// @(#)root/roostats:$Id: cranmer $ // Author: Kyle Cranmer, Akira Shibata /************************************************************************* * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers. * * All rights reserved. * * * * For the licensing terms see $ROOTSYS/LICENSE. * * For the list of contributors see $ROOTSYS/README/CREDITS. * *************************************************************************/ //_________________________________________________ /* BEGIN_HTML

END_HTML */ // //#define DEBUG #include #include "Helper.h" #include "RooStats/ModelConfig.h" #include "RooArgSet.h" #include "RooRealVar.h" #include "RooMinimizer.h" #include "RooSimultaneous.h" #include "RooCategory.h" #include "RooFitResult.h" using namespace std; namespace RooStats { namespace HistFactory { vector< pair > get_comb(vector names){ vector< pair > list; for(vector::iterator itr=names.begin(); itr!=names.end(); ++itr){ vector::iterator itr2=itr; for(itr2++; itr2!=names.end(); ++itr2){ list.push_back(pair(*itr, *itr2)); } } return list; } vector* loadSavedInputs(TFile* outFile, std::string channel ){ outFile->ShowStreamerInfo(); vector* summaries = new vector; outFile->cd(channel.c_str()); // loop through estimate summaries TIter next(gDirectory->GetListOfKeys()); EstimateSummary* summary; while ((summary=(EstimateSummary*) next())) { // if(summary){ summary->Print(); cout << "was able to read summary with name " << summary->name << std::endl; cout << " nominal hist = " << summary->nominal << std::endl; if(summary->nominal) cout << " hist name = " << summary->nominal->GetName() <push_back(*summary); //L.M. This code cannot be reached- remove it // } // else{ // cout << "was not able to read summary" << std::endl; // } } return summaries; } void saveInputs(TFile* outFile, std::string channel, vector summaries){ vector::iterator it = summaries.begin(); vector::iterator end = summaries.end(); vector::iterator histIt; vector::iterator histEnd; outFile->mkdir(channel.c_str()); for(; it!=end; ++it){ if(channel != it->channel){ cout << "channel mismatch" << std::endl; return; } outFile->cd(channel.c_str()); // write the EstimateSummary object it->Write(); gDirectory->mkdir(it->name.c_str()); gDirectory->cd(it->name.c_str()); it->nominal->Write(); histIt = it->lowHists.begin(); histEnd = it->lowHists.end(); for(; histIt!=histEnd; ++histIt) (*histIt)->Write(); histIt = it->highHists.begin(); histEnd = it->highHists.end(); for(; histIt!=histEnd; ++histIt) (*histIt)->Write(); } } TH1 * GetHisto( TFile * inFile, const std::string name ){ if(!inFile || name.empty()){ cerr << "Not all necessary info are set to access the input file. Check your config" << std::endl; cerr << "fileptr: " << inFile << "path/obj: " << name << std::endl; return 0; } #ifdef DEBUG cout << "Retrieving " << name ; #endif TH1 * ptr = (TH1 *) (inFile->Get( name.c_str() )->Clone()); #ifdef DEBUG cout << " found at " << ptr << " with integral " << ptr->Integral() << " and mean " << ptr->GetMean() << std::endl; #endif if (ptr) ptr->SetDirectory(0); // for the current histogram h //TH1::AddDirectory(kFALSE); return ptr; } TH1 * GetHisto( const std::string file, const std::string path, const std::string obj){ #ifdef DEBUG cout << "Retrieving " << file << ":" << path << obj ; #endif TFile inFile(file.c_str()); TH1 * ptr = (TH1 *) (inFile.Get( (path+obj).c_str() )->Clone()); #ifdef DEBUG cout << " found at " << ptr << " with integral " << ptr->Integral() << " and mean " << ptr->GetMean() << std::endl; #endif // if(file.empty() || path.empty() || obj.empty()){ if(!ptr){ cerr << "Not all necessary info are set to access the input file. Check your config" << std::endl; cerr << "filename: " << file << "path: " << path << "obj: " << obj << std::endl; } else ptr->SetDirectory(0); // for the current histogram h return ptr; } void AddSubStrings( vector & vs, std::string s){ const std::string delims("\\ "); std::string::size_type begIdx, endIdx; begIdx=s.find_first_not_of(delims); while(begIdx!=string::npos){ endIdx=s.find_first_of(delims, begIdx); if(endIdx==string::npos) endIdx=s.length(); vs.push_back(s.substr(begIdx,endIdx-begIdx)); begIdx=s.find_first_not_of(delims, endIdx); } } // Turn a std::string of "children" (space separated items) // into a vector of std::strings std::vector GetChildrenFromString( std::string str ) { std::vector child_vec; const std::string delims("\\ "); std::string::size_type begIdx, endIdx; begIdx=str.find_first_not_of(delims); while(begIdx!=string::npos){ endIdx=str.find_first_of(delims, begIdx); if(endIdx==string::npos) endIdx=str.length(); std::string child_name = str.substr(begIdx,endIdx-begIdx); child_vec.push_back(child_name); begIdx=str.find_first_not_of(delims, endIdx); } return child_vec; } // Turn a std::string of "children" (space separated items) // into a vector of std::strings void AddParamsToAsimov( RooStats::HistFactory::Asimov& asimov, std::string str ) { // First, split the string into a list // each describing a parameter std::vector string_list = GetChildrenFromString( str ); // Next, go through each one and split based // on the '=' to separate the name from the val // and fill the map std::map param_map; for( unsigned int i=0; i < string_list.size(); ++i) { std::string param = string_list.at(i); // Split the string size_t eql_location = param.find("="); // If there is no '=' deliminator, we only // set the variable constant if( eql_location==string::npos ) { asimov.SetFixedParam(param); } else { std::string param_name = param.substr(0,eql_location); double param_val = atof( param.substr(eql_location+1, param.size()).c_str() ); std::cout << "ASIMOV - Param Name: " << param_name << " Param Val: " << param_val << std::endl; // Give the params a value AND set them constant asimov.SetParamValue(param_name, param_val); asimov.SetFixedParam(param_name); } } return; } /* bool AddSummaries( vector & channel, vector > &master){ std::string channel_str=channel[0].channel; for( unsigned int proc=1; proc < channel.size(); proc++){ if(channel[proc].channel != channel_str){ std::cout << "Illegal channel description, should be " << channel_str << " but found " << channel.at(proc).channel << std::endl; std::cout << "name " << channel.at(proc).name << std::endl; exit(1); } master.push_back(channel); } return true; }*/ // Looking to deprecate this function and convert entirely to Measurements std::vector GetChannelEstimateSummaries(Measurement& measurement, Channel& channel) { // Convert a "Channel" into a list of "Estimate Summaries" // This should only be a temporary function, as the // EstimateSummary class should be deprecated std::vector channel_estimateSummary; std::cout << "Processing data: " << std::endl; // Add the data EstimateSummary data_es; data_es.name = "Data"; data_es.channel = channel.GetName(); TH1* data_hist = (TH1*) channel.GetData().GetHisto(); if( data_hist != NULL ) { //data_es.nominal = (TH1*) channel.GetData().GetHisto()->Clone(); data_es.nominal = data_hist; channel_estimateSummary.push_back( data_es ); } // Add the samples for( unsigned int sampleItr = 0; sampleItr < channel.GetSamples().size(); ++sampleItr ) { EstimateSummary sample_es; RooStats::HistFactory::Sample& sample = channel.GetSamples().at( sampleItr ); std::cout << "Processing sample: " << sample.GetName() << std::endl; // Define the mapping sample_es.name = sample.GetName(); sample_es.channel = sample.GetChannelName(); sample_es.nominal = (TH1*) sample.GetHisto()->Clone(); std::cout << "Checking NormalizeByTheory" << std::endl; if( sample.GetNormalizeByTheory() ) { sample_es.normName = "" ; // Really bad, confusion convention } else { TString lumiStr; lumiStr += measurement.GetLumi(); lumiStr.ReplaceAll(' ', TString()); sample_es.normName = lumiStr ; } std::cout << "Setting the Histo Systs" << std::endl; // Set the Histo Systs: for( unsigned int histoItr = 0; histoItr < sample.GetHistoSysList().size(); ++histoItr ) { RooStats::HistFactory::HistoSys& histoSys = sample.GetHistoSysList().at( histoItr ); sample_es.systSourceForHist.push_back( histoSys.GetName() ); sample_es.lowHists.push_back( (TH1*) histoSys.GetHistoLow()->Clone() ); sample_es.highHists.push_back( (TH1*) histoSys.GetHistoHigh()->Clone() ); } std::cout << "Setting the NormFactors" << std::endl; for( unsigned int normItr = 0; normItr < sample.GetNormFactorList().size(); ++normItr ) { RooStats::HistFactory::NormFactor& normFactor = sample.GetNormFactorList().at( normItr ); EstimateSummary::NormFactor normFactor_es; normFactor_es.name = normFactor.GetName(); normFactor_es.val = normFactor.GetVal(); normFactor_es.high = normFactor.GetHigh(); normFactor_es.low = normFactor.GetLow(); normFactor_es.constant = normFactor.GetConst(); sample_es.normFactor.push_back( normFactor_es ); } std::cout << "Setting the OverallSysList" << std::endl; for( unsigned int sysItr = 0; sysItr < sample.GetOverallSysList().size(); ++sysItr ) { RooStats::HistFactory::OverallSys& overallSys = sample.GetOverallSysList().at( sysItr ); std::pair DownUpPair( overallSys.GetLow(), overallSys.GetHigh() ); sample_es.overallSyst[ overallSys.GetName() ] = DownUpPair; // } std::cout << "Checking Stat Errors" << std::endl; // Do Stat Error sample_es.IncludeStatError = sample.GetStatError().GetActivate(); // Set the error and error threshold sample_es.RelErrorThreshold = channel.GetStatErrorConfig().GetRelErrorThreshold(); if( sample.GetStatError().GetErrorHist() ) { sample_es.relStatError = (TH1*) sample.GetStatError().GetErrorHist()->Clone(); } else { sample_es.relStatError = NULL; } // Set the constraint type; Constraint::Type type = channel.GetStatErrorConfig().GetConstraintType(); // Set the default sample_es.StatConstraintType = EstimateSummary::Gaussian; if( type == Constraint::Gaussian) { std::cout << "Using Gaussian StatErrors" << std::endl; sample_es.StatConstraintType = EstimateSummary::Gaussian; } if( type == Constraint::Poisson ) { std::cout << "Using Poisson StatErrors" << std::endl; sample_es.StatConstraintType = EstimateSummary::Poisson; } std::cout << "Getting the shape Factor" << std::endl; // Get the shape factor if( sample.GetShapeFactorList().size() > 0 ) { sample_es.shapeFactorName = sample.GetShapeFactorList().at(0).GetName(); } if( sample.GetShapeFactorList().size() > 1 ) { std::cout << "Error: Only One Shape Factor currently supported" << std::endl; throw hf_exc(); } std::cout << "Setting the ShapeSysts" << std::endl; // Get the shape systs: for( unsigned int shapeItr=0; shapeItr < sample.GetShapeSysList().size(); ++shapeItr ) { RooStats::HistFactory::ShapeSys& shapeSys = sample.GetShapeSysList().at( shapeItr ); EstimateSummary::ShapeSys shapeSys_es; shapeSys_es.name = shapeSys.GetName(); shapeSys_es.hist = shapeSys.GetErrorHist(); // Set the constraint type; Constraint::Type systype = shapeSys.GetConstraintType(); // Set the default shapeSys_es.constraint = EstimateSummary::Gaussian; if( systype == Constraint::Gaussian) { shapeSys_es.constraint = EstimateSummary::Gaussian; } if( systype == Constraint::Poisson ) { shapeSys_es.constraint = EstimateSummary::Poisson; } sample_es.shapeSysts.push_back( shapeSys_es ); } std::cout << "Adding this sample" << std::endl; // Push back channel_estimateSummary.push_back( sample_es ); } return channel_estimateSummary; } /* void unfoldConstraints(RooArgSet& initial, RooArgSet& final, RooArgSet& obs, RooArgSet& nuis, int& counter) { // // Loop through an initial set of constraints // and create a final list of constraints // This is done recursively if (counter > 50) { cout << "ERROR::Couldn't unfold constraints!" << std::endl; cout << "Initial: " << std::endl; initial.Print("v"); cout << std::endl; cout << "Final: " << std::endl; final.Print("v"); return; } TIterator* itr = initial.createIterator(); RooAbsPdf* pdf; while ((pdf = (RooAbsPdf*)itr->Next())) { RooArgSet nuis_tmp = nuis; RooArgSet constraint_set(*pdf->getAllConstraints(obs, nuis_tmp, false)); //if (constraint_set.getSize() > 1) //{ string className(pdf->ClassName()); if (className != "RooGaussian" && className != "RooLognormal" && className != "RooGamma" && className != "RooPoisson" && className != "RooBifurGauss") { counter++; unfoldConstraints(constraint_set, final, obs, nuis, counter); } else { final.add(*pdf); } } delete itr; } */ /* RooAbsData* makeAsimovData(ModelConfig* mcInWs, bool doConditional, RooWorkspace* combWS, RooAbsPdf* combPdf, RooDataSet* combData, bool b_only, double doMuHat, double muVal, bool signalInjection, bool doNuisPro) { //////////////////// //make asimov data// //////////////////// // mcInWs -> The ModelCofig for this likelihood // doConditional -> Minimize parameters for asimov quantities // b_only -> Make the 'background only' asimov dataset, ie mu=0 (set muVal = 0) // doNuisPro -> Set all nuisance parameters to '0' and to constant // before minimizing. This should be done with *care*!! // i.e. It should probably be removed as an option. // signalInjection -> If true, then do the following: // Perform the fit with m=0 // After the fit, set the value to mu=muVal // so that the asimov is created with that value of mu fixed // doMuHat -> Set 'mu' to be float during the fit (in the range -10 to 100) // Even if it floats in the fit, it is still set to // 'muVal' before the dataset is made (so the only difference // comes from the other parameters that can float simultaneously with mu // Defaults: // double doMuHat = false // double muVal = -999, // bool signalInjection = false // bool doNuisPro = true if( b_only ) muVal = 0.0; int _printLevel = 0; // If using signal injection or a non-zero mu value, // add a suffix showing that value std::stringstream muStr; if(signalInjection || !b_only) { muStr << "_" << muVal; } // Create the name of the resulting dataset std::string dataSetName; if(signalInjection) dataSetName = "signalInjection" + muStr.str(); else dataSetName = "asimovData" + muStr.str(); // Set the parameter of interest // to the 'background' value RooRealVar* mu = (RooRealVar*) mcInWs->GetParametersOfInterest()->first(); if(signalInjection){ std::cout << "Asimov: Setting " << mu->GetName() << " value to 0 for fit" << std::endl; mu->setVal(0); } else { std::cout << "Asimov: Setting " << mu->GetName() << " value to " << muVal << " for fit" << std::endl; mu->setVal(muVal); } // Get necessary info from the ModelConfig RooArgSet mc_obs = *mcInWs->GetObservables(); RooArgSet mc_globs = *mcInWs->GetGlobalObservables(); RooArgSet mc_nuis = *mcInWs->GetNuisanceParameters(); // Create a set of constraint terms, which // is stored in 'constraint_set' // Make some temporary variables and use the // unfoldConstrants function to do this. RooArgSet constraint_set; int counter_tmp = 0; RooArgSet mc_nuis_tmp = mc_nuis; RooArgSet constraint_set_tmp(*combPdf->getAllConstraints(mc_obs, mc_nuis_tmp, false)); unfoldConstraints(constraint_set_tmp, constraint_set, mc_obs, mc_nuis_tmp, counter_tmp); // Now that we have the constraint terms, we // can create the full lists of nuisance parameters // and global variables RooArgList nui_list("ordered_nuis"); RooArgList glob_list("ordered_globs"); TIterator* cIter = constraint_set.createIterator(); RooAbsArg* arg; while ((arg = (RooAbsArg*)cIter->Next())) { RooAbsPdf* pdf = (RooAbsPdf*) arg; if (!pdf) continue; TIterator* nIter = mc_nuis.createIterator(); RooRealVar* thisNui = NULL; RooAbsArg* nui_arg; while((nui_arg = (RooAbsArg*)nIter->Next())) { if(pdf->dependsOn(*nui_arg)) { thisNui = (RooRealVar*) nui_arg; break; } } delete nIter; // need this in case the observable isn't fundamental. // in this case, see which variable is dependent on the nuisance parameter and use that. RooArgSet* components = pdf->getComponents(); components->remove(*pdf); if(components->getSize()) { TIterator* itr1 = components->createIterator(); RooAbsArg* arg1; while ((arg1 = (RooAbsArg*)itr1->Next())) { TIterator* itr2 = components->createIterator(); RooAbsArg* arg2; while ((arg2 = (RooAbsArg*)itr2->Next())) { if(arg1 == arg2) continue; if(arg2->dependsOn(*arg1)) { components->remove(*arg1); } } delete itr2; } delete itr1; } if (components->getSize() > 1) { std::cout << "ERROR::Couldn't isolate proper nuisance parameter" << std::endl; return NULL; } else if (components->getSize() == 1) { thisNui = (RooRealVar*)components->first(); } TIterator* gIter = mc_globs.createIterator(); RooRealVar* thisGlob = NULL; RooAbsArg* glob_arg; while ((glob_arg = (RooAbsArg*)gIter->Next())) { if (pdf->dependsOn(*glob_arg)) { thisGlob = (RooRealVar*)glob_arg; break; } } delete gIter; if (!thisNui || !thisGlob) { std::cout << "WARNING::Couldn't find nui or glob for constraint: " << pdf->GetName() << std::endl; continue; } if (_printLevel >= 1) std::cout << "Pairing nui: " << thisNui->GetName() << ", with glob: " << thisGlob->GetName() << ", from constraint: " << pdf->GetName() << std::endl; nui_list.add(*thisNui); glob_list.add(*thisGlob); } // End Loop over Constraint Terms delete cIter; //save the snapshots of nominal parameters combWS->saveSnapshot("nominalGlobs",glob_list); combWS->saveSnapshot("nominalNuis", nui_list); RooArgSet nuiSet_tmp(nui_list); // Interesting line here: if(!doMuHat) { std::cout << "Asimov: Setting mu constant in fit" << std::endl; mu->setConstant(true); } else { std::cout << "Asimov: Letting mu float in fit (muHat)" << std::endl; mu->setRange(-10,100); } // Conditional: "Minimize the parameters" if(doConditional) { std::cout << "Starting minimization.." << std::endl; // Consider removing this option: if(!doNuisPro) { std::cout << "Asimov: Setting nuisance parameters constant in the fit (ARE YOU SURE YOU WANT THIS)" << std::endl; TIterator* nIter = nuiSet_tmp.createIterator(); RooRealVar* thisNui = NULL; while((thisNui = (RooRealVar*) nIter->Next())) { thisNui->setVal(0); thisNui->setConstant(); } delete nIter; // This should be checked, we don't want to if(combWS->var("Lumi")) { combWS->var("Lumi")->setVal(1); combWS->var("Lumi")->setConstant(); } } // Create the nll and its minimizer RooAbsReal* nll = combPdf->createNLL(*combData, RooFit::Constrain(nuiSet_tmp)); RooMinimizer minim(*nll); minim.setStrategy(2); minim.setPrintLevel(999); // Do the minimization std::cout << "Minimizing to make Asimov dataset:" << std::endl; int status = minim.minimize(ROOT::Math::MinimizerOptions::DefaultMinimizerType().c_str(), "migrad"); if (status == 0) { // status==0 means fit was successful std::cout << "Successfully minimized to make Asimov dataset:" << std::endl; RooFitResult* fit_result = minim.lastMinuitFit(); std::cout << "Asimov: Final Fitted Parameters" << std::endl; fit_result->Print("V"); } else{ std::cout << "Fit failed for mu = " << mu->getVal() << " with status " << status << std::endl; std::cout << "Trying minuit..." << std::endl; status = minim.minimize("Minuit", "migrad"); if (status != 0) { cout << "Fit failed for mu = " << mu->getVal() << " with status " << status << std::endl; throw hf_exc(); } } // Undo the 'doNuisPro' part // Again, may want to remove this if (!doNuisPro) { TIterator* nIter = nuiSet_tmp.createIterator(); RooRealVar* thisNui = NULL; while ((thisNui = (RooRealVar*)nIter->Next())) { thisNui->setConstant(false); } delete nIter; if (combWS->var("Lumi")) { combWS->var("Lumi")->setConstant(false); } } std::cout << "Done" << std::endl; } // END: DoConditional mu->setConstant(false); //loop over the nui/glob list, grab the corresponding variable from the tmp ws, // and set the glob to the value of the nui int nrNuis = nui_list.getSize(); if (nrNuis != glob_list.getSize()) { std::cout << "ERROR::nui_list.getSize() != glob_list.getSize()!" << std::endl; return NULL; } for(int i=0; i= 1) std::cout << "nui: " << nui << ", glob: " << glob << std::endl; if (_printLevel >= 1) std::cout << "Setting glob: " << glob->GetName() << ", which had previous val: " << glob->getVal() << ", to conditional val: " << nui->getVal() << std::endl; glob->setVal(nui->getVal()); } //save the snapshots of conditional parameters //cout << "Saving conditional snapshots" << std::endl; combWS->saveSnapshot(("conditionalGlobs"+muStr.str()).c_str(),glob_list); combWS->saveSnapshot(("conditionalNuis" +muStr.str()).c_str(), nui_list); if(!doConditional) { combWS->loadSnapshot("nominalGlobs"); combWS->loadSnapshot("nominalNuis"); } //cout << "Making asimov" << std::endl; //make the asimov data (snipped from Kyle) // Restore the value of mu to the target value mu->setVal(muVal); ModelConfig* mc = mcInWs; int iFrame=0; const char* weightName = "weightVar"; RooArgSet obsAndWeight; obsAndWeight.add(*mc->GetObservables()); // Get the weightVar, or create one if necessary RooRealVar* weightVar = combWS->var(weightName); // NULL; // if (!(weightVar = combWS->var(weightName))) if( weightVar==NULL ) { combWS->import(*(new RooRealVar(weightName, weightName, 1,0,1000))); weightVar = combWS->var(weightName); } if (_printLevel >= 1) std::cout << "weightVar: " << weightVar << std::endl; obsAndWeight.add(*combWS->var(weightName)); ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// // MAKE ASIMOV DATA FOR OBSERVABLES // dummy var can just have one bin since it's a dummy if(combWS->var("ATLAS_dummyX")) combWS->var("ATLAS_dummyX")->setBins(1); if (_printLevel >= 1) std::cout << " check expectedData by category" << std::endl; RooSimultaneous* simPdf = dynamic_cast(mc->GetPdf()); // Create the pointer to be returned RooDataSet* asimovData=NULL; // If the pdf isn't simultaneous: if(!simPdf) { // Get pdf associated with state from simpdf RooAbsPdf* pdftmp = mc->GetPdf();//simPdf->getPdf(channelCat->getLabel()) ; // Generate observables defined by the pdf associated with this state RooArgSet* obstmp = pdftmp->getObservables(*mc->GetObservables()) ; if (_printLevel >= 1) { obstmp->Print(); } asimovData = new RooDataSet(dataSetName.c_str(), dataSetName.c_str(), RooArgSet(obsAndWeight), RooFit::WeightVar(*weightVar)); RooRealVar* thisObs = ((RooRealVar*)obstmp->first()); double expectedEvents = pdftmp->expectedEvents(*obstmp); double thisNorm = 0; for(int jj=0; jjnumBins(); ++jj){ thisObs->setBin(jj); thisNorm=pdftmp->getVal(obstmp)*thisObs->getBinWidth(jj); if (thisNorm*expectedEvents <= 0) { cout << "WARNING::Detected bin with zero expected events (" << thisNorm*expectedEvents << ") ! Please check your inputs. Obs = " << thisObs->GetName() << ", bin = " << jj << std::endl; } if (thisNorm*expectedEvents > 0 && thisNorm*expectedEvents < pow(10.0, 18)) asimovData->add(*mc->GetObservables(), thisNorm*expectedEvents); } if (_printLevel >= 1) { asimovData->Print(); std::cout <<"sum entries "<sumEntries()<sumEntries()!=asimovData->sumEntries()){ std::cout << "sum entries is nan"<import(*asimovData); } else { // If it IS a simultaneous pdf std::cout << "found a simPdf: " << simPdf << std::endl; map asimovDataMap; RooCategory* channelCat = (RooCategory*)&simPdf->indexCat(); TIterator* iter = channelCat->typeIterator() ; RooCatType* tt = NULL; int nrIndices = 0; while((tt=(RooCatType*) iter->Next())) { nrIndices++; } for (int i=0;isetIndex(i); std::cout << "Checking channel: " << channelCat->getLabel() << std::endl; iFrame++; // Get pdf associated with state from simpdf RooAbsPdf* pdftmp = simPdf->getPdf(channelCat->getLabel()) ; // Generate observables defined by the pdf associated with this state RooArgSet* obstmp = pdftmp->getObservables(*mc->GetObservables()) ; if (_printLevel >= 1) { obstmp->Print(); cout << "on type " << channelCat->getLabel() << " " << iFrame << std::endl; } RooDataSet* obsDataUnbinned = new RooDataSet(Form("combAsimovData%d",iFrame),Form("combAsimovData%d",iFrame), RooArgSet(obsAndWeight,*channelCat), RooFit::WeightVar(*weightVar)); RooRealVar* thisObs = ((RooRealVar*)obstmp->first()); double expectedEvents = pdftmp->expectedEvents(*obstmp); double thisNorm = 0; TString pdftmp_name = pdftmp->GetName(); if (!expectedEvents) { std::cout << "Not expected events" << std::endl; if (pdftmp_name == "model_E") ((RooRealVar*)obstmp->first())->setVal(combWS->function("p_e")->getVal()); else if (pdftmp_name == "model_MU") ((RooRealVar*)obstmp->first())->setVal(combWS->function("p_mu")->getVal()); else if ((pdftmp_name == "model_ratio_ELMU") || (pdftmp_name == "model_comb")) { //((RooRealVar*)obstmp->first())->setVal(combWS->function("p_comb")->getVal()); double p_asimov_val = combWS->var("p_asimov")->getVal(); std::cout << "p_asimov val: " << p_asimov_val << std::endl; ((RooRealVar*)obstmp->first())->setVal(combWS->var("p_asimov")->getVal()); } else { std::cout << "Failed to set asimov data for non-extended pdf" << std::endl; exit(1); } obsDataUnbinned->add(*mc->GetObservables()); } else { std::cout << "expected events" << std::endl; for(int jj=0; jjnumBins(); ++jj){ thisObs->setBin(jj); thisNorm=pdftmp->getVal(obstmp)*thisObs->getBinWidth(jj); if (thisNorm*expectedEvents <= 0) { std::cout << "WARNING::Detected bin with zero expected events (" << thisNorm*expectedEvents << ") ! Please check your inputs. Obs = " << thisObs->GetName() << ", bin = " << jj << std::endl; } if (thisNorm*expectedEvents > pow(10.0, -9) && thisNorm*expectedEvents < pow(10.0, 9)) obsDataUnbinned->add(*mc->GetObservables(), thisNorm*expectedEvents); } } if (_printLevel >= 1) { obsDataUnbinned->Print(); std::cout <<"sum entries "<sumEntries()<sumEntries()!=obsDataUnbinned->sumEntries()){ cout << "sum entries is nan"<getLabel())] = obsDataUnbinned;//tempData; if (_printLevel >= 1) { std::cout << "channel: " << channelCat->getLabel() << ", data: "; obsDataUnbinned->Print(); std::cout << std::endl; } } channelCat->setIndex(0); asimovData = new RooDataSet(dataSetName.c_str(),dataSetName.c_str(), RooArgSet(obsAndWeight,*channelCat), RooFit::Index(*channelCat), RooFit::Import(asimovDataMap), RooFit::WeightVar(*weightVar)); // Don't import, return (of course) //combWS->import(*asimovData); } // End if over simultaneous pdf combWS->loadSnapshot("nominalNuis"); combWS->loadSnapshot("nominalGlobs"); return asimovData; } */ } }