ATLAS Offline Software
TRT_BarrelDriftTimeData.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2019 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 //______________________________________________________________________________
22 TRT_BarrelDriftTimeData::TRT_BarrelDriftTimeData(unsigned int digversion, int strawGasType) {
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 (digversion<11) {
38  std::cout << "FATAL TRT_BarrelDriftTimeData::TRT_BarrelDriftTimeData digversion < 11 ("
39  << digversion << ") is no longer supported. The job will die now :(" << std::endl;
40  throw std::runtime_error("TRT_BarrelDriftTimeData: unsupported digversion");
41  }
42 
43  if (m_strawGas==0) {
44 
45  //----------------------------//
46  // Data for no external field // Xenon
47  //----------------------------//
48  m_tabdists_nofield.push_back( 15.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back( 0*CLHEP::nanosecond/*at wire*/ );
69  m_tabdists_nofield.push_back( 1034.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(19.7583*CLHEP::nanosecond );
70  m_tabdists_nofield.push_back( 1084.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(20.7302*CLHEP::nanosecond );
72  m_tabdists_nofield.push_back( 1184.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(22.6817*CLHEP::nanosecond );
73  m_tabdists_nofield.push_back( 1234.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(23.6625*CLHEP::nanosecond );
74  m_tabdists_nofield.push_back( 1284.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(24.6182*CLHEP::nanosecond );
75  m_tabdists_nofield.push_back( 1334.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(25.6292*CLHEP::nanosecond );
76  m_tabdists_nofield.push_back( 1384.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(26.6164*CLHEP::nanosecond );
77  m_tabdists_nofield.push_back( 1434.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(27.6115*CLHEP::nanosecond );
78  m_tabdists_nofield.push_back( 1484.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(28.6484*CLHEP::nanosecond );
79  m_tabdists_nofield.push_back( 1534.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(29.6929*CLHEP::nanosecond );
80  m_tabdists_nofield.push_back( 1584.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(30.7602*CLHEP::nanosecond );
81  m_tabdists_nofield.push_back( 1634.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(31.8483*CLHEP::nanosecond );
82  m_tabdists_nofield.push_back( 1684.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(32.9623*CLHEP::nanosecond );
83  m_tabdists_nofield.push_back( 1734.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(34.1029*CLHEP::nanosecond );
84  m_tabdists_nofield.push_back( 1784.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(35.2888*CLHEP::nanosecond );
86  m_tabdists_nofield.push_back( 1884.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(37.7107*CLHEP::nanosecond );
87  m_tabdists_nofield.push_back( 1934.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(38.9861*CLHEP::nanosecond );
88  m_tabdists_nofield.push_back( 1983.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(40.2195*CLHEP::nanosecond );
89  m_tabdists_nofield.push_back( 2000.0*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(40.6041*CLHEP::nanosecond ); //extrapolated
90 
91  //-----------------------------//
92  // Data for max external field // Xenon
93  //-----------------------------//
94  m_tabdists_maxfield.push_back( 15.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back( 0*CLHEP::nanosecond/*at wire*/ );
115  m_tabdists_maxfield.push_back( 1034.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(20.5285*CLHEP::nanosecond );
116  m_tabdists_maxfield.push_back( 1084.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(21.6335*CLHEP::nanosecond );
117  m_tabdists_maxfield.push_back( 1134.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(22.7324*CLHEP::nanosecond );
118  m_tabdists_maxfield.push_back( 1184.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(23.8728*CLHEP::nanosecond );
119  m_tabdists_maxfield.push_back( 1234.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(25.0018*CLHEP::nanosecond );
120  m_tabdists_maxfield.push_back( 1284.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(26.1516*CLHEP::nanosecond );
121  m_tabdists_maxfield.push_back( 1334.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(27.3103*CLHEP::nanosecond );
122  m_tabdists_maxfield.push_back( 1384.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(28.5097*CLHEP::nanosecond );
123  m_tabdists_maxfield.push_back( 1434.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(29.7311*CLHEP::nanosecond );
124  m_tabdists_maxfield.push_back( 1484.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(30.9393*CLHEP::nanosecond );
125  m_tabdists_maxfield.push_back( 1534.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(32.2265*CLHEP::nanosecond );
126  m_tabdists_maxfield.push_back( 1584.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(33.5512*CLHEP::nanosecond );
127  m_tabdists_maxfield.push_back( 1634.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(34.8922*CLHEP::nanosecond );
128  m_tabdists_maxfield.push_back( 1684.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(36.2441*CLHEP::nanosecond );
129  m_tabdists_maxfield.push_back( 1734.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(37.6531*CLHEP::nanosecond );
130  m_tabdists_maxfield.push_back( 1784.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(39.1284*CLHEP::nanosecond );
131  m_tabdists_maxfield.push_back( 1834.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(40.5923*CLHEP::nanosecond );
132  m_tabdists_maxfield.push_back( 1884.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(42.1183*CLHEP::nanosecond );
133  m_tabdists_maxfield.push_back( 1934.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(43.6698*CLHEP::nanosecond );
134  m_tabdists_maxfield.push_back( 1983.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(45.2038*CLHEP::nanosecond );
135  m_tabdists_maxfield.push_back( 2000.0*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(45.7089*CLHEP::nanosecond ); //extrapolated
136 
137  } else if (m_strawGas==1) {
138 
139  //------------------------------------------//
140  // Data for no external field (Kr) //
141  // Scaled to be 20% between Argon and Xenon //
142  // i.e. Kr = (Xe + 4*Ar)/5 //
143  //------------------------------------------//
144  m_tabdists_nofield.push_back(15.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(0*CLHEP::nanosecond);//at wire
185  m_tabdists_nofield.push_back(2000.0*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(31.1641*CLHEP::nanosecond); //extrapolated
186 
187  //------------------------------------------//
188  // Data for max external field (Kr) //
189  // Scaled to be 20% between Argon and Xenon //
190  // i.e. Kr = (Xe + 4*Ar)/5 //
191  //------------------------------------------//
192  m_tabdists_maxfield.push_back(15.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(0*CLHEP::nanosecond); // at wire
233  m_tabdists_maxfield.push_back(2000.0*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(37.9298*CLHEP::nanosecond); //extrapolated
234 
235  } else if (m_strawGas==2) {
236 
237  //----------------------------//
238  // Data for no external field // Argon
239  //----------------------------//
240  m_tabdists_nofield.push_back(15.5*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(0*CLHEP::nanosecond/*at wire*/ );
281  m_tabdists_nofield.push_back(2000.0*CLHEP::micrometer); m_tabdrifttime_nofield.push_back(28.8041*CLHEP::nanosecond); //extrapolated
282 
283  //-----------------------------//
284  // Data for max external field // Argon
285  //-----------------------------//
286  m_tabdists_maxfield.push_back(15.5*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(0*CLHEP::nanosecond/*at wire*/ );
327  m_tabdists_maxfield.push_back(2000.0*CLHEP::micrometer); m_tabdrifttime_maxfield.push_back(35.9850*CLHEP::nanosecond); //extrapolated
328 
329  } else {
330  std::cout << "FATAL TRT_BarrelDriftTimeData::TRT_BarrelDriftTimeData strawGas ("
331  << m_strawGas << ") must be 0(Xe), 1(Kr) or 2(Ar). The job will die now :(" << std::endl;
332  throw std::runtime_error("TRT_BarrelDriftTimeData: unsupported gas type");
333  }
334 
335  assert(m_tabdists_nofield.size()==m_tabdrifttime_nofield.size());
336  assert(m_tabdists_maxfield.size()==m_tabdrifttime_maxfield.size());
337 
338 }
339 
340 //______________________________________________________________________________
342  return 2.0*CLHEP::tesla;
343 }
344 
345 //______________________________________________________________________________
346 double TRT_BarrelDriftTimeData::DriftTimeAtNoField(const double& dist) const {
347 
348  if (dist <= m_tabdists_nofield.front())
349  return 0.0; //We are inside the wire!
350 
351  unsigned int nTabulated = m_tabdists_nofield.size();
352 
353  // Figure out indices
354  unsigned int indexHigh = nTabulated-1;
355  for (unsigned int testIndex = 0; testIndex < nTabulated-1; testIndex++) {
356  if (m_tabdists_nofield[testIndex] > dist) {
357  indexHigh = testIndex;
358  break;
359  };
360  };
361  unsigned int indexLow = 0;
362  if (indexHigh==0) {
363  std::cout << "TRT_BarrelDriftTimeData::DriftTimeAtNoField::Warning"
364  << " - distance is lower than first tabulated distance" << std::endl;
365  indexLow = 0;
366  indexHigh = 0;
367  } else {
368  indexLow = indexHigh - 1;
369  };
370 
371  // Figure out weights
372  double distLow = m_tabdists_nofield[indexLow];
373  double distHigh = m_tabdists_nofield[indexHigh];
374  double lowDistWeight = 1.0-(dist - distLow)/(distHigh-distLow);
375  double highDistWeight = 1.0-(distHigh - dist)/(distHigh-distLow);
376 
377  // Return interpolated value
378  return lowDistWeight*m_tabdrifttime_nofield[indexLow] + highDistWeight*m_tabdrifttime_nofield[indexHigh];
379 
380 }
381 
382 //______________________________________________________________________________
383 double TRT_BarrelDriftTimeData::DriftTimeAtMaxField(const double& dist) const {
384 
385  if (dist <= m_tabdists_maxfield.front())
386  return 0.0; //We are inside the wire!
387 
388  const unsigned int nTabulated = m_tabdists_maxfield.size();
389 
390  // Figure out indices
391  unsigned int indexHigh = nTabulated-1;
392  for (unsigned int testIndex = 0; testIndex < nTabulated-1; testIndex++) {
393  if (m_tabdists_maxfield[testIndex] > dist) {
394  indexHigh = testIndex;
395  break;
396  };
397  };
398  unsigned int indexLow = 0;
399  if (indexHigh==0) {
400  std::cout << "TRTDT::Warning - distance is lower than first tabulated distance" << std::endl;
401  indexLow = 0;
402  indexHigh = 0;
403  } else {
404  indexLow = indexHigh - 1;
405  };
406 
407  // Figure out weights
408  double distLow = m_tabdists_maxfield[indexLow];
409  double distHigh = m_tabdists_maxfield[indexHigh];
410  double lowDistWeight = 1.0-(dist - distLow)/(distHigh-distLow);
411  double highDistWeight = 1.0-(distHigh - dist)/(distHigh-distLow);
412 
413  // Return interpolated value
414  return lowDistWeight*m_tabdrifttime_maxfield[indexLow] + highDistWeight*m_tabdrifttime_maxfield[indexHigh];
415 
416 }
417 
418 //______________________________________________________________________________
419 // Diffusion code has been remove (June 2015), only represents a spread of a few ns.
420 // That is much smaller than the signal shaping width.
python.SystemOfUnits.nanosecond
int nanosecond
Definition: SystemOfUnits.py:119
TRT_BarrelDriftTimeData::m_tabdrifttime_maxfield
std::vector< double > m_tabdrifttime_maxfield
Definition: TRT_BarrelDriftTimeData.h:40
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:341
TRT_BarrelDriftTimeData::DriftTimeAtNoField
double DriftTimeAtNoField(const double &distance) const
Definition: TRT_BarrelDriftTimeData.cxx:346
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
python.SystemOfUnits.micrometer
int micrometer
Definition: SystemOfUnits.py:71
TRT_BarrelDriftTimeData.h
TRT_BarrelDriftTimeData::DriftTimeAtMaxField
double DriftTimeAtMaxField(const double &distance) const
Definition: TRT_BarrelDriftTimeData.cxx:383
python.SystemOfUnits.tesla
int tesla
Definition: SystemOfUnits.py:228
TRT_BarrelDriftTimeData::TRT_BarrelDriftTimeData
TRT_BarrelDriftTimeData(unsigned int digversion, int strawGasType)
Definition: TRT_BarrelDriftTimeData.cxx:22
TRT_BarrelDriftTimeData::m_tabdists_nofield
std::vector< double > m_tabdists_nofield
Definition: TRT_BarrelDriftTimeData.h:37