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 // get the element corresponding to multilayer = 1
110 const MuonGM::MdtReadoutElement* mdt1 = manager->getMdtReadoutElement(Id);
111 if (mdt1 == nullptr) {
112 continue;
113 }
114
115 Identifier Id2 = helper->channelID(Id, 2, 1, 1);
116
117 // get the element corresponding to multilayer = 2
118 const MuonGM::MdtReadoutElement* mdt2 = manager->getMdtReadoutElement(Id2);
119
120 double tubePitch = mdt1->tubePitch();
121
122 int ntlay = mdt1->getNLayers();
123 int ntubesl1 = mdt1->getNtubesperlayer();
124 int ntubesl2 = 0;
125
126 if (mdt2 != nullptr) ntubesl2 = mdt2->getNtubesperlayer();
127
128 Identifier Idv[4];
129 Idv[0] = helper->channelID(Id, 1, 1, 1);
130 Idv[1] = helper->channelID(Id, 1, 1, ntubesl1);
131 Idv[2] = helper->channelID(Id, 2, ntlay, 1);
132 Idv[3] = helper->channelID(Id, 2, ntlay, ntubesl2);
133
134 // std::cout<<" Number of tube layers "<<ntlay;
135 // std::cout<<" Number of tubes / layer (1 ,2) "<<ntubesl1<<", "<<ntubesl2;
136
137 double rmin = 99999999.;
138 double rmax = -99999999.;
139 double zmin = 99999999.;
140 double zmax = -99999999.;
141 double emin = 99999999.;
142 double emax = -99999999.;
143 double phimin = 999999.;
144 double phimax = -999999.;
145
146 double zpos21 = 0.;
147 Identifier Idsl = helper->channelID(Id, 1, 2, 1);
148 if (mdt1->barrel()) {
149 zpos21 = (mdt1->tubePos(Idsl)).z()-(mdt1->tubePos(Idv[0])).z();
150 }
151 else {
152 zpos21 = (mdt1->tubePos(Idsl)).perp()-(mdt1->tubePos(Idv[0])).perp();
153 }
154
157 // to a more sensibly named "itr"
158 for (int i=0; i<4; i++) {
159
160 const MuonGM::MdtReadoutElement* mdt = nullptr;
161
162 if ( i<2 ) mdt = mdt1;
163 else mdt = mdt2;
164 if (mdt == nullptr) {
165 // std::cout<<" element not found for index i = "<<i<<" --------- "<<std::endl;
166 if (i==2) {
167 Idv[2] = helper->channelID(Id, 1, ntlay, 1);
168 mdt = manager->getMdtReadoutElement(Idv[2]);
169 }
170 else if (i==3) {
171 Idv[3] = helper->channelID(Id, 1, ntlay, ntubesl1);
172 mdt = manager->getMdtReadoutElement(Idv[3]);
173 }
174 else {
175 // std::cout<<" Skipping element; i = "<<i<<" ----- "<<std::endl;
176 continue;
177 }
178
179 }
180
181 Amg::Vector3D mdtPos = mdt->tubePos(Idv[i]);
182
183 Amg::Vector3D mdtPos1 = mdtPos;
184 Amg::Vector3D mdtPos2 = mdtPos;
185
186 double scaleMin = (mdtPos.perp()-tubePitch/2.)/mdtPos.perp();
187 double scalePlus = (mdtPos.perp()+tubePitch/2.)/mdtPos.perp();
188
189 if (mdt->barrel()) {
190
191 // these are z ranges of the first or last tube layer
192 // mdtPos1.setZ(mdtPos.z()-tubePitch/2.);
193 // mdtPos2.setZ(mdtPos.z()+tubePitch/2.);
194 mdtPos1[2] = mdtPos.z()-tubePitch/2.;
195 mdtPos2[2] = mdtPos.z()+tubePitch/2.;
196
197 // correct the z ranges of the first or last tube layer to account for tube staggering
198 if (zpos21 > 1.) {
199 // mdtPos2.setZ(mdtPos2.z()+tubePitch/2.);
200 mdtPos2[2] = mdtPos2.z()+tubePitch/2.;
201 }
202 else if (zpos21 < -1.) {
203 //mdtPos1.setZ(mdtPos1.z()-tubePitch/2.);
204 mdtPos1[2] = mdtPos1.z()-tubePitch/2.;
205 }
206
207 if (i<2) {
208 mdtPos1[0] *= scaleMin;
209 mdtPos1[1] *= scaleMin;
210 mdtPos2[0] *= scaleMin;
211 mdtPos2[1] *= scaleMin;
212 // mdtPos1.setPerp(mdtPos.perp()-tubePitch/2.);
213 // mdtPos2.setPerp(mdtPos.perp()-tubePitch/2.);
214 }
215 else {
216 mdtPos1[0] *= scalePlus;
217 mdtPos1[1] *= scalePlus;
218 mdtPos2[0] *= scalePlus;
219 mdtPos2[1] *= scalePlus;
220 // mdtPos1.setPerp(mdtPos.perp()+tubePitch/2.);
221 // mdtPos2.setPerp(mdtPos.perp()+tubePitch/2.);
222 }
223 }
224 else {
225
226 // these are z ranges of the first or last tube layer
227 mdtPos1[0] *= scaleMin;
228 mdtPos1[1] *= scaleMin;
229 mdtPos2[0] *= scalePlus;
230 mdtPos2[1] *= scalePlus;
231 // mdtPos1.setPerp(mdtPos.perp()-tubePitch/2.);
232 // mdtPos2.setPerp(mdtPos.perp()+tubePitch/2.);
233 // correct the z ranges of the first or last tube layer to account for tube staggering
234 if (zpos21 > 1.) {
235 scalePlus = (mdtPos2.perp()+tubePitch/2.)/mdtPos2.perp();
236 mdtPos2[0] *= scalePlus;
237 mdtPos2[1] *= scalePlus;
238 // mdtPos2.setPerp(mdtPos2.perp()+tubePitch/2.);
239 }
240 else if (zpos21 < -1.) {
241 scaleMin = (mdtPos1.perp()-tubePitch/2.)/mdtPos1.perp();
242 mdtPos1[0] *= scaleMin;
243 mdtPos1[1] *= scaleMin;
244 // mdtPos1.setPerp(mdtPos1.perp()-tubePitch/2.);
245 }
246 if (i<2) {
247 if (mdt->sideA()){
248 // mdtPos1.setZ(mdtPos.z()-tubePitch/2.);
249 // mdtPos2.setZ(mdtPos.z()-tubePitch/2.);
250 mdtPos1[2] = mdtPos.z()-tubePitch/2.;
251 mdtPos2[2] = mdtPos.z()-tubePitch/2.;
252 }
253 else {
254 // mdtPos1.setZ(mdtPos.z()+tubePitch/2.);
255 // mdtPos2.setZ(mdtPos.z()+tubePitch/2.);
256 mdtPos1[2] = mdtPos.z()+tubePitch/2.;
257 mdtPos2[2] = mdtPos.z()+tubePitch/2.;
258 }
259 }
260 else {
261 if (mdt->sideA()) {
262 // mdtPos1.setZ(mdtPos.z()+tubePitch/2.);
263 // mdtPos2.setZ(mdtPos.z()+tubePitch/2.);
264 mdtPos1[2] = mdtPos.z()+tubePitch/2.;
265 mdtPos2[2] = mdtPos.z()+tubePitch/2.;
266 }
267 else {
268 // mdtPos1.setZ(mdtPos.z()-tubePitch/2.);
269 // mdtPos2.setZ(mdtPos.z()-tubePitch/2.);
270 mdtPos1[2] = mdtPos.z()-tubePitch/2.;
271 mdtPos2[2] = mdtPos.z()-tubePitch/2.;
272 }
273 }
274 }
275
276 double eminMod = 0.;
277 double emaxMod = 0.;
278 double zminMod = 0.;
279 double zmaxMod = 0.;
280 double rminMod = 0.;
281 double rmaxMod = 0.;
282 double dphi = 0.;
283
284 if (mdt->barrel()) {
285 eminMod = mdtPos1.eta();
286 emaxMod = mdtPos2.eta();
287
288 zminMod = mdtPos1.z();
289 zmaxMod = mdtPos2.z();
290
291 rminMod = mdtPos1.perp();
292 rmaxMod = mdtPos2.perp();
293
294 dphi = atan2(mdt->getSsize()/2., (mdtPos.perp()-tubePitch/2.));
295 }
296 else {
297 if (mdt->sideA()) {
298 eminMod = mdtPos2.eta();
299 emaxMod = mdtPos1.eta();
300
301 zminMod = mdtPos2.z();
302 zmaxMod = mdtPos1.z();
303
304 rminMod = mdtPos1.perp();
305 rmaxMod = mdtPos2.perp();
306 }
307 else {
308 eminMod = mdtPos1.eta();
309 emaxMod = mdtPos2.eta();
310
311 zminMod = mdtPos1.z();
312 zmaxMod = mdtPos2.z();
313
314 rminMod = mdtPos1.perp();
315 rmaxMod = mdtPos2.perp();
316 }
317
318 dphi = atan2(mdt->tubeLength(Idv[i])/2., (mdtPos.perp()-tubePitch/2.));
319 }
320
321 double pminMod = mdtPos.phi() - dphi;
322 double pmaxMod = mdtPos.phi() + dphi;
323
324 if (zminMod < zmin) {
325 zmin = zminMod;
326 }
327
328 if (zmaxMod > zmax) {
329 zmax = zmaxMod;
330 }
331
332 if (pminMod < phimin) phimin = pminMod;
333 if (pmaxMod > phimax) phimax = pmaxMod;
334 if (eminMod < emin) emin = eminMod;
335 if (emaxMod > emax) emax = emaxMod;
336 if (rminMod < rmin) rmin = rminMod;
337 if (rmaxMod > rmax) rmax = rmaxMod;
338 // std::cout<<" Module emin - emax "<<emin<<" "<<emax<<" phimin - phimax "<<phimin<<" "<<phimax<<std::endl;
339
340 }
341
342 // here define the eta and phi(0-2*pi) ranges
343 if (phimin<0) phimin = phimin + 2*M_PI;
344 if (phimax<0) phimax = phimax + 2*M_PI;
345
346 // calculate 4 sub detectors for the mdt, fore and aft barrel,
347 // and fore and aft endcaps
348
349 if ( mdt1->barrel() ) {
350 if ( mdt1->sideA() ) detid = 1;
351 else if ( mdt1->sideC() ) detid = -1;
352 }
353 else {
354 if ( mdt1->sideA() ) detid = 2;
355 else if ( mdt1->sideC() ) detid = -2;
356 }
357
358
359 // std::cout << "detid " << detid;
360
361 // if ( mdt1->barrel() ) detid = 0;
362 // if ( mdt1->sideA() ) detid = 1;
363 // if ( mdt1->sideC() ) detid = -1;
364
365 // std::cout << " -> " << detid << std::endl;
366
367 uint32_t RobId = cabling->getROBId(Idhash, msgStream());
368
369 RegSelModule m( zmin, zmax, rmin, rmax, phimin, phimax, layerid, detid, RobId, Idhash );
370
371 lut->addModule( m );
372
373 }
374
375
376 lut->initialise();
377
378 return lut;
379
380}
381
382
383
384
385
386
387
#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