ATLAS Offline Software
CSC_RegSelCondAlg.cxx
Go to the documentation of this file.
1 
15 #include "GaudiKernel/EventIDRange.h"
17 
18 #include "CLHEP/Units/SystemOfUnits.h"
20 
21 #include <iostream>
22 #include <fstream>
23 #include <string>
24 #include <cmath>
25 
28 
32 
33 
34 #include "CSC_RegSelCondAlg.h"
35 
36 
37 CSC_RegSelCondAlg::CSC_RegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator):
38  MuonRegSelCondAlg( name, pSvcLocator )
39 {
40  ATH_MSG_DEBUG( "CSC_RegSelCondAlg::CSC_RegSelCondAlg() " << name );
41 }
42 
43 
44 
45 
46 std::unique_ptr<RegSelSiLUT> CSC_RegSelCondAlg::createTable( const EventContext& ctx, EventIDRange& id_range ) const {
47 
49 
50  if( !manager.range( id_range ) ) {
51  ATH_MSG_ERROR("Failed to retrieve validity range for " << manager.key());
52  return {nullptr};
53  }
54 
55 
57 
58  const CSCcablingSvc* cabling = nullptr;
59 
60  if ( service( "CSCcablingSvc", cabling ).isFailure() ) {
61  ATH_MSG_ERROR( "Could not retrieve CSC cabling for " << name() );
62  return {nullptr};
63  }
64 
65 
66  const CscIdHelper* helper = manager->cscIdHelper();
67 
68  std::vector<Identifier>::const_iterator idfirst = helper->module_begin();
69  std::vector<Identifier>::const_iterator idlast = helper->module_end();
70 
71  const IdContext ModuleContext = helper->module_context();
72 
73  ATH_MSG_DEBUG("createTable()");
74 
75  std::unique_ptr<RegSelSiLUT> lut = std::make_unique<RegSelSiLUT>();
76 
77 
78 
79  for ( std::vector<Identifier>::const_iterator itr=idfirst ; itr!=idlast ; ++itr ) {
80  Identifier Id = *itr;
81  IdentifierHash Idhash;
82 
83  helper->get_hash(Id, Idhash, &ModuleContext);
84 
85  ExpandedIdentifier exp_id;
86  if (helper->get_expanded_id( Id, exp_id, &ModuleContext)) {
87  ATH_MSG_DEBUG("Failed retrieving ExpandedIdentifier for PRD Identifier = " << Id.getString() << ". Skipping to the next PRD.");
88  continue;
89  }
90 
91  int detid = ( exp_id[2]<0 ? -1 : 1 );
92  int layerid = exp_id[1]+1;
93 
94 
95  // retrieve CscReadoutElement
96 
97  Identifier Id2ndLayer;
98  int chamberLayer = 2;
99  const MuonGM::CscReadoutElement *csc = manager->getCscReadoutElement(Id);
100  if (csc == nullptr) {
101 
102  // std::cout << "Csc Readout Element not found for this Id ---- try 2nd layer"<<std::endl;
103  Id2ndLayer = helper->parentID(Id);
104  Id2ndLayer = helper->channelID(Id2ndLayer, chamberLayer, 1, 0, 1);
105  csc = manager->getCscReadoutElement(Id2ndLayer);
106  if (csc == nullptr)
107  {
108  // std::cout << "Csc Readout Element not found for 2nd layer too ---- skip"<<std::endl;
109  continue;
110  }
111  }
112 
113  double eta_min = 99999999.;
114  double eta_max = -99999999.;
115  double phi_min = 999999.;
116  double phi_max = -999999.;
117 
118  double zmin = 999999999;
119  double zmax = -999999999;
120 
121  double rmin = 0;
122  double rmax = 0;
123 
124  double phi_test = 0.;
125  Identifier Id_phi_max;
126  Identifier Id_phi_min;
127  Identifier Id_eta_max;
128  Identifier Id_eta_min;
129 
130  // only use the extreme chamber layers and wirelayers
131 
132  int chlayer_inc = helper->chamberLayerMax(Id)-1;
133  if ( chlayer_inc<1 ) chlayer_inc = 1;
134  for ( int chlayer=1 ; chlayer<=helper->chamberLayerMax(Id) ; chlayer+=chlayer_inc ) {
135 
136 
137  int wlayer_inc = helper->wireLayerMax(Id)-1;
138  if ( wlayer_inc<1 ) wlayer_inc = 1;
139  for ( int wlayer=1 ; wlayer<=helper->wireLayerMax(Id) ; wlayer+=wlayer_inc ){
140 
141  for ( int phis=1 ; phis<=csc->NphiStrips(wlayer) ; phis++ ) {
142 
143 
144  Identifier phis_id = helper->channelID(Id, chlayer, wlayer, 1, phis);
145  Amg::Vector3D phis_x = csc->localStripPos(phis_id);
146  double phis_lenght = csc->stripLength(phis_id);
147 
148  // positions of the strip endpoints
149 
150  Amg::Vector3D phis_x1 = phis_x;
151  Amg::Vector3D phis_x2 = phis_x;
152 
153  //phis_x1.setZ(phis_x.z()-phis_lenght/2.0);
154  //phis_x2.setZ(phis_x.z()+phis_lenght/2.0);
155  phis_x1[2] = phis_x.z()-phis_lenght/2.0;
156  phis_x2[2] = phis_x.z()+phis_lenght/2.0;
157 
158  Amg::Vector3D gphis_x1 = csc->globalPos(phis_x1);
159  Amg::Vector3D gphis_x2 = csc->globalPos(phis_x2);
160 
161  phi_test=gphis_x1.phi();
162  // for detector in (-0.25,0.25) phi interval use +-3,14 phi interval
163  // if(!(aux1==51 && aux3==1))if (phi_test < 0) phi_test += 2.*M_PI;
164  if(exp_id[1]!=51 || exp_id[3]!=1)if (phi_test < 0) phi_test += 2.*M_PI;
165 
166 
167  if ( zmin>gphis_x1.z() ) zmin = gphis_x1.z();
168  if ( zmax<gphis_x1.z() ) zmax = gphis_x1.z();
169 
170  if ( rmin==0 || rmin>gphis_x1.perp() ) rmin = gphis_x1.perp();
171  if ( rmax==0 || rmax<gphis_x1.perp() ) rmax = gphis_x1.perp();
172 
173  if ( zmin>gphis_x2.z() ) zmin = gphis_x2.z();
174  if ( zmax<gphis_x2.z() ) zmax = gphis_x2.z();
175 
176  if ( rmin==0 || rmin>gphis_x2.perp() ) rmin = gphis_x2.perp();
177  if ( rmax==0 || rmax<gphis_x2.perp() ) rmax = gphis_x2.perp();
178 
179  // position of the strip centre
180 
181 
182  Amg::Vector3D gphis_x = csc->globalPos(phis_x);
183 
184  if ( rmin==0 || rmin>gphis_x.perp() ) rmin = gphis_x.perp();
185  if ( rmax==0 || rmax<gphis_x.perp() ) rmax = gphis_x.perp();
186 
187  // phi
188  if(phi_test > phi_max){
189  Id_phi_max=phis_id;
190  phi_max=phi_test;
191  }
192  if(phi_test < phi_min){
193  Id_phi_min=phis_id;
194  phi_min=phi_test;
195  }
196  // eta
197  if(gphis_x1.eta() > eta_max) {
198  Id_eta_max=phis_id;
199  eta_max=gphis_x1.eta();
200  }
201  if(gphis_x1.eta() < eta_min) {
202  Id_eta_min=phis_id;
203  eta_min=gphis_x1.eta();
204  }
205 
206  phi_test=gphis_x2.phi();
207  // for detector in (-0.25,0.25) phi interval use +-3,14 phi interval
208  // if(!(aux1==51 && aux3==1)) if (phi_test < 0) phi_test += 2.*M_PI;
209  if(exp_id[1]!=51 || exp_id[3]!=1) if (phi_test < 0) phi_test += 2.*M_PI;
210 
211  // phi
212  if(phi_test > phi_max) {
213  Id_phi_max=phis_id;
214  phi_max=phi_test;
215  }
216  if(phi_test < phi_min) {
217  Id_phi_min=phis_id;
218  phi_min=phi_test;
219  }
220  // eta
221  if(gphis_x2.eta() > eta_max) {
222  Id_eta_max=phis_id;
223  eta_max=gphis_x2.eta();
224  }
225  if(gphis_x2.eta() < eta_min) {
226  Id_eta_min=phis_id;
227  eta_min=gphis_x2.eta();
228  }
229 
230  }
231 
232  // only use the extreme and middle strips
233 
234  int eta_inc = csc->NetaStrips(wlayer)/2;
235  if ( eta_inc<1 ) eta_inc = 1;
236  for ( int etas=1 ; etas<=csc->NetaStrips(wlayer) ; etas+=eta_inc ) {
237 
238 
239  Identifier etas_id = helper->channelID(Id, chlayer, wlayer, 0, etas);
240  Amg::Vector3D etas_x = csc->localStripPos(etas_id);
241  double etas_lenght = csc->stripLength(etas_id);
242 
243  // strip endpoints
244 
245  Amg::Vector3D etas_x1 = etas_x;
246  Amg::Vector3D etas_x2 = etas_x;
247 
248  //etas_x1.setY(etas_x.y()-etas_lenght/2.0);
249  //etas_x2.setY(etas_x.y()+etas_lenght/2.0);
250  etas_x1[1] = etas_x.y()-etas_lenght/2.0;
251  etas_x2[1] = etas_x.y()+etas_lenght/2.0;
252 
253  Amg::Vector3D getas_x1 = csc->globalPos(etas_x1);
254  Amg::Vector3D getas_x2 = csc->globalPos(etas_x2);
255 
256  if ( zmin>getas_x1.z() ) zmin = getas_x1.z();
257  if ( zmax<getas_x1.z() ) zmax = getas_x1.z();
258 
259  if ( zmin>getas_x2.z() ) zmin = getas_x2.z();
260  if ( zmax<getas_x2.z() ) zmax = getas_x2.z();
261 
262  if ( rmin==0 || rmin>getas_x1.perp() ) rmin = getas_x1.perp();
263  if ( rmax==0 || rmax<getas_x1.perp() ) rmax = getas_x1.perp();
264 
265  if ( rmin==0 || rmin>getas_x2.perp() ) rmin = getas_x2.perp();
266  if ( rmax==0 || rmax<getas_x2.perp() ) rmax = getas_x2.perp();
267 
268  // position of the strip centre
269 
270  Amg::Vector3D getas_x = csc->globalPos(etas_x);
271 
272  if ( rmin==0 || rmin>getas_x.perp() ) rmin = getas_x.perp();
273  if ( rmax==0 || rmax<getas_x.perp() ) rmax = getas_x.perp();
274 
275  phi_test = getas_x1.phi();
276  // for detector in (-0.25,0.25) phi interval use +-3,14 phi interval
277  // if(!(aux1==51 && aux3==1)) if (phi_test < 0) phi_test += 2.*M_PI;
278  if(exp_id[1]!=51 || exp_id[3]!=1) if (phi_test < 0) phi_test += 2.*M_PI;
279  // phi
280  if(phi_test > phi_max){
281  Id_phi_max=etas_id;
282  phi_max=phi_test;
283  }
284  if(phi_test < phi_min){
285  Id_phi_min=etas_id;
286  phi_min=phi_test;
287  }
288  // eta
289  if(getas_x1.eta() > eta_max) {
290  Id_eta_max=etas_id;
291  eta_max=getas_x1.eta();
292  }
293  if(getas_x1.eta() < eta_min) {
294  Id_eta_min=etas_id;
295  eta_min=getas_x1.eta();
296  }
297 
298  phi_test = getas_x2.phi();
299  // for detector in (-0.25,0.25) phi interval use +-3,14 phi interval
300  // if (!(aux1==51 && aux3==1)) if (phi_test < 0) phi_test += 2.*M_PI;
301  if (exp_id[1]!=51 || exp_id[3]!=1) if (phi_test < 0) phi_test += 2.*M_PI;
302  // phi
303  if(phi_test > phi_max){
304  Id_phi_max=etas_id;
305  phi_max=phi_test;
306  }
307  if(phi_test < phi_min){
308  Id_phi_min=etas_id;
309  phi_min=phi_test;
310  }
311  // eta
312  if(getas_x2.eta() > eta_max) {
313  Id_eta_max=etas_id;
314  eta_max=getas_x2.eta();
315  }
316  if(getas_x2.eta() < eta_min) {
317  Id_eta_min=etas_id;
318  eta_min=getas_x2.eta();
319  }
320 
321  }
322  } //gas gaps
323  } // chamber layers
324 
325  // if(aux1==51 && aux3==1)if (phi_min < 0) phi_min += 2.*M_PI;
326  // if(aux1==51 && aux3==1)if (phi_max < 0) phi_max += 2.*M_PI;
327  if(exp_id[1]==51 && exp_id[3]==1) {
328  if (phi_max < 0) phi_max += 2.*M_PI;
329  if (phi_min < 0) phi_min += 2.*M_PI;
330  }
331 
332  uint16_t subDetectorId = (detid == -1) ? 0x6a : 0x69;
333  uint32_t cscrob = 0x0;
334  cabling->hash2Rob(Idhash.value(),cscrob);
335  cscrob = ((subDetectorId << 16) | cscrob);
336  RegSelModule m( zmin, zmax, rmin, rmax, phi_min, phi_max, layerid, detid, cscrob, Idhash );
337  lut->addModule( m );
338 
339 
340  } // modules
341 
342 
343  lut->initialise();
344 
345  return lut;
346 
347 }
348 
349 
350 
351 
352 
353 
354 
MuonRegSelCondAlg
Definition: MuonRegSelCondAlg.h:32
CSC_RegSelCondAlg.h
emacs: this is -*- c++ -*-
RegSelModule
Definition: RegSelModule.h:38
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
PixelAthClusterMonAlgCfg.zmin
zmin
Definition: PixelAthClusterMonAlgCfg.py:176
CSC_RegSelCondAlg::CSC_RegSelCondAlg
CSC_RegSelCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: CSC_RegSelCondAlg.cxx:37
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
M_PI
#define M_PI
Definition: ActiveFraction.h:11
ExpandedIdentifier
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:108
CSC_RegSelCondAlg::createTable
std::unique_ptr< RegSelSiLUT > createTable(const EventContext &ctx, EventIDRange &id_range) const override
Definition: CSC_RegSelCondAlg.cxx:46
MuonGM::CscReadoutElement
Definition: CscReadoutElement.h:56
MuonRegSelCondAlg::m_detMgrKey
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_detMgrKey
MuonDetectorManager from the conditions store.
Definition: MuonRegSelCondAlg.h:46
MuonGM::CscReadoutElement::stripLength
double stripLength(int chamberLayer, int measuresPhi, int stripNumber, double &epsilon) const
Definition: CscReadoutElement.cxx:292
ITkPixEncoding::lut
constexpr auto lut(Generator &&f)
Definition: ITkPixQCoreEncodingLUT.h:19
runBeamSpotCalibration.helper
helper
Definition: runBeamSpotCalibration.py:112
MuonGM::CscReadoutElement::NetaStrips
int NetaStrips(int gasgaplayer) const
Definition: CscReadoutElement.h:316
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
MuonGM::CscReadoutElement::globalPos
Amg::Vector3D globalPos(const Amg::Vector3D &localP) const
station-level method: does not depend on the strip view/layer, hence it cannot account for internal a...
Definition: CscReadoutElement.cxx:460
MuonMDT_CablingMap.h
MuonGM::CscReadoutElement::localStripPos
Amg::Vector3D localStripPos(const Identifier &id) const
takes into account internal alignment parameters, hence gives generally accurate answer (local here i...
Definition: CscReadoutElement.cxx:206
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
WriteCondHandle.h
CSCcablingSvc
Definition: CSCcablingSvc.h:23
CscReadoutElement.h
PixelAthClusterMonAlgCfg.zmax
zmax
Definition: PixelAthClusterMonAlgCfg.py:176
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
IdentifierHash.h
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
CscIdHelper
Definition: CscIdHelper.h:52
IdentifierHash::value
unsigned int value(void) const
python.Logging.manager
manager
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:92
IdentifierHash
Definition: IdentifierHash.h:38
MuonStation.h
IdContext
class IdContext
Definition: IdContext.h:34
MuonGM::CscReadoutElement::NphiStrips
int NphiStrips(int gasgaplayer) const
Definition: CscReadoutElement.h:314
EgEfficiencyCorr_testFixedInput.etas
list etas
Definition: EgEfficiencyCorr_testFixedInput.py:9
CSCcablingSvc.h