ATLAS Offline Software
Loading...
Searching...
No Matches
MdtRawDataMonAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6// Package : MdtRawDataMonAlg
7// Authors: N. Benekos(Illinois)
8// A. Cortes (Illinois)
9// G. Dedes (MPI)
10// Orin Harris (University of Washington)
11// Justin Griffiths (University of Washington)
12// M. Biglietti (INFN - Roma Tre)
13// Oct. 2007
14//
15// DESCRIPTION:
16// Subject: MDT-->Offline Muon Data Quality
18
19#include "MdtRawDataMonAlg.h"
20
22#include "GaudiKernel/MsgStream.h"
24#include "MdtHistCoder.h"
34#include "TrkTrack/Track.h"
36#include "xAODMuon/Muon.h"
40
41// root includes
42#include <TH2F.h>
43
44#include <array>
45#include <cmath>
46#include <memory>
47#include <sstream>
48
49namespace {
50 // the tube number of a tube in a tubeLayer in encoded in the GeoSerialIdentifier (modulo maxNTubesPerLayer)
51 constexpr unsigned int maxNTubesPerLayer = MdtIdHelper::maxNTubesPerLayer;
52} // namespace
53
55 std::vector<float> mdt_tube_x_barrel;
56 std::vector<float> mdt_tube_y_barrel;
57 std::vector<float> mdt_tube_z_barrel;
58 std::vector<float> mdt_tube_perp_barrel;
59
60 std::vector<float> mdt_tube_x_ovl;
61 std::vector<float> mdt_tube_y_ovl;
62 std::vector<float> mdt_tube_z_ovl;
63 std::vector<float> mdt_tube_perp_ovl;
64
65 std::vector<float> mdt_tube_x_endcap;
66 std::vector<float> mdt_tube_y_endcap;
67 std::vector<float> mdt_tube_z_endcap;
68 std::vector<float> mdt_tube_perp_endcap;
69
70 std::vector<float> adc_mon_nosel;
71 std::vector<float> tdc_mon_nosel;
72 std::vector<float> tdc_mon;
73 std::vector<float> adc_mon;
74 std::vector<int> noiseBurst;
75
76 std::vector<float> tdc_mon_noiseBurst;
77 std::vector<float> adc_mon_noiseBurst;
78 std::vector<float> adc_mon_noiseBurst_notNoisy;
79 std::vector<float> tdc_mon_noiseBurst_adcCut;
80
81 std::vector<float> tdc_mon_adcCut;
82};
83
85 std::vector<int> sector;
86 std::vector<int> stationEta;
87 std::vector<float> adc_mon;
88 std::vector<float> tdc_mon;
89 std::vector<float> tdc_mon_nb2;
90 std::vector<float> adc_mon_nb2;
91 std::vector<float> tdc_mon_nb1;
92 std::vector<float> adc_mon_nb1;
93 std::vector<float> adc_mon_adccut;
94 std::vector<float> tdc_mon_adccut;
95 std::vector<int> x_mon;
96 std::vector<int> y_mon;
97 std::vector<int> x_mon_noise;
98 std::vector<int> y_mon_noise;
99 std::vector<float> tdc_mon_nb3;
100 std::vector<int> x_bin_perML;
101 std::vector<int> y_bin_perML;
102 std::vector<int> bin_byLayer_x;
103 std::vector<int> bin_byLayer_y;
104 std::vector<float> tdc_mon_rpc;
105 std::vector<float> tdc_mon_tgc;
106 std::vector<int> biny_vslb;
107 std::vector<int> biny_vslb_bycrate;
111};
112
114 std::vector<float> adc_segs_mon;
115 std::vector<float> tdc_segs_mon;
116 std::vector<int> x_segs_mon;
117 std::vector<int> y_segs_mon;
118};
119
120// *********************************************************************
121// Public Methods
122// *********************************************************************
123
124MdtRawDataMonAlg::MdtRawDataMonAlg(const std::string& name, ISvcLocator* pSvcLocator) : AthMonitorAlgorithm(name, pSvcLocator) {}
125
127/*---------------------------------------------------------*/
129/*---------------------------------------------------------*/
130{
131 // init message stream
132 ATH_MSG_DEBUG("initialize MdtRawDataMonAlg");
133
134 ATH_MSG_DEBUG("******************");
135 ATH_MSG_DEBUG("doMdtESD: " << m_doMdtESD);
136 ATH_MSG_DEBUG("******************");
137
138 // MuonDetectorManager from the conditions store
139 ATH_CHECK(m_DetectorManagerKey.initialize());
140 ATH_CHECK(detStore()->retrieve(m_detMgr));
141
142 ATH_CHECK(m_idHelperSvc.retrieve());
143
145 m_masked_tubes = std::make_unique<MDTNoisyTubes>();
146 else
147 m_masked_tubes = std::make_unique<MDTNoisyTubes>(false);
148 mdtchamberId();
149
151 ATH_CHECK(m_muonKey.initialize());
152 ATH_CHECK(m_segm_type.initialize());
153 ATH_CHECK(m_key_mdt.initialize());
154 ATH_CHECK(m_key_rpc.initialize());
155 ATH_CHECK(m_eventInfo.initialize());
156 ATH_CHECK(m_muon_type.initialize());
157 m_BMGid = m_idHelperSvc->mdtIdHelper().stationNameIndex("BMG");
158 if (m_BMGid != -1) {
159 ATH_MSG_DEBUG("Processing configuration for layouts with BMG chambers.");
160 m_BMGpresent = true;
161 // MuonDetectorManager from the Detector Store
162 const MuonGM::MuonDetectorManager* MuonDetMgrDS{nullptr};
163 ATH_CHECK(detStore()->retrieve(MuonDetMgrDS));
164
165 for (int phi = 6; phi < 8; phi++) { // phi sectors
166 for (int eta = 1; eta < 4; eta++) { // eta sectors
167 for (int side = -1; side < 2; side += 2) { // side
168 if (!MuonDetMgrDS->getMuonStation("BMG", side * eta, phi)) continue;
169 for (int roe = 1; roe <= (MuonDetMgrDS->getMuonStation("BMG", side * eta, phi))->nMuonReadoutElements();
170 roe++) { // iterate on readout elemets
171 const MuonGM::MdtReadoutElement* mdtRE = dynamic_cast<const MuonGM::MdtReadoutElement*>(
172 (MuonDetMgrDS->getMuonStation("BMG", side * eta, phi))->getMuonReadoutElement(roe)); // has to be an MDT
173 if (mdtRE) initDeadChannels(mdtRE);
174 }
175 }
176 }
177 }
178 }
179
180 /* It seems as if a bunch of histograms are created below on the heap
181 * Then these are filled in the binMdtFooBar methods
182 * Later these are passed onto relevant methods of MDTChamber where internals are filled
183 * The original histograms are transient and not needed past initialize here
184 * The logic is a little too convoluted but left as is
185 */
186 unsigned int counter{0};
187 std::string s{""}, xAxis{""};
188
189 // Create Inner/Middle/Outer/Extra histograms per BA/BC/EA/EC
190 std::vector<std::string> ecap{"BA", "BC", "EA", "EC"};
191 std::vector<std::string> layer{"Inner", "Middle", "Outer", "Extra"};
192 std::vector<std::unique_ptr<TH2F>> mdtHitsPerMultiLayerLumi;
193 mdtHitsPerMultiLayerLumi.reserve(ecap.size() * layer.size());
194
195 for (const auto& iecap : ecap) {
196 for (const auto& ilayer : layer) {
197 s = "NumberOfHitsIn" + iecap + ilayer + "PerMultiLayer_ADCCut";
198 mdtHitsPerMultiLayerLumi.push_back(std::make_unique<TH2F>(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1));
199 xAxis = iecap.substr(0, 1) + ilayer.substr(0, 1) + iecap.substr(1, 1);
200 ATH_CHECK(binMdtRegional(mdtHitsPerMultiLayerLumi[counter].get(), xAxis));
201 counter++;
202 } // end of iecap
203 } // end of ilayer
204 counter = 0;
205
206 // Create Barrel/EndCap histrograms here
207 std::vector<std::string> mdtHitsBE{"Barrel", "EndCap"};
208 std::vector<std::unique_ptr<TH2F>> mdtHitsPerChamberIMOLumi;
209 mdtHitsPerChamberIMOLumi.reserve(mdtHitsBE.size());
210
211 for (const auto& imdt : mdtHitsBE) {
212 s = "NumberOfHits" + imdt;
213 mdtHitsPerChamberIMOLumi.push_back(std::make_unique<TH2F>(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1));
214 ATH_CHECK(binMdtGlobal(mdtHitsPerChamberIMOLumi[counter].get(), imdt.at(0)));
215 counter++;
216 } // end of imdt
217 counter = 0;
218
219 // Create Inner/Middle/Outer histograms here
220 std::vector<std::unique_ptr<TH2F>> mdtHitsPerMLByLayer;
221 mdtHitsPerMLByLayer.reserve(layer.size() - 1);
222
223 for (const auto& ilayer : layer) {
224 if (ilayer == "Extra") continue;
225 s = "NumberOfHitsInMDT" + ilayer + "_ADCCut";
226 mdtHitsPerMLByLayer.push_back(std::make_unique<TH2F>(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1));
227 } // end of ilayer
228 ATH_CHECK(binMdtGlobal_byLayer(mdtHitsPerMLByLayer[0].get(), mdtHitsPerMLByLayer[1].get(), mdtHitsPerMLByLayer[2].get()));
229
230 for (std::vector<Identifier>::const_iterator itr = m_chambersId.begin(); itr != m_chambersId.end(); ++itr, ++counter) {
231 std::string hardware_name =
232 convertChamberName(m_idHelperSvc->mdtIdHelper().stationName(*itr), m_idHelperSvc->mdtIdHelper().stationEta(*itr),
233 m_idHelperSvc->mdtIdHelper().stationPhi(*itr), "MDT");
234 // Skip Chambers That Do NOT Exist
235 if (hardware_name == "BML6A13" || hardware_name == "BML6C13") continue;
236 std::unique_ptr<MDTChamber>& chamber = m_hist_hash_list[m_chambersIdHash.at(counter)];
237 chamber = std::make_unique<MDTChamber>(hardware_name);
238
239 chamber->SetMDTHitsPerChamber_IMO_Bin(mdtHitsPerChamberIMOLumi[chamber->GetBarrelEndcapEnum()].get());
240 chamber->SetMDTHitsPerML_byLayer_Bins(
241 mdtHitsPerMultiLayerLumi[chamber->GetRegionEnum() * layer.size() + chamber->GetLayerEnum()].get(),
242 mdtHitsPerMLByLayer[(chamber->GetLayerEnum() < 3 ? chamber->GetLayerEnum() : 0)].get());
243
244 m_tubesperchamber_map[hardware_name] = GetTubeMax(*itr, hardware_name); // total number of tubes in chamber
245 }
246
247 ATH_MSG_DEBUG(" end of initialize ");
249}
250
251/*----------------------------------------------------------------------------------*/
252StatusCode MdtRawDataMonAlg::fillHistograms(const EventContext& ctx) const
253/*----------------------------------------------------------------------------------*/
254{
255 int lumiblock = -1;
257 lumiblock = evt->lumiBlock();
258
259 ATH_MSG_DEBUG("MdtRawDataMonAlg::MDT RawData Monitoring Histograms being filled");
260
261 // Making an histo to store the Run3 geo flag
262 auto run3geo = Monitored::Scalar<int>("run3geo", m_do_run3Geometry);
263 auto firstEvent = Monitored::Scalar<int>("firstEvent", (int)(m_firstEvent));
264 fill("MdtMonitor", run3geo, firstEvent);
265 m_firstEvent = 0;
266
267 // Retrieve the LVL1 Muon RoIs:
268 bool trig_BARREL = false;
269 bool trig_ENDCAP = false;
270 if (!m_l1RoiKey.empty()) {
272 if (!muonRoIs.isValid()) { ATH_MSG_ERROR("evtStore() does not contain muon L1 ROI Collection with name " << m_l1RoiKey); }
273 // DEV still needed ? does not compile
274 if (muonRoIs.isPresent() && muonRoIs.isValid()) {
275 ATH_MSG_VERBOSE("Retrieved LVL1MuonRoIs object with key: " << m_l1RoiKey.key());
276 trig_BARREL = std::any_of(muonRoIs->begin(), muonRoIs->end(),
277 [](const auto& i) { return i->getSource() == xAOD::MuonRoI::RoISource::Barrel; });
278 trig_ENDCAP = std::any_of(muonRoIs->begin(), muonRoIs->end(),
279 [](const auto& i) { return i->getSource() == xAOD::MuonRoI::RoISource::Endcap; });
280 }
281 }
282
283 // declare MDT stuff
285 if (!mdt_container.isValid()) {
286 ATH_MSG_ERROR("evtStore() does not contain mdt prd Collection with name " << m_key_mdt);
287 return StatusCode::FAILURE;
288 }
289
290 ATH_MSG_DEBUG("****** mdtContainer->size() : " << mdt_container->size());
291
292 int nColl = 0; // Number of MDT chambers with hits
293 int nColl_ADCCut = 0; // Number of MDT chambers with hits above ADC cut
294 int nPrd = 0; // Total number of MDT prd digits
295 int nPrdcut = 0; // Total number of MDT prd digits with a cut on ADC>50.
296
297 // declare RPC stuff
299 if (!rpc_container.isValid()) {
300 ATH_MSG_ERROR("evtStore() does not contain rpc prd Collection with name " << m_key_rpc);
301 return StatusCode::FAILURE;
302 }
303
304 ATH_MSG_DEBUG("****** rpc->size() : " << rpc_container->size());
305
307
309 float Nhitsrpc = 0;
310 for (containerIt = rpc_container->begin(); containerIt != rpc_container->end(); ++containerIt) {
311 for (Muon::RpcPrepDataCollection::const_iterator rpcPrd = (*containerIt)->begin(); rpcPrd != (*containerIt)->end(); ++rpcPrd) {
312 ++Nhitsrpc;
313 }
314 }
315 float Nhitsmdt = 0;
316 bool isNoiseBurstCandidate = false;
318 for (MdtcontainerIt = mdt_container->begin(); MdtcontainerIt != mdt_container->end(); ++MdtcontainerIt) {
319 for (Muon::MdtPrepDataCollection::const_iterator mdtCollection = (*MdtcontainerIt)->begin();
320 mdtCollection != (*MdtcontainerIt)->end(); ++mdtCollection) {
321 ++Nhitsmdt;
322 }
323 }
324
325 if (Nhitsmdt > m_HighOccThreshold) isNoiseBurstCandidate = true;
326 std::string type = "MDT";
327 std::string hardware_name;
328
329 std::map<std::string, int> evnt_hitsperchamber_map;
330 std::set<std::string> chambers_from_tracks;
331
332 if (m_doMdtESD == true) {
333 // DEV this shouls be done in some other way, in AthenaMonManager there is
334 // Gaudi::Property<std::string> m_environmentStr {this,"Environment","user"}; ///< Environment string pulled from the job option
335 // and converted to enum
336 // commented out for the time being
337 // if(m_environment == AthenaMonManager::tier0 || m_environment == AthenaMonManager::tier0ESD || m_environment ==
338 // AthenaMonManager::online) {
339 if (true) { // DEV to be updated
340
342
343 // ATH_CHECK(muons.isValid());
344
345 for (const auto* const mu : *muons) {
346 // add quality selection here
347 if (mu) {
348 const Trk::Track* trk = mu->track();
349 // this work only if tp are available
350 if (!trk) continue;
351
352 uint8_t ntri_eta = 0;
353 uint8_t n_phi = 0;
354 mu->summaryValue(ntri_eta, xAOD::numberOfTriggerEtaLayers);
355 mu->summaryValue(n_phi, xAOD::numberOfPhiLayers);
356 if (ntri_eta + n_phi == 0) continue;
357
358 for (const Trk::MeasurementBase* hit : *trk->measurementsOnTrack()) {
359 const Trk::RIO_OnTrack* rot_from_track = dynamic_cast<const Trk::RIO_OnTrack*>(hit);
360 if (!rot_from_track) continue;
361 Identifier rotId = rot_from_track->identify();
362 if (!m_idHelperSvc->isMdt(rotId)) continue;
363 IdentifierHash mdt_idHash;
364 MDTChamber* mdt_chamber = nullptr;
365 m_idHelperSvc->mdtIdHelper().get_module_hash(rotId, mdt_idHash);
366 ATH_CHECK(getChamber(mdt_idHash, mdt_chamber));
367 std::string mdt_chambername = mdt_chamber->getName();
368 chambers_from_tracks.insert(mdt_chambername);
369 }
370 }
371 }
372
373 MDTOverviewHistogramStruct overviewPlots;
374 auto summaryPlots = std::make_unique<std::array<MDTSummaryHistogramStruct, 4096>>();
375 // loop in MdtPrepDataContainer
376 std::vector<std::string> v_hit_in_chamber_allphi;
377 std::map<std::string, std::vector<std::string>> v_hit_in_chamber;
378 for (Muon::MdtPrepDataContainer::const_iterator containerIt = mdt_container->begin(); containerIt != mdt_container->end();
379 ++containerIt) {
380 if (containerIt == mdt_container->end() || containerIt->empty()) continue; // check if there are counts
381 nColl++;
382
383 bool isHit_above_ADCCut = false;
384 // loop over hits
385 for (const auto* mdtCollection : **containerIt) {
386 nPrd++;
387
388 float adc = mdtCollection->adc();
389 hardware_name = getChamberName(mdtCollection);
390
391 if (hardware_name.substr(0, 3) == "BMG") adc /= m_adcScale;
392 if (adc > m_ADCCut) {
393 nPrdcut++;
394 isHit_above_ADCCut = true;
396 std::string phi = hardware_name.substr(hardware_name.length() - 2);
397 v_hit_in_chamber[phi].push_back(hardware_name);
398 }
399 v_hit_in_chamber_allphi.push_back(hardware_name);
400 }
401 fillMDTOverviewVects(mdtCollection, isNoiseBurstCandidate, overviewPlots);
402 //=======================================================================
403 //=======================================================================
404 //=======================================================================
405 ATH_CHECK(fillMDTSummaryVects(mdtCollection, chambers_from_tracks, isNoiseBurstCandidate, trig_BARREL, trig_ENDCAP,
406 summaryPlots.get()));
407 //=======================================================================
408 //=======================================================================
409 //=======================================================================
410 if (m_doChamberHists) { ATH_CHECK(fillMDTHistograms(mdtCollection)); }
411
412 std::map<std::string, int>::iterator iter_hitsperchamber = evnt_hitsperchamber_map.find(hardware_name);
413 if (iter_hitsperchamber == evnt_hitsperchamber_map.end()) {
414 evnt_hitsperchamber_map.insert(make_pair(hardware_name, 1));
415 } else {
416 iter_hitsperchamber->second += 1;
417 }
418
419 } // for loop over hits mdtcollection
420 nColl_ADCCut += isHit_above_ADCCut;
421 } // loop in MdtPrepDataContainer
423 for (const auto& phiitem : v_hit_in_chamber) {
424 auto hit_in_chamber = Monitored::Collection("hits_phi_" + phiitem.first, phiitem.second);
425 fill("MdtMonitor", hit_in_chamber);
426 }
427 }
428 auto hit_in_chamber_allphi = Monitored::Collection("hits_allphi", v_hit_in_chamber_allphi);
429 fill("MdtMonitor", hit_in_chamber_allphi);
430
431 fillMDTOverviewHistograms(overviewPlots);
432 ATH_CHECK(fillMDTSummaryHistograms(summaryPlots.get(), lumiblock));
433
434 int nHighOccChambers = 0;
435 for (const auto& iterstat : evnt_hitsperchamber_map) {
436 const auto iter_tubesperchamber = m_tubesperchamber_map.find(iterstat.first);
437 if (ATH_UNLIKELY(iter_tubesperchamber == m_tubesperchamber_map.end())) { // indicates software error
438 ATH_MSG_ERROR("Unable to find chamber " << iterstat.first);
439 continue;
440 }
441 float nTubes = iter_tubesperchamber->second;
442 float hits = iterstat.second;
443 float occ = hits / nTubes;
444 if (occ > 0.1) nHighOccChambers++;
445 }
446
447 auto nHighOccChambers_mon = Monitored::Scalar<float>("nHighOccChambers_mon", nHighOccChambers);
448
449 auto nPrd_mon = Monitored::Scalar<int>("nPrd_mon", nPrd);
450 auto nPrdcut_mon = Monitored::Scalar<int>("nPrdcut_mon", nPrdcut);
451 auto Nhitsrpc_mon = Monitored::Scalar<int>("Nhitsrpc_mon", Nhitsrpc);
452 auto nColl_mon = Monitored::Scalar<int>("nColl_mon", nColl);
453 auto nColl_ADCCut_mon = Monitored::Scalar<int>("nColl_ADCCut_mon", nColl_ADCCut);
454
455 fill("MdtMonitor", nHighOccChambers_mon, nPrd_mon, Nhitsrpc_mon, nPrdcut_mon, nColl_mon, nColl_ADCCut_mon);
456
457 // if (m_mdtglobalhitstime) m_mdtglobalhitstime->Fill(m_time - m_firstTime);
458
459 } // m_environment == AthenaMonManager::tier0 || m_environment == AthenaMonManager::tier0ESD
460 } // m_doMdtESD==true
461
462 for (const auto& key : m_segm_type) {
464 if (!segms.isValid()) {
465 ATH_MSG_ERROR("evtStore() does not contain mdt segms Collection with name " << key);
466 return StatusCode::FAILURE;
467 }
468
469 MDTSegmentHistogramStruct segsPlots[4][4][16]; // [region][layer][phi]
470
471 ATH_CHECK(handleEvent_effCalc_fillVects(segms.cptr(), segsPlots));
472
474 }
475 return StatusCode::SUCCESS;
476}
477// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
478
479void MdtRawDataMonAlg::fillMDTOverviewVects(const Muon::MdtPrepData* mdtCollection, bool& isNoiseBurstCandidate,
480 MDTOverviewHistogramStruct& vects) const {
481 Identifier digcoll_id = mdtCollection->identify();
482
483 std::string hardware_name = getChamberName(mdtCollection);
484 bool isNoisy = m_masked_tubes->isNoisy(mdtCollection);
485
486 // MuonDetectorManager from the conditions store
488 const MuonGM::MuonDetectorManager* MuonDetMgr = DetectorManagerHandle.cptr();
489 if (!MuonDetMgr) {
490 ATH_MSG_ERROR("Null pointer to the read MuonDetectorManager conditions object");
491 return;
492 }
493
494 const MuonGM::MdtReadoutElement* pReadoutElementMDT = MuonDetMgr->getMdtReadoutElement(digcoll_id);
495 const Amg::Vector3D mdtgPos = pReadoutElementMDT->tubePos(digcoll_id); // global position of the wire
496 float mdt_tube_eta = mdtgPos.eta();
497
498 float tdc = mdtCollection->tdc() * 25.0 / 32.0;
499 // Note: the BMG is digitized with 200ps which is not same as other MDT chambers with 25/32=781.25ps
500 if (hardware_name.substr(0, 3) == "BMG") tdc = mdtCollection->tdc() * 0.2;
501
502 float adc = mdtCollection->adc();
503 if (hardware_name.substr(0, 3) == "BMG") adc /= m_adcScale;
504
505 if (adc > m_ADCCut) {
506 // barrel
507 if (std::abs(mdt_tube_eta) > 0. && std::abs(mdt_tube_eta) < 0.9) {
508 vects.mdt_tube_x_barrel.push_back(mdtgPos.x());
509 vects.mdt_tube_y_barrel.push_back(mdtgPos.y());
510 vects.mdt_tube_z_barrel.push_back(mdtgPos.z());
511 vects.mdt_tube_perp_barrel.push_back(mdtgPos.perp());
512 }
513 // OverLap -->Fill MDT Global RZ and YX
514 if (std::abs(mdt_tube_eta) > 0.9 && std::abs(mdt_tube_eta) < 1.2) {
515 vects.mdt_tube_x_ovl.push_back(mdtgPos.x());
516 vects.mdt_tube_y_ovl.push_back(mdtgPos.y());
517 vects.mdt_tube_z_ovl.push_back(mdtgPos.z());
518 vects.mdt_tube_perp_ovl.push_back(mdtgPos.perp());
519 }
520 // EndCap -->Fill MDT Global RZ and YX
521 if (std::abs(mdt_tube_eta) > 1.2 && std::abs(mdt_tube_eta) < 2.7) {
522 vects.mdt_tube_x_endcap.push_back(mdtgPos.x());
523 vects.mdt_tube_y_endcap.push_back(mdtgPos.y());
524 vects.mdt_tube_z_endcap.push_back(mdtgPos.z());
525 vects.mdt_tube_perp_endcap.push_back(mdtgPos.perp());
526 }
527 }
528
529 vects.adc_mon_nosel.push_back(adc);
530 vects.tdc_mon_nosel.push_back(tdc);
531 if (!isNoisy && adc > 0) {
532 vects.tdc_mon.push_back(tdc);
533 vects.adc_mon.push_back(adc);
534 }
535
536 vects.noiseBurst.push_back((int)isNoiseBurstCandidate);
537 if (isNoiseBurstCandidate) {
538 vects.tdc_mon_noiseBurst.push_back(tdc);
539 vects.adc_mon_noiseBurst.push_back(adc);
540 if (!isNoisy) { vects.adc_mon_noiseBurst_notNoisy.push_back(adc); }
541 if (adc > m_ADCCut) { vects.tdc_mon_noiseBurst_adcCut.push_back(tdc); }
542 }
543
544 if (adc > m_ADCCut) { vects.tdc_mon_adcCut.push_back(tdc); }
545}
546
548 auto mdt_tube_x_barrel = Monitored::Collection("mdt_tube_x_barrel", vects.mdt_tube_x_barrel);
549 auto mdt_tube_y_barrel = Monitored::Collection("mdt_tube_y_barrel", vects.mdt_tube_y_barrel);
550 auto mdt_tube_z_barrel = Monitored::Collection("mdt_tube_z_barrel", vects.mdt_tube_z_barrel);
551 auto mdt_tube_perp_barrel = Monitored::Collection("mdt_tube_perp_barrel", vects.mdt_tube_perp_barrel);
552 fill("MdtMonitor", mdt_tube_z_barrel, mdt_tube_perp_barrel, mdt_tube_x_barrel, mdt_tube_y_barrel);
553
554 auto mdt_tube_x_ovl = Monitored::Collection("mdt_tube_x_ovl", vects.mdt_tube_x_ovl);
555 auto mdt_tube_y_ovl = Monitored::Collection("mdt_tube_y_ovl", vects.mdt_tube_y_ovl);
556 auto mdt_tube_z_ovl = Monitored::Collection("mdt_tube_z_ovl", vects.mdt_tube_z_ovl);
557 auto mdt_tube_perp_ovl = Monitored::Collection("mdt_tube_perp_ovl", vects.mdt_tube_perp_ovl);
558 fill("MdtMonitor", mdt_tube_z_ovl, mdt_tube_perp_ovl, mdt_tube_x_ovl, mdt_tube_y_ovl);
559
560 auto mdt_tube_x_endcap = Monitored::Collection("mdt_tube_x_endcap", vects.mdt_tube_x_endcap);
561 auto mdt_tube_y_endcap = Monitored::Collection("mdt_tube_y_endcap", vects.mdt_tube_y_endcap);
562 auto mdt_tube_z_endcap = Monitored::Collection("mdt_tube_z_endcap", vects.mdt_tube_z_endcap);
563 auto mdt_tube_perp_endcap = Monitored::Collection("mdt_tube_perp_endcap", vects.mdt_tube_perp_endcap);
564 fill("MdtMonitor", mdt_tube_z_endcap, mdt_tube_perp_endcap, mdt_tube_x_endcap, mdt_tube_y_endcap);
565
566 auto adc_mon_nosel = Monitored::Collection("adc_mon_nosel", vects.adc_mon_nosel);
567 auto tdc_mon_nosel = Monitored::Collection("tdc_mon_nosel", vects.tdc_mon_nosel);
568 auto noiseBurst = Monitored::Collection("noiseBurst", vects.noiseBurst);
569 fill("MdtMonitor", adc_mon_nosel, tdc_mon_nosel, noiseBurst);
570
571 auto tdc_mon = Monitored::Collection("tdc_mon", vects.tdc_mon);
572 auto adc_mon = Monitored::Collection("adc_mon", vects.adc_mon);
573 fill("MdtMonitor", tdc_mon, adc_mon);
574
575 auto adc_mon_noiseBurst_notNoisy = Monitored::Collection("adc_mon_noiseBurst_notNoisy", vects.adc_mon_noiseBurst_notNoisy);
576 fill("MdtMonitor", adc_mon_noiseBurst_notNoisy);
577
578 auto tdc_mon_noiseBurst_adcCut = Monitored::Collection("tdc_mon_noiseBurst_adcCut", vects.tdc_mon_noiseBurst_adcCut);
579 fill("MdtMonitor", tdc_mon_noiseBurst_adcCut);
580
581 auto tdc_mon_adcCut = Monitored::Collection("tdc_mon_adcCut", vects.tdc_mon_adcCut);
582 fill("MdtMonitor", tdc_mon_adcCut);
583}
584
585StatusCode MdtRawDataMonAlg::fillMDTSummaryVects(const Muon::MdtPrepData* mdtCollection, const std::set<std::string>& chambers_from_tracks,
586 bool& isNoiseBurstCandidate, bool trig_barrel, bool trig_endcap,
587 std::array<MDTSummaryHistogramStruct, 4096>* vects) const {
588 StatusCode sc = StatusCode::SUCCESS;
589 Identifier digcoll_id = (mdtCollection)->identify();
590 IdentifierHash digcoll_idHash = (mdtCollection)->collectionHash();
591
592 MDTChamber* chamber{nullptr};
593 ATH_CHECK(getChamber(digcoll_idHash, chamber));
594 bool isNoisy = m_masked_tubes->isNoisy(mdtCollection);
595
596 std::string region[4] = {"BA", "BC", "EA", "EC"};
597 std::string layer[4] = {"Inner", "Middle", "Outer", "Extra"};
598 std::string crate[4] = {"01", "02", "03", "04"};
599 // std::string slayer[4]={"inner","middle","outer","extra"};
600
601 // int ibarrel = chamber->GetBarrelEndcapEnum();
602 int iregion = chamber->GetRegionEnum();
603 int ilayer = chamber->GetLayerEnum();
604 int icrate = chamber->GetCrate();
605 //
606 int stationPhi = chamber->GetStationPhi();
607 std::string chambername = chamber->getName();
608 int thisStationEta = chamber->GetStationEta();
609
610 int crate_region = iregion;
611 // correct readout crate info for BEE,BIS7/8
612 if (chambername.substr(0, 3) == "BEE" || (chambername.substr(0, 3) == "BIS" && (thisStationEta == 7 || thisStationEta == 8))) {
613 if (iregion == 0) crate_region = 2;
614 if (iregion == 1) crate_region = 3;
615 }
616
617 uint16_t v = MdtHistCoder::encode(iregion, ilayer, stationPhi, crate_region, icrate - 1);
618 std::array<MDTSummaryHistogramStruct, 4096>& array = *(vects);
619 auto& thisVects = array[v];
620
621 bool is_on_track = false;
622 for (const auto& ch : chambers_from_tracks) {
623 if (chambername == ch) is_on_track = true;
624 }
625
626 bool isBIM = (chambername.at(2) == 'M');
627 float tdc = mdtCollection->tdc() * 25.0 / 32.0;
628 // Note: the BMG is digitized with 200ps which is not same as other MDT chambers with 25/32=781.25ps
629 if (chambername.substr(0, 3) == "BMG") tdc = mdtCollection->tdc() * 0.2;
630 float adc = mdtCollection->adc();
631 if (chambername.substr(0, 3) == "BMG") adc /= m_adcScale;
632
633 thisVects.sector.push_back(stationPhi + iregion * 16); // here valgrind complains
634
635 // mdtoccvslb_summaryPerSector->Fill(lumiblock, stationPhi+iregion*16 );
636 // MDTBA/Overview/Hits
637 // iregion = BA/BC/EA/EC --> 4
638 // ilayer = //inner, middle, outer, extra --> 4
639 // stationPhi --> 16 ====> 256
640 // std::string mon="MDTHits_ADCCut_"+region[iregion]+"_Mon_"+layer[ilayer]+"_Phi_"+std::to_string(stationPhi+1);;
641 // int mlayer_n = m_mdtIdHelper->multilayer(digcoll_id);
642 int mlayer_n = m_idHelperSvc->mdtIdHelper().multilayer(digcoll_id);
643
644 if (!isNoisy && adc > 0) {
645 thisVects.adc_mon.push_back(adc);
646 thisVects.tdc_mon.push_back(tdc);
647 if (isNoiseBurstCandidate) {
648 thisVects.tdc_mon_nb2.push_back(tdc);
649 thisVects.adc_mon_nb2.push_back(adc);
650 }
651 }
652
653 if (!isNoisy) {
654 // fill(MDT_regionGroup, adc_mon);
655 if (isNoiseBurstCandidate) {
656 thisVects.tdc_mon_nb1.push_back(tdc);
657 thisVects.adc_mon_nb1.push_back(adc);
658 }
659 }
660 if (adc > m_ADCCut && !isNoisy) {
661 thisVects.adc_mon_adccut.push_back(adc);
662 thisVects.tdc_mon_adccut.push_back(tdc);
663 int thisStationEta = chamber->GetStationEta();
664 thisVects.stationEta.push_back(thisStationEta);
665
666 int binx = chamber->GetMDTHitsPerChamber_IMO_BinX();
667 if (iregion < 2)
668 binx = binx - 9;
669 else
670 binx = binx - 7;
671 int biny = chamber->GetMDTHitsPerChamber_IMO_BinY();
672
673 std::string varx = " ";
674 std::string vary = " ";
675 std::string varx_noise = " ";
676 std::string vary_noise = " ";
677 if (iregion < 2) {
678 varx = "x_mon_barrel";
679 vary = "y_mon_barrel";
680 varx_noise = "x_mon_barrel_noise";
681 vary_noise = "y_mon_barrel_noise";
682 } else {
683 varx = "x_mon_endcap";
684 vary = "y_mon_endcap";
685 varx_noise = "x_mon_endcap_noise";
686 vary_noise = "y_mon_endcap_noise";
687 }
688
689 thisVects.x_mon.push_back(binx);
690 thisVects.y_mon.push_back(biny - 1);
691 if (isNoiseBurstCandidate) {
692 thisVects.x_mon_noise.push_back(binx);
693 thisVects.y_mon_noise.push_back(biny - 1);
694 thisVects.tdc_mon_nb3.push_back(tdc);
695 }
696
697 thisVects.x_bin_perML.push_back(chamber->GetMDTHitsPerML_Binx() - 1); // get the right bin!!!!
698 int biny_ml = 0;
699 if (mlayer_n == 1)
700 biny_ml = chamber->GetMDTHitsPerML_m1_Biny();
701 else if (mlayer_n == 2)
702 biny_ml = chamber->GetMDTHitsPerML_m2_Biny();
703 thisVects.y_bin_perML.push_back(biny_ml - 1);
704
705 if (layer[ilayer] != "Extra") {
706 thisVects.bin_byLayer_x.push_back(chamber->GetMDTHitsPerML_byLayer_BinX() - 1);
707 thisVects.bin_byLayer_y.push_back(chamber->GetMDTHitsPerML_byLayer_BinY(mlayer_n) - 1);
708 }
709 if (trig_barrel) { thisVects.tdc_mon_rpc.push_back(tdc); }
710 if (trig_endcap) { thisVects.tdc_mon_tgc.push_back(tdc); }
711
712 // Fill occupancy vs. Lumiblock
713 thisVects.biny_vslb.push_back(get_bin_for_LB_hist(iregion, ilayer, stationPhi, thisStationEta, isBIM));
714 if (chambername.substr(0, 3) == "BEE" || (chambername.substr(0, 3) == "BIS" && (thisStationEta == 7 || thisStationEta == 8))) {
715 thisVects.biny_vslb_bycrate_bis_bee.push_back(
716 get_bin_for_LB_crate_hist(crate_region, icrate, stationPhi + 1, thisStationEta, chambername));
717 } else {
718 thisVects.biny_vslb_bycrate.push_back(
719 get_bin_for_LB_crate_hist(crate_region, icrate, stationPhi + 1, thisStationEta, chambername));
720 }
721
722 if (is_on_track) {
723 if (chambername.substr(0, 3) == "BEE" || (chambername.substr(0, 3) == "BIS" && (thisStationEta == 7 || thisStationEta == 8))) {
724 thisVects.biny_vslb_bycrate_bis_bee_ontrack.push_back(
725 get_bin_for_LB_crate_hist(crate_region, icrate, stationPhi + 1, thisStationEta, chambername));
726 } else {
727 thisVects.biny_vslb_bycrate_ontrack.push_back(
728 get_bin_for_LB_crate_hist(crate_region, icrate, stationPhi + 1, thisStationEta, chambername));
729 }
730 }
731 }
732
733 return sc;
734}
735
736StatusCode MdtRawDataMonAlg::fillMDTSummaryHistograms(std::array<MDTSummaryHistogramStruct, 4096>* vects, int lb) const {
737 std::string region[4] = {"BA", "BC", "EA", "EC"};
738 std::string layer[4] = {"Inner", "Middle", "Outer", "Extra"};
739 std::string crate[4] = {"01", "02", "03", "04"};
740 // std::string slayer[4]={"inner","middle","outer","extra"};
741
742 auto lb_mon = Monitored::Scalar<int>("lb_mon", lb);
743
744 for (int iregion = 0; iregion < 4; ++iregion) {
745 std::string MDT_regionGroup = "MDT_regionGroup" + region[iregion]; // MDTXX/Overview
746 for (int crate_region = 0; crate_region < 4; ++crate_region) {
747 std::string MDT_regionGroup_bycrate = "MDT_regionGroup_bycrate" + region[crate_region]; // MDTXX/Overview
748 for (int ilayer = 0; ilayer < 4; ++ilayer) {
749 for (int stationPhi = 0; stationPhi < 16; ++stationPhi) {
750 for (int icrate = 0; icrate < 4; ++icrate) {
751 uint16_t v = MdtHistCoder::encode(iregion, ilayer, stationPhi, crate_region, icrate);
752
753 std::array<MDTSummaryHistogramStruct, 4096>& array = *(vects);
754 auto& thisVects = array[v];
755
756 auto sector = Monitored::Collection("sector", thisVects.sector);
757
758 fill("MdtMonitor", lb_mon, sector);
759
760 auto stationEta = Monitored::Collection(
761 "stEta_" + region[iregion] + "_" + layer[ilayer] + "_phi" + std::to_string(stationPhi + 1),
762 thisVects.stationEta);
763
764 if (m_do_mdtChamberHits) { fill(MDT_regionGroup, stationEta); }
765
766 auto adc_mon = Monitored::Collection("adc_mon", thisVects.adc_mon);
767 auto tdc_mon = Monitored::Collection("tdc_mon", thisVects.tdc_mon);
768
769 auto tdc_mon_nb2 = Monitored::Collection("tdc_mon_nb2", thisVects.tdc_mon_nb2);
770 auto adc_mon_nb2 = Monitored::Collection("adc_mon_nb2", thisVects.adc_mon_nb2);
771
772 auto tdc_mon_nb1 = Monitored::Collection("tdc_mon_nb1", thisVects.tdc_mon_nb1);
773 auto adc_mon_nb1 = Monitored::Collection("adc_mon_nb1", thisVects.adc_mon_nb1);
774
775 auto adc_mon_adccut = Monitored::Collection("adc_mon_adccut", thisVects.adc_mon_adccut);
776
777 auto tdc_mon_adccut = Monitored::Collection("tdc_mon_adccut", thisVects.tdc_mon_adccut);
778
779 std::string varx = iregion < 2 ? "x_mon_barrel" : "x_mon_endcap";
780 std::string vary = iregion < 2 ? "y_mon_barrel" : "y_mon_endcap";
781 std::string varx_noise = iregion < 2 ? "x_mon_barrel_noise" : "x_mon_endcap_noise";
782 std::string vary_noise = iregion < 2 ? "y_mon_barrel_noise" : "y_mon_endcap_noise";
783
784 auto x_mon = Monitored::Collection(varx, thisVects.x_mon);
785 auto y_mon = Monitored::Collection(vary, thisVects.y_mon);
786 auto x_mon_noise = Monitored::Collection(varx_noise, thisVects.x_mon_noise);
787 auto y_mon_noise = Monitored::Collection(vary_noise, thisVects.y_mon_noise);
788 fill("MdtMonitor", x_mon, y_mon, x_mon_noise, y_mon_noise);
789 auto tdc_mon_nb3 = Monitored::Collection("tdc_mon_nb3", thisVects.tdc_mon_nb3);
790
791 varx = "x_mon_" + region[iregion] + "_" + layer[ilayer];
792 vary = "y_mon_" + region[iregion] + "_" + layer[ilayer];
793
794 auto x_bin_perML = Monitored::Collection(varx, thisVects.x_bin_perML); // get the right bin!!!!
795 auto y_bin_perML = Monitored::Collection(vary, thisVects.y_bin_perML);
796
797 if (layer[ilayer] != "Extra") {
798 varx = "x_mon_" + layer[ilayer];
799 vary = "y_mon_" + layer[ilayer];
800 auto bin_byLayer_x = Monitored::Collection(varx, thisVects.bin_byLayer_x);
801 auto bin_byLayer_y = Monitored::Collection(vary, thisVects.bin_byLayer_y);
802
803 fill("MdtMonitor", bin_byLayer_x, bin_byLayer_y);
804 }
805
806 auto tdc_mon_rpc = Monitored::Collection("tdc_mon_rpc", thisVects.tdc_mon_rpc);
807 auto tdc_mon_tgc = Monitored::Collection("tdc_mon_tgc", thisVects.tdc_mon_tgc);
808
809 auto biny_name = "y_mon_bin_" + region[iregion] + "_" + layer[ilayer];
810 if (layer[ilayer] == "Extra" || layer[ilayer] == "Outer")
811 biny_name = "y_mon_bin_" + region[iregion] + "_OuterPlusExtra";
812
813 auto biny_var = Monitored::Collection(biny_name, thisVects.biny_vslb);
814
815 std::vector<int> sum_biny_vslb_bycrate;
816 sum_biny_vslb_bycrate.reserve(thisVects.biny_vslb_bycrate.size() + thisVects.biny_vslb_bycrate_bis_bee.size());
817 sum_biny_vslb_bycrate.insert(sum_biny_vslb_bycrate.end(), thisVects.biny_vslb_bycrate_bis_bee.begin(),
818 thisVects.biny_vslb_bycrate_bis_bee.end());
819 sum_biny_vslb_bycrate.insert(sum_biny_vslb_bycrate.end(), thisVects.biny_vslb_bycrate.begin(),
820 thisVects.biny_vslb_bycrate.end());
821
822 auto biny_name_bycrate = "y_mon_bin_bycrate_" + region[crate_region] + "_" + crate[icrate];
823 auto biny_var_bycrate = Monitored::Collection(biny_name_bycrate, sum_biny_vslb_bycrate);
824
825 std::vector<int> sum_biny_vslb_bycrate_ontrack;
826 sum_biny_vslb_bycrate_ontrack.reserve(thisVects.biny_vslb_bycrate_ontrack.size() +
827 thisVects.biny_vslb_bycrate_bis_bee_ontrack.size());
828 sum_biny_vslb_bycrate_ontrack.insert(sum_biny_vslb_bycrate_ontrack.end(),
829 thisVects.biny_vslb_bycrate_bis_bee_ontrack.begin(),
830 thisVects.biny_vslb_bycrate_bis_bee_ontrack.end());
831 sum_biny_vslb_bycrate_ontrack.insert(sum_biny_vslb_bycrate_ontrack.end(),
832 thisVects.biny_vslb_bycrate_ontrack.begin(),
833 thisVects.biny_vslb_bycrate_ontrack.end());
834
835 auto biny_name_bycrate_ontrack = "y_mon_bin_bycrate_ontrack_" + region[crate_region] + "_" + crate[icrate];
836 auto biny_var_bycrate_ontrack = Monitored::Collection(biny_name_bycrate_ontrack, sum_biny_vslb_bycrate_ontrack);
837
838 fill(MDT_regionGroup, adc_mon, tdc_mon, tdc_mon_nb2, adc_mon_nb2, tdc_mon_adccut, adc_mon_adccut, tdc_mon_adccut,
839 adc_mon_adccut, tdc_mon_nb3, x_bin_perML, y_bin_perML, tdc_mon_rpc, tdc_mon_tgc, biny_var, lb_mon, biny_var);
840
841 fill(MDT_regionGroup_bycrate, lb_mon, biny_var_bycrate, biny_var_bycrate_ontrack);
842 }
843 }
844 }
845 }
846 }
847
848 return StatusCode::SUCCESS;
849}
850
851StatusCode MdtRawDataMonAlg::fillMDTHistograms(const Muon::MdtPrepData* mdtCollection) const {
852 // fill chamber by chamber histos
853 StatusCode sc = StatusCode::SUCCESS;
854 Identifier digcoll_id = (mdtCollection)->identify();
855 IdentifierHash digcoll_idHash = (mdtCollection)->collectionHash();
856
857 MDTChamber* chamber{nullptr};
858 ATH_CHECK(getChamber(digcoll_idHash, chamber));
859
860 std::string hardware_name = chamber->getName();
861 //
862
863 // //convert layer numbering from 1->4 to 1->8
864 // //check if we are in 2nd multilayer
865 // //then add 4 if large chamber, 3 if small chamber
866 int mdtlayer = m_idHelperSvc->mdtIdHelper().tubeLayer(digcoll_id);
867 if (m_idHelperSvc->mdtIdHelper().multilayer(digcoll_id) == 2) {
868 if (hardware_name.at(1) == 'I' && hardware_name.at(3) != '8')
869 mdtlayer += 4;
870 else
871 mdtlayer += 3;
872 }
873
874 int mdttube = m_idHelperSvc->mdtIdHelper().tube(digcoll_id) + (mdtlayer - 1) * cachedTubeMax(digcoll_id);
875
876 ChamberTubeNumberCorrection(mdttube, hardware_name, m_idHelperSvc->mdtIdHelper().tube(digcoll_id), mdtlayer - 1);
877 bool isNoisy = m_masked_tubes->isNoisy(mdtCollection);
878
879 float tdc = mdtCollection->tdc() * 25.0 / 32.0;
880 // Note: the BMG is digitized with 200ps which is not same as other MDT chambers with 25/32=781.25ps
881 if (hardware_name.substr(0, 3) == "BMG") tdc = mdtCollection->tdc() * 0.2;
882 float adc = mdtCollection->adc();
883 if (hardware_name.substr(0, 3) == "BMG") adc /= m_adcScale;
884
885 int iregion = chamber->GetRegionEnum();
886
887 int mezz = mezzmdt(digcoll_id);
888
889 std::string monPerCh = "MdtMonPerChamber";
890 if (iregion == 0) monPerCh += "BA";
891 if (iregion == 1) monPerCh += "BC";
892 if (iregion == 2) monPerCh += "EA";
893 if (iregion == 3) monPerCh += "EC";
894
895 int mdtMultLayer = m_idHelperSvc->mdtIdHelper().multilayer(digcoll_id);
896
897 auto tdc_perch = Monitored::Scalar<float>("tdc_perch_" + hardware_name, tdc);
898 auto adc_perch = Monitored::Scalar<float>("adc_perch_" + hardware_name, adc);
899 auto layer_perch = Monitored::Scalar<int>("layer_perch_" + hardware_name, mdtlayer);
900 auto tube_perch = Monitored::Scalar<int>("tube_perch_" + hardware_name, mdttube);
901 auto mezz_perch = Monitored::Scalar<int>("mezz_perch_" + hardware_name, mezz);
902 auto ml1_adccut = Monitored::Scalar<int>("ml1_adccut", (int)(adc > m_ADCCut && !isNoisy && mdtMultLayer == 1));
903 auto ml2_adccut = Monitored::Scalar<int>("ml2_adccut", (int)(adc > m_ADCCut && !isNoisy && mdtMultLayer == 2));
904 auto adccut_nonoise = Monitored::Scalar<int>("adccut_nonoise", (int)(adc > m_ADCCut && !isNoisy));
905 auto adccut = Monitored::Scalar<int>("adccut", (int)(adc > m_ADCCut));
906
907 fill(monPerCh, tdc_perch, adc_perch, layer_perch, tube_perch, mezz_perch, ml1_adccut, ml2_adccut, adccut_nonoise, adccut);
908
909 return sc;
910}
911
912// Code for measuring tube efficiencies and tdc/adc based on hits along segments
913// Strategy:
914// First loop over hits along segments and store hits
915// Identify the MLs affected for each segment
916// Loop over the tubes in the affected MLs and identify tubes traversed by segment vector (these represent the denom in the efficiency calc)
917// Find traversed tubes that also have a hit along the segment (these represent the num in the efficiency calc)
918// Details:
919// * To avoid double-counting hits (for tdc/adc fills) due to overlapping segments, use a set called store_ROTs
920// * To avoid double-counting hits (for eff calc) due to overlapping segments, use a set called store_effTubes
921// * The above 2 sets need not have the same size, because in the latter case some tubes are missed because they are slightly too
922// far away from the segment vector -- these tubes are simply excluded from the eff calc.
923// Additionally the latter case is complicated because for overlapping traversed tubes,
924// we must preference the ones that are part of a segment that records a hit in those tubes
926 MDTSegmentHistogramStruct (&vects)[4][4][16]) const {
927 std::string type = "MDT";
928 const MdtIdHelper& id_helper = m_idHelperSvc->mdtIdHelper();
929 std::set<monAlg::TubeTraversedBySegment, monAlg::TubeTraversedBySegment_cmp> store_effTubes;
930 std::set<Identifier> store_ROTs;
931
932 // MuonDetectorManager from the conditions store
933
935 const MuonGM::MuonDetectorManager* MuonDetMgr = DetectorManagerHandle.cptr();
936 if (!MuonDetMgr) {
937 ATH_MSG_ERROR("Null pointer to the read MuonDetectorManager conditions object");
938 return StatusCode::FAILURE;
939 }
940
941 // LOOP OVER SEGMENTS
942 for (const Trk::Segment* trk_seg : *segms) {
943 const Muon::MuonSegment* segment = dynamic_cast<const Muon::MuonSegment*>(trk_seg);
944 if (!segment) {
945 ATH_MSG_DEBUG("no pointer to segment!!!");
946 break;
947 }
948 if (segment->numberOfContainedROTs() < std::max(0lu, m_nb_hits.value()) ||
949 segment->fitQuality()->chiSquared() / segment->fitQuality()->doubleNumberDoF() > m_chi2_cut) {
950 continue;
951 }
952
953 std::vector<Identifier> ROTs_chamber;
954 std::vector<int> ROTs_tube;
955 std::vector<int> ROTs_L;
956 std::vector<int> ROTs_ML;
957 for (unsigned int irot = 0; irot < segment->numberOfContainedROTs(); irot++) {
958 const Trk::RIO_OnTrack* rot = segment->rioOnTrack(irot);
959 const Muon::MdtDriftCircleOnTrack* mrot = dynamic_cast<const Muon::MdtDriftCircleOnTrack*>(rot);
960 if (!mrot) continue;
961 Identifier tmpid = rot->identify();
962 // This information needs to be stored fully for each segment (for calculations below), so deal with these duplicates later
963 // (otherwise we may not check a traversed ML for a differently pointing overlapping segment, for example)
964
965 IdentifierHash idHash{0};
966 MDTChamber* chamber = nullptr;
967 id_helper.get_module_hash(tmpid, idHash);
968 ATH_CHECK(getChamber(idHash, chamber));
969 const std::string& chambername = chamber->getName();
970 float adc = mrot->prepRawData()->adc();
971
972 if (m_idHelperSvc->hasHPTDC(tmpid)) adc /= m_adcScale;
973
974 if (store_ROTs.count(tmpid)) { continue; }
975 store_ROTs.insert(tmpid);
976
977 double tdc = mrot->prepRawData()->tdc() * 25.0 / 32.0;
978 // Note: the BMG is digitized with 200ps which is not same as other MDT chambers with 25/32=781.25ps
979 if (m_idHelperSvc->hasHPTDC(tmpid)) tdc = mrot->prepRawData()->tdc() * 0.2;
980 int iregion = chamber->GetRegionEnum();
981 int ilayer = chamber->GetLayerEnum();
982 int statphi = chamber->GetStationPhi();
983
984 auto& thisVects = vects[iregion][ilayer][statphi];
985 thisVects.adc_segs_mon.push_back(adc);
986
987 if (adc > m_ADCCut) { // This is somewhat redundant because this is usual cut for segment-reconstruction, but that's OK
988
989 thisVects.tdc_segs_mon.push_back(tdc);
990
991 int binx = chamber->GetMDTHitsPerChamber_IMO_BinX();
992 if (iregion < 2)
993 binx = binx - 9;
994 else
995 binx = binx - 7;
996 int biny = chamber->GetMDTHitsPerChamber_IMO_BinY();
997 thisVects.x_segs_mon.push_back(binx);
998 thisVects.y_segs_mon.push_back(biny - 1);
999
1000 } // adc cut
1001
1002 int mdtMultLayer = m_idHelperSvc->mdtIdHelper().multilayer(tmpid);
1003 auto adc_perch = Monitored::Scalar<float>("adc_segs_perch_" + chambername, adc);
1004 auto adc_ml1 = Monitored::Scalar<int>("adc_ml1", (int)(mdtMultLayer == 1));
1005 auto adc_ml2 = Monitored::Scalar<int>("adc_ml2", (int)(mdtMultLayer == 2));
1006
1007 std::string monPerCh = "MdtMonPerChamber";
1008 if (iregion == 0)
1009 monPerCh += "BA";
1010 else if (iregion == 1)
1011 monPerCh += "BC";
1012 else if (iregion == 2)
1013 monPerCh += "EA";
1014 else if (iregion == 3)
1015 monPerCh += "EC";
1016
1017 ROTs_chamber.push_back(tmpid);
1018 ROTs_ML.push_back(mdtMultLayer);
1019 ROTs_tube.push_back(m_idHelperSvc->mdtIdHelper().tube(tmpid));
1020 ROTs_L.push_back(m_idHelperSvc->mdtIdHelper().tubeLayer(tmpid));
1021
1022
1023 fill(monPerCh, adc_perch, adc_ml1, adc_ml2);
1024 }
1025 // Finished gathering hits used in segment
1026
1027 if (m_doChamberHists) {
1028 // Find unique chambers (since above we stored one chamber for every tube)
1029 // Also store the MLs affected by the ROTs, since we don't necessarily want to look for traversed tubes in entire chamber
1030 std::vector<Identifier> unique_chambers;
1031 std::vector<std::vector<int>> unique_chambers_ML;
1032
1033 for (unsigned i = 0; i < ROTs_chamber.size(); i++) {
1034 bool isUnique = true;
1035 for (unsigned j = 0; j < unique_chambers.size(); j++) {
1036 if (getChamberName(ROTs_chamber.at(i)) == getChamberName(unique_chambers.at(j))) {
1037 isUnique = false;
1038 if (!AinB(ROTs_ML.at(i), unique_chambers_ML.at(j))) unique_chambers_ML.at(j).push_back(ROTs_ML.at(i));
1039 break;
1040 }
1041 }
1042 if (isUnique) {
1043 unique_chambers.push_back(ROTs_chamber.at(i));
1044 std::vector<int> tmp_ML;
1045 tmp_ML.push_back(ROTs_ML.at(i));
1046 unique_chambers_ML.push_back(tmp_ML);
1047 }
1048 }
1049 // Done finding unique chambers
1050 // Loop over the unique chambers
1051 // Here we store the tubes in each chamber that were traversed by the segment
1052 std::vector<Identifier> traversed_station_id;
1053 std::vector<int> traversed_tube;
1054 std::vector<int> traversed_L;
1055 std::vector<int> traversed_ML;
1056
1057 for (const Identifier& station_id : unique_chambers) {
1058 const std::string hardware_name = getChamberName(station_id);
1059 // SEGMENT track
1060 const MuonGM::MdtReadoutElement* detEl = MuonDetMgr->getMdtReadoutElement(station_id);
1061 const Amg::Transform3D& gToStation = detEl->GlobalToAmdbLRSTransform();
1062 const Amg::Vector3D segPosL = gToStation * segment->globalPosition();
1063 const Amg::Vector3D segDirL = gToStation.linear() * segment->globalDirection();
1064 MuonCalib::MTStraightLine segment_track =
1065 MuonCalib::MTStraightLine(segPosL, segDirL, Amg::Vector3D(0, 0, 0), Amg::Vector3D(0, 0, 0));
1066
1067 // Loop over tubes in chamber, find those along segment
1068 for (int ML : {1, 2}) {
1069
1070 Identifier newId = id_helper.channelID(station_id, ML, 1, 1);
1071 const MuonGM::MdtReadoutElement* MdtRoEl = MuonDetMgr->getMdtReadoutElement(newId);
1072 int tubeMax = cachedTubeMax(newId);
1073 int tubeLayerMax = cachedTubeLayerMax(newId);
1074 CorrectTubeMax(hardware_name, tubeMax);
1075 CorrectLayerMax(hardware_name, tubeLayerMax);
1076
1077 int tubeMin = id_helper.tubeMin(newId);
1078 int tubeLayerMin = id_helper.tubeLayerMin(newId);
1079 for (int i_tube = tubeMin; i_tube <= tubeMax; ++i_tube) {
1080 for (int i_layer = tubeLayerMin; i_layer <= tubeLayerMax; ++i_layer) {
1081 Identifier tubeId = id_helper.channelID(newId, ML, i_layer, i_tube);
1082
1083 if (m_BMGpresent && m_idHelperSvc->mdtIdHelper().stationName(newId) == m_BMGid) {
1084 std::map<Identifier, std::set<Identifier>>::const_iterator myIt = m_DeadChannels.find(MdtRoEl->identify());
1085 if (myIt != m_DeadChannels.end()) {
1086 if (myIt->second.count(tubeId)) {
1087 ATH_MSG_DEBUG("Skipping tube with identifier " << m_idHelperSvc->toString(tubeId));
1088 continue;
1089 }
1090 }
1091 }
1092
1093 Amg::Vector3D TubePos = MdtRoEl->GlobalToAmdbLRSCoords(MdtRoEl->tubePos(tubeId));
1094 Amg::Vector3D tube_position = Amg::Vector3D(TubePos.x(), TubePos.y(), TubePos.z());
1095 static const Amg::Vector3D tube_direction{1, 0, 0};
1096 MuonCalib::MTStraightLine tube_track =
1097 MuonCalib::MTStraightLine(tube_position, tube_direction, Amg::Vector3D(0, 0, 0), Amg::Vector3D(0, 0, 0));
1098 double distance = std::abs(segment_track.signDistFrom(tube_track));
1099
1100 if (distance < (MdtRoEl->innerTubeRadius())) {
1101 traversed_tube.push_back(i_tube);
1102 traversed_L.push_back(i_layer);
1103 traversed_ML.push_back(ML);
1104 traversed_station_id.push_back(station_id);
1105 }
1106
1107 }
1108 }
1109 }
1110 }
1111
1112 // Done looping over the unqiue chambers
1113
1114 // Loop over traversed tubes that were stored above
1115 // Here we fill the DRvsDT/DRvsSegD histos, as well is unique hits and traversed tubes to calculate efficiencies
1116 if (traversed_tube.size() < 20) { // quality cut here -- 20 traversed tubes is ridiculous and generates low efficiencies (these
1117 // are due to non-pointing segments)
1118
1119 for (unsigned k = 0; k < traversed_tube.size(); k++) {
1120
1121 std::string hardware_name = getChamberName(traversed_station_id.at(k));
1122
1123 // GET HISTS
1124 IdentifierHash idHash{0};
1125 id_helper.get_module_hash(traversed_station_id.at(k), idHash);
1126
1127 MDTChamber* chamber{nullptr};
1128 ATH_CHECK(getChamber(idHash, chamber));
1129
1130 bool hit_flag = false;
1131 for (unsigned j = 0; j < ROTs_tube.size(); j++) {
1132 if ((getChamberName(ROTs_chamber.at(j)) == hardware_name) && (traversed_tube.at(k) == ROTs_tube.at(j)) &&
1133 (traversed_L.at(k) == ROTs_L.at(j)) &&
1134 (traversed_ML.at(k) == ROTs_ML.at(j))) { // found traversed tube with hit used in segment
1135 hit_flag = true;
1136 break;
1137 }
1138 }
1139
1140 const Identifier& trav_id = traversed_station_id.at(k);
1141 Identifier newId = id_helper.channelID(trav_id, traversed_ML.at(k), 1, 1);
1142
1143
1144 int tubeLayerMax = cachedTubeLayerMax(newId);
1145 id_helper.get_module_hash(newId, idHash);
1146 CorrectLayerMax(hardware_name, tubeLayerMax); // ChamberTubeNumberCorrection handles the tubeMax problem
1147
1148
1149 int mdtlayer = ((traversed_L.at(k) - 1) + (traversed_ML.at(k) - 1) * tubeLayerMax);
1150 int ibin = traversed_tube.at(k) + mdtlayer * cachedTubeMax(newId);
1151
1152
1153 ChamberTubeNumberCorrection(ibin, hardware_name, traversed_tube.at(k), mdtlayer);
1154 // Store info for eff calc
1155 // (Here we make sure we are removing duplicates from overlapping segments by using sets)
1156 std::set<monAlg::TubeTraversedBySegment, monAlg::TubeTraversedBySegment_cmp>::iterator it;
1157 monAlg::TubeTraversedBySegment tmp_effTube = monAlg::TubeTraversedBySegment(hardware_name, ibin, hit_flag, idHash);
1158 monAlg::TubeTraversedBySegment tmp_effTube_Hit = monAlg::TubeTraversedBySegment(hardware_name, ibin, true, idHash);
1159 monAlg::TubeTraversedBySegment tmp_effTube_noHit = monAlg::TubeTraversedBySegment(hardware_name, ibin, false, idHash);
1160 it = store_effTubes.find(tmp_effTube_Hit);
1161 if (hit_flag || (it == store_effTubes.end()))
1162 store_effTubes.insert(tmp_effTube); // Insert if w/hit, but if w/o hit then only insert if no already stored w/ h
1163
1164 it = store_effTubes.find(tmp_effTube_noHit);
1165 if (hit_flag && (it != store_effTubes.end()))
1166 store_effTubes.erase(it); // If w/ hit, and the same tube is stored w/o hit, remove duplicate w/o hit
1167 }
1168 }
1169 // Done looping over traversed tubes
1170
1171 } // m_doChamberHists
1172 }
1173
1174 // Fill effentries/effcounts hists for efficiency calculation
1175 if (m_doChamberHists) { // Don't perform this block if not doing chamber by chamber hists
1176 for (const monAlg::TubeTraversedBySegment& it : store_effTubes) {
1177 // GET HISTS
1178 MDTChamber* chamber{nullptr};
1179 ATH_CHECK(getChamber(it.idHash, chamber));
1180 int tubebin = it.tubeBin;
1181
1182 int iregion = chamber->GetRegionEnum();
1183 std::string monPerCh = "MdtMonPerChamber";
1184 if (iregion == 0) monPerCh += "BA";
1185 if (iregion == 1) monPerCh += "BC";
1186 if (iregion == 2) monPerCh += "EA";
1187 if (iregion == 3) monPerCh += "EC";
1188
1189 std::string chambername = chamber->getName();
1190 auto tube_perch_segs = Monitored::Scalar<int>("tube_perch_segs_" + chambername, tubebin);
1191 auto hitcut = Monitored::Scalar<int>("hitcut", (int)(it.isHit));
1192
1193 fill(monPerCh, tube_perch_segs, hitcut);
1194 }
1195 }
1196 return StatusCode::SUCCESS;
1197
1198}
1199
1201 std::string region[4] = {"BA", "BC", "EA", "EC"};
1202 std::string layer[4] = {"Inner", "Middle", "Outer", "Extra"};
1203
1204 for (int iregion = 0; iregion < 4; ++iregion) {
1205 std::string MDT_regionGroup = "MDT_regionGroup" + region[iregion]; // MDTXX/Overview, 4 gruppi
1206 for (int ilayer = 0; ilayer < 4; ++ilayer) {
1207 for (int stationPhi = 0; stationPhi < 16; ++stationPhi) {
1208 const auto& thisVects = vects[iregion][ilayer][stationPhi];
1209
1210 auto adc_segs_mon = Monitored::Collection("adc_segs_mon", thisVects.adc_segs_mon);
1211 auto adc_segs_overall_mon = Monitored::Collection("adc_segs_overall_mon", thisVects.adc_segs_mon);
1212 std::string tdc_var = "tdc_segs_" + region[iregion] + "_" + layer[ilayer] + "_phi" + std::to_string(stationPhi + 1);
1213 auto tdc_segs_mon = Monitored::Collection(tdc_var, thisVects.tdc_segs_mon);
1214 if (m_do_mdttdccut_sector) fill(MDT_regionGroup, tdc_segs_mon);
1215
1216 auto tdc_segs_overall_mon = Monitored::Collection("tdc_segs_overall_mon", thisVects.tdc_segs_mon);
1217 auto tdc_segs_region_mon = Monitored::Collection("tdc_segs_region_mon", thisVects.tdc_segs_mon);
1218
1219 fill(MDT_regionGroup, adc_segs_mon, tdc_segs_region_mon);
1220
1221 std::string varx = iregion < 2 ? "x_segs_mon_barrel" : "x_segs_mon_endcap";
1222 std::string vary = iregion < 2 ? "y_segs_mon_barrel" : "y_segs_mon_endcap";
1223 auto x_segs_mon = Monitored::Collection(varx, thisVects.x_segs_mon);
1224 auto y_segs_mon = Monitored::Collection(vary, thisVects.y_segs_mon);
1225
1226 fill("MdtMonitor", tdc_segs_overall_mon, adc_segs_overall_mon, x_segs_mon, y_segs_mon);
1227 }
1228 }
1229 }
1230 return StatusCode::SUCCESS;
1231}
1232
1234 PVConstLink cv = mydetEl->getMaterialGeom(); // it is "Multilayer"
1235 int nGrandchildren = cv->getNChildVols();
1236 if (nGrandchildren <= 0) return;
1237
1238 Identifier detElId = mydetEl->identify();
1239
1240 std::set<Identifier>& deadTubes = m_DeadChannels[detElId];
1241
1242 for (int layer = 1; layer <= mydetEl->getNLayers(); ++layer) {
1243 for (int tube = 1; tube <= mydetEl->getNtubesperlayer(); ++tube) {
1244 bool tubefound = false;
1245 for (unsigned int kk = 0; kk < cv->getNChildVols(); ++kk) {
1246 int tubegeo = cv->getIdOfChildVol(kk).value() % maxNTubesPerLayer;
1247 int layergeo = (cv->getIdOfChildVol(kk).value() - tubegeo) / maxNTubesPerLayer;
1248 if (tubegeo == tube && layergeo == layer) {
1249 tubefound = true;
1250 break;
1251 }
1252 if (layergeo > layer) break; // don't loop any longer if you cannot find tube anyway anymore
1253 }
1254 if (!tubefound) {
1255 Identifier deadTubeId = m_idHelperSvc->mdtIdHelper().channelID(detElId, mydetEl->getMultilayer(), layer, tube);
1256 deadTubes.insert(deadTubeId);
1257 ATH_MSG_VERBOSE("adding dead tube " << m_idHelperSvc->toString(deadTubeId));
1258 }
1259 }
1260 }
1261}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
#define ATH_UNLIKELY(x)
bool hit(const Container &ids, int pdgId)
static Double_t sc
double tubeMax
std::string convertChamberName(int, int, int, const std::string &)
const ServiceHandle< StoreGateSvc > & detStore() const
virtual StatusCode initialize() override
initialize
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
This is a "hash" representation of an Identifier.
const std::string & getName() const
Definition MDTChamber.h:67
static uint16_t encode(const uint16_t regionIn, const uint16_t layerIn, const uint16_t phiIn, const uint16_t crate_regionIn, const uint16_t crateIn)
virtual int get_module_hash(const Identifier &id, IdentifierHash &hash_id) const override
static constexpr int maxNTubesPerLayer
The maxNTubesPerLayer represents the absolute maximum of tubes which are built into a single multilay...
Definition MdtIdHelper.h:68
static int tubeLayerMin()
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
static int tubeMin()
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
int get_bin_for_LB_hist(int region, int layer, int phi, int eta, bool isBIM) const
virtual StatusCode fillMDTHistograms(const Muon::MdtPrepData *) const
StatusCode getChamber(const IdentifierHash &id, MDTChamber *&chamber) const
virtual StatusCode binMdtRegional(TH2 *, std::string_view xAxis)
Gaudi::Property< bool > m_do_mdttdccut_sector
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_muon_type
int GetTubeMax(const Identifier &digcoll_id, std::string_view hardware_name)
std::map< Identifier, std::set< Identifier > > m_DeadChannels
virtual StatusCode binMdtGlobal_byLayer(TH2 *, TH2 *, TH2 *)
StatusCode handleEvent_effCalc_fillVects(const Trk::SegmentCollection *segms, MDTSegmentHistogramStruct(&vects)[4][4][16]) const
std::string getChamberName(const Muon::MdtPrepData *) const
SG::ReadHandleKey< Muon::RpcPrepDataContainer > m_key_rpc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Gaudi::Property< size_t > m_ADCCut
std::vector< std::unique_ptr< MDTChamber > > m_hist_hash_list
std::vector< Identifier > m_chambersId
static void CorrectLayerMax(const std::string &hardware_name, int &numLayers)
SG::ReadHandleKey< Muon::MdtPrepDataContainer > m_key_mdt
Gaudi::Property< bool > m_do_run3Geometry
Gaudi::Property< bool > m_doMdtESD
virtual StatusCode fillMDTSummaryHistograms(std::array< MDTSummaryHistogramStruct, 4096 > *vects, int lb) const
const MuonGM::MuonDetectorManager * m_detMgr
virtual StatusCode binMdtGlobal(TH2 *, char ecap)
int mezzmdt(const Identifier &id) const
virtual StatusCode initialize() override
initialize
virtual ~MdtRawDataMonAlg()
int get_bin_for_LB_crate_hist(int region, int layer, int phi, int eta, std::string_view chamber) const
Gaudi::Property< bool > m_do_mdtchamberstatphislice
int cachedTubeLayerMax(const Identifier &id) const
std::vector< IdentifierHash > m_chambersIdHash
Gaudi::Property< size_t > m_adcScale
Gaudi::Property< bool > m_chi2_cut
Gaudi::Property< bool > m_maskNoisyTubes
int cachedTubeMax(const Identifier &id) const
Gaudi::Property< size_t > m_HighOccThreshold
std::unique_ptr< MDTNoisyTubes > m_masked_tubes
virtual void fillMDTOverviewHistograms(const MDTOverviewHistogramStruct &vects) const
SG::ReadHandleKeyArray< Trk::SegmentCollection > m_segm_type
SG::ReadHandleKey< xAOD::MuonRoIContainer > m_l1RoiKey
MdtRawDataMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode fillMDTSegmentHistograms(const MDTSegmentHistogramStruct(&vects)[4][4][16]) const
std::map< std::string, int > m_tubesperchamber_map
void initDeadChannels(const MuonGM::MdtReadoutElement *mydetEl)
virtual StatusCode fillMDTSummaryVects(const Muon::MdtPrepData *, const std::set< std::string > &, bool &isNoiseBurstCandidate, bool trig_barrel, bool trig_endcap, std::array< MDTSummaryHistogramStruct, 4096 > *) const
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
Gaudi::Property< bool > m_doChamberHists
static void ChamberTubeNumberCorrection(int &tubeNum, std::string_view hardware_name, int tubePos, int numLayers)
Gaudi::Property< size_t > m_nb_hits
std::atomic< int > m_firstEvent
Gaudi::Property< bool > m_do_mdtChamberHits
static bool AinB(int A, std::vector< int > &B)
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo
SG::ReadHandleKey< xAOD::MuonContainer > m_muonKey
static void CorrectTubeMax(const std::string &hardware_name, int &numTubes)
virtual void fillMDTOverviewVects(const Muon::MdtPrepData *, bool &isNoiseBurstCandidate, MDTOverviewHistogramStruct &vects) const
Declare a monitored scalar variable.
double signDistFrom(const MTStraightLine &h) const
get the signed distance of two lines (if both are parallel, dist>0)
Amg::Vector3D tubePos(const Identifier &id) const
Returns the global position of the given tube.
int getNLayers() const
Returns the number of tube layers inside the multilayer.
int getMultilayer() const
Returns the multilayer represented by the readout element.
int getNtubesperlayer() const
Returns the number of tubes in each tube layer.
double innerTubeRadius() const
Returns the inner tube radius excluding the aluminium walls.
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const MuonStation * getMuonStation(const std::string &stName, int eta, int phi) const
virtual Amg::Vector3D GlobalToAmdbLRSCoords(const Amg::Vector3D &x) const
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
This class represents the corrected MDT measurements, where the corrections include the effects of wi...
virtual const MdtPrepData * prepRawData() const override final
Returns the PrepRawData used to create this corrected measurement.
Class to represent measurements from the Monitored Drift Tubes.
Definition MdtPrepData.h:33
int adc() const
Returns the ADC (typically range is 0 to 250).
int tdc() const
Returns the TDC (typically range is 0 to 2500).
This is the common class for 3D segments used in the muon spectrometer.
const Trk::RIO_OnTrack * rioOnTrack(unsigned int) const
returns the RIO_OnTrack (also known as ROT) objects depending on the integer
virtual const Amg::Vector3D & globalPosition() const override final
global position
const_pointer_type cptr()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
bool isPresent() const
Is the referenced object present in SG?
double chiSquared() const
returns the of the overall track fit
Definition FitQuality.h:56
double doubleNumberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as double
Definition FitQuality.h:68
This class is the pure abstract base class for all fittable tracking measurements.
Identifier identify() const
return the identifier
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
Identifier identify() const
return the identifier -extends MeasurementBase
Base class for all TrackSegment implementations, extends the common MeasurementBase.
const FitQuality * fitQuality() const
return the FitQuality object, returns NULL if no FitQuality is defined
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
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.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:132
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
DataVector< Trk::Segment > SegmentCollection
@ numberOfTriggerEtaLayers
layers with trigger eta hits [unit8_t].
@ numberOfPhiLayers
layers with a trigger phi hit [unit8_t].
std::vector< float > adc_mon_nosel
std::vector< float > mdt_tube_z_barrel
std::vector< float > tdc_mon_adcCut
std::vector< float > mdt_tube_x_ovl
std::vector< float > mdt_tube_perp_ovl
std::vector< float > mdt_tube_x_endcap
std::vector< float > tdc_mon_nosel
std::vector< float > mdt_tube_x_barrel
std::vector< float > adc_mon_noiseBurst
std::vector< float > mdt_tube_y_ovl
std::vector< float > adc_mon_noiseBurst_notNoisy
std::vector< float > mdt_tube_y_barrel
std::vector< float > mdt_tube_perp_barrel
std::vector< float > tdc_mon_noiseBurst_adcCut
std::vector< float > tdc_mon_noiseBurst
std::vector< float > mdt_tube_z_endcap
std::vector< float > tdc_mon
std::vector< float > mdt_tube_perp_endcap
std::vector< float > mdt_tube_z_ovl
std::vector< float > adc_mon
std::vector< float > mdt_tube_y_endcap
std::vector< float > tdc_segs_mon
std::vector< float > adc_segs_mon
std::vector< float > adc_mon_adccut
std::vector< float > tdc_mon_nb3
std::vector< int > bin_byLayer_x
std::vector< int > biny_vslb_bycrate
std::vector< float > adc_mon_nb2
std::vector< float > tdc_mon_rpc
std::vector< float > tdc_mon_tgc
std::vector< float > adc_mon_nb1
std::vector< int > biny_vslb_bycrate_bis_bee_ontrack
std::vector< int > stationEta
std::vector< int > biny_vslb_bycrate_bis_bee
std::vector< int > bin_byLayer_y
std::vector< float > tdc_mon_nb2
std::vector< int > x_mon_noise
std::vector< float > tdc_mon_nb1
std::vector< float > tdc_mon
std::vector< int > biny_vslb_bycrate_ontrack
std::vector< float > tdc_mon_adccut
std::vector< float > adc_mon
std::vector< int > y_mon_noise
void fill(H5::Group &out_file, size_t iterations)