ATLAS Offline Software
Loading...
Searching...
No Matches
AFPToFAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*
4*
5* AFPToFAlgorithm
6*
7*
8*/
9
13
14
15AFPToFAlgorithm::AFPToFAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
16:AthMonitorAlgorithm(name,pSvcLocator)
17, m_afpToFHitContainerKey("AFPToFHitContainer"), m_afpTrackContainerKey( "AFPTrackContainer" )
18
19{
20 declareProperty( "AFPToFHitContainer", m_afpToFHitContainerKey );
21 declareProperty( "AFPTrackContainer", m_afpTrackContainerKey );
22}
23
24
26
27
29 using namespace Monitored;
30
36
37
38 // We must declare to the framework in initialize what SG objects we are going to use
39 SG::ReadHandleKey<xAOD::AFPToFHitContainer> afpToFHitContainerKey("AFPToFHits");
41 SG::ReadHandleKey<xAOD::AFPTrackContainer> afpTrackContainerKey( "AFPTracks" );
42 ATH_CHECK( m_afpTrackContainerKey.initialize() );
43
44 ATH_MSG_INFO( "BunchCrossingKey initialization (ToF)" );
45 ATH_CHECK(m_bunchCrossingKeyToF.initialize());
46 ATH_MSG_INFO( "initialization completed (ToF)" );
47
49}
50
51
52StatusCode AFPToFAlgorithm::fillHistograms( const EventContext& ctx ) const {
53 using namespace Monitored;
54
55 const unsigned NTRAINS = 4;
56 enum { FRONT, MIDDLE, END, NPOS } position = NPOS;
57
58 auto bcidAllToF = Monitored::Scalar<int>("bcidAllToF", 0);
59 Monitored::Scalar<int> bcidToF[NPOS] =
60 { Monitored::Scalar<int>("bcidFrontToF", 0),
61 Monitored::Scalar<int>("bcidMiddleToF", 0),
62 Monitored::Scalar<int>("bcidEndToF", 0) };
63
64 // Declare the quantities which should be monitored
65 auto lb = Monitored::Scalar<int>("lb", 0);
66 auto nTofHits = Monitored::Scalar<int>("nTofHits", 1);
67 auto numberOfHit_S0 = Monitored::Scalar<int>("numberOfHit_S0", 0);
68 auto numberOfHit_S3 = Monitored::Scalar<int>("numberOfHit_S3", 0);
69 auto trainID = Monitored::Scalar<int>("trainID", 0);
70 auto barInTrainID = Monitored::Scalar<int>("barInTrainID", 0);
71 auto barInTrainAllA = Monitored::Scalar<int>("barInTrainAllA", 0);
72 auto barInTrainIDA = Monitored::Scalar<int>("barInTrainIDA", 0);
73 auto barInTrainAllC = Monitored::Scalar<int>("barInTrainAllC", 0);
74 auto barInTrainIDC = Monitored::Scalar<int>("barInTrainIDC", 0);
75
76 auto ToFHits_sideA = Monitored::Scalar<int>("ToFHits_sideA", 0);
77 auto ToFHits_sideC = Monitored::Scalar<int>("ToFHits_sideC", 0);
78 auto ToFHits_MU_Weight = Monitored::Scalar<float>("ToFHits_MU_Weight", 0.0);
79 auto muPerBXToF = Monitored::Scalar<float>("muPerBXToF", 0.0);
80
81 auto lbAToF = Monitored::Scalar<int>("lbAToF", 0);
82 auto lbCToF = Monitored::Scalar<int>("lbCToF", 0);
83 auto lbAToF_Weight = Monitored::Scalar<float>("lbAToF_Weight", 0.0);
84 auto lbCToF_Weight = Monitored::Scalar<float>("lbCToF_Weight", 0.0);
85
86 auto lbAToFEvents = Monitored::Scalar<int>("lbAToFEvents", 0);
87 auto lbCToFEvents = Monitored::Scalar<int>("lbCToFEvents", 0);
88 auto lbAandCToFEvents = Monitored::Scalar<int>("lbAandCToFEvents", 0);
89
90 // FME histograms quantites (side A)
91
92 Monitored::Scalar<int> lbAToF_T[NTRAINS] =
93 { Monitored::Scalar<int>("lbAToF_T0", 0),
94 Monitored::Scalar<int>("lbAToF_T1", 0),
95 Monitored::Scalar<int>("lbAToF_T2", 0),
96 Monitored::Scalar<int>("lbAToF_T3", 0) };
97
98 auto lbAToF_TAll_Weight = Monitored::Scalar<float>("lbAToF_TAll_Weight", 1);
99
100 Monitored::Scalar<int> lbAToF_TP[NTRAINS][NPOS] =
101 { { Monitored::Scalar<int>("lbAToF_T0_Front", 0),
102 Monitored::Scalar<int>("lbAToF_T0_Middle", 0),
103 Monitored::Scalar<int>("lbAToF_T0_End", 0) },
104 { Monitored::Scalar<int>("lbAToF_T1_Front", 0),
105 Monitored::Scalar<int>("lbAToF_T1_Middle", 0),
106 Monitored::Scalar<int>("lbAToF_T1_End", 0) },
107 { Monitored::Scalar<int>("lbAToF_T2_Front", 0),
108 Monitored::Scalar<int>("lbAToF_T2_Middle", 0),
109 Monitored::Scalar<int>("lbAToF_T2_End", 0) },
110 { Monitored::Scalar<int>("lbAToF_T3_Front", 0),
111 Monitored::Scalar<int>("lbAToF_T3_Middle", 0),
112 Monitored::Scalar<int>("lbAToF_T3_End", 0) } };
113
114 Monitored::Scalar<float> lbAToF_TWeight[NPOS] =
115 { Monitored::Scalar<float>("lbAToF_TFront_Weight", 1),
116 Monitored::Scalar<float>("lbAToF_TMiddle_Weight", 1),
117 Monitored::Scalar<float>("lbAToF_TEnd_Weight", 1) };
118
119 // FME histograms quantites (side C)
120
121 Monitored::Scalar<int> lbCToF_T[NTRAINS] =
122 { Monitored::Scalar<int>("lbCToF_T0", 0),
123 Monitored::Scalar<int>("lbCToF_T1", 0),
124 Monitored::Scalar<int>("lbCToF_T2", 0),
125 Monitored::Scalar<int>("lbCToF_T3", 0) };
126
127 auto lbCToF_TAll_Weight = Monitored::Scalar<float>("lbCToF_TAll_Weight", 1);
128
129 Monitored::Scalar<int> lbCToF_TP[NTRAINS][NPOS] =
130 { { Monitored::Scalar<int>("lbCToF_T0_Front", 0),
131 Monitored::Scalar<int>("lbCToF_T0_Middle", 0),
132 Monitored::Scalar<int>("lbCToF_T0_End", 0) },
133 { Monitored::Scalar<int>("lbCToF_T1_Front", 0),
134 Monitored::Scalar<int>("lbCToF_T1_Middle", 0),
135 Monitored::Scalar<int>("lbCToF_T1_End", 0) },
136 { Monitored::Scalar<int>("lbCToF_T2_Front", 0),
137 Monitored::Scalar<int>("lbCToF_T2_Middle", 0),
138 Monitored::Scalar<int>("lbCToF_T2_End", 0) },
139 { Monitored::Scalar<int>("lbCToF_T3_Front", 0),
140 Monitored::Scalar<int>("lbCToF_T3_Middle", 0),
141 Monitored::Scalar<int>("lbCToF_T3_End", 0) } };
142
143 Monitored::Scalar<float> lbCToF_TWeight[NPOS] =
144 { Monitored::Scalar<float>("lbCToF_TFront_Weight", 1),
145 Monitored::Scalar<float>("lbCToF_TMiddle_Weight", 1),
146 Monitored::Scalar<float>("lbCToF_TEnd_Weight", 1) };
147
149 lb = eventInfo->lumiBlock();
150 lbAToF = eventInfo->lumiBlock();
151 lbCToF = eventInfo->lumiBlock();
152 lbAToFEvents = eventInfo->lumiBlock();
153 lbCToFEvents = eventInfo->lumiBlock();
154 lbAandCToFEvents = eventInfo->lumiBlock();
155 muPerBXToF = lbAverageInteractionsPerCrossing(ctx);
156
157 if (muPerBXToF == 0.0) {
158 ATH_MSG_DEBUG("AverageInteractionsPerCrossing is 0, forcing to 1.0");
159 muPerBXToF=1.0;
160 }
161
162
163 ToFHits_MU_Weight = 1/muPerBXToF;
164 lbAToF_Weight = 1/muPerBXToF;
165 lbCToF_Weight = 1/muPerBXToF;
166 lbAToF_TAll_Weight = 1/muPerBXToF;
167 lbCToF_TAll_Weight = 1/muPerBXToF;
168 lbAToF_TWeight[FRONT] = 1/muPerBXToF;
169 lbAToF_TWeight[MIDDLE] = 1/muPerBXToF;
170 lbAToF_TWeight[END] = 1/muPerBXToF;
171 lbCToF_TWeight[FRONT] = 1/muPerBXToF;
172 lbCToF_TWeight[MIDDLE] = 1/muPerBXToF;
173 lbCToF_TWeight[END] = 1/muPerBXToF;
174
175 fill("AFPToFTool", lb, muPerBXToF);
176
177 // BCX handler
178 const unsigned int tempBCID = eventInfo->bcid();
180 if (!bcidHdlToF.isValid()) {
181 ATH_MSG_ERROR( "Unable to retrieve BunchCrossing conditions object (ToF)" );
182 }
183 const BunchCrossingCondData* bcDataToF{*bcidHdlToF};
184
185 // Classifying bunches by position in train (Front, Middle, End)
186 if(bcDataToF->isFilled(tempBCID))
187 {
188 bcidAllToF = tempBCID;
189 fill("AFPToFTool", bcidAllToF);
190 if(!bcDataToF->isFilled(tempBCID-1))
191 {
192 position = FRONT;
193 }
194 else if(bcDataToF->isFilled(tempBCID+1))
195 {
196 position = MIDDLE;
197 }
198 else
199 {
200 position = END;
201 }
202 bcidToF[position] = tempBCID;
203 fill("AFPToFTool", bcidToF[position]);
204 }
205
206
208 if(! afpToFHitContainer.isValid())
209 {
210 ATH_MSG_WARNING("evtStore() does not contain hits collection with name " << m_afpToFHitContainerKey);
211 return StatusCode::SUCCESS;
212 }
213
214 ATH_CHECK( afpToFHitContainer.initialize() );
215
217 if ( !afpTrackContainer.isValid() ) {
218 ATH_MSG_WARNING( "evtStore() does not contain hits collection with name " << m_afpTrackContainerKey );
219 return StatusCode::SUCCESS;
220 }
221 ATH_CHECK( afpTrackContainer.initialize() );
222
223 nTofHits = afpToFHitContainer->size();
224 fill("AFPToFTool", lb, nTofHits);
225
226 int eventsInStations[4] = {};
227
228 for(const xAOD::AFPToFHit *hitsItr: *afpToFHitContainer)
229 {
230 trainID = hitsItr->trainID();
231 barInTrainID = hitsItr->barInTrainID();
232 ++eventsInStations[hitsItr->stationID()];
233
234 if(hitsItr->isSideA())
235 {
236 numberOfHit_S0 = hitsItr->trainID();
237 fill("AFPToFTool", numberOfHit_S0);
238
239 barInTrainIDA = hitsItr->barInTrainID();
240 fill(m_tools[m_TrainsToFGroup.at(m_trainsToF.at(hitsItr->trainID()))], barInTrainIDA);
241 barInTrainAllA = (hitsItr->trainID()*4)+barInTrainIDA;
242 fill("AFPToFTool", barInTrainAllA);
243
244 ToFHits_sideA = eventInfo->lumiBlock();
245 fill("AFPToFTool", ToFHits_sideA, ToFHits_MU_Weight);
246 }
247 else if(hitsItr->isSideC())
248 {
249 numberOfHit_S3 = hitsItr->trainID();
250 fill("AFPToFTool", numberOfHit_S3);
251
252 barInTrainIDC = hitsItr->barInTrainID();
253 fill(m_tools[m_TrainsToFGroup.at(m_trainsToF.at(hitsItr->trainID()))], barInTrainIDC);
254 barInTrainAllC = (hitsItr->trainID()*4)+barInTrainIDC;
255 fill("AFPToFTool", barInTrainAllC);
256
257 ToFHits_sideC = eventInfo->lumiBlock();
258 fill("AFPToFTool", ToFHits_sideC, ToFHits_MU_Weight);
259 }
260
261 if(hitsItr->isSideA() || hitsItr->isSideC())
262 {
263 auto& lbToF_T = hitsItr->isSideA() ? lbAToF_T : lbCToF_T;
264 auto& lbToF_TP = hitsItr->isSideA() ? lbAToF_TP : lbCToF_TP;
265 auto& lbToF_TAll_Weight = hitsItr->isSideA() ? lbAToF_TAll_Weight : lbCToF_TAll_Weight;
266 auto& lbToF_TWeight = hitsItr->isSideA() ? lbAToF_TWeight : lbCToF_TWeight;
267
268 unsigned int train = hitsItr->trainID();
269 if(train < NTRAINS)
270 {
271 lbToF_T[train] = eventInfo->lumiBlock();
272 fill("AFPToFTool", lbToF_T[train], lbToF_TAll_Weight);
273
274 if(position != NPOS)
275 {
276 lbToF_TP[train][position] = eventInfo->lumiBlock();
277 fill("AFPToFTool", lbToF_TP[train][position], lbToF_TWeight[position]);
278 }
279 }
280 }
281
282 if (hitsItr->stationID() == 0 || hitsItr->stationID() == 3)
283 {
284 fill(m_tools[m_StationNamesGroup.at(m_stationNamesToF.at(hitsItr->stationID()))], barInTrainID, trainID);
285
286 if(hitsItr->stationID() == 0) // farAside
287 {
288 fill(m_tools[m_BarsInTrainsA.at(m_trainsToFA.at(hitsItr->trainID())).at(m_barsToF.at(hitsItr->barInTrainID()))], lbAToF, lbAToF_Weight);
289 }
290 else // farCside
291 {
292 fill(m_tools[m_BarsInTrainsC.at(m_trainsToFC.at(hitsItr->trainID())).at(m_barsToF.at(hitsItr->barInTrainID()))], lbCToF, lbCToF_Weight);
293 }
294 }
295 }
296
297 // Events histograms
298 if(eventsInStations[0] > 0 || eventsInStations[3] > 0)
299 {
300 fill("AFPToFTool", lbAandCToFEvents);
301
302 if(eventsInStations[0] > 0)
303 {
304 fill("AFPToFTool", lbAToFEvents);
305 }
306 if(eventsInStations[3] > 0)
307 {
308 fill("AFPToFTool", lbCToFEvents);
309 }
310 }
311
312 return fillHistograms_crossBarDeltaT(*afpTrackContainer, *afpToFHitContainer);
313}
314
316 const xAOD::AFPTrackContainer& afpTrackContainer,
317 const xAOD::AFPToFHitContainer& afpToFHitContainer) const {
318 // Initialize monitored variables for histogram filling
319 Monitored::Scalar<float> crossBarDeltaT[2] = {
320 Monitored::Scalar<float>( "crossBarDeltaT_A", 0.0 ),
321 Monitored::Scalar<float>( "crossBarDeltaT_C", 0.0 )
322 };
323
324 bool channel_present[2][16] = {};
325 bool multihit[2] = {};
326 std::size_t track_count[2] = {};
327 std::size_t train_count[2][4] = {};
328
329 for (const xAOD::AFPTrack* tracksItr : afpTrackContainer)
330 {
331 const auto side = tracksItr->stationID() == 3;
332 // Ignore tracks that are not from FAR stations
333 if (tracksItr->stationID() != 0 && tracksItr->stationID() != 3)
334 continue;
335 ++track_count[side];
336 }
337
338 // Load the necessary information
339 auto times = std::vector<std::vector<std::vector<float>>>(2, std::vector<std::vector<float>>(4, std::vector<float>(4, -10000)));
340 for (const xAOD::AFPToFHit* hitsItr : afpToFHitContainer)
341 {
342 const auto side = hitsItr->stationID() == 3;
343 const auto train = hitsItr->trainID();
344 const auto bar = hitsItr->barInTrainID();
345 const auto channel = 4 * train + bar;
346 const auto tof_time = hitsItr->time();
347 const auto TimePs=(tof_time)*1000;
348 //Cut on only 1 SiT track in the monitored station
349 if (track_count[side] != 1) continue;
350 // Ignore hits with an impossible origin
351 if (hitsItr->stationID() != 0 && hitsItr->stationID() != 3)
352 continue;
353 if (channel >= 16) continue;
354 if (channel_present[side][channel])
355 multihit[side] = true;
356 channel_present[side][channel] = true;
357 ++train_count[side][train];
358
359 times[side][train][bar]=TimePs;
360
361 }
362
363 for (uint8_t side : {0, 1})
364 {
365 // Cut on only 1 SiT track in the monitored station
366 if (track_count[side] != 1) continue;
367 // Cut on maximum of 1 hit in each ToF channel
368 if (multihit[side]) continue;
369 //Cut on maximum 1 train per event
370 uint8_t multrain[2] = {};
371 for (uint8_t train = 0; train < 4; ++train) {
372 if (train_count[side][train]>1) {
373 ++multrain[side];
374 }
375 }
376 if (multrain[side]>1) continue;
377 //fill histos
378 for (uint8_t train = 0; train < 4; ++train) {
379 for (uint8_t bar1 = 0; bar1 < 4; ++bar1) {
380 for (uint8_t bar2 = 0; bar2 < 4; ++bar2) {
381 if (bar2>bar1) {
382 int comb = bar1*bar2+bar2-1;
383 if (comb==5) {comb=4;}
384 if (comb==8) {comb=5;}
385 int global_comb = train*6 + comb;
386 if (times[side][train][bar1]>-10000 && times[side][train][bar2]>-10000) {
387 crossBarDeltaT[side] = (times[side][train][bar1] - times[side][train][bar2]);
388 fill(m_tools[m_GroupChanCombDeltaT.at(m_chanComb.at(global_comb))], crossBarDeltaT[side]);
389 }
390 }
391 }
392 }
393 }
394 }
395
396 return StatusCode::SUCCESS;
397}
Definitions of AFP stations identification numbers.
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Property holding a SG store/key/clid from which a ReadHandle is made.
std::vector< std::string > m_barsToF
virtual StatusCode fillHistograms_crossBarDeltaT(const xAOD::AFPTrackContainer &, const xAOD::AFPToFHitContainer &) const
SG::ReadHandleKey< xAOD::AFPToFHitContainer > m_afpToFHitContainerKey
std::vector< std::string > m_trainsToF
std::map< std::string, int > m_GroupChanCombDeltaT
virtual StatusCode initialize() override
initialize
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
AFPToFAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::AFPTrackContainer > m_afpTrackContainerKey
std::vector< std::string > m_trainsToFA
std::vector< std::string > m_chanComb
std::vector< std::string > m_stationNamesToF
std::map< std::string, int > m_StationNamesGroup
std::map< std::string, std::map< std::string, int > > m_BarsInTrainsA
virtual ~AFPToFAlgorithm()
std::map< std::string, std::map< std::string, int > > m_BarsInTrainsC
SG::ReadCondHandleKey< BunchCrossingCondData > m_bunchCrossingKeyToF
std::map< std::string, int > m_TrainsToFGroup
std::vector< std::string > m_trainsToFC
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
virtual StatusCode initialize() override
initialize
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
ToolHandleArray< GenericMonitoringTool > m_tools
Array of Generic Monitoring Tools.
bool isFilled(const bcid_type bcid) const
The simplest query: Is the bunch crossing filled or not?
Declare a monitored scalar variable.
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode initialize(bool used=true)
Verify that the handle has been configured properly.
int lb
Definition globals.cxx:23
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable > > &&variables) const
Fills a vector of variables to a group by reference.
virtual float lbAverageInteractionsPerCrossing(const EventContext &ctx=Gaudi::Hive::currentContext()) const
Calculate the average mu, i.e.
Generic monitoring tool for athena components.
std::vector< V > buildToolMap(const ToolHandleArray< GenericMonitoringTool > &tools, const std::string &baseName, int nHist)
Builds an array of indices (base case)
AFPTrack_v2 AFPTrack
Definition AFPTrack.h:12
AFPToFHitContainer_v1 AFPToFHitContainer
AFPTrackContainer_v2 AFPTrackContainer
AFPToFHit_v1 AFPToFHit
Definition AFPToFHit.h:12