ATLAS Offline Software
Loading...
Searching...
No Matches
MDT_RegSelCondAlg.cxx
Go to the documentation of this file.
1
13
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
29MDT_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
40 ATH_CHECK(m_cablingKey.initialize());
41 ATH_CHECK(m_condKey.initialize(!m_condKey.empty()));
42 return StatusCode::SUCCESS;
43}
44
45
46
47
48std::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
#define M_PI
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
emacs: this is -*- c++ -*-
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition IdContext.h:26
This is a "hash" representation of an Identifier.
std::string getString() const
Provide a string form of the identifier - hexadecimal.
SG::ReadCondHandleKey< MdtCondDbData > m_condKey
MDT_RegSelCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadCondHandleKey< MuonMDT_CablingMap > m_cablingKey
virtual StatusCode initialize() override
std::unique_ptr< RegSelSiLUT > createTable(const EventContext &ctx, EventIDRange &id_range) const override
bool isGood(const Identifier &Id) const
Returns if the identifier (tube/multiLayer/chamber) is masked in the conditions database.
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 getNtubesperlayer() const
Returns the number of tubes in each tube layer.
double tubePitch() const
Returns the distance between 2 tubes in a tube layer.
bool barrel() const
Returns whether the chamber is in the barrel (Assement on first later in stationName)
double tubeLength(const int tubeLayer, const int tube) const
virtual StatusCode initialize() override
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_detMgrKey
MuonDetectorManager from the conditions store.
MuonRegSelCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
bool range(EventIDRange &r)
const std::string & key() const
const_pointer_type cptr()
Eigen::Matrix< double, 3, 1 > Vector3D