ATLAS Offline Software
TrigTRTHTHCounter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "TrigTRTHTHCounter.h"
7 
8 //Function to calculate distance for road algorithm
9 float dist2COR(float R, float phi1, float phi2){
10  float PHI= std::abs(phi1-phi2);
11  return std::abs(R*std::sin(PHI));
12 }
13 
14 //TRT hit struct used for convenience
15 struct TRT_hit {
16  float phi;
17  float R;
18  bool isHT;
19 };
20 
21 //Constructor of above struct
22 TRT_hit make_hit(float phi, float R, bool isHT){
23  TRT_hit my_hit={phi,R,isHT};
24  return my_hit;
25 }
26 
27 //hth_eta_match is used for matching hits to RoI eta
28 bool hth_eta_match(float caleta, float trteta, float etaWindow){
29  return std::abs(caleta)<etaWindow or caleta*trteta>0.;
30 }
31 //---------------------------------------------------------------------------------
32 
33 
34 TrigTRTHTHCounter::TrigTRTHTHCounter(const std::string & name, ISvcLocator* pSvcLocator)
35  : AthReentrantAlgorithm(name, pSvcLocator)
36 {}
37 
39 {
40  ATH_MSG_DEBUG ( "Initialising this TrigTRTHTHCounter: " << name());
41 
42  // Get a TRT identifier helper
43  ATH_CHECK( detStore()->retrieve(m_trtHelper, "TRT_ID") );
44 
45  if (!m_doFullScan){
46  ATH_MSG_INFO ( "PhiHalfWidth: " << m_phiHalfWidth << " EtaHalfWidth: "<< m_etaHalfWidth);
47  } else {
48  ATH_MSG_INFO ( "FullScan mode");
49  }
50 
53  ATH_CHECK( m_trigRNNOutputKey.initialize() );
54 
55  return StatusCode::SUCCESS;
56 }
57 
58 
59 StatusCode TrigTRTHTHCounter::execute(const EventContext& ctx) const {
60 
61  ATH_MSG_DEBUG( "Executing " <<name());
62 
63  auto trigRNNOutputColl = SG::makeHandle (m_trigRNNOutputKey, ctx);
64  ATH_CHECK(trigRNNOutputColl.record (std::make_unique<xAOD::TrigRNNOutputContainer>(),
65  std::make_unique<xAOD::TrigRNNOutputAuxContainer>()));
66 
67  ATH_MSG_DEBUG( "Made WriteHandle " << m_trigRNNOutputKey );
68 
69  auto roiCollection = SG::makeHandle(m_roiCollectionKey, ctx);
70  ATH_MSG_DEBUG( "Made handle " << m_roiCollectionKey );
71 
72  if (roiCollection->size()==0) {
73  ATH_MSG_DEBUG(" RoI collection size = 0");
74  return StatusCode::SUCCESS;
75  }
76 
77  const TrigRoiDescriptor* roiDescriptor = *(roiCollection->begin());
78 
79  ATH_MSG_DEBUG(" RoI ID = " << (roiDescriptor)->roiId()
80  << ": Eta = " << (roiDescriptor)->eta()
81  << ", Phi = " << (roiDescriptor)->phi());
82 
83 
84  std::vector<float> trththits{0,-999,0,-999,-999,-999};
85 
86  //Vectors to hold the count of total and HT TRT hits in the coarse bins
87  std::vector<int> count_httrt_c(m_nBinCoarse);
88  std::vector<int> count_tottrt_c(m_nBinCoarse);
89 
90  //Vectors to hold the count of total and HT TRT hits in the fine bins
91  std::vector<int> count_httrt(3*m_nBinFine);
92  std::vector<int> count_tottrt(3*m_nBinFine);
93 
94  //Vector to hold TRT hits that are within RoI
95  std::vector<TRT_hit> hit;
96 
97  //Sanity check of the ROI size
98  double deltaEta= std::abs(roiDescriptor->etaPlus()-roiDescriptor->etaMinus());
99  double deltaPhi= std::abs(CxxUtils::deltaPhi(roiDescriptor->phiPlus(),roiDescriptor->phiMinus()));
100 
101  ATH_MSG_DEBUG( "roiDescriptor->etaPlus() in TrigTRTHTHCounter:"<<roiDescriptor->etaPlus());
102  ATH_MSG_DEBUG( "roiDescriptor->etaMinus() in TrigTRTHTHCounter:"<<roiDescriptor->etaMinus());
103  ATH_MSG_DEBUG( "deltaEta in TrigTRTHTHCounter:"<<deltaEta);
104 
105  float phiTolerance = 0.001;
106  float etaTolerance = 0.001;
107 
108  if((m_etaHalfWidth - deltaEta/2.) > etaTolerance)
109  ATH_MSG_WARNING ( "ROI eta range too small : " << deltaEta);
110 
111  if((m_phiHalfWidth - deltaPhi/2.) > phiTolerance)
112  ATH_MSG_WARNING ( "ROI phi range too small : " << deltaPhi);
113 
114  float coarseWedgeHalfWidth = m_phiHalfWidth/m_nBinCoarse;
115  float fineWedgeHalfWidth = coarseWedgeHalfWidth/m_nBinFine;
116 
117  //Code will only proceed if the RoI eta is not too large; used to limit rate from endcap
118  if ( std::abs(roiDescriptor->eta())<=m_maxCaloEta ){
119 
121  ATH_MSG_DEBUG( "Made handle " << m_trtDCContainerKey );
122 
123  if (trtDCC->size() == 0){
124  return StatusCode::SUCCESS; // Exit early if there are no tracks
125  }
126 
127  InDet::TRT_DriftCircleContainer::const_iterator trtdriftContainerItr = trtDCC->begin();
128  InDet::TRT_DriftCircleContainer::const_iterator trtdriftContainerItrE = trtDCC->end();
129 
130  for (; trtdriftContainerItr != trtdriftContainerItrE; ++trtdriftContainerItr) {
131 
132  InDet::TRT_DriftCircleCollection::const_iterator trtItr = (*trtdriftContainerItr)->begin();
133  InDet::TRT_DriftCircleCollection::const_iterator trtEnd = (*trtdriftContainerItr)->end();
134 
135  for(; trtItr!=trtEnd; ++trtItr){
136 
137  // find out which detector element the hit belongs to
138  const InDetDD::TRT_BaseElement *det = (*trtItr)->detectorElement();
139  Identifier ID = (*trtItr)->identify();
140  const Amg::Vector3D& strawcenter = det->strawCenter(m_trtHelper->straw(ID));
141 
142  bool hth = false;
143  float hphi = strawcenter.phi();
144  float heta = strawcenter.eta();
145  float R = strawcenter.perp();
146 
147  if ((*trtItr)->highLevel()) hth = true;
148 
149  //hit needs to be stored
150  if(hth_eta_match((roiDescriptor)->eta(), heta, m_etaHalfWidth))
151  hit.push_back(make_hit(hphi,R,hth));
152 
153 
154  //First, define coarse wedges in phi, and count the TRT hits in these wedges
155  int countbin=0;
156  if(std::abs(CxxUtils::deltaPhi(hphi, static_cast<float>(roiDescriptor->phi()))) < 0.1){
157  float startValue = roiDescriptor->phi() - m_phiHalfWidth + coarseWedgeHalfWidth;
158  float endValue = roiDescriptor->phi() + m_phiHalfWidth;
159  float increment = 2*coarseWedgeHalfWidth;
160  for(float roibincenter = startValue; roibincenter < endValue; roibincenter += increment){
161  if (std::abs(CxxUtils::deltaPhi(hphi,roibincenter))<=coarseWedgeHalfWidth && hth_eta_match((roiDescriptor)->eta(), heta, m_etaHalfWidth)) {
162  if(hth) count_httrt_c.at(countbin) += 1.;
163  count_tottrt_c.at(countbin) += 1.;
164  break; //the hit has been assigned to one of the coarse wedges, so no need to continue the for loop
165  }
166  countbin++;
167  }
168  }
169  ATH_MSG_VERBOSE ( "timeOverThreshold=" << (*trtItr)->timeOverThreshold()
170  << " highLevel=" << (*trtItr)->highLevel()
171  << " rawDriftTime=" << (*trtItr)->rawDriftTime()
172  << " barrel_ec=" << m_trtHelper->barrel_ec(ID)
173  << " phi_module=" << m_trtHelper->phi_module(ID)
174  << " layer_or_wheel=" << m_trtHelper->layer_or_wheel(ID)
175  << " straw_layer=" << m_trtHelper->straw_layer(ID)
176  << " straw=" << m_trtHelper->straw(ID)
177  << " scR=" << det->strawCenter(m_trtHelper->straw(ID)).perp()
178  << " scPhi=" << hphi
179  << " scEta=" << heta);
180  } // end of loop over TRT drift circle collection
181  } //end of loop over TRT drift circle container
182  } //end of check to see if RoI eta is not too large
183 
184  //Now figure out which of the coarse bins in phi has the max number of HT TRT hits
185  int maxHits = 0; //used to keep track of the max number of HT TRT hits in a coarse bin
186  int dist = 0; //used to keep track of which coarse bin has the max number of HT TRT hits
187 
188  for (size_t iw = 0; iw < count_httrt_c.size(); iw++){
189  if(maxHits <= count_httrt_c[iw]){
190  maxHits = count_httrt_c[iw];
191  dist = iw;
192  }
193  }
194 
195  //Value of dist can range between 0 and (m_nBinCoarse-1)
196  float center_pos_phi=roiDescriptor->phi()+(2*dist+1-m_nBinCoarse)*coarseWedgeHalfWidth;
197 
198  //Now, define fine wedges in phi, centered around the best coarse wedge, and count the TRT hits in these fine wedges
199  for(size_t v=0;v<hit.size();v++){
200  int countbin=0;
201  if(std::abs(CxxUtils::deltaPhi(hit[v].phi, center_pos_phi)) < 0.01){
202  float startValue = center_pos_phi - 3*coarseWedgeHalfWidth + fineWedgeHalfWidth;
203  float endValue = center_pos_phi + 3*coarseWedgeHalfWidth;
204  float increment = 2*fineWedgeHalfWidth;
205  for(float roibincenter = startValue; roibincenter < endValue; roibincenter += increment){
206  if (std::abs(CxxUtils::deltaPhi(hit[v].phi,roibincenter))<=fineWedgeHalfWidth) {
207  if(hit[v].isHT) count_httrt.at(countbin) += 1.;
208  count_tottrt.at(countbin) += 1.;
209  break; //the hit has been assigned to one of the fine wedges, so no need to continue the for loop
210  }
211  countbin++;
212  }
213  }
214  }
215 
216  //Now figure out which of the fine bins in phi has the max number of HT TRT hits
217  maxHits = 0; //used to keep track of the max number of HT TRT hits in a fine bin
218  dist = 0; //used to keep track of which fine bin has the max number of HT TRT hits
219 
220  for (size_t iw = 0; iw < count_httrt.size(); iw++){
221  if(maxHits <= count_httrt[iw]){
222  maxHits = count_httrt[iw];
223  dist = iw;
224  }
225  }
226 
227  //Value of dist can range between 0 and (3*m_nBinFine-1)
228  center_pos_phi+=(2*dist+1-3*m_nBinFine)*fineWedgeHalfWidth;
229 
230  //Count the number of total and HT TRT hits for the road algorithm
231  int trthit=0, trthit_ht=0;
232  for(size_t v=0;v<hit.size();v++){
233  if (dist2COR(hit[v].R,hit[v].phi,center_pos_phi)<=m_roadWidth){
234  if(hit[v].isHT) trthit_ht+=1;
235  trthit+=1;
236  }
237  }
238 
239  if (trthit!=0&&(std::abs(roiDescriptor->eta())<=m_roadMaxEta)){
240  trththits[0] = trthit_ht;
241  trththits[1] = (float)trthit_ht/trthit;
242  }
243 
244  //Count the number of total and HT TRT hits for the wedge algorithm
245  trthit = 0;
246  trthit_ht = 0;
247 
248  for (int k=0;k<(2*m_wedgeNBin+1);k++){
249  int binNumber = dist+k-m_wedgeNBin;
250  //Even though we are supposed to use 2*m_wedgeNBin+1 fine bins,
251  //need to make sure that binNumber is sensible
252  if(binNumber >= 0 && binNumber < (int)count_httrt.size()){
253  trthit += count_tottrt.at(binNumber);
254  trthit_ht += count_httrt.at(binNumber);
255  }
256  }
257 
258  if (trthit!=0&&(std::abs(roiDescriptor->eta())>=m_wedgeMinEta)){
259  trththits[2] = trthit_ht;
260  trththits[3] = (float)trthit_ht/trthit;
261  }
262 
263  trththits[4]=roiDescriptor->eta();
264  trththits[5]=roiDescriptor->phi();
265 
266  ATH_MSG_VERBOSE ( "trthits with road algorithm : " << trththits[0]);
267  ATH_MSG_VERBOSE ( "fHT with road algorithm : " << trththits[1]);
268  ATH_MSG_VERBOSE ( "trthits with wedge algorithm : " << trththits[2]);
269  ATH_MSG_VERBOSE ( "fHT with wedge algorithm : " << trththits[3]);
270  ATH_MSG_VERBOSE ( "ROI eta : " << trththits[4]);
271 
272  //Writing to xAOD
273  xAOD::TrigRNNOutput* rnnOutput = new xAOD::TrigRNNOutput();
274  trigRNNOutputColl->push_back(rnnOutput);
275  rnnOutput->setRnnDecision(trththits);
276 
277  ATH_MSG_DEBUG("REGTEST: returning an xAOD::TrigRNNOutputContainer with size "<< trigRNNOutputColl->size() << ".");
278 
279  return StatusCode::SUCCESS;
280 }
281 
282 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::TrigRNNOutput_v2
Definition: TrigRNNOutput_v2.h:24
TrigTRTHTHCounter::m_doFullScan
Gaudi::Property< bool > m_doFullScan
Definition: TrigTRTHTHCounter.h:58
TrigTRTHTHCounter::m_trtHelper
const TRT_ID * m_trtHelper
TRT ID helper.
Definition: TrigTRTHTHCounter.h:51
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ID
std::vector< Identifier > ID
Definition: CalibHitIDCheck.h:24
TRTCalib_Extractor.det
det
Definition: TRTCalib_Extractor.py:36
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAOD::deltaPhi
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap setEtaBin setIsTgcFailure setDeltaPt deltaPhi
Definition: L2StandAloneMuon_v1.cxx:160
TrigTRTHTHCounter::initialize
virtual StatusCode initialize() override
Definition: TrigTRTHTHCounter.cxx:38
TrigTRTHTHCounter::m_roadWidth
Gaudi::Property< float > m_roadWidth
Definition: TrigTRTHTHCounter.h:59
TrigTRTHTHCounter::m_etaHalfWidth
Gaudi::Property< float > m_etaHalfWidth
Definition: TrigTRTHTHCounter.h:56
TrigRoiDescriptor
nope - should be used for standalone also, perhaps need to protect the class def bits #ifndef XAOD_AN...
Definition: TrigRoiDescriptor.h:56
RoiUtil::PHI
@ PHI
Definition: RoiSerialise.cxx:31
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
TrigTRTHTHCounter::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: TrigTRTHTHCounter.cxx:59
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
TrigTRTHTHCounter::m_wedgeNBin
Gaudi::Property< int > m_wedgeNBin
Definition: TrigTRTHTHCounter.h:64
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
TRT_hit
Definition: TrigTRTHTHCounter.cxx:15
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:270
xAOD::TrigRNNOutput
TrigRNNOutput_v2 TrigRNNOutput
Define the latest version of the RingerRings class.
Definition: Event/xAOD/xAODTrigRinger/xAODTrigRinger/TrigRNNOutput.h:17
TrigTRTHTHCounter::m_nBinCoarse
Gaudi::Property< int > m_nBinCoarse
Definition: TrigTRTHTHCounter.h:60
TRT_ID::straw
int straw(const Identifier &id) const
Definition: TRT_ID.h:902
TrigTRTHTHCounter::m_wedgeMinEta
Gaudi::Property< float > m_wedgeMinEta
Definition: TrigTRTHTHCounter.h:62
TrigTRTHTHCounter::m_trigRNNOutputKey
SG::WriteHandleKey< xAOD::TrigRNNOutputContainer > m_trigRNNOutputKey
Definition: TrigTRTHTHCounter.h:77
TrigTRTHTHCounter::m_nBinFine
Gaudi::Property< int > m_nBinFine
Definition: TrigTRTHTHCounter.h:61
hth_eta_match
bool hth_eta_match(float caleta, float trteta, float etaWindow)
Definition: TrigTRTHTHCounter.cxx:28
P4Helpers::deltaEta
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition: P4Helpers.h:66
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
xAOD::roiId
setTeId setLumiBlock roiId
Definition: L2StandAloneMuon_v1.cxx:331
TRT_hit::phi
float phi
Definition: TrigTRTHTHCounter.cxx:16
TRT_hit::R
float R
Definition: TrigTRTHTHCounter.cxx:17
TrigTRTHTHCounter::m_roiCollectionKey
SG::ReadHandleKey< TrigRoiDescriptorCollection > m_roiCollectionKey
Definition: TrigTRTHTHCounter.h:66
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TrigTRTHTHCounter::m_roadMaxEta
Gaudi::Property< float > m_roadMaxEta
Definition: TrigTRTHTHCounter.h:63
TrigTRTHTHCounter::m_trtDCContainerKey
SG::ReadHandleKey< InDet::TRT_DriftCircleContainer > m_trtDCContainerKey
Definition: TrigTRTHTHCounter.h:71
AnalysisUtils::Delta::R
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
Definition: AnalysisMisc.h:49
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
TRT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: TRT_ID.h:866
TRT_ID::straw_layer
int straw_layer(const Identifier &id) const
Definition: TRT_ID.h:893
TRT_ID::layer_or_wheel
int layer_or_wheel(const Identifier &id) const
Definition: TRT_ID.h:884
Monitored.h
Header file to be included by clients of the Monitored infrastructure.
make_hit
TRT_hit make_hit(float phi, float R, bool isHT)
Definition: TrigTRTHTHCounter.cxx:22
TrigTRTHTHCounter::m_phiHalfWidth
Gaudi::Property< float > m_phiHalfWidth
Definition: TrigTRTHTHCounter.h:57
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
dist2COR
float dist2COR(float R, float phi1, float phi2)
Definition: TrigTRTHTHCounter.cxx:9
CxxUtils::deltaPhi
T deltaPhi(T phiA, T phiB)
Return difference phiA - phiB in range [-pi, pi].
Definition: phihelper.h:42
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
TRT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: TRT_ID.h:875
python.PyAthena.v
v
Definition: PyAthena.py:154
TrigTRTHTHCounter.h
RoiDescriptor::etaPlus
virtual double etaPlus() const override final
gets eta at zedPlus
Definition: RoiDescriptor.h:115
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
RoiDescriptor::phi
virtual double phi() const override final
Methods to retrieve data members.
Definition: RoiDescriptor.h:100
RoiDescriptor::eta
virtual double eta() const override final
Definition: RoiDescriptor.h:101
TrigTRTHTHCounter::m_maxCaloEta
float m_maxCaloEta
Definition: TrigTRTHTHCounter.h:53
TrigTRTHTHCounter::TrigTRTHTHCounter
TrigTRTHTHCounter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrigTRTHTHCounter.cxx:34
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
RoiDescriptor::phiPlus
virtual double phiPlus() const override final
gets phiPlus
Definition: RoiDescriptor.h:118
RoiDescriptor::etaMinus
virtual double etaMinus() const override final
gets eta at zMinus
Definition: RoiDescriptor.h:116
TRT_hit::isHT
bool isHT
Definition: TrigTRTHTHCounter.cxx:18
xAOD::TrigRNNOutput_v2::setRnnDecision
void setRnnDecision(const std::vector< float > &d)
RoiDescriptor::phiMinus
virtual double phiMinus() const override final
gets phiMinus
Definition: RoiDescriptor.h:119
readCCLHist.float
float
Definition: readCCLHist.py:83
fitman.k
k
Definition: fitman.py:528
InDetDD::TRT_BaseElement
Definition: TRT_BaseElement.h:57
Identifier
Definition: IdentifierFieldParser.cxx:14