ATLAS Offline Software
MDT_RegSelCondAlg.cxx
Go to the documentation of this file.
1 
14 #include "MDT_RegSelCondAlg.h"
15 
16 #include "CLHEP/Units/SystemOfUnits.h"
18 
19 #include <iostream>
20 #include <fstream>
21 #include <string>
22 
26 
27 
28 
29 MDT_RegSelCondAlg::MDT_RegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator):
30  MuonRegSelCondAlg( name, pSvcLocator )
31 {
32  ATH_MSG_DEBUG( "MDT_RegSelCondAlg::MDT_RegSelCondAlg() " << name );
33 }
34 
35 
36 
37 
42  return StatusCode::SUCCESS;
43 }
44 
45 
46 
47 
48 std::unique_ptr<RegSelSiLUT> MDT_RegSelCondAlg::createTable( const EventContext& ctx, EventIDRange& id_range ) const {
49 
51 
52  if( !cabling.range( id_range ) ) {
53  ATH_MSG_ERROR("Failed to retrieve validity range for " << cabling.key());
54  return {nullptr};
55  }
56 
58 
59  if( !manager.range( id_range ) ) {
60  ATH_MSG_ERROR("Failed to retrieve validity range for " << manager.key());
61  return {nullptr};
62  }
63 
64 
65  const MdtCondDbData* conditions_ptr = nullptr;
66 
67  if (!m_condKey.empty()){
69  if( !conditions.range( id_range ) ) {
70  ATH_MSG_ERROR("Failed to retrieve validity range for " << conditions.key());
71  return {nullptr};
72  }
73  conditions_ptr = conditions.cptr();
74  }
76 
77 
78 
79  const MdtIdHelper* helper = manager->mdtIdHelper();
80 
82  std::unique_ptr<RegSelSiLUT> lut = std::make_unique<RegSelSiLUT>();
83 
84 
85  IdContext ModuleContext = helper->module_context();
86 
87  std::vector<Identifier>::const_iterator itr = helper->module_begin();
88  std::vector<Identifier>::const_iterator idlast = helper->module_end();
89 
90  for ( ; itr!=idlast; ++itr ) {
91 
92  Identifier Id = *itr;
93  IdentifierHash Idhash;
94 
95  helper->get_hash(Id, Idhash, &ModuleContext);
96 
97  ExpandedIdentifier exp_id;
98  if (helper->get_expanded_id( Id, exp_id, &ModuleContext)) {
99  ATH_MSG_DEBUG("Failed retrieving ExpandedIdentifier for PRD Identifier = " << Id.getString() << ". Skipping to the next PRD.");
100  continue;
101  }
102  if (conditions_ptr && !conditions_ptr->isGood(Id)) {
103  ATH_MSG_DEBUG("Channel is marked as dead");
104  continue;
105  }
106  int detid = ( exp_id[2]<0 ? -1 : 1 );
107  int layerid = exp_id[1]+1;
108 
109  IdContext mdtChannelContext = helper->channel_context();
110 
111  // get the element corresponding to multilayer = 1
112  const MuonGM::MdtReadoutElement* mdt1 = manager->getMdtReadoutElement(Id);
113  if (mdt1 == nullptr) {
114  continue;
115  }
116 
117  Identifier Id2 = helper->channelID(Id, 2, 1, 1);
118 
119  // get the element corresponding to multilayer = 2
120  const MuonGM::MdtReadoutElement* mdt2 = manager->getMdtReadoutElement(Id2);
121 
122  double tubePitch = mdt1->tubePitch();
123 
124  int ntlay = mdt1->getNLayers();
125  int ntubesl1 = mdt1->getNtubesperlayer();
126  int ntubesl2 = 0;
127 
128  if (mdt2 != nullptr) ntubesl2 = mdt2->getNtubesperlayer();
129 
130  Identifier Idv[4];
131  Idv[0] = helper->channelID(Id, 1, 1, 1);
132  Idv[1] = helper->channelID(Id, 1, 1, ntubesl1);
133  Idv[2] = helper->channelID(Id, 2, ntlay, 1);
134  Idv[3] = helper->channelID(Id, 2, ntlay, ntubesl2);
135 
136  // std::cout<<" Number of tube layers "<<ntlay;
137  // std::cout<<" Number of tubes / layer (1 ,2) "<<ntubesl1<<", "<<ntubesl2;
138 
139  double rmin = 99999999.;
140  double rmax = -99999999.;
141  double zmin = 99999999.;
142  double zmax = -99999999.;
143  double emin = 99999999.;
144  double emax = -99999999.;
145  double phimin = 999999.;
146  double phimax = -999999.;
147 
148  double zpos21 = 0.;
149  Identifier Idsl = helper->channelID(Id, 1, 2, 1);
150  if (mdt1->barrel()) {
151  zpos21 = (mdt1->tubePos(Idsl)).z()-(mdt1->tubePos(Idv[0])).z();
152  }
153  else {
154  zpos21 = (mdt1->tubePos(Idsl)).perp()-(mdt1->tubePos(Idv[0])).perp();
155  }
156 
159  // to a more sensibly named "itr"
160  for (int i=0; i<4; i++) {
161 
162  const MuonGM::MdtReadoutElement* mdt = nullptr;
163 
164  if ( i<2 ) mdt = mdt1;
165  else mdt = mdt2;
166  if (mdt == nullptr) {
167  // std::cout<<" element not found for index i = "<<i<<" --------- "<<std::endl;
168  if (i==2) {
169  Idv[2] = helper->channelID(Id, 1, ntlay, 1);
170  mdt = manager->getMdtReadoutElement(Idv[2]);
171  }
172  else if (i==3) {
173  Idv[3] = helper->channelID(Id, 1, ntlay, ntubesl1);
174  mdt = manager->getMdtReadoutElement(Idv[3]);
175  }
176  else {
177  // std::cout<<" Skipping element; i = "<<i<<" ----- "<<std::endl;
178  continue;
179  }
180 
181  }
182 
183  Amg::Vector3D mdtPos = mdt->tubePos(Idv[i]);
184 
185  Amg::Vector3D mdtPos1 = mdtPos;
186  Amg::Vector3D mdtPos2 = mdtPos;
187 
188  double scaleMin = (mdtPos.perp()-tubePitch/2.)/mdtPos.perp();
189  double scalePlus = (mdtPos.perp()+tubePitch/2.)/mdtPos.perp();
190 
191  if (mdt->barrel()) {
192 
193  // these are z ranges of the first or last tube layer
194  // mdtPos1.setZ(mdtPos.z()-tubePitch/2.);
195  // mdtPos2.setZ(mdtPos.z()+tubePitch/2.);
196  mdtPos1[2] = mdtPos.z()-tubePitch/2.;
197  mdtPos2[2] = mdtPos.z()+tubePitch/2.;
198 
199  // correct the z ranges of the first or last tube layer to account for tube staggering
200  if (zpos21 > 1.) {
201  // mdtPos2.setZ(mdtPos2.z()+tubePitch/2.);
202  mdtPos2[2] = mdtPos2.z()+tubePitch/2.;
203  }
204  else if (zpos21 < -1.) {
205  //mdtPos1.setZ(mdtPos1.z()-tubePitch/2.);
206  mdtPos1[2] = mdtPos1.z()-tubePitch/2.;
207  }
208 
209  if (i<2) {
210  mdtPos1[0] *= scaleMin;
211  mdtPos1[1] *= scaleMin;
212  mdtPos2[0] *= scaleMin;
213  mdtPos2[1] *= scaleMin;
214  // mdtPos1.setPerp(mdtPos.perp()-tubePitch/2.);
215  // mdtPos2.setPerp(mdtPos.perp()-tubePitch/2.);
216  }
217  else {
218  mdtPos1[0] *= scalePlus;
219  mdtPos1[1] *= scalePlus;
220  mdtPos2[0] *= scalePlus;
221  mdtPos2[1] *= scalePlus;
222  // mdtPos1.setPerp(mdtPos.perp()+tubePitch/2.);
223  // mdtPos2.setPerp(mdtPos.perp()+tubePitch/2.);
224  }
225  }
226  else {
227 
228  // these are z ranges of the first or last tube layer
229  mdtPos1[0] *= scaleMin;
230  mdtPos1[1] *= scaleMin;
231  mdtPos2[0] *= scalePlus;
232  mdtPos2[1] *= scalePlus;
233  // mdtPos1.setPerp(mdtPos.perp()-tubePitch/2.);
234  // mdtPos2.setPerp(mdtPos.perp()+tubePitch/2.);
235  // correct the z ranges of the first or last tube layer to account for tube staggering
236  if (zpos21 > 1.) {
237  scalePlus = (mdtPos2.perp()+tubePitch/2.)/mdtPos2.perp();
238  mdtPos2[0] *= scalePlus;
239  mdtPos2[1] *= scalePlus;
240  // mdtPos2.setPerp(mdtPos2.perp()+tubePitch/2.);
241  }
242  else if (zpos21 < -1.) {
243  scaleMin = (mdtPos1.perp()-tubePitch/2.)/mdtPos1.perp();
244  mdtPos1[0] *= scaleMin;
245  mdtPos1[1] *= scaleMin;
246  // mdtPos1.setPerp(mdtPos1.perp()-tubePitch/2.);
247  }
248  if (i<2) {
249  if (mdt->sideA()){
250  // mdtPos1.setZ(mdtPos.z()-tubePitch/2.);
251  // mdtPos2.setZ(mdtPos.z()-tubePitch/2.);
252  mdtPos1[2] = mdtPos.z()-tubePitch/2.;
253  mdtPos2[2] = mdtPos.z()-tubePitch/2.;
254  }
255  else {
256  // mdtPos1.setZ(mdtPos.z()+tubePitch/2.);
257  // mdtPos2.setZ(mdtPos.z()+tubePitch/2.);
258  mdtPos1[2] = mdtPos.z()+tubePitch/2.;
259  mdtPos2[2] = mdtPos.z()+tubePitch/2.;
260  }
261  }
262  else {
263  if (mdt->sideA()) {
264  // mdtPos1.setZ(mdtPos.z()+tubePitch/2.);
265  // mdtPos2.setZ(mdtPos.z()+tubePitch/2.);
266  mdtPos1[2] = mdtPos.z()+tubePitch/2.;
267  mdtPos2[2] = mdtPos.z()+tubePitch/2.;
268  }
269  else {
270  // mdtPos1.setZ(mdtPos.z()-tubePitch/2.);
271  // mdtPos2.setZ(mdtPos.z()-tubePitch/2.);
272  mdtPos1[2] = mdtPos.z()-tubePitch/2.;
273  mdtPos2[2] = mdtPos.z()-tubePitch/2.;
274  }
275  }
276  }
277 
278  double eminMod = 0.;
279  double emaxMod = 0.;
280  double zminMod = 0.;
281  double zmaxMod = 0.;
282  double rminMod = 0.;
283  double rmaxMod = 0.;
284  double dphi = 0.;
285 
286  if (mdt->barrel()) {
287  eminMod = mdtPos1.eta();
288  emaxMod = mdtPos2.eta();
289 
290  zminMod = mdtPos1.z();
291  zmaxMod = mdtPos2.z();
292 
293  rminMod = mdtPos1.perp();
294  rmaxMod = mdtPos2.perp();
295 
296  dphi = atan2(mdt->getSsize()/2., (mdtPos.perp()-tubePitch/2.));
297  }
298  else {
299  if (mdt->sideA()) {
300  eminMod = mdtPos2.eta();
301  emaxMod = mdtPos1.eta();
302 
303  zminMod = mdtPos2.z();
304  zmaxMod = mdtPos1.z();
305 
306  rminMod = mdtPos1.perp();
307  rmaxMod = mdtPos2.perp();
308  }
309  else {
310  eminMod = mdtPos1.eta();
311  emaxMod = mdtPos2.eta();
312 
313  zminMod = mdtPos1.z();
314  zmaxMod = mdtPos2.z();
315 
316  rminMod = mdtPos1.perp();
317  rmaxMod = mdtPos2.perp();
318  }
319 
320  dphi = atan2(mdt->tubeLength(Idv[i])/2., (mdtPos.perp()-tubePitch/2.));
321  }
322 
323  double pminMod = mdtPos.phi() - dphi;
324  double pmaxMod = mdtPos.phi() + dphi;
325 
326  if (zminMod < zmin) {
327  zmin = zminMod;
328  }
329 
330  if (zmaxMod > zmax) {
331  zmax = zmaxMod;
332  }
333 
334  if (pminMod < phimin) phimin = pminMod;
335  if (pmaxMod > phimax) phimax = pmaxMod;
336  if (eminMod < emin) emin = eminMod;
337  if (emaxMod > emax) emax = emaxMod;
338  if (rminMod < rmin) rmin = rminMod;
339  if (rmaxMod > rmax) rmax = rmaxMod;
340  // std::cout<<" Module emin - emax "<<emin<<" "<<emax<<" phimin - phimax "<<phimin<<" "<<phimax<<std::endl;
341 
342  }
343 
344  // here define the eta and phi(0-2*pi) ranges
345  if (phimin<0) phimin = phimin + 2*M_PI;
346  if (phimax<0) phimax = phimax + 2*M_PI;
347 
348  // calculate 4 sub detectors for the mdt, fore and aft barrel,
349  // and fore and aft endcaps
350 
351  if ( mdt1->barrel() ) {
352  if ( mdt1->sideA() ) detid = 1;
353  else if ( mdt1->sideC() ) detid = -1;
354  }
355  else {
356  if ( mdt1->sideA() ) detid = 2;
357  else if ( mdt1->sideC() ) detid = -2;
358  }
359 
360 
361  // std::cout << "detid " << detid;
362 
363  // if ( mdt1->barrel() ) detid = 0;
364  // if ( mdt1->sideA() ) detid = 1;
365  // if ( mdt1->sideC() ) detid = -1;
366 
367  // std::cout << " -> " << detid << std::endl;
368 
369  uint32_t RobId = cabling->getROBId(Idhash, msgStream());
370 
371  RegSelModule m( zmin, zmax, rmin, rmax, phimin, phimax, layerid, detid, RobId, Idhash );
372 
373  lut->addModule( m );
374 
375  }
376 
377 
378  lut->initialise();
379 
380  return lut;
381 
382 }
383 
384 
385 
386 
387 
388 
389 
MuonRegSelCondAlg
Definition: MuonRegSelCondAlg.h:32
RegSelModule
Definition: RegSelModule.h:38
MdtReadoutElement.h
MuonGM::MdtReadoutElement::getNLayers
int getNLayers() const
Returns the number of tube layers inside the multilayer.
MdtCondDbData::isGood
bool isGood(const Identifier &Id) const
Returns if the identifier (tube/multiLayer/chamber) is masked in the conditions database.
Definition: MdtCondDbData.cxx:25
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
MuonGM::MdtReadoutElement::tubeLength
double tubeLength(const int tubeLayer, const int tube) const
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
perp
Scalar perp() const
perp method - perpenticular length
Definition: AmgMatrixBasePlugin.h:44
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
PixelAthClusterMonAlgCfg.zmin
zmin
Definition: PixelAthClusterMonAlgCfg.py:169
MDT_RegSelCondAlg::createTable
std::unique_ptr< RegSelSiLUT > createTable(const EventContext &ctx, EventIDRange &id_range) const override
Definition: MDT_RegSelCondAlg.cxx:48
MuonGM::MdtReadoutElement::tubePitch
double tubePitch() const
Returns the distance between 2 tubes in a tube layer.
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
M_PI
#define M_PI
Definition: ActiveFraction.h:11
ExpandedIdentifier
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:102
MdtCondDbData
Definition: MdtCondDbData.h:21
MuonGM::MdtReadoutElement::barrel
bool barrel() const
Returns whether the chamber is in the barrel (Assement on first later in stationName)
MDT_RegSelCondAlg::MDT_RegSelCondAlg
MDT_RegSelCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MDT_RegSelCondAlg.cxx:29
MDT_RegSelCondAlg::m_cablingKey
SG::ReadCondHandleKey< MuonMDT_CablingMap > m_cablingKey
Definition: MDT_RegSelCondAlg.h:29
SG::ReadCondHandle::range
bool range(EventIDRange &r)
Definition: ReadCondHandle.h:224
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
MuonRegSelCondAlg::m_detMgrKey
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_detMgrKey
MuonDetectorManager from the conditions store.
Definition: MuonRegSelCondAlg.h:46
ITkPixEncoding::lut
constexpr auto lut(Generator &&f)
Definition: ITkPixQCoreEncodingLUT.h:19
runBeamSpotCalibration.helper
helper
Definition: runBeamSpotCalibration.py:112
MuonGM::MuonReadoutElement::getSsize
double getSsize() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:196
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
MuonGM::MdtReadoutElement
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h:51
lumiFormat.i
int i
Definition: lumiFormat.py:85
z
#define z
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
MuonGM::MuonReadoutElement::sideC
bool sideC() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:208
MdtIdHelper
Definition: MdtIdHelper.h:61
PixelAthClusterMonAlgCfg.zmax
zmax
Definition: PixelAthClusterMonAlgCfg.py:169
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
IdentifierHash.h
MuonRegSelCondAlg::initialize
virtual StatusCode initialize() override
Definition: MuonRegSelCondAlg.cxx:35
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonDetectorManager.h
Identifier::getString
std::string getString() const
Provide a string form of the identifier - hexadecimal.
Definition: Identifier.cxx:25
MuonGM::MdtReadoutElement::tubePos
Amg::Vector3D tubePos(const Identifier &id) const
Returns the global position of the given tube.
MDT_RegSelCondAlg.h
emacs: this is -*- c++ -*-
python.Logging.manager
manager
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:92
MuonGM::MuonReadoutElement::sideA
bool sideA() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:207
SG::ReadCondHandle::key
const std::string & key() const
Definition: ReadCondHandle.h:59
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
MuonGM::MdtReadoutElement::getNtubesperlayer
int getNtubesperlayer() const
Returns the number of tubes in each tube layer.
MuonStation.h
MDT_RegSelCondAlg::m_condKey
SG::ReadCondHandleKey< MdtCondDbData > m_condKey
Definition: MDT_RegSelCondAlg.h:31
IdContext
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition: IdContext.h:26
MDT_RegSelCondAlg::initialize
virtual StatusCode initialize() override
Definition: MDT_RegSelCondAlg.cxx:38
SG::ReadCondHandle::cptr
const_pointer_type cptr()
Definition: ReadCondHandle.h:67
Identifier
Definition: IdentifierFieldParser.cxx:14