ATLAS Offline Software
Loading...
Searching...
No Matches
LArWheelCalculator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// LArWheelCalculator 19-Apr-2001 Bill Seligman
6// 26-May-2009 AMS: remove all previous comments from here as obsoleted
7
8#include <cmath>
9#include <climits>
10#include <cassert>
11#ifndef PORTABLE_LAR_SHAPE
12#include "GaudiKernel/Bootstrap.h"
13#include "GaudiKernel/ISvcLocator.h"
14#include "GaudiKernel/MsgStream.h"
15#else
17#endif
18
21
24
25
26#include "GeoModelKernel/Units.h"
27
28using namespace GeoModelKernelUnits;
29
30
31// these numbers are taken from DB in constructor,
32// hardcoded values here are just for reference
33/*
34 double LArWheelCalculator::zWheelRefPoint = 3689.5*mm; //=endg_z0
35 double LArWheelCalculator::dMechFocaltoWRP = 3691. *mm; //=endg_z1
36 double LArWheelCalculator::dElecFocaltoWRP = 3689. *mm; //=endg_dcf
37 double LArWheelCalculator::rOuterCutoff = 2034. *mm; //=endg_rlimit
38 double LArWheelCalculator::HalfGapBetweenWheels = 0.15*cm; // In DB EMECGEOMETRY.DCRACK
39 float LArWheelCalculator::m_zShift = 4. *cm; // endg_zshift
40 double LArWheelCalculator::eta_hi = 3.2; // from EmecWheelParameters
41 double LArWheelCalculator::eta_mid = 2.5;
42 double LArWheelCalculator::eta_low = 1.375;
43*/
44
45// these values are taken from "EMECParams" DB
46/*
47 bool LArWheelCalculator::SaggingOn = false;
48 bool LArWheelCalculator::phiRotation = false;
49*/
50
51// these were internal constants, now everything in DB
52//const double LArWheelCalculator::s_dWRPtoFrontFace = 11.*mm;
53//const double LArWheelCalculator::s_WheelThickness = 514.*mm;
54// 2x2mm are to be substracted from value of wheel thickness
55// - for straight 2-mm domains at start and finish of absorber
56//const double LArWheelCalculator::s_StraightStartSection = 2.*mm;
57//const double LArWheelCalculator::s_HalfWheelThickness = s_WheelThickness * 0.5;
58//const double LArWheelCalculator::s_WheelThickness_wo_2sss = s_WheelThickness - 2.*s_StraightStartSection;
59
60static const double default_slant_parametrization[2][5] = {
61 { -50.069, 0.50073, -0.10127E-02, 0.10390E-05, -0.42176E-09 }, // inner
62 { -34.254, 0.15528, -0.11670E-03, 0.45018E-07, -0.68473E-11 } //outer
63};
64
66{
67 switch(type){
68 case LArG4::InnerAbsorberWheel: return("InnerAbsorberWheel");
69 case LArG4::OuterAbsorberWheel: return("OuterAbsorberWheel");
70 case LArG4::InnerElectrodWheel: return("InnerElectrodWheel");
71 case LArG4::OuterElectrodWheel: return("OuterElectrodWheel");
72 case LArG4::InnerAbsorberModule: return("InnerAbsorberModule");
73 case LArG4::OuterAbsorberModule: return("OuterAbsorberModule");
74 case LArG4::InnerElectrodModule: return("InnerElectrodModule");
75 case LArG4::OuterElectrodModule: return("OuterElectrodModule");
76 case LArG4::BackOuterBarretteWheel: return("BackOuterBarretteWheel");
77 case LArG4::BackInnerBarretteWheel: return("BackInnerBarretteWheel");
78 case LArG4::BackOuterBarretteModule: return("BackOuterBarretteModule");
79 case LArG4::BackInnerBarretteModule: return("BackInnerBarretteModule");
80 case LArG4::BackOuterBarretteWheelCalib: return("BackOuterBarretteWheelCalib");
81 case LArG4::BackInnerBarretteWheelCalib: return("BackInnerBarretteWheelCalib");
82 case LArG4::BackOuterBarretteModuleCalib: return("BackOuterBarretteModuleCalib");
83 case LArG4::BackInnerBarretteModuleCalib: return("BackInnerBarretteModuleCalib");
84 case LArG4::InnerGlueWheel: return("InnerGlueWheel");
85 case LArG4::InnerLeadWheel: return("InnerLeadWheel");
86 case LArG4::OuterGlueWheel: return("OuterGlueWheel");
87 case LArG4::OuterLeadWheel: return("OuterLeadWheel");
88 }
89 return("unknown");
90}
91
98
100 m_type(a_wheelType),
101 m_AtlasZside(zside),
104{
105
106#ifndef PORTABLE_LAR_SHAPE
107 // Get pointer to the message service
108 SmartIF<IMessageSvc> msgSvc{Gaudi::svcLocator()->service("MessageSvc")};
109 if(!msgSvc.isValid()){
110 throw std::runtime_error("LArWheelCalculator constructor: cannot initialze message service");
111 }
112 MsgStream msg(msgSvc, "LArWheelCalculator");
113#else
114 PortableMsgStream msg("LArWheelCalculator");
115#endif
116 msg << MSG::VERBOSE << "LArWheelCalculator constructor at " << this
117 << " (type " << LArWheelCalculatorTypeString(m_type)
118 << "):" << endmsg;
119
120
121 msg << MSG::VERBOSE << "LArWheelCalculator constructor at " << this
122 << " (type " << LArWheelCalculatorTypeString(m_type)
123 << "):" << endmsg;
124
125 msg << MSG::VERBOSE << "compiled with new DTNF" << endmsg;
126
127 // Access source of detector parameters.
128 msg << MSG::VERBOSE
129 << "initializing data members from DB..." << endmsg;
130
131 m_zWheelRefPoint =emecData.emecgeometry[0].Z0*cm;
132 m_dMechFocaltoWRP =emecData.emecgeometry[0].Z1*cm;
133 m_dElecFocaltoWRP =emecData.emecgeometry[0].DCF*cm;
134 m_HalfGapBetweenWheels =emecData.emecgeometry[0].DCRACK*cm;
135 m_rOuterCutoff =emecData.emecgeometry[0].RLIMIT*cm;
136 m_zShift =emecData.emecgeometry[0].ZSHIFT*cm;
137
138
139 m_eta_hi =emecData.emecwheelparameters[0].ETAINT;
140 m_eta_mid =emecData.emecwheelparameters[0].ETAEXT;
141 m_eta_low =emecData.emecwheelparameters[1].ETAEXT;
142
143
144
145 m_leadThicknessInner=emecData.emecfan[0].LEADTHICKNESSINNER*mm;
146 m_leadThicknessOuter=emecData.emecfan[0].LEADTHICKNESSOUTER*mm;
147 m_steelThickness=emecData.emecfan[0].STEELTHICKNESS*mm;
148 m_glueThickness=emecData.emecfan[0].GLUETHICKNESS*mm;
149 m_electrodeTotalThickness=emecData.emecfan[0].ELECTRODETOTALTHICKNESS*mm;
150 m_coldContraction=emecData.coldcontraction[0].ABSORBERCONTRACTION;
151 m_electrodeInvContraction=emecData.coldcontraction[0].ELECTRODEINVCONTRACTION;
152
153
154
155 m_ActiveLength =emecData.emecmagicnumbers[0].ACTIVELENGTH*mm;
156 m_StraightStartSection =emecData.emecmagicnumbers[0].STRAIGHTSTARTSECTION*mm;
157 m_dWRPtoFrontFace =emecData.emecmagicnumbers[0].REFTOACTIVE*mm;
158
159
162
163 std::string pr_opt_value=emecData.emecparams[0].PHIROTATION;
164 std::string sagging_opt_value=emecData.emecparams[0].SAGGING;
165
166 m_phiRotation = pr_opt_value == "g3"? true: false;
167
170
171 msg << MSG::DEBUG << "... got these values:" << endmsg
172 << "m_zWheelRefPoint : " << m_zWheelRefPoint / cm << " [cm]" << endmsg
173 << "m_dMechFocaltoWRP : " << m_dMechFocaltoWRP / cm << " [cm]" << endmsg
174 << "m_dElecFocaltoWRP : " << m_dElecFocaltoWRP / cm << " [cm]" << endmsg
175 << "m_HalfGapBetweenWheels : " << m_HalfGapBetweenWheels / cm << " [cm]" << endmsg
176 << "m_rOuterCutoff : " << m_rOuterCutoff / cm << " [cm]" << endmsg
177 << "m_zWheelFrontFace : " << m_zWheelFrontFace / cm << " [cm]" << endmsg
178 << "m_zWheelBackFace : " << m_zWheelBackFace / cm << " [cm]" << endmsg
179 << "m_zShift : " << m_zShift / cm << " [cm]" << endmsg
180 << "Phi rotation : " << (m_phiRotation? "true": "false") << "" << endmsg
181 << "eta wheels limits : " << m_eta_low << ", " << m_eta_mid << ", " << m_eta_hi
182 << endmsg;
183 msg << MSG::VERBOSE << "hardcoded constants: " << endmsg
184 << "m_WheelThickness : " << m_WheelThickness / cm << " [cm]" << endmsg
185 << "m_dWRPtoFrontFace : " << m_dWRPtoFrontFace / cm << " [cm]"
186 << endmsg;
187
188
189 // Constructor initializes the geometry.
190
191 m_isBarrette = false;
192 m_isBarretteCalib = false;
193 m_isModule = false;
194 m_isElectrode = false;
195 m_isInner = false;
196 m_FirstFan = 0;
197 m_LastFan = 0;
198
199 switch(m_type){
201 m_isBarretteCalib = true;
202 /* FALLTHROUGH */
204 m_isBarrette = true;
206 /* FALLTHROUGH */
210 inner_wheel_init(emecData);
213 break;
215 m_isBarretteCalib = true;
216 /* FALLTHROUGH */
218 m_isBarrette = true;
220 /* FALLTHROUGH */
224 outer_wheel_init(emecData);
227 break;
229 inner_wheel_init(emecData);
230 m_ZeroFanPhi = 0;
232 m_isElectrode = true;
233 break;
235 outer_wheel_init(emecData);
236 m_ZeroFanPhi = 0;
238 m_isElectrode = true;
239 break;
241 m_isBarretteCalib = true;
242 /* FALLTHROUGH */
244 m_isBarrette = true;
246 /* FALLTHROUGH */
248 inner_wheel_init(emecData);
249 module_init();
251 // later for all? m_ZeroFanPhi_ForDetNeaFan = m_ZeroFanPhi - m_FanStepOnPhi * 0.5;
252 break;
254 m_isBarretteCalib = true;
255 /* FALLTHROUGH */
257 m_isBarrette = true;
259 /* FALLTHROUGH */
261 outer_wheel_init(emecData);
262 module_init();
264 // later for all? m_ZeroFanPhi_ForDetNeaFan = m_ZeroFanPhi - m_FanStepOnPhi * 0.5;
265 break;
267 inner_wheel_init(emecData);
268 module_init();
269 m_FirstFan ++;
270 m_isElectrode = true;
271 break;
273 outer_wheel_init(emecData);
274 module_init();
275 m_FirstFan ++;
276 m_isElectrode = true;
277 break;
278 default:
279 throw std::runtime_error("LArWheelCalculator constructor:unknown LArWheelCalculator_t");
280 }
285 //m_HalfNumberOfFans = m_NumberOfFans / 2;
287
288 // Init sagging
289 // value read above
290 // std::string sagging_opt_value = (*DB_EMECParams)[0]->getString("SAGGING");
291
292 msg << MSG::VERBOSE << "SAGGING value = " << sagging_opt_value << endmsg;
293
294 // the same condition is in DistanceCalculatorFactory::Create
295 m_SaggingOn = (sagging_opt_value != "" && sagging_opt_value != "off")? true: false;
296
298 sagging_opt_value, this);
299 if (m_SaggingOn) {
300 msg << MSG::VERBOSE << "Creating DistanceCalculatorSaggingOn = " << this
301 << ',' << m_distanceCalcImpl << endmsg;
302 } else {
303 msg << MSG::VERBOSE << "Creating DistanceCalculatorSaggingOff = " << this
304 << ',' << m_distanceCalcImpl << endmsg;
305 }
306
308 m_SaggingOn, m_isModule, this);
309
310 //--------------------------
311 // At this place there was the loading of sagging parameters
312 // Transfered to DistanceCalculatorSaggingOn
313 //--------------------------
314
315 // Get option: Slant params.
316 msg << MSG::VERBOSE << "Loading SlantAngle parameters ...";
317 std::string slant_params;
318
319 if (m_isInner) {
320 slant_params=emecData.emecparams[0].INNERSLANTPARAM;
321 } else {
322 slant_params=emecData.emecparams[0].OUTERSLANTPARAM;
323 }
324
325 msg << (m_isInner?" InnerWheel ":" OuterWheel ") << slant_params << endmsg;
326
327 if(slant_params != "" && slant_params != "default"){
328 double a, b, c, d, e;
329 if(sscanf(slant_params.c_str(), "%80le %80le %80le %80le %80le", &a, &b, &c, &d, &e) != 5){
330 msg << MSG::ERROR
331 << "LArWheelCalculator: ERROR: wrong value(s) "
332 << "for EMEC slant angle parameters: "
333 << slant_params << ", "
334 << "defaults are used" << endmsg;
335 } else {
341 m_slant_use_default = false;
342 }
343 } // else already initialized in inner/outer_wheel_init()
344
345 fill_sincos_parameterization(); // initialize sin&cos parameterization
346
347 msg << MSG::VERBOSE << "All params initialized. Print some internal variables" << endmsg;
348
349 msg << MSG::VERBOSE << "Data members:" << endmsg
350 << "m_AtlasZside = " << m_AtlasZside << "" << endmsg
351 << "m_NumberOfFans = " << m_NumberOfFans << "" << endmsg
352 << "m_ZeroFanPhi = " << m_ZeroFanPhi << "" << endmsg
353 << "m_ZeroFanPhi_ForDetNeaFan = " << m_ZeroFanPhi_ForDetNeaFan << "" << endmsg
354 << "m_FanStepOnPhi = " << m_FanStepOnPhi << "" << endmsg
355 << "m_FanHalfThickness = " << m_FanHalfThickness << "" << endmsg
356 //<< "Sagging parameters : " << m_sagging_parameter[0][0] << " " << m_sagging_parameter[0][1] << "" << endmsg
357 //<< "Sagging parameters : " << m_sagging_parameter[1][0] << " " << m_sagging_parameter[1][1] << "" << endmsg
358 << "slant_params = " << slant_params << "" << endmsg
359 << "Sagging option = " << sagging_opt_value << "" << endmsg
360 << "SaggingOn = " << (m_SaggingOn? "true": "false") << "" << endmsg
361 << "Slant parameters : ";
362 for(int i = 0; i < 5; i ++) msg << " " << m_slant_parametrization[i];
363 msg << endmsg;
364
365 if(m_isModule){
366 msg << MSG::VERBOSE
367 << "module_init: FirstFan = " << m_FirstFan
368 << ", LastFan = " << m_LastFan
369 << ", ZeroFanPhi = " << m_ZeroFanPhi
370 << endmsg;
371 }
372
373 //m_fan_number = -1000;
374
375 // Is the following code fragment obsoleted? DM 2015-03-13
376 /* to compare various methods of slant angle computation:
377 if(isInner) return;
378 FILE *O = fopen("slant_stat.table1.txt", "w");
379 if(O == 0) abort();
380 struct timeval t1, t2;
381 struct timezone tz;
382 std::vector<double> alpha;
383 gettimeofday(&t1, &tz);
384 for(double r = 600.; r < 2100.; r += .01){
385 alpha.push_back(parameterized_slant_angle(r));
386 }
387 gettimeofday(&t2, &tz);
388
389 fprintf(O, "%d.%06d %d.%06d" << endmsg, t1.tv_sec, t1.tv_usec, t2.tv_sec, t2.tv_usec);
390 int i = 0;
391 for(double r = 600.; r < 2100.; r += .01, i ++){
392 fprintf(O, "%f %f\n", r, alpha[i]);
393 }
394
395 fclose(O);
396 exit(0);
397 */
398}
399
400/* converts module gap number into wheel gap number */
402{
403 return m_fanCalcImpl->PhiGapNumberForWheel(i);
404}
405
407{
408 for(int i = 0; i < 5; ++ i) {
410 }
411 m_slant_use_default = true;
412
413 m_NumberOfFans=emecData.emecwheelparameters[0].NABS;
414 m_NumberOfWaves=emecData.emecwheelparameters[0].NACC;
415
416 m_FanFoldRadius = 3.25*mm;
417 m_ZeroGapNumber = 64; // internal constant, should not be taken from DB
419 m_isInner = true;
420}
421
423{
424 for(int i = 0; i < 5; ++ i) {
426 }
427 m_slant_use_default = true;
428
429 m_NumberOfFans=emecData.emecwheelparameters[1].NABS;
430 m_NumberOfWaves=emecData.emecwheelparameters[1].NACC;
431
432
433 m_FanFoldRadius = 3.0*mm;
434 m_ZeroGapNumber = 192; // internal constant, should not be taken from DB
436 m_isInner = false;
437}
438
440{
441
442 switch(t){
449 return (m_leadThicknessInner / 2 + m_steelThickness + m_glueThickness)*m_coldContraction; // new values, 02.11.06 J.T. with contraction in cold
450 // lead / 2 + steel + glue
455
462 return (m_leadThicknessOuter / 2 + m_steelThickness + m_glueThickness)*m_coldContraction; // new values, 02.11.06 J.T.
467
472 return m_electrodeTotalThickness/m_electrodeInvContraction * 0.5; //new values, 02.11.06 J.T
473 }
474 throw std::runtime_error("LArWheelCalculator::GetFanHalfThickness: wrong wheel type");
475}
476
484
485/*
486 array of r is filled with:
487 for inner wheel - 2 elements { r_front, r_back }
488 for outer wheel - 3 elements { r_front, r_middle, r_back }
489 return value - delta_z of middle point in case of outer wheel
490*/
491double LArWheelCalculator::GetWheelInnerRadius(std::array<double,2> & r) const
492{
493 double zMid = 0.;
494 if(m_isInner){
495 double tanThetaInner = 2. * exp(-m_eta_hi ) / (1. - exp(-2.*m_eta_hi ));
496 r[0] = m_zWheelFrontFace * tanThetaInner;
497 r[1] = m_zWheelBackFace * tanThetaInner;
498 }
499 return zMid;
500}
501
502double LArWheelCalculator::GetWheelInnerRadius(std::array<double,3> & r) const
503{
504 double zMid = 0.;
505 if (not m_isInner){
506 double tanThetaMid = 2. * exp(-m_eta_mid) / (1. - exp(-2.*m_eta_mid));
507 double inv_tanThetaOuter = (1. - exp(-2.*m_eta_low)) / (2. * exp(-m_eta_low));
508 // Note that there is a 3mm gap between the outer surface of the
509 // inner wheel and the inner surface of the outer wheel.
510 r[0] = m_zWheelFrontFace * tanThetaMid + m_HalfGapBetweenWheels;
511 r[1] = m_rOuterCutoff * inv_tanThetaOuter * tanThetaMid + m_HalfGapBetweenWheels;
512 r[2] = m_zWheelBackFace * tanThetaMid + m_HalfGapBetweenWheels;
513 zMid = m_rOuterCutoff * inv_tanThetaOuter - m_zWheelFrontFace;
514 }
515 return zMid;
516}
517
518/*
519 array of r is filled with:
520 for inner wheel - 2 elements { r_front, r_back }
521 for outer wheel - 3 elements { r_front, r_middle, r_back }
522*/
523void LArWheelCalculator::GetWheelOuterRadius(std::array<double,2> & r) const
524{
525 if(m_isInner){
526 double tanThetaMid = 2. * exp(-m_eta_mid) / (1. - exp(-2.*m_eta_mid));
527 // Note that there is a 3mm gap between the outer surface of the
528 // inner wheel and the inner surface of the outer wheel.
529 r[0] = m_zWheelFrontFace * tanThetaMid - m_HalfGapBetweenWheels;
530 r[1] = m_zWheelBackFace * tanThetaMid - m_HalfGapBetweenWheels;
531 }
532}
533void LArWheelCalculator::GetWheelOuterRadius(std::array<double,3> & r) const
534{
535 if(not m_isInner){
536 double tanThetaOuter = 2. * exp(-m_eta_low) / (1. - exp(-2.*m_eta_low));
537 r[0] = m_zWheelFrontFace * tanThetaOuter;
538 r[1] = m_rOuterCutoff;
539 r[2] = m_rOuterCutoff;
540 }
541}
#define M_PI
#define endmsg
static Double_t a
static const double default_slant_parametrization[2][5]
static IDistanceCalculator * Create(const std::string &sagging_opt, LArWheelCalculator *lwc)
static IFanCalculator * Create(bool isSaggingOn, bool isModule, LArWheelCalculator *lwc)
double GetFanHalfThickness() const
void outer_wheel_init(const EMECData &)
std::array< double, 5 > m_slant_parametrization
LArWheelCalculator_Impl::IFanCalculator * m_fanCalcImpl
int PhiGapNumberForWheel(int) const
void inner_wheel_init(const EMECData &)
LArG4::LArWheelCalculator_t m_type
LArWheelCalculator(const EMECData &emecData, LArG4::LArWheelCalculator_t a_wheelType, int zside=1)
double GetWheelInnerRadius(std::array< double, 2 > &rInner) const
LArWheelCalculator_Impl::IDistanceCalculator * m_distanceCalcImpl
virtual LArG4::LArWheelCalculator_t type() const
static const char * LArWheelCalculatorTypeString(LArG4::LArWheelCalculator_t)
void fill_sincos_parameterization()
void GetWheelOuterRadius(std::array< double, 2 > &rOuter) const
int r
Definition globals.cxx:22
std::vector< EMECPARAMS > emecparams
Definition EMECData.h:133
std::vector< EMECFAN > emecfan
Definition EMECData.h:137
std::vector< COLDCONTRACTION > coldcontraction
Definition EMECData.h:136
std::vector< EMECGEOMETRY > emecgeometry
Definition EMECData.h:132
std::vector< EMECMAGICNUMBERS > emecmagicnumbers
Definition EMECData.h:135
std::vector< EMECWHEELPARAMETERS > emecwheelparameters
Definition EMECData.h:134
MsgStream & msg
Definition testRead.cxx:32