ATLAS Offline Software
Loading...
Searching...
No Matches
ZdcMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
11#include <sstream> // for std::ostringstream
12#include <utility> // for std::pair (if not already included indirectly)
13
14
15ZdcMonitorAlgorithm::ZdcMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
16:AthMonitorAlgorithm(name,pSvcLocator){
17 ATH_MSG_DEBUG("calling the constructor of ZdcMonitorAlgorithm");
18}
19
20
22
23
24bool ZdcMonitorAlgorithm::check_equal_within_rounding(float a, float b, float epsilon) const {
25 return std::fabs(a - b) < epsilon;
26}
27
28void ZdcMonitorAlgorithm::calculate_log_bin_edges(float min_value, float max_value, int num_bins, std::vector<float>& bin_edges) {
29 // Clear the vector to ensure it's empty
30 bin_edges.clear();
31
32 // Calculate the logarithmic bin edges
33 float log_min = std::log10(min_value);
34 float log_max = std::log10(max_value);
35
36 // Linear space between log_min and log_max with num_bins+1 points
37 float step = (log_max - log_min) / num_bins;
38
39 // Populate the vector with the bin edges
40 for (int i = 0; i <= num_bins; ++i) {
41 float edge = log_min + i * step;
42 bin_edges.push_back(std::pow(10, edge));
43 }
44}
45
46
47float ZdcMonitorAlgorithm::calculate_inverse_bin_width(float event_value, const std::string& variable_name, const std::vector<float>& bin_edges) const {
48 // Check if the event_value is out of range
49 if (event_value < bin_edges.front() || event_value > bin_edges.back()) { // changed output level to debug: this is not uncommon
50 ATH_MSG_DEBUG("In calculation of inverse-bin-width event weight for the variable " << variable_name << ", the current event value " << event_value << " is out of the bin range.");
51 ATH_MSG_DEBUG("Assign zero weight for the current event (event not filled).");
52 return 0.0; // event weight is zero
53 }
54
55 // Find the bin in which event_value falls
56 for (size_t i = 0; i < bin_edges.size() - 1; ++i) {
57 if (event_value >= bin_edges[i] && event_value < bin_edges[i + 1]) {
58 float bin_width = bin_edges[i + 1] - bin_edges[i];
59 if (bin_width != 0) {
60 return 1.0f / bin_width; // Return the inverse of bin width
61 } else {
62 ATH_MSG_WARNING("Warning: in calculation of inverse-bin-width event weight for the variable " << variable_name << ", bin width containing the event value " << event_value << " is zero.");
63 ATH_MSG_WARNING("Assign zero weight for the current event (event not filled).");
64 return 0.0; // event weight is zero
65 }
66 }
67 }
68
69 // Handle edge case where event_value == bin_edges.back()
70 if (event_value == bin_edges.back()) {
71 size_t last_bin_index = bin_edges.size() - 2;
72 float bin_width = bin_edges[last_bin_index + 1] - bin_edges[last_bin_index];
73 return 1.0 / bin_width;
74 }
75
76 // If no bin is found (should not reach here)
77 ATH_MSG_WARNING("Warning: in calculation of inverse-bin-width event weight for the variable " << variable_name << ", no valid bin found for the event value " << event_value << ".");
78 ATH_MSG_WARNING("Assign zero weight for the current event (event not filled).");
79 return 0.0; // event weight is zero
80}
81
82
84
85 ATH_MSG_DEBUG("initializing for the monitoring algorithm");
86 ATH_MSG_DEBUG("Is online? " << m_isOnline);
87 ATH_MSG_DEBUG("Is calorimeter info turned on? " << m_CalInfoOn);
88 ATH_MSG_DEBUG("Is single-side ZDC trigger info turned on? " << m_EnableZDCSingleSideTriggers);
89 ATH_MSG_DEBUG("Is UCC trigger info turned on? " << m_EnableUCCTriggers);
90 ATH_MSG_DEBUG("Is injected pulse? " << m_isInjectedPulse);
91 ATH_MSG_DEBUG("Is Standalone? " << m_isStandalone);
92 ATH_MSG_DEBUG("Enable ZDC? " << m_enableZDC);
93 ATH_MSG_DEBUG("Enable ZDC Physics? " << m_enableZDCPhysics);
94 ATH_MSG_DEBUG("Enable RPD Amp? " << m_enableRPDAmp);
95 ATH_MSG_DEBUG("Enable Centroid? " << m_enableCentroid);
96
97 using namespace Monitored;
98 ATH_CHECK( m_ZdcSumContainerKey.initialize() );
99 ATH_CHECK( m_ZdcModuleContainerKey.initialize() );
101
102 ATH_CHECK( m_eventTypeKey.initialize() );
103 // ATH_CHECK( m_ZdcBCIDKey.initialize() );
104 ATH_CHECK( m_DAQModeKey.initialize() );
105
110
111 // access to conditions in cool database
113
126
132
140
149
150 // calculate log binnings
153
154 // read json file for LB-to-injector-pulse-amplitude mapping and fill the mapping vector
155 m_zdcInjPulserAmpMap = std::make_shared<ZdcInjPulserAmpMap>();
156 ATH_MSG_DEBUG( "Using JSON file for injector-pulse voltage at path " << m_zdcInjPulserAmpMap->getFilePath() );
157 ATH_MSG_DEBUG("CALIBPATH: " << std::getenv("CALIBPATH"));
158
159 // create monitoring tools and map the strings to the tools
160 std::vector<std::string> sides = {"C","A"};
161 std::vector<std::string> modules = {"0","1","2","3"};
162 std::vector<std::string> channels = {"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};
163
164 m_ZDCModuleToolIndices = buildToolMap<std::map<std::string,int>>(m_tools,"ZdcModuleMonitor",sides,modules);
165 if (m_enableZDCPhysics || m_enableRPDAmp || m_enableCentroid){ // none is true for injector pulse --> no Per-side monitoring tool
166 m_ZDCSideToolIndices = buildToolMap<int>(m_tools,"ZdcSideMonitor",sides);
167 }
168 if (m_enableRPDAmp){
169 m_RPDChannelToolIndices = buildToolMap<std::map<std::string,int>>(m_tools,"RpdChannelMonitor",sides,channels);
170 }
173 }
174
175 //---------------------------------------------------
176
177 // Get access to the injector pulse steps for (fixed) run number for current job
178 //
180
182 if (!m_injMapRunToken.isValid()) {
183 ATH_MSG_ERROR("Unable to obtain injector pulse steps for run " << m_runNumber);
184 }
185 else {
186 unsigned int startLB = m_zdcInjPulserAmpMap->getFirstLumiBlock(m_injMapRunToken);
187 unsigned int nsteps = m_zdcInjPulserAmpMap->getNumSteps(m_injMapRunToken);
188 ATH_MSG_INFO("Successfully obtained injector pulse steps for run " << m_runNumber
189 << ", first LB = " << startLB << ", number of steps = " << nsteps);
190 }
191 }
192
193 //---------------------------------------------------
194 // initialize superclass
195
197 //---------------------------------------------------
198
199}
200
201
202StatusCode ZdcMonitorAlgorithm::fillPhysicsDataHistograms( const EventContext& ctx ) const {
203 ATH_MSG_DEBUG("calling the fillPhysicsDataHistograms function");
204
205// ______________________________________________________________________________
206 // EVENT-level flags for whether ZDC, RPD and RPDCentroid data is available
207 // needed for events with LUCROD decoding error - will have missing aux data
208 bool cur_event_ZDC_available = true;
209 bool cur_event_RPD_available = true;
210 bool cur_event_RPDCentroid_available = true;
211
212// ______________________________________________________________________________
213
214// ______________________________________________________________________________
215 // declaring & obtaining event-level information of interest
216// ______________________________________________________________________________
218
219 // already checked in fillHistograms that eventInfo is valid
220 auto lumiBlock = Monitored::Scalar<uint32_t>("lumiBlock", eventInfo->lumiBlock());
221 auto bcid = Monitored::Scalar<unsigned int>("bcid", eventInfo->bcid());
222 uint32_t eventTime = eventInfo->timeStamp();
223 uint32_t runNumber = eventInfo->runNumber();
224
225// ______________________________________________________________________________
226 // check for decoding errors
227// ______________________________________________________________________________
228 bool zdcDecodingError = eventInfo->isEventFlagBitSet(xAOD::EventInfo::ForwardDet, ZdcEventInfo::ZDCDECODINGERROR );
229 bool rpdDecodingError = eventInfo->isEventFlagBitSet(xAOD::EventInfo::ForwardDet, ZdcEventInfo::RPDDECODINGERROR );
230 std::array<float, m_nDecodingErrorBits> decodingErrorBitsArr = {0, 0, 0};
231
232 cur_event_ZDC_available &= !zdcDecodingError;
233 cur_event_RPD_available &= !rpdDecodingError;
234
235 if (!zdcDecodingError && !rpdDecodingError){
236 decodingErrorBitsArr[0] += 1;
237 } else if (zdcDecodingError){
238 ATH_MSG_WARNING("ZDC Decoding error!");
239 decodingErrorBitsArr[1] += 1;
240 } else { // RPD decoding error
241 ATH_MSG_WARNING("RPD Decoding error!");
242 decodingErrorBitsArr[2] += 1;
243 }
244
245 auto zdcTool = getGroup("genZdcMonTool"); // get the tool for easier group filling
246
247 auto decodingErrorBits = Monitored::Collection("decodingErrorBits", decodingErrorBitsArr);
248 fill(zdcTool, decodingErrorBits, lumiBlock);
249
250// ______________________________________________________________________________
251 // does event pass trigger selections?
252// ______________________________________________________________________________
253
254
255// ----------------------- ZDC single-sided triggers -----------------------
256
257 auto passTrigSideA = Monitored::Scalar<bool>("passTrigSideA",false); // if trigger isn't enabled (e.g, MC) the with-trigger histograms are never filled (cut mask never satisfied)
258 auto passTrigSideC = Monitored::Scalar<bool>("passTrigSideC",false);
259
260 if(m_EnableZDCSingleSideTriggers && m_enableZDCPhysics){ // if not enable trigger, the pass-trigger booleans will still be defined but with value always set to false
261 const auto &trigDecTool = getTrigDecisionTool();
262 passTrigSideA = trigDecTool->isPassed(m_triggerSideA, TrigDefs::Physics);
263 passTrigSideC = trigDecTool->isPassed(m_triggerSideC, TrigDefs::Physics);
264 if (passTrigSideA) ATH_MSG_DEBUG("passing trig on side A!");
265 if (passTrigSideC) ATH_MSG_DEBUG("passing trig on side C!");
266 }
267
268// ----------------------- UCC triggers -----------------------
269
270 auto passUCCTrig_HELT15 = Monitored::Scalar<bool>("passUCCTrig_HELT15",false);
271 auto passUCCTrig_HELT20 = Monitored::Scalar<bool>("passUCCTrig_HELT20",false);
272 auto passUCCTrig_HELT25 = Monitored::Scalar<bool>("passUCCTrig_HELT25",false);
273 auto passUCCTrig_HELT35 = Monitored::Scalar<bool>("passUCCTrig_HELT35",false);
274 auto passUCCTrig_HELT50 = Monitored::Scalar<bool>("passUCCTrig_HELT50",false);
275
276 std::array<float, m_nUCCTrigBits> uccTrigBitsArr = {0};
277
278 if(m_EnableUCCTriggers && m_enableZDCPhysics){ // if not enable trigger, the pass-trigger booleans will still be defined but with value always set to false
279 uccTrigBitsArr[UCCTrigEnabledBit] += 1;
280
281 const auto &trigDecTool = getTrigDecisionTool();
282 passUCCTrig_HELT15 = trigDecTool->isPassed(m_UCCtriggerHELT15);
283 passUCCTrig_HELT20 = trigDecTool->isPassed(m_UCCtriggerHELT20);
284 passUCCTrig_HELT25 = trigDecTool->isPassed(m_UCCtriggerHELT25);
285 passUCCTrig_HELT35 = trigDecTool->isPassed(m_UCCtriggerHELT35);
286 passUCCTrig_HELT50 = trigDecTool->isPassed(m_UCCtriggerHELT50);
287
288 if (passUCCTrig_HELT15){
289 uccTrigBitsArr[TrigHELT15Bit] += 1;
290 ATH_MSG_DEBUG("passing UCC trigger L1_ZDC_HELT15_jTE4000!");
291 }
292 if (passUCCTrig_HELT20){
293 uccTrigBitsArr[TrigHELT20Bit] += 1;
294 ATH_MSG_DEBUG("passing UCC trigger L1_ZDC_HELT20_jTE4000!");
295 }
296 if (passUCCTrig_HELT25){
297 uccTrigBitsArr[TrigHELT25Bit] += 1;
298 ATH_MSG_DEBUG("passing UCC trigger L1_ZDC_HELT25_jTE4000!");
299 }
300 if (passUCCTrig_HELT35){
301 uccTrigBitsArr[TrigHELT35Bit] += 1;
302 ATH_MSG_DEBUG("passing UCC trigger L1_ZDC_HELT35_jTE4000!");
303 }
304 if (passUCCTrig_HELT50){
305 uccTrigBitsArr[TrigHELT50Bit] += 1;
306 ATH_MSG_DEBUG("passing UCC trigger L1_ZDC_HELT50_jTE4000!");
307 }
308 }else{
309 uccTrigBitsArr[UCCTrigDisabledBit] += 1;
310 }
311
312 auto uccTrigBits = Monitored::Collection("uccTrigBits", uccTrigBitsArr);
313 fill(zdcTool, uccTrigBits, lumiBlock);
314
315// ----------------------- OOpO triggers -----------------------
316 int nOOpOTriggers = m_OOpOtriggerChains.size();
317 int nOOpOL1TriggersFromCTP = m_OOpOL1TriggerFromCTPIDMap.size();
318 std::vector<float> oopoTrigBitsArr(nOOpOTriggers+2, 0.); // enabled, trigger bits, disabled
319
320 std::vector<Monitored::Scalar<bool>> oopoTrigPassBoolVec;
321 oopoTrigPassBoolVec.reserve(nOOpOTriggers);
322
323 if(m_EnableOOpOTriggers && m_enableZDCPhysics) { // if not enable trigger, the pass-trigger booleans will still be defined but with value always set to false
324 oopoTrigBitsArr[0] += 1; // OOpO trigger enabled
325
326 const auto &trigDecTool = getTrigDecisionTool();
327
328 for (int i = 0; i < nOOpOTriggers - nOOpOL1TriggersFromCTP; ++i) {
329 const bool pass = (trigDecTool->isPassed( m_OOpOtriggerChains[i] ));
330
331 // Histogram variable name: “pass<L1-name>”
332 std::string varName = "pass" + m_OOpOtriggerChains[i];
333 // *Optionally sanitise if you have funky characters*
334 std::replace_if( varName.begin(), varName.end(),
335 [](char c){ return c=='-'; }, '_' );
336
337 oopoTrigPassBoolVec.emplace_back( varName, pass );
338 oopoTrigBitsArr[i+1] += pass;
339 }
340
341 try {
342 const xAOD::TrigDecision* trigDecision = nullptr;
343 ANA_CHECK(evtStore()->retrieve( trigDecision, "xTrigDecision"));
344
345 if (!trigDecision){
346 throw std::runtime_error("Trigger decision NOT retrieved for PEB stream!");
347 }
348 std::vector<uint32_t> tbp = trigDecision->tbp();
349
350 for (const auto& [ctp_id, trig_name] : m_OOpOL1TriggerFromCTPIDMap) {
351 int ind = ctp_id / 32; // index in vector tbp
352 int bit = ctp_id % 32; // bit in tax[ind]
353 const bool pass = ((tbp.at(ind) >> bit) & 1);
354 ATH_MSG_INFO("what's the size of xAOD::TrigDecision::tbp()? " << tbp.size());
355 std::string varName = "pass" + trig_name;
356 oopoTrigPassBoolVec.emplace_back( varName, pass );
357 oopoTrigBitsArr.at(oopoTrigPassBoolVec.size()) += pass;
358 }
359 } catch (const std::out_of_range& e) {
360 ATH_MSG_WARNING("Out of range error captured when fetching L1 trigger bits from CTP ID: " << e.what());
361 } catch (const std::runtime_error& e) {
362 ATH_MSG_WARNING("Runtime error captured when fetching L1 trigger bits from CTP ID: " << e.what());
363 } catch (const std::exception& e) {
364 ATH_MSG_WARNING("Other std::exception captured when fetching L1 trigger bits from CTP ID: " << e.what());
365 } catch (...) {
366 ATH_MSG_WARNING("Error captured when fetching L1 trigger bits from CTP ID. Likely either no L1 trigger looked at or no L1 trigger will show to be passed.");
367 }
368 }else{
369 oopoTrigBitsArr[nOOpOTriggers + 1] += 1; // OOpO trigger disabled
370 }
371
372 auto oopoTrigBits = Monitored::Collection("OOpOTrigBits", oopoTrigBitsArr);
373
374 fill(zdcTool, oopoTrigBits, lumiBlock);
375
376// ______________________________________________________________________________
377 // declaring & obtaining variables of interest for the ZDC sums
378 // including the RPD x,y positions, reaction plane and status
379// ______________________________________________________________________________
381
382 auto zdcEnergySumTwoSidesTeV = Monitored::Scalar<float>("zdcEnergySumTwoSidesTeV",0.0);
383 auto zdcHadronicEnergySumTwoSidesTeV = Monitored::Scalar<float>("zdcHadronicEnergySumTwoSidesTeV",0.0);
384 auto zdcEnergySumA = Monitored::Scalar<float>("zdcEnergySumA",-1000.0);
385 auto zdcEnergySumC = Monitored::Scalar<float>("zdcEnergySumC",-1000.0);
386 auto zdcUncalibSumA = Monitored::Scalar<float>("zdcUncalibSumA",-1000.0);
387 auto zdcUncalibSumC = Monitored::Scalar<float>("zdcUncalibSumC",-1000.0);
388 auto rpdCosDeltaReactionPlaneAngle = Monitored::Scalar<float>("rpdCosDeltaReactionPlaneAngle",-1000.0);
389 auto bothReactionPlaneAngleValid = Monitored::Scalar<bool>("bothReactionPlaneAngleValid",true);
390 auto bothHasCentroid = Monitored::Scalar<bool>("bothHasCentroid",true); // the looser requirement that both centroids were calculated (ignore valid)
391
392 std::array<bool, 2> centroidSideValidArr;
393 std::array<bool, 2> rpdSideValidArr = {false, false};
394 std::array<std::vector<float>,2> rpdSubAmpVecs;
395 auto rpdSubAmpSumCurSide = Monitored::Scalar<float>("rpdSubAmpSum",-1000.0);
396 auto rpdXCentroidCurSide = Monitored::Scalar<float>("xCentroid",-1000.0);
397 auto rpdYCentroidCurSide = Monitored::Scalar<float>("yCentroid",-1000.0);
398 auto rpdReactionPlaneAngleCurSide = Monitored::Scalar<float>("ReactionPlaneAngle",-1000.0);
399 auto centroidValid = Monitored::Scalar<bool>("centroidValid",false);
400 auto centroidValidBitFloat = Monitored::Scalar<float>("centroidValidBitFloat", -1000.0); // 0.5 if valid, 1.5 if invalid --> needed for DQ
401 auto passMinZDCEnergyCutForCentroidValidEvaluation = Monitored::Scalar<bool>("passMinZDCEnergyCutForCentroidValidEvaluation",false);
402
403 // need to recognize same-side correlation among the following observables
404 // since they are filled differently, it is helpful to store each of their values in the 2-dimension array first
405 // and fill the side monitoring tool in the same "monitoring group"
406 std::array<float, 2> zdcEMModuleEnergyArr = {-1000.,-1000.};
407 std::array<float, 2> zdcEnergySumArr = {-1000,-1000.};
408 std::array<float, 2> zdcUncalibSumArr = {-1000.,-1000.};
409 std::array<float, 2> zdcAvgTimeArr = {-1000.,-1000.};
410 std::array<bool, 2> zdcModuleMaskArr = {false, false};
411 std::array<bool, 2> passTrigOppSideArr = {false, false};
412 std::array<float, 2> rpdAmplitudeCalibSum = {-1000.,-1000.};
413 std::array<float, 2> rpdMaxADCSum = {-1000.,-1000.};
414
415 std::array<float, m_nRpdCentroidStatusBits> centroidStatusBitsCountCurSide;
416
417 if (! zdcSums.isValid() ) {
418 ATH_MSG_WARNING("evtStore() does not contain Collection with name "<< m_ZdcSumContainerKey);
419 return StatusCode::SUCCESS;
420 }
421
426
427 // ZDC per-arm module mask retrieval --> needed both for physics (calib stream) and inj stream (energy fraction DQ)
428
429 if (cur_event_ZDC_available){ // no ZDC decoding error
430 for (const auto zdcSum : *zdcSums) { // side -1: C; side 1: A
431 if (zdcSum->zdcSide() != 0){
432 int iside = (zdcSum->zdcSide() > 0)? 1 : 0;
433 zdcModuleMaskArr[iside] = ZdcSumModuleMaskHandle(*zdcSum);
434 }
435 }
436 }
437
438 // write ZDC per-arm information to arrays
439 zdcEnergySumTwoSidesTeV = 0.;
440
441 if (m_enableZDCPhysics){ // write down energy sum, uncalib sum, average time, and module mask if we enable ZDC physics
442 cur_event_ZDC_available &= ZdcSumCalibEnergyHandle.isAvailable();
443
444 if (cur_event_ZDC_available){
445 for (const auto zdcSum : *zdcSums) { // side -1: C; side 1: A
446 if (zdcSum->zdcSide() != 0){
447 int iside = (zdcSum->zdcSide() > 0)? 1 : 0;
448
449 zdcEnergySumArr[iside] = ZdcSumCalibEnergyHandle(*zdcSum);
450 zdcUncalibSumArr[iside] = ZdcSumUncalibSumHandle(*zdcSum);
451 zdcAvgTimeArr[iside] = ZdcSumAverageTimeHandle(*zdcSum);
452
453 passTrigOppSideArr[iside] = (iside == 0)? passTrigSideA : passTrigSideC;
454
455 zdcEnergySumTwoSidesTeV += (ZdcSumCalibEnergyHandle(*zdcSum)) / 1000.;
456
457 if (zdcSum->zdcSide() == 1){
458 zdcEnergySumA = ZdcSumCalibEnergyHandle(*zdcSum);
459 zdcUncalibSumA = ZdcSumUncalibSumHandle(*zdcSum);
460 }
461 else {
462 zdcEnergySumC = ZdcSumCalibEnergyHandle(*zdcSum);
463 zdcUncalibSumC = ZdcSumUncalibSumHandle(*zdcSum);
464 }
465 }
466 } // having filled both sides
467 }
468 } else if (m_enableZDC){ // enable ZDC but not physics - for now, the only case is injector pulse --> no energy, only record uncalib sum
469 cur_event_ZDC_available &= ZdcSumUncalibSumHandle.isAvailable();
470 if (cur_event_ZDC_available){
471 for (const auto zdcSum : *zdcSums) { // side -1: C; side 1: A
472 if (zdcSum->zdcSide() != 0){
473 int iside = (zdcSum->zdcSide() > 0)? 1 : 0;
474 zdcUncalibSumArr[iside] = ZdcSumUncalibSumHandle(*zdcSum);
475 }
476 }
477 }
478 }
479
480 // write RPD per-arm status to arrays
481 if (m_enableRPDAmp){
483 cur_event_RPD_available &= RPDsideStatusHandle.isAvailable();
484 if (cur_event_RPD_available){
485 for (const auto zdcSum : *zdcSums) { // side -1: C; side 1: A
486 if (zdcSum->zdcSide() != 0){ // contains the RPD Cos Delta reaction plane
487 int iside = (zdcSum->zdcSide() > 0)? 1 : 0;
488 unsigned int rpdStatusCurSide = RPDsideStatusHandle(*zdcSum);
489 rpdSideValidArr.at(iside) = rpdStatusCurSide & 1 << ZDC::RPDDataAnalyzer::ValidBit;
490 }
491 }
492 }
493 }
494
495 // fill RPD centroid information to monitoring tools
496 if (m_enableCentroid){
504
505 cur_event_RPDCentroid_available &= RPDcentroidStatusHandle.isAvailable();
506 if (cur_event_RPDCentroid_available){
507 for (const auto zdcSum : *zdcSums) { // side -1: C; side 1: A
508
509 if (zdcSum->zdcSide() == 0){ // contains the RPD Cos Delta reaction plane
510 rpdCosDeltaReactionPlaneAngle = RPDcosDeltaReactionPlaneAngleHandle(*zdcSum);
511 }else{
512 int iside = (zdcSum->zdcSide() > 0)? 1 : 0; // already exclude the possibility of global sum
513 std::string side_str = (iside == 0)? "C" : "A";
514
515 rpdSubAmpVecs[iside] = RPDsubAmpHandle(*zdcSum);
516 rpdSubAmpSumCurSide = RPDsubAmpSumHandle(*zdcSum);
517 rpdXCentroidCurSide = RPDxCentroidHandle(*zdcSum);
518 rpdYCentroidCurSide = RPDyCentroidHandle(*zdcSum);
519 rpdReactionPlaneAngleCurSide = RPDreactionPlaneAngleHandle(*zdcSum);
520
521 unsigned int rpdCentroidStatusCurSide = RPDcentroidStatusHandle(*zdcSum);
522
523 // Remarks - Oct 2024
524 // HasCentroidBit is false if RPD on the current side is invalid
525 // The centroid ValidBit, compared with Has HasCentroidBit, also checks that ZDC is valid
526 // and has the infrastruture to require (1) ZDC total energy to be in given range
527 // (2) EM-module energy to be in given range
528 // (3) pile up fraction is below a threshold
529 // but these are currently NOT implemented
530 // for online, we only monitor the ones requiring valid bit
531 // for offline, we plot both sets, with the expectation that they are the same for now
532 centroidValid = (rpdCentroidStatusCurSide & 1 << ZDC::RpdSubtractCentroidTool::ValidBit);
533
534 centroidValidBitFloat = (centroidValid)? 0.5 : 1.5;
535
536 centroidSideValidArr.at(iside) = rpdCentroidStatusCurSide & 1 << ZDC::RpdSubtractCentroidTool::ValidBit;
537 bool curSideHasCentroid = (rpdCentroidStatusCurSide & 1 << ZDC::RpdSubtractCentroidTool::HasCentroidBit);
538
539 bothReactionPlaneAngleValid &= centroidValid;
540 bothHasCentroid &= curSideHasCentroid;
541
542 for (int bit = 0; bit < m_nRpdCentroidStatusBits; bit++) centroidStatusBitsCountCurSide[bit] = 0; // reset
543 for (int bit = 0; bit < m_nRpdCentroidStatusBits; bit++){
544 if (rpdCentroidStatusCurSide & 1 << bit){
545 centroidStatusBitsCountCurSide[bit] += 1;
546 }
547 }
548 auto centroidStatusBits = Monitored::Collection("centroidStatusBits", centroidStatusBitsCountCurSide);
549
550 if (curSideHasCentroid){ // only impose the looser requirement that this side has centroid; have a set of histograms for the more stringent centroid-valid requirement
551 if (m_enableZDCPhysics){ // if not enable ZDC physics, no ZDC energy --> the boolean requiring minimum ZDC energy will always be set to false
552 passMinZDCEnergyCutForCentroidValidEvaluation = (zdcEnergySumArr[iside] > m_ZDCEnergyCutForCentroidValidBitMonitor);
553 }
554 fill(m_tools[m_ZDCSideToolIndices.at(side_str)], rpdSubAmpSumCurSide, centroidValid, passMinZDCEnergyCutForCentroidValidEvaluation, centroidValidBitFloat, rpdXCentroidCurSide, rpdYCentroidCurSide, rpdReactionPlaneAngleCurSide, centroidStatusBits, lumiBlock, bcid);
555 }else{
556 fill(m_tools[m_ZDCSideToolIndices.at(side_str)], rpdSubAmpSumCurSide, centroidStatusBits, lumiBlock, bcid);
557 }
558 }
559 } // having filled both sides
560 }
561 }
562
563// ______________________________________________________________________________
564 // declaring & obtaining variables of interest for the ZDC modules & RPD channels
565 // filling arrays of monitoring tools (module/channel-level)
566 // updating status bits
567// ______________________________________________________________________________
568
570
583
589
590 auto zdcModuleAmp = Monitored::Scalar<float>("zdcModuleAmp", -1000.0);
591 auto zdcModuleFitAmp = Monitored::Scalar<float>("zdcModuleFitAmp", -1000.0);
592 auto zdcModuleMaxADC = Monitored::Scalar<float>("zdcModuleMaxADC", -1000.0);
593 auto zdcModuleMaxADCHG = Monitored::Scalar<float>("zdcModuleMaxADCHG", -1000.0);
594 auto zdcModuleMaxADCLG = Monitored::Scalar<float>("zdcModuleMaxADCLG", -1000.0);
595 auto zdcModuleAmpToMaxADCRatio = Monitored::Scalar<float>("zdcModuleAmpToMaxADCRatio", -1000.0);
596 auto zdcModuleFract = Monitored::Scalar<float>("zdcModuleFract", -1000.0);
597 auto zdcUncalibSumCurrentSide = Monitored::Scalar<float>("zdcUncalibSumCurrentSide", -1000.0);
598 auto zdcEnergySumCurrentSide = Monitored::Scalar<float>("zdcEnergySumCurrentSide", -1000.0);
599 auto zdcAbove20NCurrentSide = Monitored::Scalar<bool>("zdcAbove20NCurrentSide", false);
600 auto zdcEnergyAboveModuleFractCut = Monitored::Scalar<bool>("zdcEnergyAboveModuleFractCut", false);
601 auto zdcModuleTime = Monitored::Scalar<float>("zdcModuleTime", -1000.0);
602 auto zdcModuleFitT0 = Monitored::Scalar<float>("zdcModuleFitT0", -1000.0);
603 auto zdcModuleChisq = Monitored::Scalar<float>("zdcModuleChisq", -1000.0);
604 auto zdcModuleChisqEventWeight = Monitored::Scalar<float>("zdcModuleChisqEventWeight", -1000.0);
605 auto zdcModuleChisqOverAmp = Monitored::Scalar<float>("zdcModuleChisqOverAmp", -1000.0);
606 auto zdcModuleChisqOverAmpEventWeight = Monitored::Scalar<float>("zdcModuleChisqOverAmpEventWeight", -1000.0);
607 auto zdcModuleCalibAmp = Monitored::Scalar<float>("zdcModuleCalibAmp", -1000.0);
608 auto zdcModuleCalibTime = Monitored::Scalar<float>("zdcModuleCalibTime", -1000.0);
609 auto zdcModuleLG = Monitored::Scalar<bool>("zdcModuleLG", false);
610 auto zdcModuleHG = Monitored::Scalar<bool>("zdcModuleHG", false);
611
612 auto injectedPulseInputVoltage = Monitored::Scalar<float>("injectedPulseInputVoltage", -1000.0);
613 auto zdcInjInputVoltagePassMinThrsh = Monitored::Scalar<bool>("zdcInjInputVoltagePassMinThrsh", false);
614 auto zdcHGInjPulseValid = Monitored::Scalar<bool>("zdcHGInjPulseValid", true);
615 auto zdcLGInjPulseValid = Monitored::Scalar<bool>("zdcLGInjPulseValid", true);
616
617 auto zdcModuleFractionValid = Monitored::Scalar<bool>("zdcModuleFractionValid", false);
618 auto zdcModuleTimeValid = Monitored::Scalar<bool>("zdcModuleTimeValid", false);
619 auto zdcModuleHGTimeValid = Monitored::Scalar<bool>("zdcModuleHGTimeValid", false);
620 auto zdcModuleLGTimeValid = Monitored::Scalar<bool>("zdcModuleLGTimeValid", false);
621
622 auto zdcModuleLGFitAmp = Monitored::Scalar<float>("zdcModuleLGFitAmp", -1000.0);
623 auto zdcModuleFitAmpLGRefit = Monitored::Scalar<float>("zdcModuleFitAmpLGRefit", -1000.0);
624 auto zdcModuleAmpLGRefit = Monitored::Scalar<float>("zdcModuleAmpLGRefit", -1000.0);
625 auto zdcModuleT0LGRefit = Monitored::Scalar<float>("zdcModuleT0LGRefit", -1000.0);
626 auto zdcModuleT0SubLGRefit = Monitored::Scalar<float>("zdcModuleT0SubLGRefit", -1000.0);
627 auto zdcModuleChisqLGRefit = Monitored::Scalar<float>("zdcModuleChisqLGRefit", -1000.0);
628
629 auto zdcModuleHGtoLGAmpRatio = Monitored::Scalar<float>("zdcModuleHGtoLGAmpRatio", -1000.0);
630 auto zdcModuleHGtoLGAmpRatioNoNonlinCorr = Monitored::Scalar<float>("zdcModuleHGtoLGAmpRatioNoNonlinCorr", -1000.0);
631 auto zdcModuleHGtoLGT0Diff = Monitored::Scalar<float>("zdcModuleHGtoLGT0Diff", -1000.0);
632
633 auto zdcModuleMaskCurSide = Monitored::Scalar<bool>("zdcModuleMaskCurSide", false);
634
635 auto rpdChannelSubAmp = Monitored::Scalar<float>("RPDChannelSubAmp", -1000.0);
636 auto rpdChannelAmplitude = Monitored::Scalar<float>("RPDChannelAmplitude", -1000.0);
637 auto rpdChannelMaxADC = Monitored::Scalar<float>("RPDChannelMaxADC", -1000.0);
638 auto rpdChannelMaxSample = Monitored::Scalar<unsigned int>("RPDChannelMaxSample", 1000);
639 auto rpdChannelAmplitudeCalib = Monitored::Scalar<float>("RPDChannelAmplitudeCalib", -1000.0);
640 auto rpdChannelStatus = Monitored::Scalar<unsigned int>("RPDChannelStatus", 1000);
641 auto rpdChannelPileupFitSlope = Monitored::Scalar<float>("RPDChannelPileupFitSlope", -1000);
642 auto absRpdChannelAmplitude = Monitored::Scalar<float>("absRPDChannelAmplitude", -1000.); // EM module energy on the same side (assuming filled already)
643 auto rpdChannelValid = Monitored::Scalar<bool>("RPDChannelValid", false);
644 auto rpdChannelValidBitFloat = Monitored::Scalar<float>("RPDChannelValidBitFloat", -1000.0); // 0.5 if valid, 1.5 if invalid --> needed for DQ
645 auto rpdChannelCentroidValid = Monitored::Scalar<bool>("RPDChannelCentroidValid", false);
646 auto rpdChannelPileupFrac = Monitored::Scalar<float>("RPDChannelPileupFrac", -1000.);
647 auto zdcEMModuleEnergySameSide = Monitored::Scalar<float>("zdcEMModuleEnergySameSide", -1000.); // EM module energy on the same side (assuming filled already)
648 auto zdcEnergySumSameSide = Monitored::Scalar<float>("zdcEnergySumSameSide", -1000.); // EM module energy on the same side (assuming filled already)
649
650 std::array<float, m_nZdcStatusBits> zdcStatusBitsCount;
651 std::array<float, m_nRpdStatusBits> rpdStatusBitsCount;
652
653 if (! zdcModules.isValid() ) {
654 ATH_MSG_WARNING("evtStore() does not contain Collection with name "<< m_ZdcModuleContainerKey);
655 return StatusCode::SUCCESS;
656 }
657
659 // Check the event run number agrees with fixed run number
660 if (runNumber != m_runNumber) {
661 ATH_MSG_WARNING("The event run number differs from the fixed run number read from the input-file metadata!");
662 ATH_MSG_WARNING("The event run number is " << runNumber << "; the fixed run number is " << m_runNumber);
663 }
664
665 injectedPulseInputVoltage = m_zdcInjPulserAmpMap->getPulserAmplitude(m_injMapRunToken, lumiBlock);
666 zdcInjInputVoltagePassMinThrsh = (injectedPulseInputVoltage >= m_minVInjToEvaluateLowAmpPercentageDQInjectorPulse);
667 }
668
669 // first loop over zdcModules - read ZDC-module information & fill in ZDC histograms
670 // separate ZDC and RPD variable retrieval into two for loops to make sure
671 // essential ZDC information (e.g, the EM module energy and total energy sum on both sides) is properly filled
672 // before they are required in RPD channel monitoring
673 zdcHadronicEnergySumTwoSidesTeV = 0.;
674 if (m_enableZDC){
675 cur_event_ZDC_available &= zdcModuleStatusHandle.isAvailable();
676 if (cur_event_ZDC_available){
677 for (const auto zdcMod : *zdcModules){
678 int iside = (zdcMod->zdcSide() > 0)? 1 : 0;
679 std::string side_str = (iside == 0)? "C" : "A";
680
681 zdcModuleMaskCurSide = zdcModuleMaskArr[iside];
682
683 if (zdcMod->zdcType() == 0){
684 int imod = zdcMod->zdcModule();
685 std::string module_str = std::to_string(imod);
686
687 int status = zdcModuleStatusHandle(*zdcMod);
688
689 for (int bit = 0; bit < m_nZdcStatusBits; bit++) zdcStatusBitsCount[bit] = 0; // reset
690 for (int bit = 0; bit < m_nZdcStatusBits; bit++){
691 if (status & 1 << bit){
692 zdcStatusBitsCount[bit] += 1;
693 }
694 }
695
696 auto zdcStatusBits = Monitored::Collection("zdcStatusBits", zdcStatusBitsCount);
697 fill(m_tools[m_ZDCModuleToolIndices.at(side_str).at(module_str)], zdcStatusBits, lumiBlock, bcid);
698
699 if ((status & 1 << ZDCPulseAnalyzer::PulseBit) != 0){ // has pulse
700 zdcModuleAmp = zdcModuleAmplitudeHandle(*zdcMod);
701
702 float zdcModuleAmpNoNonLin = zdcModuleAmpNoNonLinHandle(*zdcMod); // module fit amplitude (without gain factor or nonlinear corrections applied)
703 zdcModuleFitAmp = zdcModuleFitAmpHandle(*zdcMod); // module fit amplitude (without gain factor or nonlinear corrections applied)
704 zdcModuleMaxADC = zdcModuleMaxADCHandle(*zdcMod);
705 zdcModuleMaxADCHG = zdcModuleMaxADCHGHandle(*zdcMod);
706 zdcModuleMaxADCLG = zdcModuleMaxADCLGHandle(*zdcMod);
707 zdcModuleAmpToMaxADCRatio = (zdcModuleMaxADC == 0)? -1000. : zdcModuleFitAmp / zdcModuleMaxADC; // use fit amplitude: no gain factor applied to either
708 zdcModuleTime = zdcModuleTimeHandle(*zdcMod);
709 zdcModuleFitT0 = zdcModuleFitT0Handle(*zdcMod);
710 zdcModuleChisq = zdcModuleChisqHandle(*zdcMod);
711 zdcModuleCalibAmp = zdcModuleCalibEnergyHandle(*zdcMod);
712 zdcModuleCalibTime = zdcModuleCalibTimeHandle(*zdcMod);
713 zdcUncalibSumCurrentSide = zdcUncalibSumArr[iside];
714 zdcEnergySumCurrentSide = zdcEnergySumArr[iside];
715 zdcAbove20NCurrentSide = (zdcUncalibSumCurrentSide > 20 * m_expected1N);
716 zdcEnergyAboveModuleFractCut = (zdcEnergySumCurrentSide > m_energyCutForModuleFractMonitor);
717
719 zdcModuleFract = (zdcEnergySumCurrentSide == 0)? -1000. : zdcModuleCalibAmp / zdcEnergySumCurrentSide; // use calibrated amplitudes + energy sum
720 }else{
721 zdcModuleFract = (zdcUncalibSumCurrentSide == 0)? -1000. : zdcModuleAmp / zdcUncalibSumCurrentSide; // use uncalibrated amplitudes + amplitude sum
722 }
723
724 // use fit amplitude for chisq over amplitude: neither fit amplitude nor chisq has gain factor applied
725 zdcModuleChisqOverAmp = (zdcModuleFitAmp == 0)? -1000. : zdcModuleChisq / zdcModuleFitAmp;
726 zdcModuleLG = (status & 1 << ZDCPulseAnalyzer::LowGainBit);
727 zdcModuleHG = !zdcModuleLG;
728
729 zdcModuleFractionValid = (zdcModuleFract >= 0 && zdcModuleFract <= 1);
730
731 zdcModuleTimeValid = (zdcModuleTime > -100.);
732 zdcModuleHGTimeValid = zdcModuleHG && zdcModuleTimeValid;
733 zdcModuleLGTimeValid = zdcModuleLG && zdcModuleTimeValid;
734
735
736 zdcModuleFitAmpLGRefit = zdcModuleFitAmpLGRefitHandle(*zdcMod);
737 zdcModuleAmpLGRefit = zdcModuleAmpLGRefitHandle(*zdcMod);
738 zdcModuleT0LGRefit = zdcModuleT0LGRefitHandle(*zdcMod);
739 zdcModuleT0SubLGRefit = zdcModuleT0SubLGRefitHandle(*zdcMod);
740 zdcModuleChisqLGRefit = zdcModuleChisqLGRefitHandle(*zdcMod);
741
742 zdcModuleLGFitAmp = (zdcModuleHG)? zdcModuleFitAmpLGRefit * 1. : zdcModuleFitAmp * 1.;
743
744 zdcModuleHGtoLGAmpRatio = (zdcModuleLG || zdcModuleAmpLGRefit == 0)? -1000. : zdcModuleAmp * 1. / zdcModuleAmpLGRefit; // HG/LG ratio if HG is valid and LG-refit amplitude is nonzero (shouldn't be)
745 zdcModuleHGtoLGAmpRatioNoNonlinCorr = (zdcModuleLG || zdcModuleAmpLGRefit == 0)? -1000. : zdcModuleAmpNoNonLin * 1. / zdcModuleAmpLGRefit; // HG/LG ratio if HG is valid and LG-refit amplitude is nonzero (shouldn't be)
746 zdcModuleHGtoLGT0Diff = (zdcModuleLG)? -1000. : zdcModuleFitT0 - zdcModuleT0LGRefit;
747
748 zdcModuleChisqEventWeight = calculate_inverse_bin_width(zdcModuleChisq, "module chisq", m_ZdcModuleChisqBinEdges);
749 zdcModuleChisqOverAmpEventWeight = calculate_inverse_bin_width(zdcModuleChisqOverAmp, "module chisq over amplitude", m_ZdcModuleChisqOverAmpBinEdges);
750
751 if (imod == 0) zdcEMModuleEnergyArr[iside] = zdcModuleCalibAmp; // EM module energy
752 else zdcHadronicEnergySumTwoSidesTeV += zdcModuleCalibAmp / 1000.; // hadronic module energy
753
754 fill(m_tools[m_ZDCModuleToolIndices.at(side_str).at(module_str)], zdcModuleChisq, zdcModuleChisqOverAmp, zdcModuleChisqLGRefit, zdcModuleChisqEventWeight, zdcModuleChisqOverAmpEventWeight, zdcModuleAmp);
755
756 if (!(status & 1 << ZDCPulseAnalyzer::ArmSumIncludeBit)) continue;
757
759
760 zdcHGInjPulseValid = true;
761 zdcLGInjPulseValid = true;
762
763 bool pass_first3s = true;
764
765 // ------------ throw away the first few seconds of each LB ------------
766 // get the start + end time of the event LB from the cool data
767 // copied from Trigger/TrigT1/TrigT1CTMonitoring/src/BSMonitoringAlg.cxx
768
769 if (!m_isSim && !m_isOnline) {
770 uint64_t lb_stime = 0; // LB POSIX start time in seconds
771 uint64_t lb_etime = 0; // LB POSIX end time in seconds
772 bool retrievedLumiBlockTimes = false;
773
775 const AthenaAttributeList* lblbattrList{*lblb};
776 if (lblbattrList==nullptr) {
777 ATH_MSG_WARNING("Failed to retrieve /TRIGGER/LUMI/LBLB " << m_LBLBFolderInputKey.key() << " not found");
778 }
779 else {
780 retrievedLumiBlockTimes = true;
781 auto lb_stime_loc = (*lblbattrList)["StartTime"].data<cool::UInt63>();
782 auto lb_etime_loc = (*lblbattrList)["EndTime"].data<cool::UInt63>();
783 lb_stime = lb_stime_loc;
784 lb_etime = lb_etime_loc;
785 ATH_MSG_DEBUG("lb_stime: " << lb_stime << " lb_etime: " << lb_etime );
786 }
787
788 lb_stime /= 1000000000;
789 lb_etime /= 1000000000;
790
791 if (lb_etime <= lb_stime || !retrievedLumiBlockTimes){
792 ATH_MSG_WARNING("The LB start + end time for current event is not retrieved.");
793 ATH_MSG_WARNING("No event rejection at beginning of LB is implemented.");
794 }else if(eventTime < lb_stime){
795 ATH_MSG_WARNING("Event time is before the start time of the current LB");
796 ATH_MSG_WARNING("Event time: " << eventTime << "; current LB: " << lumiBlock << "; start time of current LB: " << lb_stime);
797 }else if (eventTime > lb_etime){
798 ATH_MSG_WARNING("Event time is after the end time of the current LB");
799 ATH_MSG_WARNING("Event time: " << eventTime << "; current LB: " << lumiBlock << "; end time of current LB: " << lb_etime);
800 }else{ // require event time to be at least X seconds after start time of the current LB
801 pass_first3s = (eventTime > lb_stime + m_nSecondsRejectStartofLBInjectorPulse);
802 zdcHGInjPulseValid &= (eventTime > lb_stime + m_nSecondsRejectStartofLBInjectorPulse);
803 zdcLGInjPulseValid &= (eventTime > lb_stime + m_nSecondsRejectStartofLBInjectorPulse);
804 }
805 }
806
807 // ------------ impose the rest of HG/LG injector-pulse validity requirements ------------
808
809 zdcHGInjPulseValid &= zdcModuleHG;
810 zdcHGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::ExcludeEarlyLGBit);
811 zdcHGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::BadChisqBit);
812 zdcHGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::FailBit);
813 zdcHGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::FitMinAmpBit);
814 zdcHGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::BadT0Bit);
816 zdcHGInjPulseValid &= (zdcModuleAmp > m_minAmpRequiredHGInjectorPulse);
817 }
818
819 zdcLGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::LGOverflowBit);
820 zdcLGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::ExcludeEarlyLGBit);
821 zdcLGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::BadChisqBit);
822 zdcLGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::FailBit);
823 zdcLGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::FitMinAmpBit);
824 zdcLGInjPulseValid &= !(status & 1 << ZDCPulseAnalyzer::BadT0Bit);
826 zdcLGInjPulseValid &= (zdcModuleLGFitAmp > m_minAmpRequiredLGInjectorPulse);
827 }
828
829 if (injectedPulseInputVoltage > 0){ // LB > startLB
830 if (injectedPulseInputVoltage > 1 && !zdcLGInjPulseValid &&pass_first3s){ // problematic range && LG not valid && not failing first 3s
831
832 std::ostringstream fails;
833 std::vector<std::pair<std::string, bool>> checks = {
834 {"LGOverflowBit", !(status & (1 << ZDCPulseAnalyzer::LGOverflowBit))},
835 {"ExcludeEarlyLGBit", !(status & (1 << ZDCPulseAnalyzer::ExcludeEarlyLGBit))},
836 {"BadChisqBit", !(status & (1 << ZDCPulseAnalyzer::BadChisqBit))},
837 {"FailBit", !(status & (1 << ZDCPulseAnalyzer::FailBit))},
838 {"FitMinAmpBit", !(status & (1 << ZDCPulseAnalyzer::FitMinAmpBit))},
839 {"BadT0Bit", !(status & (1 << ZDCPulseAnalyzer::BadT0Bit))}
840 };
841
842 for (const auto& [name, pass] : checks) {
843 if (!pass) fails << "fail " << name << "; ";
844 }
845
846 ATH_MSG_DEBUG("[LG NOT valid] Lumi block: " << lumiBlock
847 << "; input voltage: " << injectedPulseInputVoltage
848 << "; LG amp: " << zdcModuleLGFitAmp
849 << "; side" << side_str << ", mod" << module_str
850 << "; " << fails.str());
851
852 }
853 } else if (lumiBlock > m_zdcInjPulserAmpMap->getFirstLumiBlock(m_injMapRunToken)){ // LB > startLB but injectedPulseInputVoltage < 0!
854 ATH_MSG_WARNING("Lumi block: " << lumiBlock << ", yet input voltage is negative!! input voltage: " << injectedPulseInputVoltage);
855 }
856
857
858 // ------------ find the voltage index & fill per-voltage HG&LG cut masks ------------
859
860 std::vector<float> injPulseVoltageSteps = m_injPulseVoltageSteps.value();
861
862 int voltage_index = -1;
863 auto voltage_iter = std::find_if(injPulseVoltageSteps.begin(), injPulseVoltageSteps.end(),
864 [&](float num) { return check_equal_within_rounding(num, injectedPulseInputVoltage); });
865
866 if (voltage_iter != injPulseVoltageSteps.end()) {
867 voltage_index = std::distance(injPulseVoltageSteps.begin(), voltage_iter);
868 ATH_MSG_DEBUG("Found injected-pulse input voltage " << injectedPulseInputVoltage << " at index " << std::distance(injPulseVoltageSteps.begin(), voltage_iter));
869 } else {
870 ATH_MSG_WARNING("Injected-pulse input voltage " << injectedPulseInputVoltage << "(Lumi block: " << lumiBlock << ") NOT found in voltage steps read from json.");
871 ATH_MSG_WARNING("Possibly a problem with json file reading.");
872 ATH_MSG_WARNING("Single-voltage lucrod response histograms NOT filled.");
873 }
874
875 // ------------ fill the histograms ------------
876
877 auto VoltageIndex = Monitored::Scalar<float>("VoltageIndex", voltage_index+0.5);
878
879 if (m_isStandalone) injectedPulseInputVoltage = zdcModuleAmp * 1. / 25000.; // no LB in standalone --> fill dummy histograms
880 fill(m_tools[m_ZDCModuleToolIndices.at(side_str).at(module_str)], VoltageIndex, zdcModuleAmp, zdcModuleFitAmp, zdcModuleMaxADC, zdcModuleMaxADCHG, zdcModuleMaxADCLG, zdcModuleAmpToMaxADCRatio, zdcModuleFract, zdcInjInputVoltagePassMinThrsh, zdcModuleMaskCurSide, zdcUncalibSumCurrentSide, zdcEnergySumCurrentSide, zdcModuleTime, zdcModuleFitT0, zdcModuleCalibAmp, zdcModuleCalibTime, zdcModuleLG, zdcModuleHG, zdcModuleAmpLGRefit, zdcModuleT0LGRefit, zdcModuleT0SubLGRefit, zdcModuleChisqLGRefit, zdcModuleLGFitAmp, zdcModuleHGtoLGAmpRatio, zdcModuleHGtoLGAmpRatioNoNonlinCorr, zdcModuleHGtoLGT0Diff, zdcModuleFractionValid, zdcModuleTimeValid, zdcModuleHGTimeValid, zdcModuleLGTimeValid, injectedPulseInputVoltage, zdcHGInjPulseValid, zdcLGInjPulseValid, lumiBlock, bcid);
881 if (voltage_index >= 0 && (!m_isOnline)){
882 fill(m_tools[m_LucrodResponseSingleVoltageToolIndices.at(side_str).at(module_str).at(m_injPulseVoltageStepsStr.value().at(voltage_index))], zdcModuleFitAmp, zdcModuleLGFitAmp, zdcModuleMaxADCHG, zdcModuleMaxADCLG, zdcHGInjPulseValid, zdcLGInjPulseValid);
883 }
884 } // end if statement for injected pulse
885 else{
886 fill(m_tools[m_ZDCModuleToolIndices.at(side_str).at(module_str)], zdcModuleAmp, zdcModuleMaxADC, zdcModuleMaxADCHG, zdcModuleMaxADCLG, zdcModuleAmpToMaxADCRatio, zdcModuleFract, zdcModuleMaskCurSide, zdcUncalibSumCurrentSide, zdcEnergySumCurrentSide, zdcAbove20NCurrentSide, zdcEnergyAboveModuleFractCut, zdcModuleTime, zdcModuleFitT0, zdcModuleCalibAmp, zdcModuleCalibTime, zdcModuleLG, zdcModuleHG, zdcModuleAmpLGRefit, zdcModuleT0LGRefit, zdcModuleT0SubLGRefit, zdcModuleChisqLGRefit, zdcModuleHGtoLGAmpRatio, zdcModuleHGtoLGAmpRatioNoNonlinCorr, zdcModuleHGtoLGT0Diff, zdcModuleFractionValid, zdcModuleTimeValid, zdcModuleHGTimeValid, zdcModuleLGTimeValid, lumiBlock, bcid);
887 }
888 } // end if statement for pulse bit
889 }
890 }
891 }
892 }
893
894
895 // second loop over zdcModules - read RPD-channel information & fill in RPD histograms
896 // only run if NOT injector pulse
897 if (m_enableRPDAmp){
905
906 cur_event_RPD_available &= RPDChannelStatusHandle.isAvailable();
907 if (cur_event_RPD_available){
908 for (const auto zdcMod : *zdcModules){
909 int iside = (zdcMod->zdcSide() > 0)? 1 : 0;
910 std::string side_str = (iside == 0)? "C" : "A";
911
912 if (zdcMod->zdcType() == 1) {
913 // this is the RPD
914
915 int ichannel = zdcMod->zdcChannel(); // zero-based
916 std::string channel_str = std::to_string(ichannel);
917
918 int status = RPDChannelStatusHandle(*zdcMod);
919
920 for (int bit = 0; bit < m_nRpdStatusBits; bit++) rpdStatusBitsCount[bit] = 0; // reset
921 for (int bit = 0; bit < m_nRpdStatusBits; bit++){
922 if (status & 1 << bit){
923 rpdStatusBitsCount[bit] += 1;
924 }
925 }
926
927 auto rpdStatusBits = Monitored::Collection("RPDStatusBits", rpdStatusBitsCount);
928
929 rpdChannelSubAmp = rpdSubAmpVecs[iside][ichannel];
930 rpdChannelAmplitude = RPDChannelAmplitudeHandle(*zdcMod);
931 rpdChannelMaxADC = RPDChannelMaxADCHandle(*zdcMod);
932 rpdChannelMaxSample = RPDChannelMaxSampleHandle(*zdcMod);
933 rpdChannelAmplitudeCalib = RPDChannelAmplitudeCalibHandle(*zdcMod);
934 std::vector<float> rpdChannelPileupFitParams = RPDChannelPileupExpFitParamsHandle(*zdcMod);
935 rpdChannelPileupFitSlope = rpdChannelPileupFitParams[1];
936 rpdChannelPileupFrac = RPDChannelPileupFracHandle(*zdcMod);
937
938 absRpdChannelAmplitude = abs(rpdChannelAmplitude);
939 zdcEMModuleEnergySameSide = zdcEMModuleEnergyArr[iside];
940 zdcEnergySumSameSide = zdcEnergySumArr[iside];
941 bool curRpdChannelValid = status & 1 << ZDC::RPDDataAnalyzer::ValidBit;
942 rpdChannelValid = curRpdChannelValid;
943 rpdChannelValidBitFloat = (curRpdChannelValid)? 0.5 : 1.5;
944 rpdChannelCentroidValid = centroidSideValidArr.at(iside);
945
946 rpdAmplitudeCalibSum[iside] += rpdChannelAmplitudeCalib;
947 rpdMaxADCSum[iside] += rpdChannelMaxADC;
948
949 fill(m_tools[m_RPDChannelToolIndices.at(side_str).at(channel_str)], rpdChannelSubAmp, rpdChannelAmplitude, rpdChannelAmplitudeCalib, rpdChannelMaxADC, rpdChannelMaxSample, rpdStatusBits, rpdChannelPileupFitSlope, absRpdChannelAmplitude, rpdChannelPileupFrac, zdcEMModuleEnergySameSide, zdcEnergySumSameSide, rpdChannelValid, rpdChannelValidBitFloat, rpdChannelCentroidValid, lumiBlock, bcid);
950 }
951 }
952 }
953 }
954
955
956// ______________________________________________________________________________
957 // obtaining fCalEt on A,C side
958// ______________________________________________________________________________
959
960 auto totalEt24 = Monitored::Scalar<double>("totalEt24", 0.0); // total ET within |eta| < 2.4
961 auto fcalEtA = Monitored::Scalar<double>("fcalEtA", 0.0);
962 auto fcalEtC = Monitored::Scalar<double>("fcalEtC", 0.0);
963 auto fcalEtSumTwoSides = Monitored::Scalar<double>("fcalEtSumTwoSides", 0.0);
964 std::array<double,2> fcalEtArr = {0.,0.};
965
968 if (! eventShapes.isValid()) {
969 ATH_MSG_WARNING("evtStore() does not contain Collection with name "<< m_HIEventShapeContainerKey);
970 }
971 else{
972 for (const auto eventShape : *eventShapes){
973 int layer = eventShape->layer();
974 float eta = eventShape->etaMin();
975 float et = eventShape->et();
976 if (layer == 21 || layer == 22 || layer == 23){ // FCal
977 fcalEtSumTwoSides += et / 1000000.;
978 if (eta > 0){
979 fcalEtA += et / 1000000.;
980 fcalEtArr[1] += et / 1000000.;
981 }
982 if (eta < 0){
983 fcalEtC += et / 1000000.;
984 fcalEtArr[0] += et / 1000000.;
985 }
986 }
987
988 if (TMath::Abs(eta) < 2.4) {
989 totalEt24 += et / 1000000.;
990 }
991 }
992 }
993 }
994
995// ______________________________________________________________________________
996 // give warning if there is missing aux data but no decoding error
997// ______________________________________________________________________________
998 if (!cur_event_ZDC_available && !zdcDecodingError){
999 ATH_MSG_WARNING("Current event has no ZDC decoding error but ZDC aux data is not available!");
1000 }
1001 if (!cur_event_RPD_available && !rpdDecodingError){
1002 ATH_MSG_WARNING("Current event has no RPD decoding error but RPD aux data is not available!");
1003 }
1004// ______________________________________________________________________________
1005 // give warning and return if neither ZDC nor RPD are available
1006// ______________________________________________________________________________
1007 if (!cur_event_ZDC_available && !cur_event_RPD_available){
1008 ATH_MSG_WARNING("For current event, neither ZDC nor RPD data are available!");
1009 return StatusCode::SUCCESS;
1010 }
1011
1012// ______________________________________________________________________________
1013 // filling generic ZDC monitoring tool for A-C side correlations & cos(reaction plane angle)
1014// ______________________________________________________________________________
1015
1016 if ((m_enableZDCPhysics && cur_event_ZDC_available) || (m_enableCentroid && cur_event_RPD_available)) {
1017
1018 if (m_enableZDCPhysics && cur_event_ZDC_available){
1019 // ZDC-only global variables
1020 std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>> vars_global = {
1021 std::ref(lumiBlock),
1022 std::ref(bcid),
1023 std::ref(passTrigSideA),
1024 std::ref(passTrigSideC),
1025 std::ref(zdcEnergySumA),
1026 std::ref(zdcEnergySumC),
1027 std::ref(zdcUncalibSumA),
1028 std::ref(zdcUncalibSumC),
1029 std::ref(zdcEnergySumTwoSidesTeV),
1030 };
1031
1032 // calo-based global variables
1033 if (m_CalInfoOn){ // calorimeter information is turned on
1034 vars_global.insert(vars_global.end(), {
1035 std::ref(fcalEtA),
1036 std::ref(fcalEtC),
1037 std::ref(zdcHadronicEnergySumTwoSidesTeV),
1038 std::ref(fcalEtSumTwoSides),
1039 std::ref(totalEt24)
1040 });
1041 }
1042
1044 vars_global.insert(vars_global.end(), {
1045 std::ref(passUCCTrig_HELT15),
1046 std::ref(passUCCTrig_HELT20),
1047 std::ref(passUCCTrig_HELT25),
1048 std::ref(passUCCTrig_HELT35),
1049 std::ref(passUCCTrig_HELT50)
1050 });
1051 }
1052
1054 for (auto& m : oopoTrigPassBoolVec) vars_global.push_back( std::ref(m) );
1055 }
1056
1057 auto monitor_globals = Monitored::Group(zdcTool, vars_global);
1058 }
1059
1060 if (m_enableCentroid && cur_event_RPD_available){
1061 fill(zdcTool, rpdCosDeltaReactionPlaneAngle, bothReactionPlaneAngleValid, bothHasCentroid);
1062 }
1063 }
1064
1065// ______________________________________________________________________________
1066 // filling per-side tools
1067// ______________________________________________________________________________
1068
1069
1070 if (m_enableZDCPhysics && cur_event_ZDC_available && m_enableRPDAmp && cur_event_RPD_available){
1071 for (int iside = 0; iside < m_nSides; iside++){
1072 std::string side_str = (iside == 0)? "C" : "A";
1073
1074 auto passTrigOppSide = Monitored::Scalar<bool>("passTrigOppSide",passTrigOppSideArr[iside]); // this is duplicate information as A,C but convenient for filling per-side histograms
1075 auto zdcEnergySumCurSide = Monitored::Scalar<float>("zdcEnergySum",zdcEnergySumArr[iside]); // this is duplicate information as A,C but convenient for filling per-side histograms
1076 auto zdcEnergySumCurSideTeV = Monitored::Scalar<float>("zdcEnergySumTeV",zdcEnergySumArr[iside]/1000.); // this is duplicate information as A,C but convenient for filling per-side histograms
1077 auto zdcUncalibSumCurSide = Monitored::Scalar<float>("zdcUncalibSum",zdcUncalibSumArr[iside]); // this is duplicate information as A,C but convenient for filling per-side histograms
1078 auto zdcEMModuleEnergyCurSide = Monitored::Scalar<float>("zdcEMModuleEnergy",zdcEMModuleEnergyArr[iside]);
1079 auto zdcAvgTimeCurSide = Monitored::Scalar<float>("zdcAvgTime",zdcAvgTimeArr[iside]);
1080
1081 zdcModuleMaskCurSide = zdcModuleMaskArr[iside];
1082
1083 auto fcalEtCurSide = Monitored::Scalar<float>("fCalEt",fcalEtArr[iside]);
1084 ATH_MSG_DEBUG("fcalEtCurSide: " << fcalEtCurSide);
1085
1086 auto rpdAmplitudeCalibSumCurSide = Monitored::Scalar<float>("rpdAmplitudeCalibSum",rpdAmplitudeCalibSum[iside]);
1087 auto rpdMaxADCSumCurSide = Monitored::Scalar<float>("rpdMaxADCSum",rpdMaxADCSum[iside]);
1088 auto rpdCurSideValid = Monitored::Scalar<bool>("RPDSideValid",rpdSideValidArr[iside]);
1089
1090 fill(m_tools[m_ZDCSideToolIndices.at(side_str)], passTrigOppSide, zdcEnergySumCurSide, zdcEnergySumCurSideTeV, zdcUncalibSumCurSide, zdcEMModuleEnergyCurSide, zdcAvgTimeCurSide, zdcModuleMaskCurSide, rpdAmplitudeCalibSumCurSide, rpdMaxADCSumCurSide, rpdCurSideValid, fcalEtCurSide, lumiBlock, bcid);
1091 }
1092 }else if (m_enableZDCPhysics && cur_event_ZDC_available){
1093 for (int iside = 0; iside < m_nSides; iside++){
1094 std::string side_str = (iside == 0)? "C" : "A";
1095
1096 auto passTrigOppSide = Monitored::Scalar<bool>("passTrigOppSide",passTrigOppSideArr[iside]); // this is duplicate information as A,C but convenient for filling per-side histograms
1097 auto zdcEnergySumCurSide = Monitored::Scalar<float>("zdcEnergySum",zdcEnergySumArr[iside]); // this is duplicate information as A,C but convenient for filling per-side histograms
1098 auto zdcEnergySumCurSideTeV = Monitored::Scalar<float>("zdcEnergySum",zdcEnergySumArr[iside]/1000.); // this is duplicate information as A,C but convenient for filling per-side histograms
1099 auto zdcUncalibSumCurSide = Monitored::Scalar<float>("zdcUncalibSum",zdcUncalibSumArr[iside]); // this is duplicate information as A,C but convenient for filling per-side histograms
1100 auto zdcEMModuleEnergyCurSide = Monitored::Scalar<float>("zdcEMModuleEnergy",zdcEMModuleEnergyArr[iside]);
1101 auto zdcAvgTimeCurSide = Monitored::Scalar<float>("zdcAvgTime",zdcAvgTimeArr[iside]);
1102 zdcModuleMaskCurSide = zdcModuleMaskArr[iside];
1103 auto fcalEtCurSide = Monitored::Scalar<float>("fCalEt",fcalEtArr[iside]);
1104
1105 fill(m_tools[m_ZDCSideToolIndices.at(side_str)], passTrigOppSide, zdcEnergySumCurSide, zdcEnergySumCurSideTeV, zdcUncalibSumCurSide, zdcEMModuleEnergyCurSide, zdcAvgTimeCurSide, zdcModuleMaskCurSide, fcalEtCurSide, lumiBlock, bcid);
1106 }
1107 }else if (m_enableRPDAmp && cur_event_RPD_available){
1108 for (int iside = 0; iside < m_nSides; iside++){
1109 std::string side_str = (iside == 0)? "C" : "A";
1110
1111 auto rpdAmplitudeCalibSumCurSide = Monitored::Scalar<float>("rpdAmplitudeCalibSum",rpdAmplitudeCalibSum[iside]);
1112 auto rpdMaxADCSumCurSide = Monitored::Scalar<float>("rpdMaxADCSum",rpdMaxADCSum[iside]);
1113 auto rpdCurSideValid = Monitored::Scalar<bool>("RPDSideValid",rpdSideValidArr[iside]);
1114
1115 fill(m_tools[m_ZDCSideToolIndices.at(side_str)], rpdAmplitudeCalibSumCurSide, rpdMaxADCSumCurSide, rpdCurSideValid, lumiBlock, bcid);
1116 }
1117 }
1118
1119 return StatusCode::SUCCESS;
1120}
1121
1122
1123StatusCode ZdcMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
1124
1125 ATH_MSG_DEBUG("calling the fillHistograms function");
1126
1128 if (! eventInfo.isValid() || eventInfo.cptr() == nullptr) {
1129 ATH_MSG_WARNING("EventInfo handle is not valid or has null pointer!");
1130 return StatusCode::SUCCESS;
1131 }
1132
1133 unsigned int eventType = ZdcEventInfo::ZdcEventUnknown;
1134 unsigned int DAQMode = ZdcEventInfo::DAQModeUndef;
1135
1138
1140
1141 if (! zdcSums.isValid() ) {
1142 ATH_MSG_WARNING("evtStore() does not contain Collection with name "<< m_ZdcSumContainerKey);
1143 return StatusCode::SUCCESS;
1144 }
1145 for (const auto zdcSum : *zdcSums) {
1146 if (zdcSum->zdcSide() == 0){
1147 if (!eventTypeHandle.isAvailable()){
1148 ATH_MSG_WARNING("The global sum entry in zdc sum container can be retrieved; but it does NOT have the variable eventType written as a decoration!");
1149 return StatusCode::SUCCESS;
1150 }
1151
1152 if (!DAQModeHandle.isAvailable()){
1153 ATH_MSG_WARNING("The global sum entry in zdc sum container can be retrieved; but it does NOT have the variable DAQMode written as a decoration!");
1154 return StatusCode::SUCCESS;
1155 }
1156
1157 eventType = eventTypeHandle(*zdcSum);
1158 DAQMode = DAQModeHandle(*zdcSum);
1159 }
1160 }
1161
1162 ATH_MSG_DEBUG("The event type is: " << eventType);
1163
1164 if (eventType == ZdcEventInfo::ZdcEventUnknown || DAQMode == ZdcEventInfo::DAQModeUndef){
1165 ATH_MSG_WARNING("The zdc sum container can be retrieved from the evtStore() but");
1166 ATH_MSG_WARNING("Either the event type or the DAQ mode is the default unknown value");
1167 ATH_MSG_WARNING("Most likely, there is no global sum (side == 0) entry in the zdc sum container");
1168 return StatusCode::SUCCESS;
1169 }
1170
1171 if (eventType == ZdcEventInfo::ZdcEventPhysics || eventType == ZdcEventInfo::ZdcSimulation){
1172 return fillPhysicsDataHistograms(ctx);
1173 }
1174
1175 ATH_MSG_WARNING("Event type should be PhysicsData/Simulation but it is NOT");
1176 return StatusCode::SUCCESS;
1177}
1178
Scalar eta() const
pseudorapidity method
#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)
Helper class to provide constant type-safe access to aux data.
#define ANA_CHECK(EXP)
check whether the given expression was successful
static Double_t a
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
virtual StatusCode initialize() override
initialize
const ToolHandle< Trig::TrigDecisionTool > & getTrigDecisionTool() const
Get the trigger decision tool member.
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
ToolHandleArray< GenericMonitoringTool > m_tools
Array of Generic Monitoring Tools.
SG::ReadHandleKey< xAOD::EventInfo > m_EventInfoKey
Key for retrieving EventInfo from StoreGate.
An AttributeList represents a logical row of attributes in a metadata table.
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
Handle class for reading a decoration on an object.
bool isAvailable()
Test to see if this variable exists in the store, for the referenced object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_DAQModeKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDChannelMaxADCKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleChisqLGRefitKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcSumModuleMaskKey
static const int m_nRpdStatusBits
Gaudi::Property< bool > m_EnableZDCSingleSideTriggers
Gaudi::Property< float > m_moduleChisqOverAmpHistNumBins
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleChisqKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDcosDeltaReactionPlaneAngleKey
Gaudi::Property< std::string > m_UCCtriggerHELT15
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_eventTypeKey
Gaudi::Property< float > m_moduleChisqOverAmpHistMinValue
Gaudi::Property< float > m_energyCutForModuleFractMonitor
Gaudi::Property< bool > m_EnableUCCTriggers
Gaudi::Property< bool > m_isSim
SG::ReadHandleKey< xAOD::ZdcModuleContainer > m_ZdcSumContainerKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleTimeKey
Gaudi::Property< std::vector< std::string > > m_OOpOtriggerChains
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDxCentroidKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleT0SubLGRefitKey
Gaudi::Property< std::vector< std::string > > m_injPulseVoltageStepsStr
std::map< std::string, std::map< std::string, int > > m_RPDChannelToolIndices
Gaudi::Property< std::string > m_UCCtriggerHELT50
Gaudi::Property< bool > m_enableZDC
bool check_equal_within_rounding(float a, float b, float epsilon=1e-6f) const
std::vector< float > m_ZdcModuleChisqBinEdges
Gaudi::Property< float > m_moduleChisqHistMinValue
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDChannelPileupExpFitParamsKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleFitT0Key
Gaudi::Property< bool > m_isOnline
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcSumCalibEnergyKey
Gaudi::Property< bool > m_isStandalone
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDChannelStatusKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDChannelAmplitudeCalibKey
Gaudi::Property< unsigned int > m_nSecondsRejectStartofLBInjectorPulse
virtual StatusCode initialize() override
initialize
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleMaxADCLGKey
Gaudi::Property< float > m_minVInjToEvaluateLowAmpPercentageDQInjectorPulse
std::map< std::string, int > m_ZDCSideToolIndices
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleAmpLGRefitKey
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
ZdcInjPulserAmpMap::Token m_injMapRunToken
Gaudi::Property< std::vector< float > > m_injPulseVoltageSteps
void calculate_log_bin_edges(float min_value, float max_value, int num_bins, std::vector< float > &bin_edges)
Gaudi::Property< std::string > m_UCCtriggerHELT35
std::shared_ptr< ZdcInjPulserAmpMap > m_zdcInjPulserAmpMap
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDChannelMaxSampleKey
Gaudi::Property< float > m_minVInjToImposeAmpRequirementLGInjectorPulse
Gaudi::Property< float > m_minAmpRequiredHGInjectorPulse
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleFitAmpKey
std::map< std::string, std::map< std::string, std::map< std::string, int > > > m_LucrodResponseSingleVoltageToolIndices
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleCalibEnergyKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDSubtrAmpSumKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleMaxADCHGKey
Gaudi::Property< float > m_ZDCEnergyCutForCentroidValidBitMonitor
Gaudi::Property< std::string > m_triggerSideA
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDChannelSubtrAmpKey
StatusCode fillPhysicsDataHistograms(const EventContext &ctx) const
Gaudi::Property< float > m_minAmpRequiredLGInjectorPulse
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleT0LGRefitKey
Gaudi::Property< float > m_expected1N
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleMaxADCKey
Gaudi::Property< std::string > m_UCCtriggerHELT20
Gaudi::Property< std::map< int, std::string > > m_OOpOL1TriggerFromCTPIDMap
Gaudi::Property< float > m_moduleChisqHistNumBins
std::map< std::string, std::map< std::string, int > > m_ZDCModuleToolIndices
Gaudi::Property< std::string > m_triggerSideC
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleCalibTimeKey
Gaudi::Property< float > m_moduleChisqOverAmpHistMaxvalue
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleFitAmpLGRefitKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDSideStatusKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleStatusKey
std::vector< float > m_ZdcModuleChisqOverAmpBinEdges
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDChannelAmplitudeKey
Gaudi::Property< bool > m_enableZDCPhysics
SG::ReadHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleContainerKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcSumAverageTimeKey
Gaudi::Property< float > m_moduleChisqHistMaxvalue
Gaudi::Property< float > m_minVInjToImposeAmpRequirementHGInjectorPulse
Gaudi::Property< std::string > m_UCCtriggerHELT25
Gaudi::Property< bool > m_CalInfoOn
static const int m_nZdcStatusBits
Gaudi::Property< bool > m_enableCentroid
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcSumUncalibSumKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDcentroidStatusKey
ZdcMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< bool > m_enableRPDAmp
static const int m_nSides
Gaudi::Property< bool > m_EnableOOpOTriggers
static const int m_nRpdCentroidStatusBits
SG::ReadHandleKey< xAOD::HIEventShapeContainer > m_HIEventShapeContainerKey
SG::ReadCondHandleKey< AthenaAttributeList > m_LBLBFolderInputKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleAmpNoNonLinKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDChannelPileupFracKey
Gaudi::Property< bool > m_isInjectedPulse
Gaudi::Property< unsigned int > m_runNumber
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDreactionPlaneAngleKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleAmplitudeKey
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_RPDyCentroidKey
float calculate_inverse_bin_width(float event_value, const std::string &variable_name, const std::vector< float > &bin_edges) const
@ ForwardDet
The forward detectors.
const std::vector< uint32_t > & tbp() const
Get the Trigger Before Prescale bits.
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)
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
TrigDecision_v1 TrigDecision
Define the latest version of the trigger decision class.
Extra patterns decribing particle interation process.
void fill(H5::Group &out_file, size_t iterations)