ATLAS Offline Software
Loading...
Searching...
No Matches
MDT_Response.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef MDT_RESPONSE_MDT_RESPONSE_H
6#define MDT_RESPONSE_MDT_RESPONSE_H
7
8#include <vector>
9
11#include "CLHEP/Vector/ThreeVector.h"
12#include "CLHEP/Random/RandPoisson.h"
13#include "CLHEP/Random/RandGaussZiggurat.h"
14#include "CLHEP/Random/RandFlat.h"
15// Add support for CLHEP 1.9 by replacing forward declarations by inclusion
16// of equivalent header file.
17#include "CLHEP/Random/RandomEngine.h"
18
19
21
22 public:
23 typedef std::vector<double> clusterVec;
24
26 MDT_Response(double timewindow, double binsize); // time window in which to look for threshold
28
29 // set segment
30 void SetSegment(double r, double x);
31
32 // set parameters
33 void SetTubeRadius(double radius);
34 void SetClusterDensity(double dens);
35 void SetAttLength(double len);
36 void SetRtMode(unsigned int mode);
37 void SetDifRMS(double rms);
38 void SetTriggerElectron(double el);
39 void SetIntegrationWindow(double win);
40 void SetRtParameters(int npar,double *par);
41
42 // get functions
43 bool GetSignal(CLHEP::HepRandomEngine *rndmEngine); // processes hit, returns true if amplifier passed threshold
44 bool GetSignal(double ParticleCharge,double ParticleGamma,CLHEP::HepRandomEngine *rndmEngine); // processes hit, returns true if amplifier passed threshold
45
46 // acces to amplifier
47 double DriftTime() const;
48 double TThreshold() const;
49 double TFirst() const;
50 double T0() const;
51 double AdcResponse() const;
52 double Charge() const;
53 double V_r(double r);
54 double DoStep(CLHEP::HepRandomEngine *rndmEngine) const;
55 double DampingFactor(double x);
56 double PropagationDelay(double x);
57 double RtoT(double r);
58 double Diffusion(double r, CLHEP::HepRandomEngine *rndmEngine) const;
59 double SigmaDiffusion(double r) const;
60 int GenerateQ(CLHEP::HepRandomEngine *rndmEngine) const;
61
62 const double* RtParameters() const;
63 private:
64 void InitTubeParameters();
65 void InitClusters(double timewindow, double binsize);
66 void InitRt();
67 void InitdEdxTable();
68 void DoStepping(CLHEP::HepRandomEngine *rndmEngine);
69 void DoStepping(double ParticleCharge,double ParticleGamma, CLHEP::HepRandomEngine *rndmEngine);
70 void Reset();
71
72 double m_radius = 0.0; // radius of the tube
73
74 double m_rhit; // radius of the current hit
75 double m_xhit; // position along the tube of the current hit
76 double m_pathLength; // path length of particle in tube
77
78 double m_clusterDensity = 0.0; // clusters per mm
79 std::vector<double> m_gammaFactorVec; // gamma
80 std::vector<double> m_numberOfClustersPerMmVec; // clusters per mm
81
82 double m_attLength = 0.0; // attenuation length of tube
83 double m_signalSpeed = 0.0; // propagation speed along wire
84
85 int m_rtMode = 0; // choose rt mode
86 unsigned int m_rtNpar = 0U;
88
89 double m_difSmearing = 0.0; // width of gaussian smearing
90
91 double m_triggerElectron = 0.0;
92 double m_integrationWindow = 0.0;
93 double m_binsize = 0.0;
94 double m_timeWindow = 0.0;
95 int m_offset = 0;
96 int m_bins = 0;
97
98 Amplifier m_amplifier; // amplifier
99 clusterVec m_clusters; // produced clusters
100
101 double m_t0;
102};
103
104inline
105void MDT_Response::SetSegment(double r, double x)
106{
107 m_rhit = r;
108 m_xhit = x;
109 m_pathLength = sqrt(m_radius*m_radius - r*r);
110 Reset();
111}
112
113inline
114double MDT_Response::DoStep(CLHEP::HepRandomEngine *rndmEngine) const
115{
116 return (-1./m_clusterDensity)*log( CLHEP::RandFlat::shoot(rndmEngine) );
117}
118
119inline
120int MDT_Response::GenerateQ(CLHEP::HepRandomEngine *rndmEngine) const
121{
122 double v = CLHEP::RandFlat::shoot(rndmEngine);
123 double p;
124 if(v<0.08){
125 p = CLHEP::RandPoisson::shoot(rndmEngine,13.);
126 }else if(v<0.28){
127 double v1 = CLHEP::RandFlat::shoot(rndmEngine);
128 p = (1./(v1+1.e-7));
129 }else{
130 p = 1+CLHEP::RandPoisson::shoot(rndmEngine,0.05);
131 }
132 return (int)p;
133}
134
135inline
136double MDT_Response::DampingFactor(double x) { return exp(-1.*x/m_attLength); }
137
138inline
140
141inline
142double MDT_Response::RtoT(double r)
143{
144 int j = m_rtNpar-1;
145 double time = m_rtParameters[j];
146 while(j>0) { --j; time = time*r + m_rtParameters[j]; }
147 return time;
148}
149
150inline
151double MDT_Response::V_r(double r)
152{
153 int j = m_rtNpar-1;
154 double p = m_rtParameters[j];
155 double dp = 0.;
156 while(j>0) {dp = dp*r + p;--j;p=p*r+m_rtParameters[j]; }
157 return 1./dp;
158}
159
160inline
161double MDT_Response::Diffusion(double r, CLHEP::HepRandomEngine *rndmEngine) const
162{
163 // Smearing with maximum of three sigma
164 double sigma = SigmaDiffusion(r);
165 double t = CLHEP::RandGaussZiggurat::shoot(rndmEngine,0.,sigma);
166 if(fabs(t) > 3*sigma) {
167 t = Diffusion(r, rndmEngine);
168 }
169 return t;
170}
171
172inline
173double MDT_Response::SigmaDiffusion(double r) const
174{
175 return m_difSmearing*r/m_radius;
176}
177
178// access to amplifier response
179inline double MDT_Response::DriftTime() const
180{ return m_t0 + m_amplifier.TThreshold() - m_offset*m_binsize; }
181
182inline double MDT_Response::TThreshold() const
183{ return m_amplifier.TThreshold() - m_offset*m_binsize; }
184
185inline double MDT_Response::TFirst() const
186{ return m_amplifier.TFirst(); }
187
188inline double MDT_Response::T0() const
189{ return m_t0; }
190
191inline double MDT_Response::AdcResponse() const
192{ return m_amplifier.AdcResponse(); }
193
194inline double MDT_Response::Charge() const
195{ return m_amplifier.Charge(); }
196
197inline void MDT_Response::SetTubeRadius(double radius)
198{ m_radius = radius ; }
199
200
201inline void MDT_Response::SetClusterDensity(double dens)
202{ m_clusterDensity = dens ; }
203
204inline void MDT_Response::SetAttLength(double len)
205{ m_attLength = len ; }
206
207inline void MDT_Response::SetRtMode(unsigned int mode)
208{ m_rtMode = mode; InitRt(); }
209
212
213inline void MDT_Response::SetTriggerElectron(double el)
214{ m_triggerElectron = el; m_amplifier.SetTriggerElectron(el); }
215
217{ m_integrationWindow = win; m_amplifier.SetIntegrationWindow(win); }
218
219inline void MDT_Response::SetRtParameters(int npar,double *par)
220{
221 m_rtNpar = npar;
223 m_rtParameters = new double[m_rtNpar];
224 for(unsigned int i=0;i<m_rtNpar;++i)
225 m_rtParameters[i] = par[i];
226}
227inline const double* MDT_Response::RtParameters() const
228{
229 return m_rtParameters;
230}
231
232#endif
#define x
void SetDifRMS(double rms)
double DoStep(CLHEP::HepRandomEngine *rndmEngine) const
double T0() const
void InitTubeParameters()
unsigned int m_rtNpar
clusterVec m_clusters
void SetRtMode(unsigned int mode)
double DampingFactor(double x)
void SetSegment(double r, double x)
double TThreshold() const
double m_attLength
double m_triggerElectron
double m_difSmearing
double Diffusion(double r, CLHEP::HepRandomEngine *rndmEngine) const
double m_radius
void InitdEdxTable()
double Charge() const
double PropagationDelay(double x)
double m_clusterDensity
double V_r(double r)
int GenerateQ(CLHEP::HepRandomEngine *rndmEngine) const
void SetAttLength(double len)
const double * RtParameters() const
double m_binsize
double SigmaDiffusion(double r) const
double AdcResponse() const
double m_integrationWindow
double RtoT(double r)
void SetClusterDensity(double dens)
void InitClusters(double timewindow, double binsize)
double m_pathLength
double DriftTime() const
Amplifier m_amplifier
bool GetSignal(CLHEP::HepRandomEngine *rndmEngine)
std::vector< double > m_gammaFactorVec
void SetTubeRadius(double radius)
std::vector< double > clusterVec
void SetTriggerElectron(double el)
double TFirst() const
double m_timeWindow
void SetRtParameters(int npar, double *par)
void DoStepping(CLHEP::HepRandomEngine *rndmEngine)
void SetIntegrationWindow(double win)
std::vector< double > m_numberOfClustersPerMmVec
double * m_rtParameters
double m_signalSpeed
int r
Definition globals.cxx:22