85int main(
int argc,
char **argv) {
91 using namespace asg::msgUserCode;
97 throw std::runtime_error(
"Cannot initialise xAOD access !");
106 po::options_description desc(
"Running a simple truth analysis");
107 std::string outputName,inputName;
109 (
"help,h",
"print usage and exit")
110 (
"output,o", po::value<std::string>(&outputName),
"Output file name")
111 (
"input,i", po::value<std::string>(&inputName),
"Input file name")
112 (
"nevents", po::value<int>()->default_value(-1),
"number of events to run on (set to -1 to ignore it")
115 po::variables_map vm;
116 po::store( po::command_line_parser(argc, argv).options(desc).
run(), vm);
119 if (vm.count(
"help")) {
120 std::cout << desc << std::endl;
124 long long nevents = -1;
125 if (vm.count(
"nevents")) {
126 nevents = vm[
"nevents"].as<
int>();
129 Info(
"Reading from %s and writing to %s" , inputName.c_str() , outputName.c_str() );
132 std::unique_ptr< TFile > ifile( TFile::Open( inputName.c_str() ,
"READ" ) );
134#ifdef XAOD_STANDALONE
139 ANA_CHECK( event.readFrom( ifile.get() ) );
145 const size_t nParticleContainers = 9;
146 std::string particleKeyList[nParticleContainers] = {
"TruthElectrons",
"TruthMuons",
"TruthPhotons",
"TruthTaus",
"TruthNeutrinos",
"TruthBSM",
"TruthBottom",
"TruthTop",
"TruthBoson" };
154 for (
size_t n=0;n<nParticleContainers;++n) truthParticles[n] =
nullptr;
161 TH1D* h_metNonInt =
new TH1D(
"MET_NonInt",
"",50,0,500.);
162 TH1D* h_metInt =
new TH1D(
"MET_Int",
"",50,0,200.);
163 TH1D* h_metIntOut =
new TH1D(
"MET_IntOut",
"",50,0,100.);
164 TH1D* h_metIntMuons =
new TH1D(
"MET_IntMuons",
"",50,0,300.);
166 TH1D* h_partPt[nParticleContainers];
167 for (
size_t n=0;n<nParticleContainers;++n) h_partPt[n] =
new TH1D((particleKeyList[n]+
"_pT").c_str(),
"",50,0.,500.);
168 TH1D* h_partConn[nParticleContainers];
169 for (
size_t n=0;n<nParticleContainers;++n) h_partConn[n] =
new TH1D((particleKeyList[n]+
"_Connections").c_str(),
"",35,-10,25);
171 TH1D* h_elPtCone =
new TH1D(
"ElPtCone",
"",50,0.,20.);
172 TH1D* h_elEtCone =
new TH1D(
"ElEtCone",
"",50,0.,20.);
173 TH1D* h_muPtCone =
new TH1D(
"MuPtCone",
"",50,0.,20.);
174 TH1D* h_muEtCone =
new TH1D(
"MuEtCone",
"",50,0.,20.);
175 TH1D* h_phPtCone =
new TH1D(
"PhPtCone",
"",50,0.,20.);
176 TH1D* h_phEtCone =
new TH1D(
"PhEtCone",
"",50,0.,20.);
178 TH1D* h_elType =
new TH1D(
"ElType",
"",50,0,50);
179 TH1D* h_elOrig =
new TH1D(
"ElOrigin",
"",50,0,50);
180 TH1D* h_muType =
new TH1D(
"MuType",
"",50,0,50);
181 TH1D* h_muOrig =
new TH1D(
"MuOrigin",
"",50,0,50);
182 TH1D* h_phType =
new TH1D(
"PhType",
"",50,0,50);
183 TH1D* h_phOrig =
new TH1D(
"PhOrigin",
"",50,0,50);
184 TH1D* h_taType =
new TH1D(
"TaType",
"",50,0,50);
185 TH1D* h_taOrig =
new TH1D(
"TaOrigin",
"",50,0,50);
186 TH1D* h_nuType =
new TH1D(
"NuType",
"",50,0,50);
187 TH1D* h_nuOrig =
new TH1D(
"NuOrigin",
"",50,0,50);
189 TH1D* h_elDressedPt =
new TH1D(
"ElDressedPt",
"",50,0.,200.);
190 TH1D* h_muDressedPt =
new TH1D(
"MuDressedPt",
"",50,0.,200.);
191 TH1D* h_taDressedPt =
new TH1D(
"TaDressedPt",
"",50,0.,200.);
193 TH1D* h_jetPt =
new TH1D(
"JetPt",
"",50,0,500.);
194 TH1D* h_jetFTAG =
new TH1D(
"JetFTAG",
"",25,0,25);
195 TH1D* h_jetJeMe =
new TH1D(
"JetJeMe",
"",25,0,25);
196 TH1D* h_jetFull =
new TH1D(
"JetFull",
"",50,0,50);
198 TH1D* h_jetLRPt =
new TH1D(
"JetLRPt",
"",50,0,500.);
199 TH1D* h_jetLRT2 =
new TH1D(
"JetLRT2",
"",50,0,500.);
200 TH1D* h_jetLRD2 =
new TH1D(
"JetLRD2",
"",50,0,500.);
202 TH1D* h_x1 =
new TH1D(
"X1",
"",50,0,1.);
203 TH1D* h_x2 =
new TH1D(
"X2",
"",50,0,1.);
204 TH1D* h_xsec =
new TH1D(
"XSec",
"",50,0,1.);
205 TH1D* h_HTFilt =
new TH1D(
"HTFilt",
"",50,0,1000.);
211 std::vector<TH1D*> h_weights;
213 uint32_t channelNumber = 0;
214 std::vector<std::string> weightNames;
217 long long nEvents = nevents > 0 ? std::min(
static_cast<long long>(event.getEntries()), nevents) :
event.getEntries();
219 for (
long evt=0;evt<
nEvents;++evt){
222 if (evt%1000==0) Info(
APP_NAME ,
"Working on entry %lu" , evt );
228 CHECK_RETRIEVE( largeRJets ,
"AntiKt10TruthTrimmedPtFrac5SmallR20Jets" )
230 for (
size_t n=0;n<nParticleContainers;++n){
234 if (!event.retrieveMetaInput( truthMeta ,
"TruthMetaData" ).isSuccess()){
235 Error(
APP_NAME ,
"Could not load event TruthMetaData from the file!" );
236 throw std::runtime_error(
"Could not load event TruthMetaData from the file!");
240 if (truthMeta->
size()>1){
241 Error(
APP_NAME ,
"Truth metadata size: %lu . No one will look past item 0!" , truthMeta->
size() );
242 throw std::runtime_error(
"Truth metadata size >1");
244 if (channelNumber==0){
245 channelNumber = (*truthMeta)[0]->mcChannelNumber();
246 weightNames = std::vector<std::string>((*truthMeta)[0]->weightNames());
247 Info(
APP_NAME ,
"Got channel number %u and %lu weight names" , channelNumber , weightNames.size() );
249 if (channelNumber != (*truthMeta)[0]->mcChannelNumber()){
250 Error(
APP_NAME ,
"Channel number changed mid-file! Was: %u now: %u " , channelNumber , (*truthMeta)[0]->mcChannelNumber() );
251 throw std::runtime_error(
"Channel number changed mid-file!");
253 if (weightNames != (*truthMeta)[0]->weightNames() ){
254 Error(
APP_NAME ,
"Weights have changed!" );
255 for (
size_t n=0;n<std::max( weightNames.size() , (*truthMeta)[0]->weightNames().size() );++n){
256 std::cerr <<
" " << n <<
" ";
257 if (n<weightNames.size()) std::cerr << weightNames[n] <<
" ";
258 else std::cerr <<
"- ";
259 if (n<(*truthMeta)[0]->weightNames().size()) std::cerr << (*truthMeta)[0]->weightNames()[n] <<
" ";
260 else std::cerr <<
"- ";
261 std::cerr << std::endl;
263 throw std::runtime_error(
"Weights have changed!");
266 if (h_weights.size()==0){
268 for (
auto & name : weightNames ){
269 h_weights.push_back(
new TH1D((
"h_W_"+name).c_str(),
"",100,-10.,10.) );
271 h_weights.push_back(
new TH1D(
"h_W_nominalTest",
"",100,-10.,10.) );
273 for (
size_t n=0;n<weightNames.size();++n) h_weights[n]->Fill( weightTool->getWeight(xEventInfo,weightNames[n]) );
275 h_weights[weightNames.size()]->Fill( weightTool->getWeight(xEventInfo,
" nominal ") );
282 h_xsec->Fill( (*xTruthEventContainer)[0]->crossSection() );
284 h_HTFilt->Fill( GenFiltHTAcc (*xEventInfo ) );
286 h_metNonInt->Fill( (*truthMET)[
"NonInt"]->
met()*0.001 );
287 h_metNonInt->Fill( (*truthMET)[
"Int"]->
met()*0.001 );
288 h_metNonInt->Fill( (*truthMET)[
"IntOut"]->
met()*0.001 );
289 h_metNonInt->Fill( (*truthMET)[
"IntMuons"]->
met()*0.001 );
291 for (
size_t n=0;n<nParticleContainers;++n){
292 for (
const auto * p : *truthParticles[n]){
293 h_partPt[n]->Fill( p->pt() );
312 for (
const auto * p : *truthParticles[0]){
313 h_elPtCone->Fill( ptcone30Acc(*p)*0.001 );
314 h_elEtCone->Fill( etcone20Acc(*p)*0.001 );
315 h_elDressedPt->Fill( pt_dressedAcc(*p)*0.001 );
316 h_elType->Fill( classifierParticleTypeAcc(*p) );
317 h_elOrig->Fill( classifierParticleOriginAcc(*p) );
319 for (
const auto * p : *truthParticles[1]){
320 h_muPtCone->Fill( ptcone30Acc(*p)*0.001 );
321 h_muEtCone->Fill( etcone20Acc(*p)*0.001 );
322 h_muDressedPt->Fill( pt_dressedAcc(*p)*0.001 );
323 h_muType->Fill( classifierParticleTypeAcc(*p) );
324 h_muOrig->Fill( classifierParticleOriginAcc(*p) );
326 for (
const auto * p : *truthParticles[2]){
327 h_phPtCone->Fill( ptcone20Acc(*p)*0.001 );
328 h_phEtCone->Fill( etcone20Acc(*p)*0.001 );
329 h_phType->Fill( classifierParticleTypeAcc(*p) );
330 h_phOrig->Fill( classifierParticleOriginAcc(*p) );
332 for (
const auto * p : *truthParticles[3]){
333 h_taDressedPt->Fill( pt_vis_dressedAcc(*p)*0.001 );
334 h_taType->Fill( classifierParticleTypeAcc(*p) );
335 h_taOrig->Fill( classifierParticleOriginAcc(*p) );
337 for (
const auto * p : *truthParticles[4]){
338 h_nuType->Fill( classifierParticleTypeAcc(*p) );
339 h_nuOrig->Fill( classifierParticleOriginAcc(*p) );
341 for (
const auto * j : *smallRJets){
342 h_jetPt->Fill( j->pt()*0.001 );
343 h_jetFTAG->Fill( HadronConeExclTruthLabelIDAcc(*j) );
344 h_jetJeMe->Fill( PartonTruthLabelIDAcc(*j) );
345 h_jetFull->Fill( TrueFlavorAcc(*j) );
347 for (
const auto * j : *largeRJets){
348 h_jetLRPt->Fill( j->pt()*0.001 );
349 h_jetLRT2->Fill( Tau2_wtaAcc(*j) );
350 h_jetLRD2->Fill( D2Acc(*j) );
354 Info(
APP_NAME ,
"Done with event loop" );
357 TFile * oRoot =
new TFile(outputName.c_str(),
"RECREATE");
362 h_metNonInt->Write();
364 h_metIntOut->Write();
365 h_metIntMuons->Write();
367 for (
size_t n=0;n<nParticleContainers;++n) h_partPt[n]->Write();
368 for (
size_t n=0;n<nParticleContainers;++n) h_partConn[n]->Write();
375 h_elDressedPt->Write();
376 h_muDressedPt->Write();
377 h_taDressedPt->Write();
401 for (
auto *
h : h_weights)
h->Write();
407#ifndef XAOD_STANDALONE
408 if (app->finalize().isFailure()){
409 Warning(
APP_NAME ,
"Finalization failed?" );
413 Info(
APP_NAME ,
"All done -- goodbye." );