18 #ifdef XAOD_STANDALONE
23 #include "GaudiKernel/SmartIF.h"
27 #include <boost/program_options.hpp>
28 namespace po = boost::program_options;
57 #define CHECK_RETRIEVE( container , name ) { \
58 if (!event.retrieve( container , name ).isSuccess()){ \
59 Error( APP_NAME , "%s", std::format ("Could not load event {} from the file!" , name ).c_str()); \
60 throw std::runtime_error("Container retrieval failed"); \
68 for (
size_t n=0;
n<
p->nChildren();++
n){
78 for (
size_t n=0;
n<
p->nParents();++
n){
91 using namespace asg::msgUserCode;
95 #ifdef XAOD_STANDALONE
97 throw std::runtime_error(
"Cannot initialise xAOD access !");
106 po::options_description
desc(
"Running a simple truth analysis");
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;
119 if (vm.count(
"help")) {
120 std::cout <<
desc << std::endl;
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
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;
214 std::vector<std::string> weightNames;
228 CHECK_RETRIEVE( largeRJets ,
"AntiKt10TruthTrimmedPtFrac5SmallR20Jets" )
230 for (
size_t n=0;
n<nParticleContainers;++
n){
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() );
251 throw std::runtime_error(
"Channel number changed mid-file!");
253 if (weightNames != (*truthMeta)[0]->weightNames() ){
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." );