ATLAS Offline Software
Macros | Functions
InDetTrackSystsToolTester.cxx File Reference
#include <memory>
#include <cstdlib>
#include <TFile.h>
#include <TError.h>
#include <TString.h>
#include <TH1.h>
#include "xAODEventInfo/EventInfo.h"
#include "xAODTracking/TrackParticleContainer.h"
#include "InDetTrackSystematicsTools/InDetTrackSmearingTool.h"
#include "InDetTrackSystematicsTools/InDetTrackBiasingTool.h"
#include "InDetTrackSystematicsTools/InDetTrackTruthFilterTool.h"
#include "InDetTrackSystematicsTools/InDetTrackTruthOriginTool.h"
#include "InDetTrackSystematicsTools/JetTrackFilterTool.h"
#include "xAODCore/tools/IOStats.h"
#include "xAODCore/tools/ReadStats.h"
#include "xAODCore/ShallowCopy.h"

Go to the source code of this file.

Macros

#define CHECK(ARG)
 

Functions

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

Macro Definition Documentation

◆ CHECK

#define CHECK (   ARG)
Value:
do { \
const bool result = ARG; \
if( ! result ) { \
::Error( APP_NAME, "Failed to execute: \"%s\"", \
#ARG ); \
return 1; \
} \
} while( false )

Definition at line 42 of file InDetTrackSystsToolTester.cxx.

Function Documentation

◆ main()

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

comment / uncomment these lines to test

Configure and initialise the tool(s):

Definition at line 52 of file InDetTrackSystsToolTester.cxx.

52  {
53 
54  // The application's name:
55  const char* APP_NAME = argv[ 0 ];
56  std::string fileName;
57  // Check if we received a file name:
58  if( argc < 2 ) {
59  fileName = std::getenv("ROOTCORE_TEST_FILE");
60  if (fileName.empty()) Error( APP_NAME, "Could not open $ROOTCORE_TEST_FILE" );
61  } else {
62  fileName = argv[ 1 ];
63  }
64 
65  StatusCode::enableFailure();
67  StatusCode::enableFailure();
68 
69  // Initialise the application:
71 
72  // Open the input file:
73  Info( APP_NAME, "Opening file: %s", fileName.data() );
74  std::unique_ptr< TFile > ifile( TFile::Open( fileName.data(), "READ" ) );
75  CHECK( ifile.get() );
76 
77  // Create a TEvent object:
78  // xAOD::TEvent event( xAOD::TEvent::kClassAccess );
79  xAOD::TEvent event( xAOD::TEvent::kAthenaAccess ); // at time of writing this is required for the rootcore test file
80  CHECK( event.readFrom( ifile.get() ) );
81  Info( APP_NAME, "Number of events in the file: %i",
82  static_cast< int >( event.getEntries() ) );
83 
84  // Create a transient object store. Needed for the tools.
86 
87  // Decide how many events to run over:
88  Long64_t entries = event.getEntries();
89  if( argc > 2 ) {
90  const Long64_t e = atoll( argv[ 2 ] );
91  if( e < entries ) {
92  entries = e;
93  }
94  } else {
95  // set maximum to 500
96  if (entries > 500) entries = 500;
97  }
98 
99  // Create the tool(s) to test:
100  InDet::InDetTrackSmearingTool smearingTool( "InDetTrackSmearingTool" );
101 
102  InDet::InDetTrackBiasingTool biasingTool( "InDetTrackBiasingTool" );
104  // CHECK( biasingTool.setProperty( "isData", true ) ); // override to test, since ROOTCORE_TEST_FILE is simluation
105  // uint32_t testRunNumber = 287000;
106  // CHECK( biasingTool.setProperty( "runNumber", testRunNumber ) ); // this line is only for testing that other files are properly accessible
107 
108  InDet::InDetTrackTruthFilterTool filterTool( "InDetTrackFilterTool" );
109  auto originTool = std::make_unique<InDet::InDetTrackTruthOriginTool> ( "InDetTrackTruthOriginTool" );
110  CHECK( originTool->initialize() );
111  ToolHandle< InDet::IInDetTrackTruthOriginTool > trackTruthOriginToolHandle( originTool.get() );
112  CHECK( filterTool.setProperty("trackOriginTool", trackTruthOriginToolHandle) );
113 
114  InDet::JetTrackFilterTool jetFilterTool( "JetTrackFilterTool" );
115  CHECK( jetFilterTool.setProperty("trackOriginTool", trackTruthOriginToolHandle) );
116 
117  // Not a realistic set of systematics - we just want to make sure they can all be applied without breaking the tools
118  CP::SystematicSet systSet = {
119  CP::SystematicVariation("TRK_RES_D0_MEAS", -1),
120  CP::SystematicVariation("TRK_RES_Z0_MEAS", -1),
121  CP::SystematicVariation("TRK_BIAS_D0_WM"),
122  CP::SystematicVariation("TRK_BIAS_Z0_WM"),
123  CP::SystematicVariation("TRK_BIAS_QOVERP_SAGITTA_WM"),
124  CP::SystematicVariation("TRK_FAKE_RATE_LOOSE"),
125  // CP::SystematicVariation("TRK_FAKE_RATE_TIGHT"), // have to pick one of these, and TIGHT isn't implemented yet
126  CP::SystematicVariation("TRK_EFF_LOOSE_GLOBAL"),
127  CP::SystematicVariation("TRK_EFF_LOOSE_IBL"),
128  CP::SystematicVariation("TRK_EFF_LOOSE_PP0"),
129  CP::SystematicVariation("TRK_EFF_LOOSE_PHYSMODEL"),
130  // CP::SystematicVariation("TRK_EFF_TIGHT_GLOBAL"),
131  // CP::SystematicVariation("TRK_EFF_TIGHT_IBL"),
132  // CP::SystematicVariation("TRK_EFF_TIGHT_PP0"),
133  // CP::SystematicVariation("TRK_EFF_TIGHT_PHYSMODEL"),
134  CP::SystematicVariation("TRK_EFF_LOOSE_TIDE"),
135  CP::SystematicVariation("TRK_FAKE_RATE_LOOSE_TIDE")
136  };
137  std::vector< InDet::InDetTrackSystematicsTool* > tools = {&smearingTool, &biasingTool, &filterTool, &jetFilterTool};
138 
141  tool->msg().setLevel( MSG::DEBUG );
142  CHECK( tool->initialize() );
143  auto systCode = tool->applySystematicVariation(systSet);
144  if (systCode != StatusCode::SUCCESS) {
145  Error( APP_NAME, "Failed to apply systematic variation on tool %s", tool->name().data() );
146  return 2;
147  }
148  }
149 
150  bool doTIDE = true;
151  std::string jetCollectionName = "AntiKt4EMTopoJets";
152  if ( !event.contains< xAOD::JetContainer >( jetCollectionName ) ) doTIDE = false;
153 
154  auto outfile = std::make_unique<TFile>("InDetTrackSystsToolTester.out.root","RECREATE");
155 
156  TH1* d0_before = new TH1F("d0_before","original d_{0}",100,-5,5);
157  TH1* z0_before = new TH1F("z0_before","original z_{0}",100,-200,200);
158  TH1* qOverP_before = new TH1F("qOverP_before", "original q/p", 200, -0.05, 0.05);
159  TH1* d0_after = new TH1F("d0_after","d_{0} after",100,-5,5);
160  TH1* z0_after = new TH1F("z0_after","z_{0} after",100,-200,200);
161  TH1* qOverP_after = new TH1F("qOverP_after", "q/p after", 200, -0.05, 0.05);
162  TH1* d0_diff = new TH1F("d0_diff","#delta d_{0}",100,-1.0,1.0);
163  TH1* z0_diff = new TH1F("z0_diff","#delta z_{0}",100,-10.0,10.0);
164  TH1* qOverP_diff = new TH1F("qOverP_diff", "#delta q/p", 200, -1.e-5, 1.e-5);
165 
166  bool isSim = true;
167  const xAOD::EventInfo* ei = nullptr;
168  auto sc = event.retrieve( ei, "EventInfo" );
169  if ( ! sc.isSuccess() ) {
170  Error( __func__, "Could not retreive event ahead of time to detect data/MC" );
171  } else {
173  }
174 
175 
176  int debugN = 8; // number of tracks to print debug output for
177  // Loop over the events:
178  for( Long64_t entry = 0; entry < entries; ++entry ) {
179 
180  // Tell the object which entry to look at:
181  event.getEntry( entry );
182 
183  // Create a shallow copy of InDetTrackParticles:
184  const xAOD::TrackParticleContainer* ParticlesID = nullptr;
185  CHECK( event.retrieve( ParticlesID , "InDetTrackParticles" ) );
186 
187  const xAOD::JetContainer* jets = nullptr;
188  if (doTIDE) {
189  CHECK( event.retrieve( jets, jetCollectionName ) );
190  }
191 
192  std::pair< xAOD::TrackParticleContainer*, xAOD::ShallowAuxContainer* > ParticlesID_shallowCopy = xAOD::shallowCopyContainer( *ParticlesID );
193  for ( xAOD::TrackParticle* trkCpy : *(ParticlesID_shallowCopy.first) ) {
194 
195  if ( isSim ) {
196  if ( !filterTool.accept(trkCpy) ) continue;
197  }
198  if ( doTIDE && !jetFilterTool.accept( trkCpy, jets ) ) continue;
199 
200  auto d0b = trkCpy->d0();
201  auto z0b = trkCpy->z0();
202  auto qOverPb = trkCpy->qOverP();
203 
204  if (biasingTool.applyCorrection(*trkCpy) == CP::CorrectionCode::Error) {
205  Error(__func__, "Could not apply bias correction!" );
206  }
207  if (smearingTool.applyCorrection(*trkCpy) == CP::CorrectionCode::Error) {
208  Error(__func__, "Could not apply smearing correction!" );
209  }
210 
211  auto d0a = trkCpy->d0();
212  auto z0a = trkCpy->z0();
213  auto qOverPa = trkCpy->qOverP();
214  auto d0d = d0a - d0b;
215  auto z0d = z0a - z0b;
216  auto qOverPd = qOverPa - qOverPb;
217 
218  if (debugN > 0) {
219  std::cout << "d0, before/after/diff:\t" << d0b
220  << "/" << d0a << "/" << d0d << std::endl;
221  std::cout << "z0, before/after/diff:\t" << z0b
222  << "/" << z0a << "/" << z0d << std::endl;
223  std::cout << "q/p, before/after/diff:\t" << qOverPb
224  << "/" << qOverPa << "/" << qOverPd << std::endl;
225  --debugN;
226  }
227  if (debugN == 0) {
228  std::cout << "supressing debug output..." << std::endl;
229  --debugN;
230  }
231 
232  d0_before->Fill( d0b );
233  z0_before->Fill( z0b );
234  qOverP_before->Fill( qOverPb );
235  d0_after->Fill( d0a );
236  z0_after->Fill( z0a );
237  qOverP_after->Fill( qOverPa );
238  d0_diff->Fill( d0d );
239  z0_diff->Fill( z0d );
240  qOverP_diff->Fill( qOverPd );
241  }
242 
243  delete ParticlesID_shallowCopy.first;
244  delete ParticlesID_shallowCopy.second;
245 
246  }
247 
248  outfile->Write();
249 
250  // testing smart slimming feature:
252 
253  // Return gracefully:
254  return 0;
255 }
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
SGTest::store
TestStore store
Definition: TestStore.cxx:23
InDet::InDetTrackSystematicsTool
Definition: InDetTrackSystematicsTool.h:22
get_generator_info.result
result
Definition: get_generator_info.py:21
xAOD::IOStats::stats
ReadStats & stats()
Access the object belonging to the current thread.
Definition: IOStats.cxx:17
CP::CorrectionCode::enableFailure
static void enableFailure() noexcept
Definition: CorrectionCode.h:64
xAOD::TEvent::kAthenaAccess
@ kAthenaAccess
Access containers/objects like Athena does.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:102
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
defineDB.jets
jets
Definition: JetTagCalibration/share/defineDB.py:24
CP::SystematicVariation
Definition: SystematicVariation.h:47
InDet::InDetTrackSmearingTool
Definition: InDetTrackSmearingTool.h:33
ZDCMsg::Info
@ Info
Definition: ZDCMsg.h:20
xAOD::EventInfo_v1::IS_SIMULATION
@ IS_SIMULATION
true: simulation, false: data
Definition: EventInfo_v1.h:151
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
POOL::TEvent::contains
PyObject * contains(PyObject *tp, PyObject *pykey)
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:212
CP::CorrectionCode::Error
@ Error
Some error happened during the object correction.
Definition: CorrectionCode.h:36
POOL::TEvent::readFrom
StatusCode readFrom(TFile *file)
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:133
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
CHECK
#define CHECK(ARG)
Definition: InDetTrackSystsToolTester.cxx:41
POOL::TEvent::getEntries
long getEntries()
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:124
LArCellNtuple.argv
argv
Definition: LArCellNtuple.py:152
InDet::InDetTrackBiasingTool
Definition: InDetTrackBiasingTool.h:36
APP_NAME
#define APP_NAME
Definition: BoostedXbbTag.cxx:23
DQHistogramMergeRegExp.argc
argc
Definition: DQHistogramMergeRegExp.py:19
xAOD::IOStats::instance
static IOStats & instance()
Singleton object accessor.
Definition: IOStats.cxx:11
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
xAOD::ReadStats::printSmartSlimmingBranchList
void printSmartSlimmingBranchList(bool autoIncludeLinks=false) const
Print the accessed variables, formatted for smart slimming.
InDet::JetTrackFilterTool
Definition: JetTrackFilterTool.h:38
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
tools
Definition: DataQuality/ZLumiScripts/python/tools/__init__.py:1
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:452
InDet::InDetTrackTruthFilterTool
Definition: InDetTrackTruthFilterTool.h:36
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
xAOD::TStore
A relatively simple transient store for objects created in analysis.
Definition: TStore.h:47
SCT_ConditionsAlgorithms::CoveritySafe::getenv
std::string getenv(const std::string &variableName)
get an environment variable
Definition: SCT_ConditionsUtilities.cxx:17
POOL::TEvent::retrieve
StatusCode retrieve(const T *&obj)
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:74
DEBUG
#define DEBUG
Definition: page_access.h:11
entries
double entries
Definition: listroot.cxx:49
L1Topo::Error
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition: Error.h:16
python.TrigEgammaMonitorHelper.TH1F
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:24
LArCellNtuple.ifile
string ifile
Definition: LArCellNtuple.py:133
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
jobOptions.fileName
fileName
Definition: jobOptions.SuperChic_ALP2.py:39
PrepareReferenceFile.outfile
outfile
Definition: PrepareReferenceFile.py:42
xAOD::TEvent
Tool for accessing xAOD files outside of Athena.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:85
xAOD::EventInfo_v1::eventType
bool eventType(EventType type) const
Check for one particular bitmask value.
xAOD::Init
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
Definition: Init.cxx:31