ATLAS Offline Software
Functions
test_JSSWTopTaggerDNN.cxx File Reference
#include <string>
#include <TFile.h>
#include <TString.h>
#include <TTree.h>
#include <TChain.h>
#include "AsgTools/StandaloneToolHandle.h"
#include "xAODCore/ShallowAuxContainer.h"
#include "xAODCore/ShallowCopy.h"
#include "xAODCore/tools/IOStats.h"
#include "BoostedJetTaggers/JSSWTopTaggerDNN.h"
#include "JetUncertainties/JetUncertaintiesTool.h"
#include "AsgMessaging/MessageCheck.h"

Go to the source code of this file.

Functions

int main (int argc, char *argv[])
 

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 37 of file test_JSSWTopTaggerDNN.cxx.

37  {
38 
39  ANA_CHECK_SET_TYPE (int); // makes ANA_CHECK return ints if exiting function
40 
41  // The application's name:
42  char* APP_NAME = argv[ 0 ];
43 
44  // arguments
45  TString fileName = "/eos/atlas/atlascerngroupdisk/perf-jets/ReferenceFiles/DAOD_JETM2.Zprime.pool.root";
46  int ievent=-1;
47  int nevents=-1;
48  bool isMC=true;
49  bool verbose=false;
50  bool runSystematics=true;
51 
52  Info( APP_NAME, "==============================================" );
53  Info( APP_NAME, "Usage: $> %s [xAOD file name]", APP_NAME );
54  Info( APP_NAME, " $> %s | Run on default file", APP_NAME );
55  Info( APP_NAME, " $> %s -f X | Run on xAOD file X", APP_NAME );
56  Info( APP_NAME, " $> %s -n X | X = number of events you want to run on", APP_NAME );
57  Info( APP_NAME, " $> %s -e X | X = specific number of the event to run on - for debugging", APP_NAME );
58  Info( APP_NAME, " $> %s -d X | X = dataset ID", APP_NAME );
59  Info( APP_NAME, " $> %s -m X | X = isMC", APP_NAME );
60  Info( APP_NAME, " $> %s -noSys | Run without systematics", APP_NAME );
61  Info( APP_NAME, " $> %s -v | run in verbose mode ", APP_NAME );
62  Info( APP_NAME, "==============================================" );
63 
64  // Check if we received a file name:
65  if( argc < 2 ) {
66  Info( APP_NAME, "No arguments - using default file" );
67  Info( APP_NAME, "Executing on : %s", fileName.Data() );
68  }
69 
71  //::: parse the options
73  std::string options;
74  for( int i=0; i<argc; i++){
75  options+=(argv[i]);
76  }
77 
78  if(options.find("-f")!=std::string::npos){
79  for( int ipos=0; ipos<argc ; ipos++ ) {
80  if(std::string(argv[ipos]).compare("-f")==0){
81  if( ipos+1 == argc || std::string(argv[ipos+1])[0]=='-' ) {
82  Error( APP_NAME, "Please add the file name after -f argument" );
83  return 1;
84  }
85  fileName = argv[ipos+1];
86  Info( APP_NAME, "Argument (-f) : Running on file # %s", fileName.Data() );
87  break;
88  }
89  }
90  }
91 
92  if(options.find("-event")!=std::string::npos){
93  for( int ipos=0; ipos<argc ; ipos++ ) {
94  if(std::string(argv[ipos]).compare("-event")==0){
95  if( ipos+1 == argc || std::string(argv[ipos+1])[0]=='-' ) {
96  Error( APP_NAME, "Please add the event# after -event argument" );
97  return 1;
98  }
99  ievent = atoi(argv[ipos+1]);
100  Info( APP_NAME, "Argument (-event) : Running only on event # %i", ievent );
101  break;
102  }
103  }
104  }
105 
106  if(options.find("-m")!=std::string::npos){
107  for( int ipos=0; ipos<argc ; ipos++ ) {
108  if(std::string(argv[ipos]).compare("-m")==0){
109  if( ipos+1 == argc || std::string(argv[ipos+1])[0]=='-' ) {
110  Error( APP_NAME, "Please add 0 or 1 after -m (IsMC) argument" );
111  return 1;
112  }
113  isMC = atoi(argv[ipos+1]);
114  Info( APP_NAME, "Argument (-m) : IsMC = %i", isMC );
115  break;
116  }
117  }
118  }
119 
120  if(options.find("-n")!=std::string::npos){
121  for( int ipos=0; ipos<argc ; ipos++ ) {
122  if(std::string(argv[ipos]).compare("-n")==0){
123  if( ipos+1 == argc || std::string(argv[ipos+1])[0]=='-' ) {
124  Error( APP_NAME, "Please add NEvents after -n argument" );
125  return 1;
126  }
127  nevents = atoi(argv[ipos+1]);
128  Info( APP_NAME, "Argument (-n) : Running on NEvents = %i", nevents );
129  break;
130  }
131  }
132  }
133 
134  if(options.find("-noSys")!=std::string::npos){
135  runSystematics=false;
136  Info( APP_NAME, "Argument (-noSys) : Setting runSystematics");
137  }
138 
139  if(options.find("-v")!=std::string::npos){
140  verbose=true;
141  Info( APP_NAME, "Argument (-v) : Setting verbose");
142  }
143 
145  //::: initialize the application and get the event
148  StatusCode::enableFailure();
149 
150  // Open the input file:
151  TFile* ifile( TFile::Open( fileName, "READ" ) );
152  if( !ifile ) Error( APP_NAME, "Cannot find file %s",fileName.Data() );
153 
154  TChain *chain = new TChain ("CollectionTree","CollectionTree");
155  chain->Add(fileName);
156 
157  // Create a TEvent object:
159  Info( APP_NAME, "Number of events in the file: %i", static_cast< int >( event.getEntries() ) );
160 
161  // Create a transient object store. Needed for the tools.
163 
164  // Decide how many events to run over:
165  Long64_t entries = event.getEntries();
166 
167  // Fill a validation true with the tag return value
168  std::unique_ptr<TFile> outputFile(TFile::Open("output_JSSWTopTaggerDNN.root", "recreate"));
169  int pass,truthLabel,idx;
170  float sf,pt,eta,m,eff,effSF;
171  TTree* Tree = new TTree( "tree", "test_tree" );
172  Tree->Branch( "pass", &pass, "pass/I" );
173  Tree->Branch( "sf", &sf, "sf/F" );
174  Tree->Branch( "pt", &pt, "pt/F" );
175  Tree->Branch( "m", &m, "m/F" );
176  Tree->Branch( "eta", &eta, "eta/F" );
177  Tree->Branch( "eff", &eff, "eff/F" );
178  Tree->Branch( "effSF", &effSF, "effSF/F" );
179  Tree->Branch( "idx", &idx, "idx/I" );
180  Tree->Branch( "truthLabel", &truthLabel, "truthLabel/I" );
181 
182  std::unique_ptr<JetUncertaintiesTool> jetUncToolSF(new JetUncertaintiesTool(("JetUncProvider_SF")));
183  std::vector<CP::SystematicSet> jetUnc_sysSets;
184 
185  if(runSystematics){
186  ANA_CHECK( jetUncToolSF->setProperty("JetDefinition", "AntiKt10LCTopoTrimmedPtFrac5SmallR20") );
187  ANA_CHECK( jetUncToolSF->setProperty("ConfigFile", "rel21/Fall2020/R10_SF_LCTopo_TopTagContained_SigEff80.config") );
188  ANA_CHECK( jetUncToolSF->setProperty("MCType", "MC16") );
189  ANA_CHECK( jetUncToolSF->initialize() );
190 
191  std::vector<std::string> pulls = {"__1down", "__1up"};
192  CP::SystematicSet jetUnc_sysSet = jetUncToolSF->recommendedSystematics();
193  const std::set<std::string> sysNames = jetUnc_sysSet.getBaseNames();
194  for (const std::string & sysName: sysNames) {
195  for (const std::string & pull : pulls) {
196  std::string sysPulled = sysName + pull;
197  jetUnc_sysSets.push_back(CP::SystematicSet(sysPulled));
198  }
199  }
200  }
201 
205 
207  //::: Tool setup
208  // setup the tool handle as per the
209  // recommendation by ASG - https://twiki.cern.ch/twiki/bin/view/AtlasProtected/AthAnalysisBase#How_to_use_AnaToolHandle
211  std::cout<<"Initializing JSSWTopTaggerDNN Tagger"<<std::endl;
213  m_Tagger.setTypeAndName("JSSWTopTaggerDNN/MyTagger");
214  if(verbose) ANA_CHECK( m_Tagger.setProperty("OutputLevel", MSG::DEBUG) );
215  ANA_CHECK( m_Tagger.setProperty( "CalibArea", "JSSWTopTaggerDNN/Rel21/February2022/") );
216  ANA_CHECK( m_Tagger.setProperty( "ConfigFile", "DNNTagger_AntiKt10UFOSD_TopContained80_Oct30.dat") );
217  ANA_CHECK( m_Tagger.setProperty("IsMC", isMC) );
218  ANA_CHECK( m_Tagger.retrieve() );
219 
220 
221  std::cout << "Total Events in File : " << entries << std::endl;
222 
224  // Loop over the events
226  for( Long64_t entry = 0; entry < entries; ++entry ) {
227 
228  if( nevents!=-1 && entry > nevents ) break;
229  // Tell the object which entry to look at:
230  event.getEntry( entry );
231 
232  // Print some event information
233  const xAOD::EventInfo* evtInfo = 0;
234  if(event.retrieve( evtInfo, "EventInfo" ) != StatusCode::SUCCESS){
235  continue;
236  }
237  if(ievent!=-1 && static_cast <int> (evtInfo->eventNumber())!=ievent) {
238  continue;
239  }
240 
241  // Get the jets
242  const xAOD::JetContainer* myJets = 0;
243  if( event.retrieve( myJets, "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets" ) != StatusCode::SUCCESS)
244  continue ;
245 
246  // Loop over jet container
247  std::pair< xAOD::JetContainer*, xAOD::ShallowAuxContainer* > jets_shallowCopy = xAOD::shallowCopyContainer( *myJets );
248  std::unique_ptr<xAOD::JetContainer> shallowJets(jets_shallowCopy.first);
249  std::unique_ptr<xAOD::ShallowAuxContainer> shallowAux(jets_shallowCopy.second);
250  idx=0;
251  for( xAOD::Jet* jetSC : *shallowJets ){
252 
253  ANA_CHECK( m_Tagger->tag( *jetSC ) );
254  if(verbose) {
255  std::cout << "Testing top Tagger " << std::endl;
256  std::cout << "jet pt = " << jetSC->pt() << std::endl;
257  std::cout << "RunningTag : " << jetSC->auxdata<bool>("DNNTaggerTopQuarkContained80_Tagged") << std::endl;
258  std::cout << "Printing jet score : " << jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_Score") << std::endl;
259  std::cout << "result masspass = " << jetSC->auxdata<bool>("DNNTaggerTopQuarkContained80_PassMass") << std::endl;
260  }
261  truthLabel = jetSC->auxdata<int>("R10TruthLabel_R21Precision_2022v1");
262 
263  pass = jetSC->getAttribute<bool>("DNNTaggerTopQuarkContained80_Tagged");
264  sf = jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_SF");
265  pt = jetSC->pt();
266  m = jetSC->m();
267  eta = jetSC->eta();
268  eff = jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_efficiency");
269  effSF = jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_effSF");
270 
271  Tree->Fill();
272  idx++;
273  if(runSystematics){
274  if ( isMC ){
275  if ( pt/1.e3 > 350 && std::abs(jetSC->eta()) < 2.0 ) {
276  bool validForUncTool = ( pt/1.e3 >= 150 && pt/1.e3 < 2500 );
277  validForUncTool &= ( m/pt >= 0 && m/pt <= 1 );
278  validForUncTool &= ( std::abs(eta) < 2 );
279  std::cout << "Pass: " << pass << std::endl;
280  std::cout << "Nominal SF=" << sf << " truthLabel=" << truthLabel << " (1: t->qqb) "
281  << jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_effSF")
282  << " "
283  << jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_efficiency")
284  << std::endl;
285  if( validForUncTool ){
286  for ( const CP::SystematicSet& sysSet : jetUnc_sysSets ){
287  ANA_CHECK( m_Tagger->tag( *jetSC ) );
288  ANA_CHECK( jetUncToolSF->applySystematicVariation(sysSet) );
289  ANA_CHECK( jetUncToolSF->applyCorrection(*jetSC) );
290  std::cout << sysSet.name() << " " << jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_SF") << std::endl;
291  }
292  }
293  }
294  }
295  }
296  }
297 
298  Info( APP_NAME, "===>>> done processing event #%i, run #%i %i events processed so far <<<===", static_cast< int >( evtInfo->eventNumber() ), static_cast< int >( evtInfo->runNumber() ), static_cast< int >( entry + 1 ) );
299  }
300 
304 
305  // write the tree to the output file
306  outputFile->cd();
307  Tree->Write();
308  outputFile->Close();
309 
310  // cleanup
311  delete chain;
312 
313  // print the branches that were used for help with smart slimming
314  std::cout<<std::endl<<std::endl;
315  std::cout<<"Smart Slimming Checker :"<<std::endl;
317  std::cout<<std::endl<<std::endl;
318 
319  return 0;
320 
321 }
TestSUSYToolsAlg.ifile
ifile
Definition: TestSUSYToolsAlg.py:92
CaloCondBlobAlgs_fillNoiseFromASCII.sysName
sysName
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:93
store
StoreGateSvc * store
Definition: fbtTestBasics.cxx:69
Amg::compare
std::pair< int, int > compare(const AmgSymMatrix(N) &m1, const AmgSymMatrix(N) &m2, double precision=1e-9, bool relative=false)
compare two matrices, returns the indices of the first element that fails the condition,...
Definition: EventPrimitivesHelpers.h:109
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
runLayerRecalibration.chain
chain
Definition: runLayerRecalibration.py:175
xAOD::EventInfo_v1::eventNumber
uint64_t eventNumber() const
The current event's event number.
xAOD::IOStats::stats
ReadStats & stats()
Access the object belonging to the current thread.
Definition: IOStats.cxx:17
Tree
Definition: Tree.h:18
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
xAOD::TEvent::kAthenaAccess
@ kAthenaAccess
Access containers/objects like Athena does.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:98
test_pyathena.pt
pt
Definition: test_pyathena.py:11
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
ANA_CHECK
#define ANA_CHECK(EXP)
check whether the given expression was successful
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:324
LArCellConditions.argv
argv
Definition: LArCellConditions.py:112
ZDCMsg::Info
@ Info
Definition: ZDCMsg.h:20
xAOD::EventInfo_v1::runNumber
uint32_t runNumber() const
The current event's run number.
compareGeometries.outputFile
string outputFile
Definition: compareGeometries.py:25
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
CheckAppliedSFs.e3
e3
Definition: CheckAppliedSFs.py:264
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
asg::StandaloneToolHandle::setProperty
StatusCode setProperty(const std::string &name, T2 &&value)
Definition: StandaloneToolHandle.h:105
lumiFormat.i
int i
Definition: lumiFormat.py:92
POOL::TEvent::getEntries
long getEntries()
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:123
JetUncertaintiesTool
Definition: JetUncertaintiesTool.h:44
asg::StandaloneToolHandle
an "initializing" ToolHandle for stand-alone applications
Definition: StandaloneToolHandle.h:44
APP_NAME
#define APP_NAME
Definition: BoostedXbbTag.cxx:23
python.StandardJetMods.pull
pull
Definition: StandardJetMods.py:264
python.AtlRunQueryLib.options
options
Definition: AtlRunQueryLib.py:379
CP::SystematicSet::getBaseNames
std::set< std::string > getBaseNames() const
description: get the set of base systematic names from this set
Definition: SystematicSet.cxx:159
DQHistogramMergeRegExp.argc
argc
Definition: DQHistogramMergeRegExp.py:20
xAOD::IOStats::instance
static IOStats & instance()
Singleton object accessor.
Definition: IOStats.cxx:11
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
asg::StandaloneToolHandle::retrieve
StatusCode retrieve()
initialize the tool, will succeed if the tool was already initialized
Definition: StandaloneToolHandle.h:147
xAOD::ReadStats::printSmartSlimmingBranchList
void printSmartSlimmingBranchList(bool autoIncludeLinks=false) const
Print the accessed variables, formatted for smart slimming.
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
xAOD::shallowCopyContainer
std::pair< std::unique_ptr< T >, std::unique_ptr< ShallowAuxContainer > > shallowCopyContainer(const T &cont, [[maybe_unused]] const EventContext &ctx)
Function making a shallow copy of a constant container.
Definition: ShallowCopy.h:110
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
asg::StandaloneToolHandle::setTypeAndName
void setTypeAndName(const std::string &typeAndName)
Definition: StandaloneToolHandle.h:101
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
xAOD::TStore
A relatively simple transient store for objects created in analysis.
Definition: TStore.h:44
mapkey::sf
@ sf
Definition: TElectronEfficiencyCorrectionTool.cxx:38
ANA_CHECK_SET_TYPE
#define ANA_CHECK_SET_TYPE(TYPE)
set the type for ANA_CHECK to report failures
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:314
POOL::TEvent::retrieve
StatusCode retrieve(const T *&obj)
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:73
python.TriggerHandler.verbose
verbose
Definition: TriggerHandler.py:297
DEBUG
#define DEBUG
Definition: page_access.h:11
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
entries
double entries
Definition: listroot.cxx:49
EventInfoRead.isMC
isMC
Definition: EventInfoRead.py:11
CxxUtils::atoi
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
Definition: Control/CxxUtils/Root/StringUtils.cxx:85
dqt_zlumi_alleff_HIST.eff
int eff
Definition: dqt_zlumi_alleff_HIST.py:113
L1Topo::Error
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition: Error.h:16
LArG4GenerateShowerLib.nevents
nevents
Definition: LArG4GenerateShowerLib.py:19
xAOD::TEvent
Tool for accessing xAOD files outside of Athena.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:81
JSSWTopTaggerDNN::tag
virtual StatusCode tag(const xAOD::Jet &jet) const override
Decorate single jet with tagging info.
Definition: JSSWTopTaggerDNN.cxx:208
xAOD::Init
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
Definition: Init.cxx:31