ATLAS Offline Software
CalibrationNtupleMakerTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
7 // CalibrationNtupleMakerTool.cxx, (c) ATLAS Detector software
9 
11 
12 #include "xAODJet/JetContainer.h"
14 
17 
19 
20 // Gaudi
21 #include "GaudiKernel/ITHistSvc.h"
22 #include "GaudiKernel/SystemOfUnits.h"
23 
24 // Root
25 #include "TTree.h"
26 #include "TString.h"
27 #include "TH1F.h"
28 
29 #include <vector>
30 
31 using Gaudi::Units::GeV;
32 
33 CalibrationNtupleMakerTool::CalibrationNtupleMakerTool(const std::string& name, ISvcLocator* pSvcLocator) :
34  AthAlgorithm(name, pSvcLocator),
35  m_treeFolder("/calibration/"),
36  m_treeDescription("Calibration Ntuple"),
37  m_truthJetContainerName("MyAntiKt10TruthJets"),
38  m_vertexContainerName("PrimaryVertices"),
39  m_recoIsoDR(1.5),
40  m_recoIsoPtCut(100.*GeV),
41  m_trueIsoDR(2.5),
42  m_trueIsoPtCut(100.*GeV),
43  m_matchingCut(0.6),
44  m_h_events(nullptr),
45  m_index(nullptr),
46  m_etaCalo(nullptr),
47  m_etaDetCalo(nullptr),
48  m_phiCalo(nullptr),
49  m_eCalo(nullptr),
50  m_mCalo(nullptr),
51  m_etaCorr(nullptr),
52  m_etaDetCorr(nullptr),
53  m_phiCorr(nullptr),
54  m_eCorr(nullptr),
55  m_mCorr(nullptr),
56  m_etaTrue(nullptr),
57  m_phiTrue(nullptr),
58  m_eTrue(nullptr),
59  m_mTrue(nullptr)
60  {
61  declareProperty("FolderName" , m_treeFolder);
62  declareProperty("Description", m_treeDescription);
63 
64  // the jets collections to calibrate
65  declareProperty("JetCollections" , m_collectionNames);
66  declareProperty("TruthJetContainerName", m_truthJetContainerName);
67  declareProperty("VertexContainerName" , m_vertexContainerName);
68 
69  declareProperty("RecoIsolationDR" , m_recoIsoDR);
70  declareProperty("RecoIsolationPtCut" , m_recoIsoPtCut);
71  declareProperty("TruthIsolationDR" , m_trueIsoDR);
72  declareProperty("TruthIsolationPtCut", m_trueIsoPtCut);
73  declareProperty("MatchingCut" , m_matchingCut);
74  }
75 
77 = default;
78 
80 {
81  ATH_MSG_INFO( "initialize()" );
82 
83  if (bookTree().isFailure()){
84  ATH_MSG_FATAL( "Could not book the TTree object" );
85  return StatusCode::FAILURE;
86  }
87 
89 
90  return StatusCode::SUCCESS;
91 }
92 
94 {
95  ATH_MSG_INFO( "bookTree()" );
96 
97 
98  for (auto& name : m_collectionNames) {
99 
100  // creating the tree for thw jet collection
101  TTree * tree = new TTree (name.c_str(), m_treeDescription.c_str());
102 
103  // add the branches
104  tree->Branch("EventWeight" , &m_eventWeight );
105 
106  tree->Branch("eta_calo" , &m_etaCalo );
107  tree->Branch("eta_det_calo" , &m_etaDetCalo );
108  tree->Branch("phi_calo" , &m_phiCalo );
109  tree->Branch("E_calo" , &m_eCalo );
110  tree->Branch("m_calo" , &m_mCalo );
111 
112  tree->Branch("eta_corr1" , &m_etaCorr );
113  tree->Branch("eta_det_corr1" , &m_etaDetCorr );
114  tree->Branch("phi_corr1" , &m_phiCorr );
115  tree->Branch("E_corr1" , &m_eCorr );
116  tree->Branch("m_corr1" , &m_mCorr );
117 
118  tree->Branch("eta_true" , &m_etaTrue );
119  tree->Branch("phi_true" , &m_phiTrue );
120  tree->Branch("E_true" , &m_eTrue );
121  tree->Branch("m_true" , &m_mTrue );
122 
123  tree->Branch("index" , &m_index );
124  tree->Branch("mu" , &m_mu );
125  tree->Branch("NPV" , &m_npv );
126 
127 
128  m_trees.insert(std::pair<std::string, TTree*>(name, tree));
129 
130  }
131 
132  // now register the Tree
133  ITHistSvc* tHistSvc = nullptr;
134  if (service("THistSvc",tHistSvc).isFailure()) {
135  ATH_MSG_ERROR( "initialize() Could not find Hist Service!" );
136  return StatusCode::FAILURE;
137  }
138 
139  if (tHistSvc) {
140  for (const auto& name : m_collectionNames) {
141  if((tHistSvc->regTree(m_treeFolder+name, m_trees.at(name))).isFailure()) {
142  ATH_MSG_ERROR( "initialize() Could not register the validation Tree!" );
143  return StatusCode::FAILURE;
144  }
145  }
146  }
147 
148  // now register the Event histogram
149  m_h_events = new TH1F("h_events","total events", 10, 0, 10);
150 
151  if (tHistSvc and (tHistSvc->regHist(m_treeFolder+m_h_events->GetName(), m_h_events)).isFailure()) {
152  ATH_MSG_ERROR( "Can not register histogram" << m_h_events->GetName() );
153  return StatusCode::FAILURE;
154  }
155 
156  ATH_MSG_INFO("Calibration Tree booked and registered successfully!");
157 
158  return StatusCode::SUCCESS;
159 
160 }
161 
163 {
164  m_h_events->Fill(0);
165 
167  if(!evt.isValid()) {
168  ATH_MSG_FATAL( "Unable to retrieve Event Info" );
169  }
170  float ev_weight = evt->mcEventWeight();
171 
172  const auto *const truths = getContainer<xAOD::JetContainer>(m_truthJetContainerName);
173  if (not truths) return StatusCode::FAILURE;
174 
175  const auto *const vertices = getContainer<xAOD::VertexContainer>(m_vertexContainerName);
176  if (not vertices) return StatusCode::FAILURE;
177 
178  // get mu
179  float mu= evt->averageInteractionsPerCrossing();
180 
181  //get NPV
182  float npv = 0.;
183 
184  for (const auto& vertex : *vertices) {
185  if (vertex->nTrackParticles()>=2)
186  npv++;
187  }
188 
189  for (auto& name : m_collectionNames) {
190  const auto *const jets = getContainer<xAOD::JetContainer>(name);
191 
192  m_etaCalo ->clear();
193  m_etaDetCalo ->clear();
194  m_phiCalo ->clear();
195  m_eCalo ->clear();
196  m_mCalo ->clear();
197  m_etaCorr ->clear();
198  m_etaDetCorr ->clear();
199  m_phiCorr ->clear();
200  m_eCorr ->clear();
201  m_mCorr ->clear();
202  m_etaTrue ->clear();
203  m_phiTrue ->clear();
204  m_eTrue ->clear();
205  m_mTrue ->clear();
206  m_index ->clear();
207 
208  for (const auto& truth: *truths) {
209 
210  // here we match to the reco
211  int index = 0;
212  std::vector<const xAOD::Jet*> matched = {};
213 
214  int Nmatches = Matched(truth, jets, matched, index);
215 
216  // skip truth jets that don't match any reco jets
217  if (Nmatches==0) continue;
218 
219  // skip the jets that are not isolated
220  if ( m_recoIsoDR > 0 ) {
221  double DRminReco = DRmin(matched.at(0),jets,m_recoIsoPtCut);
222  if ( DRminReco < m_recoIsoDR ) continue;
223  }
224 
225  if ( m_trueIsoDR > 0 ) {
226  double DRminTruth = DRmin(truth,truths,m_trueIsoPtCut);
227  if ( DRminTruth < m_trueIsoDR ) continue;
228  }
229 
230  //Storing variables
231  m_etaTrue->push_back(truth->eta());
232  m_phiTrue->push_back(truth->phi());
233  m_mTrue->push_back(truth->m()/GeV);
234  m_eTrue->push_back(truth->e()/GeV);
235 
236  m_etaCalo->push_back(jets->at(index)->eta());
237  m_phiCalo->push_back(jets->at(index)->phi());
238  m_mCalo->push_back(jets->at(index)->m()/GeV);
239  m_eCalo->push_back(jets->at(index)->e()/GeV);
240 
241  float detectorEta = DetectorEta(jets->at(index));
242  m_etaDetCalo->push_back(detectorEta);
243 
244  m_etaCorr->push_back(jets->at(index)->eta());
245  m_phiCorr->push_back(jets->at(index)->phi());
246  m_mCorr->push_back(jets->at(index)->m()/GeV);
247  m_eCorr->push_back(jets->at(index)->e()/GeV);
248  m_etaDetCorr->push_back(detectorEta);
249 
250  m_index->push_back(index);
251 
252  }
253 
254  m_eventWeight = ev_weight;
255  m_mu = mu;
256  m_npv = npv;
257 
258  m_trees.at(name)->Fill();
259 
260  }
261 
262  return StatusCode::SUCCESS;
263 
264 }
265 
266 int CalibrationNtupleMakerTool::Matched(const xAOD::Jet* truth, const xAOD::JetContainer* jets, std::vector<const xAOD::Jet*>& matched, int& index) const {
267 
268  int Nmatches = 0;
269  double drmin = 999.;
270  int Min_index=-1;
271 
272  for (unsigned int ind = 0; ind < jets->size(); ind++) {
273  double dr = truth->p4().DeltaR(jets->at(ind)->p4());
274  if (dr < m_matchingCut) ++Nmatches;
275  //find minimum:
276  if (dr < drmin) {
277  drmin = dr;
278  Min_index = ind;
279  }
280  }
281 
282  if (drmin<m_matchingCut) {
283  matched.push_back(jets->at(Min_index));
284  index = Min_index;
285  }
286 
287  return Nmatches;
288 }
289 
291 
292  double DRmin=9999;
293  for (const auto& jet : *jets) {
294  if (PtMin>0. and jet->pt()<PtMin) continue;
295  double Dr = myjet->p4().DeltaR(jet->p4());
296  if (Dr>0.0001 and Dr<DRmin)
297  DRmin=Dr;
298  }
299  return DRmin;
300 }
301 
303 
304  xAOD::IParticle::FourMom_t corrP4(0,0,0,0);
305 
306  const auto& partLinks = jet->constituentLinks();
307  for (const xAOD::IParticleLink& link : partLinks) {
308 
309  if (not link.isValid()) {
310  ATH_MSG_WARNING("Got an invalid element link. Returning jet eta...");
311  return jet->eta();
312  }
313 
314  const xAOD::TrackCaloCluster* tcc = dynamic_cast<const xAOD::TrackCaloCluster*>(*link);
315 
316  static const SG::AuxElement::Accessor< float > acc_detEta( "DetectorEta" );
317  float det_eta = tcc->eta();
318 
319  if (acc_detEta.isAvailable(*tcc)) {
320  det_eta = acc_detEta(*tcc);
321  } else
322  ATH_MSG_WARNING("DetectorEta decoration not found for TCCs! Using eta...");
323 
324  double pt = tcc->p4().P()/cosh(det_eta);
325 
327  p4CorrCl.SetPtEtaPhiE(pt, det_eta, tcc->p4().Phi(), tcc->p4().E());
328  if(tcc->p4().E() < 0.) p4CorrCl*=-1.;
329  corrP4 += p4CorrCl;
330  }
331 
332  return corrP4.Eta();
333 }
334 
336 {
337  ATH_MSG_INFO( "finalize()" );
338 
339  delete m_index;
340 
341  delete m_etaCalo;
342  delete m_etaDetCalo;
343  delete m_phiCalo;
344  delete m_eCalo;
345  delete m_mCalo;
346 
347  delete m_etaCorr;
348  delete m_etaDetCorr;
349  delete m_phiCorr;
350  delete m_eCorr;
351  delete m_mCorr;
352 
353  delete m_etaTrue;
354  delete m_phiTrue;
355  delete m_eTrue;
356  delete m_mTrue;
357 
358  return StatusCode::SUCCESS;
359 
360 }
CalibrationNtupleMakerTool::m_trueIsoDR
double m_trueIsoDR
Definition: CalibrationNtupleMakerTool.h:62
CalibrationNtupleMakerTool::initialize
StatusCode initialize()
standard Athena-Algorithm method
Definition: CalibrationNtupleMakerTool.cxx:79
CalibrationNtupleMakerTool::m_etaDetCalo
std::vector< double > * m_etaDetCalo
Definition: CalibrationNtupleMakerTool.h:76
CalibrationNtupleMakerTool::m_collectionNames
std::vector< std::string > m_collectionNames
Definition: CalibrationNtupleMakerTool.h:52
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:66
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
index
Definition: index.py:1
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
CalibrationNtupleMakerTool::m_etaCorr
std::vector< double > * m_etaCorr
Definition: CalibrationNtupleMakerTool.h:81
CalibrationNtupleMakerTool::m_recoIsoPtCut
double m_recoIsoPtCut
Definition: CalibrationNtupleMakerTool.h:61
xAOD::TrackCaloCluster_v1
Class describing a TrackCaloCluster.
Definition: TrackCaloCluster_v1.h:25
CalibrationNtupleMakerTool::m_etaCalo
std::vector< double > * m_etaCalo
Definition: CalibrationNtupleMakerTool.h:75
tree
TChain * tree
Definition: tile_monitor.h:30
CalibrationNtupleMakerTool::~CalibrationNtupleMakerTool
virtual ~CalibrationNtupleMakerTool()
Default Destructor.
TrackCaloClusterContainer.h
CalibrationNtupleMakerTool::DRmin
static double DRmin(const xAOD::Jet *myjet, const xAOD::JetContainer *jets, double PtMin)
Definition: CalibrationNtupleMakerTool.cxx:290
test_pyathena.pt
pt
Definition: test_pyathena.py:11
CalibrationNtupleMakerTool::m_evt
SG::ReadHandleKey< xAOD::EventInfo > m_evt
Definition: CalibrationNtupleMakerTool.h:93
CalibrationNtupleMakerTool::m_eTrue
std::vector< double > * m_eTrue
Definition: CalibrationNtupleMakerTool.h:89
xAOD::TrackCaloCluster_v1::p4
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition: TrackCaloCluster_v1.cxx:36
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
python.TurnDataReader.dr
dr
Definition: TurnDataReader.py:112
RunExEngineTest.PtMin
PtMin
Definition: RunExEngineTest.py:49
xAOD::IParticle::FourMom_t
TLorentzVector FourMom_t
Definition of the 4-momentum type.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:68
CalibrationNtupleMakerTool::m_vertexContainerName
std::string m_vertexContainerName
Definition: CalibrationNtupleMakerTool.h:58
xAOD::TrackCaloCluster_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
CalibrationNtupleMakerTool::m_index
std::vector< int > * m_index
Definition: CalibrationNtupleMakerTool.h:73
CalibrationNtupleMakerTool::m_trueIsoPtCut
double m_trueIsoPtCut
Definition: CalibrationNtupleMakerTool.h:63
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CalibrationNtupleMakerTool::finalize
StatusCode finalize()
standard Athena-Algorithm method
Definition: CalibrationNtupleMakerTool.cxx:335
CalibrationNtupleMakerTool::m_treeFolder
std::string m_treeFolder
Definition: CalibrationNtupleMakerTool.h:54
CalibrationNtupleMakerTool::m_phiTrue
std::vector< double > * m_phiTrue
Definition: CalibrationNtupleMakerTool.h:88
CalibrationNtupleMakerTool::m_eventWeight
float m_eventWeight
Definition: CalibrationNtupleMakerTool.h:69
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CalibrationNtupleMakerTool::m_npv
float m_npv
Definition: CalibrationNtupleMakerTool.h:71
CalibrationNtupleMakerTool::m_recoIsoDR
double m_recoIsoDR
Definition: CalibrationNtupleMakerTool.h:60
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CalibrationNtupleMakerTool::m_mCorr
std::vector< double > * m_mCorr
Definition: CalibrationNtupleMakerTool.h:85
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
TH1::Fill
int Fill(double)
Definition: rootspy.cxx:285
CalibrationNtupleMakerTool::m_treeDescription
std::string m_treeDescription
Definition: CalibrationNtupleMakerTool.h:55
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
AthAlgorithm
Definition: AthAlgorithm.h:47
CalibrationNtupleMakerTool::DetectorEta
float DetectorEta(const xAOD::Jet *jet)
Definition: CalibrationNtupleMakerTool.cxx:302
Dr
double Dr
Definition: LArDetectorConstructionTBEC.cxx:55
CalibrationNtupleMakerTool::m_eCorr
std::vector< double > * m_eCorr
Definition: CalibrationNtupleMakerTool.h:84
CalibrationNtupleMakerTool.h
CalibrationNtupleMakerTool::m_phiCalo
std::vector< double > * m_phiCalo
Definition: CalibrationNtupleMakerTool.h:77
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
CalibrationNtupleMakerTool::m_trees
std::map< std::string, TTree * > m_trees
Definition: CalibrationNtupleMakerTool.h:53
CalibrationNtupleMakerTool::bookTree
virtual StatusCode bookTree()
Definition: CalibrationNtupleMakerTool.cxx:93
python.ElectronD3PDObject.matched
matched
Definition: ElectronD3PDObject.py:138
CalibrationNtupleMakerTool::m_h_events
TH1 * m_h_events
Definition: CalibrationNtupleMakerTool.h:67
CalibrationNtupleMakerTool::Matched
int Matched(const xAOD::Jet *truth, const xAOD::JetContainer *jets, std::vector< const xAOD::Jet * > &matched, int &index) const
Definition: CalibrationNtupleMakerTool.cxx:266
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
xAOD::Jet_v1::p4
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition: Jet_v1.cxx:71
VertexContainer.h
JetContainer.h
CalibrationNtupleMakerTool::m_eCalo
std::vector< double > * m_eCalo
Definition: CalibrationNtupleMakerTool.h:78
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CalibrationNtupleMakerTool::m_mCalo
std::vector< double > * m_mCalo
Definition: CalibrationNtupleMakerTool.h:79
CalibrationNtupleMakerTool::execute
StatusCode execute()
standard Athena-Algorithm method
Definition: CalibrationNtupleMakerTool.cxx:162
CalibrationNtupleMakerTool::m_truthJetContainerName
std::string m_truthJetContainerName
Definition: CalibrationNtupleMakerTool.h:57
CalibrationNtupleMakerTool::m_phiCorr
std::vector< double > * m_phiCorr
Definition: CalibrationNtupleMakerTool.h:83
CalibrationNtupleMakerTool::m_mTrue
std::vector< double > * m_mTrue
Definition: CalibrationNtupleMakerTool.h:90
SG::ConstAccessor< T, AuxAllocator_t< T > >::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
CalibrationNtupleMakerTool::m_etaDetCorr
std::vector< double > * m_etaDetCorr
Definition: CalibrationNtupleMakerTool.h:82
python.TrigEgammaMonitorHelper.TH1F
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:24
CalibrationNtupleMakerTool::m_matchingCut
double m_matchingCut
Definition: CalibrationNtupleMakerTool.h:65
CalibrationNtupleMakerTool::CalibrationNtupleMakerTool
CalibrationNtupleMakerTool(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena-Algorithm Constructor.
Definition: CalibrationNtupleMakerTool.cxx:33
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
CalibrationNtupleMakerTool::m_etaTrue
std::vector< double > * m_etaTrue
Definition: CalibrationNtupleMakerTool.h:87
checkFileSG.ind
list ind
Definition: checkFileSG.py:118
CalibrationNtupleMakerTool::m_mu
float m_mu
Definition: CalibrationNtupleMakerTool.h:70