95 using namespace RooFit;
96 using namespace RooStats;
97 using namespace HistFactory;
101 void topDriver(
string input);
162 void topDriver(
string input ) {
166 std::vector< HistFactory::Measurement > measurement_list;
170 HistFactory::ConfigParser xmlParser;
175 measurement_list = xmlParser.GetMeasurementsFromXML( input );
187 for(
unsigned int i = 0; i < measurement_list.size(); ++i) {
189 HistFactory::Measurement measurement = measurement_list.at(i);
199 std::string rowTitle = measurement.GetName();
200 std::string outputFileName = measurement.GetOutputFilePrefix() +
"_" + measurement.GetName() +
".root";
202 double lumiError = measurement.GetLumi()*measurement.GetLumiRelErr();
204 TFile* outFile =
new TFile(outputFileName.c_str(),
"recreate");
205 HistoToWorkspaceFactory factory(measurement.GetOutputFilePrefix(), rowTitle, measurement.GetConstantParams(),
206 measurement.GetLumi(), lumiError,
207 measurement.GetBinLow(), measurement.GetBinHigh(), outFile);
210 vector<RooWorkspace*> channel_workspaces;
211 vector<string> channel_names;
220 for(
unsigned int chanItr = 0; chanItr < measurement.GetChannels().size(); ++chanItr ) {
222 HistFactory::Channel& channel = measurement.GetChannels().at( chanItr );
225 string ch_name=channel.GetName();
226 channel_names.push_back(ch_name);
228 std::vector< EstimateSummary > dummy;
229 RooWorkspace* ws = factory.MakeSingleChannelModel( dummy, measurement.GetConstantParams() );
231 std::cout <<
"Failed to create SingleChannelModel for channel: " << channel.GetName()
232 <<
" and measurement: " << measurement.GetName() << std::endl;
236 channel_workspaces.push_back(ws);
239 ModelConfig* proto_config = (ModelConfig *) ws->obj(
"ModelConfig");
241 std::cout <<
"Setting Parameter of Interest as :" << measurement.GetPOI() << endl;
242 RooRealVar* poi = (RooRealVar*) ws->var( (measurement.GetPOI()).c_str() );
243 RooArgSet * params=
new RooArgSet;
247 proto_config->SetParametersOfInterest(*params);
252 if( measurement.GetGammaSyst().size()>0 || measurement.GetUniformSyst().size()>0 || measurement.GetLogNormSyst().size()>0) {
253 factory.EditSyst( ws, (
"model_"+ch_name).c_str(), measurement.GetGammaSyst(), measurement.GetUniformSyst(), measurement.GetLogNormSyst());
254 proto_config->SetPdf( *ws->pdf(
"newSimPdf") );
258 RooAbsData* expData = ws->data(
"expData");
260 proto_config->GuessObsAndNuisance(*expData);
262 std::string ChannelFileName = measurement.GetOutputFilePrefix() +
"_" + ch_name +
"_" + rowTitle +
"_model.root";
263 ws->writeToFile( ChannelFileName.c_str() );
267 RooStats::HistFactory::Measurement meas_chan( measurement );
268 meas_chan.GetChannels().clear();
269 meas_chan.GetChannels().push_back( channel );
270 TFile* chanFile = TFile::Open( ChannelFileName.c_str(),
"UPDATE" );
271 meas_chan.writeToFile( chanFile );
275 if(! measurement.GetExportOnly() ){
277 cout <<
"can't do fit for this channel, no parameter of interest"<<endl;
279 factory.FitModel(ws, ch_name,
"newSimPdf",
"expData",
false);
282 fprintf(factory.pFile,
" & " );
287 RooWorkspace* ws=factory.MakeCombinedModel(channel_names, channel_workspaces);
289 std::cout <<
"Error: Failed to create workspace" << std::endl;
294 if( measurement.GetGammaSyst().size()>0 || measurement.GetUniformSyst().size()>0 || measurement.GetLogNormSyst().size()>0)
295 factory.EditSyst(ws,
"simPdf", measurement.GetGammaSyst(), measurement.GetUniformSyst(), measurement.GetLogNormSyst());
299 ModelConfig * combined_config = (ModelConfig *) ws->obj(
"ModelConfig");
300 cout <<
"Setting Parameter of Interest as :" << measurement.GetPOI() << endl;
301 RooRealVar* poi = (RooRealVar*) ws->var( (measurement.GetPOI()).c_str() );
303 RooArgSet * params=
new RooArgSet;
308 combined_config->SetParametersOfInterest(*params);
312 if( measurement.GetGammaSyst().size()>0 || measurement.GetUniformSyst().size()>0 || measurement.GetLogNormSyst().size()>0)
313 combined_config->SetPdf(*ws->pdf(
"newSimPdf"));
315 RooAbsData* simData = ws->data(
"simData");
316 combined_config->GuessObsAndNuisance(*simData);
318 std::string CombinedFileName = measurement.GetOutputFilePrefix()+
"_combined_"+rowTitle+
"_model.root";
319 ws->writeToFile( CombinedFileName.c_str() );
320 TFile* combFile = TFile::Open( CombinedFileName.c_str(),
"UPDATE" );
321 measurement.writeToFile( combFile );
328 if(! measurement.GetExportOnly() ){
330 cout <<
"can't do fit for this channel, no parameter of interest"<<endl;
332 factory.FitModel(ws,
"combined",
"simPdf",
"simData",
false);