ATLAS Offline Software
TRT_SimDriftTimeTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // //
7 // Class: TRT_SimDriftTimeTool //
8 // //
9 // Author: Thomas Kittelmann //
10 // //
11 // First Version: January 2006 //
12 // //
14 
15 #include "TRT_SimDriftTimeTool.h"
18 #include "GaudiKernel/MsgStream.h"
19 #include "CLHEP/Units/SystemOfUnits.h"
20 #include "GaudiKernel/ServiceHandle.h"
22 #include <stdexcept>
23 
25  const std::string& name,
26  const IInterface* parent )
27  : AthAlgTool( type, name, parent )
28  , m_minDistance( 0*CLHEP::mm )
29  , m_maxDistance( 2.0001*CLHEP::mm )
30  , m_maxField ( -999 )
31  , m_maxFieldSquaredLimit(999)
32  , m_invMaxFieldSquared(0.0)
33  , m_digversion(0)
34  , m_nTabulatedDistances(4000)//4000 means resolution of 0.5micron and 96KB of memory.
35  , m_invDeltaTabulatedDistances( (m_nTabulatedDistances-1)/(m_maxDistance-m_minDistance) )
36 {
37  // declare my special interface
38  declareInterface<ITRT_SimDriftTimeTool>(this);
39 }
40 
41 //__________________________________________________________________________
43 {
44 
45  ATH_MSG_INFO("Initializing TRT_SimDriftTimeTool.");
46 
49  // Get dig. version through //
50  // the TRT Detector Manager //
53 
54  // Get the TRT Detector Manager
55  const InDetDD::TRT_DetectorManager * detmgr;
56  ATH_CHECK(detStore()->retrieve(detmgr,"TRT"));
57  ATH_MSG_INFO("Retrieved TRT_DetectorManager with version " << detmgr->getVersion().majorNum());
58 
60 
61  if (m_digversion<11)
62  {
63  ATH_MSG_FATAL("digversion < 11 (" << m_digversion << ") is no longer supported. The job will die now :(");
64  return StatusCode::FAILURE;
65  }
66 
69  // Select DriftTime Data //
70  // ( based on dig. version ) //
73 
74  std::vector<std::unique_ptr<ITRT_DriftTimeData>> pDTData;
75  pDTData.emplace_back(std::make_unique<TRT_BarrelDriftTimeData>(m_digversion,0)); // Xe straws
76  pDTData.emplace_back(std::make_unique<TRT_BarrelDriftTimeData>(m_digversion,1)); // Kr straws
77  pDTData.emplace_back(std::make_unique<TRT_BarrelDriftTimeData>(m_digversion,2)); // Ar straws
78 
81  // Make lookup tables of the data //
84 
85  m_maxField = pDTData[0]->MaxTabulatedField();
88 
89  for (auto & i : pDTData)
90  {
91 
92  // Tabulate mean drifttimes at no and max field.
93  // Fill different tables for Xe, Kr and Ar-based gas mixtures
94  std::vector<double> table_of_dist2meanDT_at_noField;
95  std::vector<double> table_of_dist2meanDT_at_maxField;
96 
97  table_of_dist2meanDT_at_noField.resize(m_nTabulatedDistances);
98  table_of_dist2meanDT_at_maxField.resize(m_nTabulatedDistances);
99 
100  for (unsigned int distIndex = 0; distIndex < m_nTabulatedDistances; distIndex++)
101  {
103  if (distIndex == m_nTabulatedDistances-1) distance = m_maxDistance;//to avoid a numerical mistake.
104  table_of_dist2meanDT_at_noField[distIndex] = i->DriftTimeAtNoField(distance);
105  table_of_dist2meanDT_at_maxField[distIndex] = i->DriftTimeAtMaxField(distance);
106  }
107 
108  m_table_of_dist2meanDT_at_noField.push_back(table_of_dist2meanDT_at_noField);
109  m_table_of_dist2meanDT_at_maxField.push_back(table_of_dist2meanDT_at_maxField);
110 
111  }
112 
115 
116  return StatusCode::SUCCESS;
117 
118 }
119 
120 //__________________________________________________________________________
121 // Don't worry; physical checks on "dist" and "effectivefield_squared" are already performed in TRTProcessingOfStraw.cxx
122 double TRT_SimDriftTimeTool::getAverageDriftTime( const double& dist,
123  const double& effectivefield_squared,
124  int strawGasType) const
125 {
126 
127  if (effectivefield_squared>m_maxFieldSquaredLimit)
128  { //a little extrapolation is ok
129  ATH_MSG_WARNING ("Extrapolation from tabulated field values greater than 10% (at "
130  << std::sqrt(effectivefield_squared)/CLHEP::tesla<<" Tesla)");
131  }
132 
133  const unsigned int distIndex(static_cast<int>( m_invDeltaTabulatedDistances*(dist-m_minDistance) ));
134 
135  if ( distIndex >= m_nTabulatedDistances)
136  {
137  ATH_MSG_FATAL("getAverageDriftTime: Somehow distIndex (" << distIndex << " ) is out of bounds ("
138  << m_nTabulatedDistances << "). The job will die now.");
139  throw std::runtime_error("getAverageDriftTime distIndex out of bounds");
140  }
141 
142  const double C(m_table_of_dist2meanDT_at_noField[strawGasType][distIndex]);
143  const double A((m_table_of_dist2meanDT_at_maxField[strawGasType][distIndex] - C) * m_invMaxFieldSquared);
144 
145  return (A * effectivefield_squared) + C;
146 
147 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
TRT_SimDriftTimeTool.h
TRT_SimDriftTimeTool::m_nTabulatedDistances
const unsigned int m_nTabulatedDistances
Definition: TRT_SimDriftTimeTool.h:50
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TRT_DetectorManager.h
DMTest::C
C_v1 C
Definition: C.h:26
TRT_SimDriftTimeTool::m_digversion
unsigned int m_digversion
Definition: TRT_SimDriftTimeTool.h:48
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
dqt_zlumi_alleff_HIST.A
A
Definition: dqt_zlumi_alleff_HIST.py:110
TRT_SimDriftTimeTool::m_maxFieldSquaredLimit
double m_maxFieldSquaredLimit
Definition: TRT_SimDriftTimeTool.h:45
lumiFormat.i
int i
Definition: lumiFormat.py:92
TRT_SimDriftTimeTool::m_maxDistance
const double m_maxDistance
Definition: TRT_SimDriftTimeTool.h:43
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CLHEP
STD'S.
Definition: IAtRndmGenSvc.h:19
InDetDD::InDetDetectorManager::getVersion
const Version & getVersion() const
Get version information.
Definition: InDetDetectorManager.cxx:33
test_pyathena.parent
parent
Definition: test_pyathena.py:15
InDetDD::Version::majorNum
int majorNum() const
Major version number.
Definition: Version.cxx:62
TRT_SimDriftTimeTool::m_table_of_dist2meanDT_at_noField
std::vector< std::vector< double > > m_table_of_dist2meanDT_at_noField
Definition: TRT_SimDriftTimeTool.h:53
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TRT_SimDriftTimeTool::TRT_SimDriftTimeTool
TRT_SimDriftTimeTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: TRT_SimDriftTimeTool.cxx:24
TRT_BarrelDriftTimeData.h
TRT_SimDriftTimeTool::m_invMaxFieldSquared
double m_invMaxFieldSquared
Definition: TRT_SimDriftTimeTool.h:46
TRT_SimDriftTimeTool::m_table_of_dist2meanDT_at_maxField
std::vector< std::vector< double > > m_table_of_dist2meanDT_at_maxField
Definition: TRT_SimDriftTimeTool.h:54
TRT_SimDriftTimeTool::m_invDeltaTabulatedDistances
const double m_invDeltaTabulatedDistances
Definition: TRT_SimDriftTimeTool.h:51
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
TRT_SimDriftTimeTool::getAverageDriftTime
virtual double getAverageDriftTime(const double &distIndex, const double &effectivefield_squared, int strawGasType) const
Definition: TRT_SimDriftTimeTool.cxx:122
python.SystemOfUnits.tesla
int tesla
Definition: SystemOfUnits.py:228
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
TRT_SimDriftTimeTool::initialize
virtual StatusCode initialize()
Definition: TRT_SimDriftTimeTool.cxx:42
TRT_SimDriftTimeTool::m_maxField
double m_maxField
Definition: TRT_SimDriftTimeTool.h:44
InDetDD::TRT_DetectorManager
The Detector Manager for all TRT Detector elements, it acts as the interface to the detector elements...
Definition: TRT_DetectorManager.h:69
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
InDetDD::TRT_DetectorManager::digitizationVersion
unsigned int digitizationVersion() const
Get and set information about digitization version ---------------------—.
Definition: TRT_DetectorManager.cxx:225
TRT_ScaledDriftTimeData.h
AthAlgTool
Definition: AthAlgTool.h:26
TRT_SimDriftTimeTool::m_minDistance
const double m_minDistance
Definition: TRT_SimDriftTimeTool.h:42
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54