ATLAS Offline Software
TRT_BarrelDriftTimeData.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // //
7 // Class: TRT_BarrelDriftTimeData //
8 // //
9 // Author: Thomas Kittelmann //
10 // //
11 // First Version: January 2006 //
12 // //
14 
16 #include "CLHEP/Units/SystemOfUnits.h"
17 #include <iostream>
18 #include <cassert>
19 #include <stdexcept>
20 
21 //______________________________________________________________________________
23 
25  // The data made available by Peter Cwetanski by detailed gas simulations //
27 
28  m_strawGas = strawGasType;
29 
30  //----------------------------//
31  // Data for no external field //
32  //----------------------------//
33 
34  m_tabdists_nofield.resize(0); m_tabdrifttime_nofield.resize(0);
35  m_tabdists_maxfield.resize(0); m_tabdrifttime_maxfield.resize(0);
36 
37  if (m_strawGas==0) {
38 
39  //----------------------------//
40  // Data for no external field // Xenon
41  //----------------------------//
42  m_tabdists_nofield.push_back( 15.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back( 0*CLHEP::nanosecond/*at wire*/ );
63  m_tabdists_nofield.push_back( 1034.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(19.7583*CLHEP::nanosecond );
64  m_tabdists_nofield.push_back( 1084.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(20.7302*CLHEP::nanosecond );
66  m_tabdists_nofield.push_back( 1184.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(22.6817*CLHEP::nanosecond );
67  m_tabdists_nofield.push_back( 1234.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(23.6625*CLHEP::nanosecond );
68  m_tabdists_nofield.push_back( 1284.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(24.6182*CLHEP::nanosecond );
69  m_tabdists_nofield.push_back( 1334.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(25.6292*CLHEP::nanosecond );
70  m_tabdists_nofield.push_back( 1384.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(26.6164*CLHEP::nanosecond );
71  m_tabdists_nofield.push_back( 1434.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(27.6115*CLHEP::nanosecond );
72  m_tabdists_nofield.push_back( 1484.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(28.6484*CLHEP::nanosecond );
73  m_tabdists_nofield.push_back( 1534.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(29.6929*CLHEP::nanosecond );
74  m_tabdists_nofield.push_back( 1584.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(30.7602*CLHEP::nanosecond );
75  m_tabdists_nofield.push_back( 1634.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(31.8483*CLHEP::nanosecond );
76  m_tabdists_nofield.push_back( 1684.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(32.9623*CLHEP::nanosecond );
77  m_tabdists_nofield.push_back( 1734.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(34.1029*CLHEP::nanosecond );
78  m_tabdists_nofield.push_back( 1784.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(35.2888*CLHEP::nanosecond );
80  m_tabdists_nofield.push_back( 1884.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(37.7107*CLHEP::nanosecond );
81  m_tabdists_nofield.push_back( 1934.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(38.9861*CLHEP::nanosecond );
82  m_tabdists_nofield.push_back( 1983.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(40.2195*CLHEP::nanosecond );
83  m_tabdists_nofield.push_back( 2000.0*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(40.6041*CLHEP::nanosecond ); //extrapolated
84 
85  //-----------------------------//
86  // Data for max external field // Xenon
87  //-----------------------------//
88  m_tabdists_maxfield.push_back( 15.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back( 0*CLHEP::nanosecond/*at wire*/ );
109  m_tabdists_maxfield.push_back( 1034.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(20.5285*CLHEP::nanosecond );
110  m_tabdists_maxfield.push_back( 1084.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(21.6335*CLHEP::nanosecond );
111  m_tabdists_maxfield.push_back( 1134.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(22.7324*CLHEP::nanosecond );
112  m_tabdists_maxfield.push_back( 1184.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(23.8728*CLHEP::nanosecond );
113  m_tabdists_maxfield.push_back( 1234.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(25.0018*CLHEP::nanosecond );
114  m_tabdists_maxfield.push_back( 1284.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(26.1516*CLHEP::nanosecond );
115  m_tabdists_maxfield.push_back( 1334.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(27.3103*CLHEP::nanosecond );
116  m_tabdists_maxfield.push_back( 1384.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(28.5097*CLHEP::nanosecond );
117  m_tabdists_maxfield.push_back( 1434.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(29.7311*CLHEP::nanosecond );
118  m_tabdists_maxfield.push_back( 1484.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(30.9393*CLHEP::nanosecond );
119  m_tabdists_maxfield.push_back( 1534.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(32.2265*CLHEP::nanosecond );
120  m_tabdists_maxfield.push_back( 1584.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(33.5512*CLHEP::nanosecond );
121  m_tabdists_maxfield.push_back( 1634.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(34.8922*CLHEP::nanosecond );
122  m_tabdists_maxfield.push_back( 1684.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(36.2441*CLHEP::nanosecond );
123  m_tabdists_maxfield.push_back( 1734.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(37.6531*CLHEP::nanosecond );
124  m_tabdists_maxfield.push_back( 1784.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(39.1284*CLHEP::nanosecond );
125  m_tabdists_maxfield.push_back( 1834.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(40.5923*CLHEP::nanosecond );
126  m_tabdists_maxfield.push_back( 1884.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(42.1183*CLHEP::nanosecond );
127  m_tabdists_maxfield.push_back( 1934.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(43.6698*CLHEP::nanosecond );
128  m_tabdists_maxfield.push_back( 1983.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(45.2038*CLHEP::nanosecond );
129  m_tabdists_maxfield.push_back( 2000.0*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(45.7089*CLHEP::nanosecond ); //extrapolated
130 
131  } else if (m_strawGas==1) {
132 
133  //------------------------------------------//
134  // Data for no external field (Kr) //
135  // Scaled to be 20% between Argon and Xenon //
136  // i.e. Kr = (Xe + 4*Ar)/5 //
137  //------------------------------------------//
138  m_tabdists_nofield.push_back(15.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(0*CLHEP::nanosecond);//at wire
179  m_tabdists_nofield.push_back(2000.0*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(31.1641*CLHEP::nanosecond); //extrapolated
180 
181  //------------------------------------------//
182  // Data for max external field (Kr) //
183  // Scaled to be 20% between Argon and Xenon //
184  // i.e. Kr = (Xe + 4*Ar)/5 //
185  //------------------------------------------//
186  m_tabdists_maxfield.push_back(15.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(0*CLHEP::nanosecond); // at wire
227  m_tabdists_maxfield.push_back(2000.0*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(37.9298*CLHEP::nanosecond); //extrapolated
228 
229  } else if (m_strawGas==2) {
230 
231  //----------------------------//
232  // Data for no external field // Argon
233  //----------------------------//
234  m_tabdists_nofield.push_back(15.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(0*CLHEP::nanosecond/*at wire*/ );
275  m_tabdists_nofield.push_back(2000.0*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(28.8041*CLHEP::nanosecond); //extrapolated
276 
277  //-----------------------------//
278  // Data for max external field // Argon
279  //-----------------------------//
280  m_tabdists_maxfield.push_back(15.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(0*CLHEP::nanosecond/*at wire*/ );
321  m_tabdists_maxfield.push_back(2000.0*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(35.9850*CLHEP::nanosecond); //extrapolated
322 
323  } else {
324  std::cout << "FATAL TRT_BarrelDriftTimeData::TRT_BarrelDriftTimeData strawGas ("
325  << m_strawGas << ") must be 0(Xe), 1(Kr) or 2(Ar). The job will die now :(" << std::endl;
326  throw std::runtime_error("TRT_BarrelDriftTimeData: unsupported gas type");
327  }
328 
329  assert(m_tabdists_nofield.size()==m_tabdrifttime_nofield.size());
330  assert(m_tabdists_maxfield.size()==m_tabdrifttime_maxfield.size());
331 
332 }
333 
334 //______________________________________________________________________________
336  return 2.0*CLHEP::tesla;
337 }
338 
339 //______________________________________________________________________________
340 double TRT_BarrelDriftTimeData::DriftTimeAtNoField(const double& dist) const {
341 
342  if (dist <= m_tabdists_nofield.front())
343  return 0.0; //We are inside the wire!
344 
345  unsigned int nTabulated = m_tabdists_nofield.size();
346 
347  // Figure out indices
348  unsigned int indexHigh = nTabulated-1;
349  for (unsigned int testIndex = 0; testIndex < nTabulated-1; testIndex++) {
350  if (m_tabdists_nofield[testIndex] > dist) {
351  indexHigh = testIndex;
352  break;
353  };
354  };
355  unsigned int indexLow = 0;
356  if (indexHigh==0) {
357  std::cout << "TRT_BarrelDriftTimeData::DriftTimeAtNoField::Warning"
358  << " - distance is lower than first tabulated distance" << std::endl;
359  indexLow = 0;
360  indexHigh = 0;
361  } else {
362  indexLow = indexHigh - 1;
363  };
364 
365  // Figure out weights
366  double distLow = m_tabdists_nofield[indexLow];
367  double distHigh = m_tabdists_nofield[indexHigh];
368  double lowDistWeight = 1.0-(dist - distLow)/(distHigh-distLow);
369  double highDistWeight = 1.0-(distHigh - dist)/(distHigh-distLow);
370 
371  // Return interpolated value
372  return lowDistWeight*m_tabdrifttime_nofield[indexLow] + highDistWeight*m_tabdrifttime_nofield[indexHigh];
373 
374 }
375 
376 //______________________________________________________________________________
377 double TRT_BarrelDriftTimeData::DriftTimeAtMaxField(const double& dist) const {
378 
379  if (dist <= m_tabdists_maxfield.front())
380  return 0.0; //We are inside the wire!
381 
382  const unsigned int nTabulated = m_tabdists_maxfield.size();
383 
384  // Figure out indices
385  unsigned int indexHigh = nTabulated-1;
386  for (unsigned int testIndex = 0; testIndex < nTabulated-1; testIndex++) {
387  if (m_tabdists_maxfield[testIndex] > dist) {
388  indexHigh = testIndex;
389  break;
390  };
391  };
392  unsigned int indexLow = 0;
393  if (indexHigh==0) {
394  std::cout << "TRTDT::Warning - distance is lower than first tabulated distance" << std::endl;
395  indexLow = 0;
396  indexHigh = 0;
397  } else {
398  indexLow = indexHigh - 1;
399  };
400 
401  // Figure out weights
402  double distLow = m_tabdists_maxfield[indexLow];
403  double distHigh = m_tabdists_maxfield[indexHigh];
404  double lowDistWeight = 1.0-(dist - distLow)/(distHigh-distLow);
405  double highDistWeight = 1.0-(distHigh - dist)/(distHigh-distLow);
406 
407  // Return interpolated value
408  return lowDistWeight*m_tabdrifttime_maxfield[indexLow] + highDistWeight*m_tabdrifttime_maxfield[indexHigh];
409 
410 }
411 
412 //______________________________________________________________________________
413 // Diffusion code has been remove (June 2015), only represents a spread of a few ns.
414 // That is much smaller than the signal shaping width.
TRT_BarrelDriftTimeData::m_tabdrifttime_maxfield
std::vector< double > m_tabdrifttime_maxfield
Definition: TRT_BarrelDriftTimeData.h:40
python.SystemOfUnits.nanosecond
float nanosecond
Definition: SystemOfUnits.py:134
TRT_BarrelDriftTimeData::m_tabdrifttime_nofield
std::vector< double > m_tabdrifttime_nofield
Definition: TRT_BarrelDriftTimeData.h:38
TRT_BarrelDriftTimeData::MaxTabulatedField
double MaxTabulatedField() const
Definition: TRT_BarrelDriftTimeData.cxx:335
TRT_BarrelDriftTimeData::TRT_BarrelDriftTimeData
TRT_BarrelDriftTimeData(int strawGasType)
Definition: TRT_BarrelDriftTimeData.cxx:22
TRT_BarrelDriftTimeData::DriftTimeAtNoField
double DriftTimeAtNoField(const double &distance) const
Definition: TRT_BarrelDriftTimeData.cxx:340
python.SystemOfUnits.micrometer
float micrometer
Definition: SystemOfUnits.py:80
TRT_BarrelDriftTimeData::m_strawGas
int m_strawGas
Definition: TRT_BarrelDriftTimeData.h:35
TRT_BarrelDriftTimeData::m_tabdists_maxfield
std::vector< double > m_tabdists_maxfield
Definition: TRT_BarrelDriftTimeData.h:39
TRT_BarrelDriftTimeData.h
TRT_BarrelDriftTimeData::DriftTimeAtMaxField
double DriftTimeAtMaxField(const double &distance) const
Definition: TRT_BarrelDriftTimeData.cxx:377
TRT_BarrelDriftTimeData::m_tabdists_nofield
std::vector< double > m_tabdists_nofield
Definition: TRT_BarrelDriftTimeData.h:37
python.SystemOfUnits.tesla
float tesla
Definition: SystemOfUnits.py:248