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){
 
  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() );
 
  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) );
 
  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?" );