ATLAS Offline Software
Loading...
Searching...
No Matches
LArWheelCalculator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 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#ifdef LARWC_DTNF_NEW
126 msg << MSG::VERBOSE << "compiled with new DTNF" << endmsg;
127#endif
128
129 // Access source of detector parameters.
130 msg << MSG::VERBOSE
131 << "initializing data members from DB..." << endmsg;
132
133 m_zWheelRefPoint =emecData.emecgeometry[0].Z0*cm;
134 m_dMechFocaltoWRP =emecData.emecgeometry[0].Z1*cm;
135 m_dElecFocaltoWRP =emecData.emecgeometry[0].DCF*cm;
136 m_HalfGapBetweenWheels =emecData.emecgeometry[0].DCRACK*cm;
137 m_rOuterCutoff =emecData.emecgeometry[0].RLIMIT*cm;
138 m_zShift =emecData.emecgeometry[0].ZSHIFT*cm;
139
140
141 m_eta_hi =emecData.emecwheelparameters[0].ETAINT;
142 m_eta_mid =emecData.emecwheelparameters[0].ETAEXT;
143 m_eta_low =emecData.emecwheelparameters[1].ETAEXT;
144
145
146
147 m_leadThicknessInner=emecData.emecfan[0].LEADTHICKNESSINNER*mm;
148 m_leadThicknessOuter=emecData.emecfan[0].LEADTHICKNESSOUTER*mm;
149 m_steelThickness=emecData.emecfan[0].STEELTHICKNESS*mm;
150 m_glueThickness=emecData.emecfan[0].GLUETHICKNESS*mm;
151 m_electrodeTotalThickness=emecData.emecfan[0].ELECTRODETOTALTHICKNESS*mm;
152 m_coldContraction=emecData.coldcontraction[0].ABSORBERCONTRACTION;
153 m_electrodeInvContraction=emecData.coldcontraction[0].ELECTRODEINVCONTRACTION;
154
155
156
157 m_ActiveLength =emecData.emecmagicnumbers[0].ACTIVELENGTH*mm;
158 m_StraightStartSection =emecData.emecmagicnumbers[0].STRAIGHTSTARTSECTION*mm;
159 m_dWRPtoFrontFace =emecData.emecmagicnumbers[0].REFTOACTIVE*mm;
160
161
164
165 std::string pr_opt_value=emecData.emecparams[0].PHIROTATION;
166 std::string sagging_opt_value=emecData.emecparams[0].SAGGING;
167
168 m_phiRotation = pr_opt_value == "g3"? true: false;
169
172
173 msg << MSG::DEBUG << "... got these values:" << endmsg
174 << "m_zWheelRefPoint : " << m_zWheelRefPoint / cm << " [cm]" << endmsg
175 << "m_dMechFocaltoWRP : " << m_dMechFocaltoWRP / cm << " [cm]" << endmsg
176 << "m_dElecFocaltoWRP : " << m_dElecFocaltoWRP / cm << " [cm]" << endmsg
177 << "m_HalfGapBetweenWheels : " << m_HalfGapBetweenWheels / cm << " [cm]" << endmsg
178 << "m_rOuterCutoff : " << m_rOuterCutoff / cm << " [cm]" << endmsg
179 << "m_zWheelFrontFace : " << m_zWheelFrontFace / cm << " [cm]" << endmsg
180 << "m_zWheelBackFace : " << m_zWheelBackFace / cm << " [cm]" << endmsg
181 << "m_zShift : " << m_zShift / cm << " [cm]" << endmsg
182 << "Phi rotation : " << (m_phiRotation? "true": "false") << "" << endmsg
183 << "eta wheels limits : " << m_eta_low << ", " << m_eta_mid << ", " << m_eta_hi
184 << endmsg;
185 msg << MSG::VERBOSE << "hardcoded constants: " << endmsg
186 << "m_WheelThickness : " << m_WheelThickness / cm << " [cm]" << endmsg
187 << "m_dWRPtoFrontFace : " << m_dWRPtoFrontFace / cm << " [cm]"
188 << endmsg;
189
190
191 // Constructor initializes the geometry.
192
193 m_isBarrette = false;
194 m_isBarretteCalib = false;
195 m_isModule = false;
196 m_isElectrode = false;
197 m_isInner = false;
198 m_FirstFan = 0;
199 m_LastFan = 0;
200
201 switch(m_type){
203 m_isBarretteCalib = true;
204 /* FALLTHROUGH */
206 m_isBarrette = true;
208 /* FALLTHROUGH */
212 inner_wheel_init(emecData);
215 break;
217 m_isBarretteCalib = true;
218 /* FALLTHROUGH */
220 m_isBarrette = true;
222 /* FALLTHROUGH */
226 outer_wheel_init(emecData);
229 break;
231 inner_wheel_init(emecData);
232 m_ZeroFanPhi = 0;
234 m_isElectrode = true;
235 break;
237 outer_wheel_init(emecData);
238 m_ZeroFanPhi = 0;
240 m_isElectrode = true;
241 break;
243 m_isBarretteCalib = true;
244 /* FALLTHROUGH */
246 m_isBarrette = true;
248 /* FALLTHROUGH */
250 inner_wheel_init(emecData);
251 module_init();
253 // later for all? m_ZeroFanPhi_ForDetNeaFan = m_ZeroFanPhi - m_FanStepOnPhi * 0.5;
254 break;
256 m_isBarretteCalib = true;
257 /* FALLTHROUGH */
259 m_isBarrette = true;
261 /* FALLTHROUGH */
263 outer_wheel_init(emecData);
264 module_init();
266 // later for all? m_ZeroFanPhi_ForDetNeaFan = m_ZeroFanPhi - m_FanStepOnPhi * 0.5;
267 break;
269 inner_wheel_init(emecData);
270 module_init();
271 m_FirstFan ++;
272 m_isElectrode = true;
273 break;
275 outer_wheel_init(emecData);
276 module_init();
277 m_FirstFan ++;
278 m_isElectrode = true;
279 break;
280 default:
281 throw std::runtime_error("LArWheelCalculator constructor:unknown LArWheelCalculator_t");
282 }
287 //m_HalfNumberOfFans = m_NumberOfFans / 2;
289
290 // Init sagging
291 // value read above
292 // std::string sagging_opt_value = (*DB_EMECParams)[0]->getString("SAGGING");
293
294 msg << MSG::VERBOSE << "SAGGING value = " << sagging_opt_value << endmsg;
295
296 // the same condition is in DistanceCalculatorFactory::Create
297 m_SaggingOn = (sagging_opt_value != "" && sagging_opt_value != "off")? true: false;
298
300 sagging_opt_value, this);
301 if (m_SaggingOn) {
302 msg << MSG::VERBOSE << "Creating DistanceCalculatorSaggingOn = " << this
303 << ',' << m_distanceCalcImpl << endmsg;
304 } else {
305 msg << MSG::VERBOSE << "Creating DistanceCalculatorSaggingOff = " << this
306 << ',' << m_distanceCalcImpl << endmsg;
307 }
308
310 m_SaggingOn, m_isModule, this);
311
312 //--------------------------
313 // At this place there was the loading of sagging parameters
314 // Transfered to DistanceCalculatorSaggingOn
315 //--------------------------
316
317 // Get option: Slant params.
318 msg << MSG::VERBOSE << "Loading SlantAngle parameters ...";
319 std::string slant_params;
320
321 if (m_isInner) {
322 slant_params=emecData.emecparams[0].INNERSLANTPARAM;
323 } else {
324 slant_params=emecData.emecparams[0].OUTERSLANTPARAM;
325 }
326
327 msg << (m_isInner?" InnerWheel ":" OuterWheel ") << slant_params << endmsg;
328
329 if(slant_params != "" && slant_params != "default"){
330 double a, b, c, d, e;
331 if(sscanf(slant_params.c_str(), "%80le %80le %80le %80le %80le", &a, &b, &c, &d, &e) != 5){
332 msg << MSG::ERROR
333 << "LArWheelCalculator: ERROR: wrong value(s) "
334 << "for EMEC slant angle parameters: "
335 << slant_params << ", "
336 << "defaults are used" << endmsg;
337 } else {
343 m_slant_use_default = false;
344 }
345 } // else already initialized in inner/outer_wheel_init()
346
347 fill_sincos_parameterization(); // initialize sin&cos parameterization
348
349 msg << MSG::VERBOSE << "All params initialized. Print some internal variables" << endmsg;
350
351 msg << MSG::VERBOSE << "Data members:" << endmsg
352 << "m_AtlasZside = " << m_AtlasZside << "" << endmsg
353 << "m_NumberOfFans = " << m_NumberOfFans << "" << endmsg
354 << "m_ZeroFanPhi = " << m_ZeroFanPhi << "" << endmsg
355 << "m_ZeroFanPhi_ForDetNeaFan = " << m_ZeroFanPhi_ForDetNeaFan << "" << endmsg
356 << "m_FanStepOnPhi = " << m_FanStepOnPhi << "" << endmsg
357 << "m_FanHalfThickness = " << m_FanHalfThickness << "" << endmsg
358 //<< "Sagging parameters : " << m_sagging_parameter[0][0] << " " << m_sagging_parameter[0][1] << "" << endmsg
359 //<< "Sagging parameters : " << m_sagging_parameter[1][0] << " " << m_sagging_parameter[1][1] << "" << endmsg
360 << "slant_params = " << slant_params << "" << endmsg
361 << "Sagging option = " << sagging_opt_value << "" << endmsg
362 << "SaggingOn = " << (m_SaggingOn? "true": "false") << "" << endmsg
363 << "Slant parameters : ";
364 for(int i = 0; i < 5; i ++) msg << " " << m_slant_parametrization[i];
365 msg << endmsg;
366
367 if(m_isModule){
368 msg << MSG::VERBOSE
369 << "module_init: FirstFan = " << m_FirstFan
370 << ", LastFan = " << m_LastFan
371 << ", ZeroFanPhi = " << m_ZeroFanPhi
372 << endmsg;
373 }
374
375 //m_fan_number = -1000;
376
377 // Is the following code fragment obsoleted? DM 2015-03-13
378 /* to compare various methods of slant angle computation:
379 if(isInner) return;
380 FILE *O = fopen("slant_stat.table1.txt", "w");
381 if(O == 0) abort();
382 struct timeval t1, t2;
383 struct timezone tz;
384 std::vector<double> alpha;
385 gettimeofday(&t1, &tz);
386 for(double r = 600.; r < 2100.; r += .01){
387 alpha.push_back(parameterized_slant_angle(r));
388 }
389 gettimeofday(&t2, &tz);
390
391 fprintf(O, "%d.%06d %d.%06d" << endmsg, t1.tv_sec, t1.tv_usec, t2.tv_sec, t2.tv_usec);
392 int i = 0;
393 for(double r = 600.; r < 2100.; r += .01, i ++){
394 fprintf(O, "%f %f\n", r, alpha[i]);
395 }
396
397 fclose(O);
398 exit(0);
399 */
400}
401
402/* converts module gap number into wheel gap number */
404{
405 return m_fanCalcImpl->PhiGapNumberForWheel(i);
406}
407
409{
410 for(int i = 0; i < 5; ++ i) {
412 }
413 m_slant_use_default = true;
414
415 m_NumberOfFans=emecData.emecwheelparameters[0].NABS;
416 m_NumberOfWaves=emecData.emecwheelparameters[0].NACC;
417
418 m_FanFoldRadius = 3.25*mm;
419 m_ZeroGapNumber = 64; // internal constant, should not be taken from DB
421 m_isInner = true;
422}
423
425{
426 for(int i = 0; i < 5; ++ i) {
428 }
429 m_slant_use_default = true;
430
431 m_NumberOfFans=emecData.emecwheelparameters[1].NABS;
432 m_NumberOfWaves=emecData.emecwheelparameters[1].NACC;
433
434
435 m_FanFoldRadius = 3.0*mm;
436 m_ZeroGapNumber = 192; // internal constant, should not be taken from DB
438 m_isInner = false;
439}
440
442{
443
444 switch(t){
451 return (m_leadThicknessInner / 2 + m_steelThickness + m_glueThickness)*m_coldContraction; // new values, 02.11.06 J.T. with contraction in cold
452 // lead / 2 + steel + glue
457
464 return (m_leadThicknessOuter / 2 + m_steelThickness + m_glueThickness)*m_coldContraction; // new values, 02.11.06 J.T.
469
474 return m_electrodeTotalThickness/m_electrodeInvContraction * 0.5; //new values, 02.11.06 J.T
475 }
476 throw std::runtime_error("LArWheelCalculator::GetFanHalfThickness: wrong wheel type");
477}
478
486
487/*
488 array of r is filled with:
489 for inner wheel - 2 elements { r_front, r_back }
490 for outer wheel - 3 elements { r_front, r_middle, r_back }
491 return value - delta_z of middle point in case of outer wheel
492*/
493double LArWheelCalculator::GetWheelInnerRadius(std::array<double,2> & r) const
494{
495 double zMid = 0.;
496 if(m_isInner){
497 double tanThetaInner = 2. * exp(-m_eta_hi ) / (1. - exp(-2.*m_eta_hi ));
498 r[0] = m_zWheelFrontFace * tanThetaInner;
499 r[1] = m_zWheelBackFace * tanThetaInner;
500 }
501 return zMid;
502}
503
504double LArWheelCalculator::GetWheelInnerRadius(std::array<double,3> & r) const
505{
506 double zMid = 0.;
507 if (not m_isInner){
508 double tanThetaMid = 2. * exp(-m_eta_mid) / (1. - exp(-2.*m_eta_mid));
509 double inv_tanThetaOuter = (1. - exp(-2.*m_eta_low)) / (2. * exp(-m_eta_low));
510 // Note that there is a 3mm gap between the outer surface of the
511 // inner wheel and the inner surface of the outer wheel.
512 r[0] = m_zWheelFrontFace * tanThetaMid + m_HalfGapBetweenWheels;
513 r[1] = m_rOuterCutoff * inv_tanThetaOuter * tanThetaMid + m_HalfGapBetweenWheels;
514 r[2] = m_zWheelBackFace * tanThetaMid + m_HalfGapBetweenWheels;
515 zMid = m_rOuterCutoff * inv_tanThetaOuter - m_zWheelFrontFace;
516 }
517 return zMid;
518}
519
520/*
521 array of r is filled with:
522 for inner wheel - 2 elements { r_front, r_back }
523 for outer wheel - 3 elements { r_front, r_middle, r_back }
524*/
525void LArWheelCalculator::GetWheelOuterRadius(std::array<double,2> & r) const
526{
527 if(m_isInner){
528 double tanThetaMid = 2. * exp(-m_eta_mid) / (1. - exp(-2.*m_eta_mid));
529 // Note that there is a 3mm gap between the outer surface of the
530 // inner wheel and the inner surface of the outer wheel.
531 r[0] = m_zWheelFrontFace * tanThetaMid - m_HalfGapBetweenWheels;
532 r[1] = m_zWheelBackFace * tanThetaMid - m_HalfGapBetweenWheels;
533 }
534}
535void LArWheelCalculator::GetWheelOuterRadius(std::array<double,3> & r) const
536{
537 if(not m_isInner){
538 double tanThetaOuter = 2. * exp(-m_eta_low) / (1. - exp(-2.*m_eta_low));
539 r[0] = m_zWheelFrontFace * tanThetaOuter;
540 r[1] = m_rOuterCutoff;
541 r[2] = m_rOuterCutoff;
542 }
543}
#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