ATLAS Offline Software
CaloMuonTag.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "CaloMuonTag.h"
6 
9 #include "TFile.h"
10 #include "TH2F.h"
12 // Constructor
14 CaloMuonTag::CaloMuonTag(const std::string& type, const std::string& name, const IInterface* pInterface) :
15  AthAlgTool(type, name, pInterface) {
16  declareInterface<ICaloMuonTag>(this);
17  declareProperty("TagMode", m_tagMode = "Tight");
18 }
19 
21 // Destructor
23 CaloMuonTag::~CaloMuonTag() = default;
24 
26 // initialize
29  // Retrieve histogram
30  std::string rootFilePath = PathResolverFindCalibFile("CaloTrkMuIdTools/cutBased_release21/CaloTag.CutConfig.root");
31 
32  std::unique_ptr<TFile> rootFile{TFile::Open(rootFilePath.c_str(), "READ")};
34  // Read cut names from histogram
35  m_numCuts = m_hist->GetYaxis()->GetNbins();
36  if (m_numCuts == 0) {
37  ATH_MSG_FATAL("Histogram number of cuts invalid");
38  return StatusCode::FAILURE;
39  }
40  for (int i = 0; i <= m_numCuts; i++) { m_vecCutNames.push_back(m_hist->GetYaxis()->GetBinLabel(i)); }
41  // Read pt bins from histogram
42  m_numPtBins = m_hist->GetXaxis()->GetNbins();
43  if (m_numPtBins == 0) {
44  ATH_MSG_FATAL("Histogram number of pt bins invalid");
45  return StatusCode::FAILURE;
46  }
47  for (int i = 0; i <= m_numPtBins; i++) { m_vecPtBins.push_back(atoi(m_hist->GetXaxis()->GetBinLabel(i))); }
48  ATH_MSG_DEBUG("initialize() successful in " << name());
49  return StatusCode::SUCCESS;
50 }
51 
53 // getHist
55 StatusCode CaloMuonTag::getHist(TFile* file, const std::string& histName, std::unique_ptr<TH2>& unique_hist) {
56  if (!file) {
57  ATH_MSG_ERROR("NULL TFile");
58  return StatusCode::FAILURE;
59  }
60  TH2* hist = nullptr;
61  file->GetObject(histName.c_str(), hist);
62  if (!hist) {
63  ATH_MSG_ERROR("Cannot retrieve histogram: " << histName);
64  return StatusCode::FAILURE;
65  }
66  hist->SetDirectory(nullptr);
67  unique_hist.reset(hist);
68  ATH_MSG_INFO("Successfully retrieved histogram: " << histName);
69  return StatusCode::SUCCESS;
70 }
71 
73 // finalize
76  ATH_MSG_INFO("Number of tracks tagged : " << m_numTagged);
77  ATH_MSG_INFO("Number of tracks rejected : " << m_numRejected);
78  ATH_MSG_DEBUG("finalize() successful in " << name());
79  return StatusCode::SUCCESS;
80 }
81 
83 // caloMuonTag
85 int CaloMuonTag::caloMuonTag(const std::vector<DepositInCalo>& deposits, double /*eta*/, double pt) const {
86  std::vector<DepositInCalo>::const_iterator it = deposits.begin();
87  int numVetoesTriggered = 0;
88  int tag = 4;
89  for (; it != deposits.end(); ++it) {
90  CaloCell_ID::CaloSample sample = it->subCaloId();
91  double dep = it->energyDeposited();
92  double eLoss = it->muonEnergyLoss();
93  double diff = dep - eLoss;
94 
95  if (sample == CaloCell_ID::EMB1) {
96  if (dep > interpolate("emb1Veto", pt)) { numVetoesTriggered++; }
97  }
98  if (sample == CaloCell_ID::EMB2) {
99  if (dep > interpolate("emb2Veto", pt)) { numVetoesTriggered++; }
100  }
101  if (sample == CaloCell_ID::EMB3) {
102  if (dep > interpolate("emb3Veto", pt)) { numVetoesTriggered++; }
103  }
104  if (sample == CaloCell_ID::EME1) {
105  if (dep > interpolate("eme1Veto", pt)) { numVetoesTriggered++; }
106  }
107  if (sample == CaloCell_ID::EME2) {
108  if (dep > interpolate("eme2Veto", pt)) { numVetoesTriggered++; }
109  }
110  if (sample == CaloCell_ID::EME3) {
111  if (dep > interpolate("eme3Veto", pt)) { numVetoesTriggered++; }
112  }
113  if (sample == CaloCell_ID::TileBar0) {
114  if (tag > 3) tag = 3;
115  if (dep < interpolate("tileBar0Sig", pt)) { numVetoesTriggered++; }
116  if (dep > interpolate("tileBar0Veto", pt)) { numVetoesTriggered++; }
117  if (diff < interpolate("tileBar0DiffLow", pt)) { numVetoesTriggered++; }
118  }
119  if (sample == CaloCell_ID::TileBar1) {
120  if (tag > 2) tag = 2;
121  if (dep < interpolate("tileBar1Sig", pt)) { numVetoesTriggered++; }
122  if (dep > interpolate("tileBar1Veto", pt)) { numVetoesTriggered++; }
123  if (diff < interpolate("tileBar1DiffLow", pt)) { numVetoesTriggered++; }
124  }
125  if (sample == CaloCell_ID::TileBar2) {
126  if (tag > 1) tag = 1;
127  if (dep < interpolate("tileBar2Sig", pt)) { numVetoesTriggered++; }
128  if (dep > interpolate("tileBar2Veto", pt)) { numVetoesTriggered++; }
129  if (diff < interpolate("tileBar2DiffLow", pt)) { numVetoesTriggered++; }
130  }
131  if (sample == CaloCell_ID::TileExt0) {
132  if (tag > 3) tag = 3;
133  if (dep < interpolate("tileExt0Sig", pt)) { numVetoesTriggered++; }
134  if (diff < interpolate("tileExt0DiffLow", pt)) { numVetoesTriggered++; }
135  if (dep > interpolate("tileExt0Veto", pt)) { numVetoesTriggered++; }
136  }
137  if (sample == CaloCell_ID::TileExt1) {
138  if (tag > 2) tag = 2;
139  if (dep < interpolate("tileExt1Sig", pt)) { numVetoesTriggered++; }
140  if (diff < interpolate("tileExt1DiffLow", pt)) { numVetoesTriggered++; }
141  if (dep > interpolate("tileExt1Veto", pt)) { numVetoesTriggered++; }
142  }
143  if (sample == CaloCell_ID::TileExt2) {
144  if (tag > 1) tag = 1;
145  if (dep < interpolate("tileExt2Sig", pt)) { numVetoesTriggered++; }
146  if (diff < interpolate("tileExt2DiffLow", pt)) { numVetoesTriggered++; }
147  if (dep > interpolate("tileExt2Veto", pt)) { numVetoesTriggered++; }
148  }
149  if (sample == CaloCell_ID::HEC0) {
150  if (dep > interpolate("hec0Veto", pt)) { numVetoesTriggered++; }
151  if (dep < interpolate("hec0Sig", pt)) { numVetoesTriggered++; }
152  }
153  if (sample == CaloCell_ID::HEC1) {
154  if (tag > 3) tag = 3;
155  if (dep > interpolate("hec1Veto", pt)) { numVetoesTriggered++; }
156  if (dep < interpolate("hec1Sig", pt)) { numVetoesTriggered++; }
157  }
158  if (sample == CaloCell_ID::HEC2) {
159  if (tag > 2) tag = 2;
160  if (dep > interpolate("hec2Veto", pt)) { numVetoesTriggered++; }
161  if (dep < interpolate("hec2Sig", pt)) { numVetoesTriggered++; }
162  }
163  if (sample == CaloCell_ID::HEC3) {
164  if (tag > 1) tag = 1;
165  if (dep > interpolate("hec3Veto", pt)) { numVetoesTriggered++; }
166  if (dep < interpolate("hec3Sig", pt)) { numVetoesTriggered++; }
167  }
168 
169  if (numVetoesTriggered >= 1) {
170  m_numRejected++;
171  return 0;
172  }
173  }
174  if (tag < 3)
175  m_numTagged++;
176  else if (tag == 4)
177  return 0;
178  return tag;
179 }
180 
182 // interpolate
184 double CaloMuonTag::interpolate(const std::string& cutName, double pt) const {
185  double ptLow = 0, ptUp = 0, cutLow = 0, cutUp = 0, cutReturn = 0;
186  // MeV-->GeV
187  pt = pt / 1000;
188  int ptBin = getPtBinLow(pt);
189  int cutBin = getCutBin(cutName);
190  if (ptBin < 0 || ptBin > m_numPtBins || cutBin == 0 || cutBin > m_numCuts) ATH_MSG_WARNING("Bin out of bound");
191 
192  // Get lowest pt bin
193  if (ptBin < 1) cutReturn = m_hist->GetBinContent(1, cutBin);
194  // Get highest pt bin
195  else if (ptBin == m_numPtBins)
196  cutReturn = m_hist->GetBinContent(m_numPtBins, cutBin);
197  // Interpolate between bins
198  else {
199  ptUp = m_vecPtBins[ptBin + 1];
200  ptLow = m_vecPtBins[ptBin];
201  cutUp = m_hist->GetBinContent(ptBin + 1, cutBin);
202  cutLow = m_hist->GetBinContent(ptBin, cutBin);
203  cutReturn = cutLow + (cutUp - cutLow) * (pt - ptLow) / (ptUp - ptLow);
204  }
205 
206  return cutReturn;
207 }
208 
209 int CaloMuonTag::getPtBinLow(double pt) const {
210  // Return the bin of lower pt
211  for (int i = 0; i <= m_numPtBins; i++) {
212  if (pt < m_vecPtBins[i]) return (i - 1);
213  }
214  return m_numPtBins;
215 }
216 
217 int CaloMuonTag::getCutBin(const std::string& cutName) const {
218  for (int i = 0; i <= m_numCuts; i++) {
219  if (cutName == m_vecCutNames[i]) return i;
220  }
221  return 0;
222 }
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
CaloCell_ID_FCS::TileExt2
@ TileExt2
Definition: FastCaloSim_CaloCell_ID.h:39
CaloMuonTag::interpolate
double interpolate(const std::string &cutName, double pt) const
Definition: CaloMuonTag.cxx:184
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
AddEmptyComponent.histName
string histName
Definition: AddEmptyComponent.py:64
CaloMuonTag::CaloMuonTag
CaloMuonTag(const std::string &type, const std::string &name, const IInterface *pInterface)
Definition: CaloMuonTag.cxx:14
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloMuonTag::caloMuonTag
int caloMuonTag(const std::vector< DepositInCalo > &deposits, double eta, double pt) const override
Returns the Tag.
Definition: CaloMuonTag.cxx:85
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
CaloCell_ID_FCS::TileExt0
@ TileExt0
Definition: FastCaloSim_CaloCell_ID.h:37
CaloCell_ID_FCS::TileBar1
@ TileBar1
Definition: FastCaloSim_CaloCell_ID.h:32
plotmaker.hist
hist
Definition: plotmaker.py:148
skel.it
it
Definition: skel.GENtoEVGEN.py:423
CaloMuonTag::m_numRejected
std::atomic_int m_numRejected
Definition: CaloMuonTag.h:69
test_pyathena.pt
pt
Definition: test_pyathena.py:11
CaloMuonTag::m_vecCutNames
std::vector< std::string > m_vecCutNames
Definition: CaloMuonTag.h:63
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
CaloCell_ID_FCS::HEC2
@ HEC2
Definition: FastCaloSim_CaloCell_ID.h:29
CaloMuonTag::finalize
virtual StatusCode finalize() override
Definition: CaloMuonTag.cxx:75
CaloMuonTag::m_vecPtBins
std::vector< int > m_vecPtBins
Definition: CaloMuonTag.h:64
CaloCell_ID_FCS::HEC1
@ HEC1
Definition: FastCaloSim_CaloCell_ID.h:28
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
FullCPAlgorithmsTest_eljob.sample
sample
Definition: FullCPAlgorithmsTest_eljob.py:100
lumiFormat.i
int i
Definition: lumiFormat.py:92
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
CaloMuonTag::getPtBinLow
int getPtBinLow(double pt) const
Definition: CaloMuonTag.cxx:209
CaloCell_ID_FCS::TileBar0
@ TileBar0
Definition: FastCaloSim_CaloCell_ID.h:31
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
CaloMuonTag::initialize
virtual StatusCode initialize() override
Definition: CaloMuonTag.cxx:28
file
TFile * file
Definition: tile_monitor.h:29
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
makeComparison.rootFile
rootFile
Definition: makeComparison.py:27
CaloMuonTag::m_numPtBins
int m_numPtBins
Definition: CaloMuonTag.h:66
CaloMuonTag::m_numCuts
int m_numCuts
Definition: CaloMuonTag.h:65
CaloMuonTag::m_numTagged
std::atomic_int m_numTagged
Definition: CaloMuonTag.h:68
TH2
Definition: rootspy.cxx:373
CaloMuonTag::getCutBin
int getCutBin(const std::string &cutName) const
Definition: CaloMuonTag.cxx:217
CaloMuonTag::m_tagMode
std::string m_tagMode
Definition: CaloMuonTag.h:60
PathResolver.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
CaloCell_ID_FCS::TileExt1
@ TileExt1
Definition: FastCaloSim_CaloCell_ID.h:38
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
CaloCell_ID_FCS::HEC0
@ HEC0
Definition: FastCaloSim_CaloCell_ID.h:27
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
CaloMuonTag.h
CaloMuonTag::getHist
StatusCode getHist(TFile *file, const std::string &histName, std::unique_ptr< TH2 > &hist)
Definition: CaloMuonTag.cxx:55
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
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
AthAlgTool
Definition: AthAlgTool.h:26
CaloCell_ID_FCS::HEC3
@ HEC3
Definition: FastCaloSim_CaloCell_ID.h:30
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
StoreGateSvc.h
CaloCell_ID_FCS::TileBar2
@ TileBar2
Definition: FastCaloSim_CaloCell_ID.h:33
CaloMuonTag::~CaloMuonTag
virtual ~CaloMuonTag()
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56
CaloMuonTag::m_hist
std::unique_ptr< TH2 > m_hist
Definition: CaloMuonTag.h:59