CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
CSCDriftSim Class Reference

#include <CSCDriftSim.h>

Public Member Functions

 CSCDriftSim ()
 
CSCDetectorHit getWireHit (const Local3DPoint &ionClusterPosition, const CSCLayer *, int wire, const PSimHit &simHit)
 
void setMagneticField (const MagneticField *field)
 
void setRandomEngine (CLHEP::HepRandomEngine &engine)
 
 ~CSCDriftSim ()
 

Private Member Functions

double avalancheCharge ()
 
double avgDrift () const
 
double avgDriftTimeHighB ()
 
double avgDriftTimeLowB ()
 
double avgPathLengthHighB ()
 
double avgPathLengthLowB ()
 
double driftSigma () const
 
double driftTimeSigmaHighB ()
 
double driftTimeSigmaLowB ()
 
double gasGain (const CSCDetId &id) const
 
double pathSigmaHighB ()
 
double pathSigmaLowB ()
 

Private Attributes

float bz
 
std::vector< double > dNdEIntegral
 
const double ELECTRON_DIFFUSION_COEFF
 
const double STEP_SIZE
 
const MagneticFieldtheMagneticField
 
CLHEP::RandFlat * theRandFlat
 
CLHEP::RandGaussQ * theRandGaussQ
 
double ycell
 
double zcell
 

Detailed Description

Simulate drift of electrons through CSC gas.

Author
Rick Wilkinson

Someday this class will be subclassed into fast and slow sims, Now it's just slow, according to the rest of the ORCA developers...

Last mod:
30-Jun-00 ptc Doxygenate.
Bug-fix in ctor: first bin of integral was 'nan'.
Bug-trap in avalancheCharge(): very rarely could attempt access outside std::vector.

01-08/00 vin use binary search in avalancheCharge()

Definition at line 30 of file CSCDriftSim.h.

Constructor & Destructor Documentation

CSCDriftSim::CSCDriftSim ( )

Definition at line 20 of file CSCDriftSim.cc.

References dNdEIntegral, create_public_lumi_plots::exp, i, N_INTEGRAL_STEPS, funct::pow(), and STEP_SIZE.

21 : bz(0.), // should make these local variables
22  ycell(0.),
23  zcell(0.),
25  STEP_SIZE(0.01),
28  theRandGaussQ(0),
29  theRandFlat(0)
30 {
31  // just initialize avalanche sim. There has to be a better
32  // way to take the integral of a function!
33  double sum = 0.;
34  int i;
35  for(i = 0; i < N_INTEGRAL_STEPS; ++i) {
36  if(i > 1) {
37  double xx = STEP_SIZE * (double(i) - 0.5 );
38  double dNdE = pow( xx, 0.38) * exp(-1.38*xx);
39 
40  sum += dNdE;
41  }
42  // store this value in the map
43  dNdEIntegral[i] = sum;
44  }
45 
46  // now normalize the whole map
47  for(i = 0; i < N_INTEGRAL_STEPS; ++i) {
48  dNdEIntegral[i] /= sum;
49  }
50 }
int i
Definition: DBlmapReader.cc:9
double zcell
Definition: CSCDriftSim.h:65
CLHEP::RandFlat * theRandFlat
Definition: CSCDriftSim.h:75
const MagneticField * theMagneticField
Definition: CSCDriftSim.h:72
const double STEP_SIZE
Definition: CSCDriftSim.h:68
const double ELECTRON_DIFFUSION_COEFF
Definition: CSCDriftSim.h:70
double ycell
Definition: CSCDriftSim.h:65
CLHEP::RandGaussQ * theRandGaussQ
Definition: CSCDriftSim.h:74
static const int N_INTEGRAL_STEPS
Definition: CSCDriftSim.cc:18
std::vector< double > dNdEIntegral
Definition: CSCDriftSim.h:67
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
CSCDriftSim::~CSCDriftSim ( )

Definition at line 53 of file CSCDriftSim.cc.

References theRandFlat, and theRandGaussQ.

54 {
55  delete theRandGaussQ;
56  delete theRandFlat;
57 }
CLHEP::RandFlat * theRandFlat
Definition: CSCDriftSim.h:75
CLHEP::RandGaussQ * theRandGaussQ
Definition: CSCDriftSim.h:74

Member Function Documentation

double CSCDriftSim::avalancheCharge ( )
private

Definition at line 144 of file CSCDriftSim.cc.

References dNdEIntegral, i, LogTrace, AlCaHLTBitMon_ParallelJobs::p, STEP_SIZE, theRandFlat, and x.

Referenced by getWireHit().

144  {
145  double returnVal = 0.;
146  // pick a random value along the dNdE integral
147  double x = theRandFlat->fire();
148  size_t i;
149  size_t isiz = dNdEIntegral.size();
150  /*
151  for(i = 0; i < isiz-1; ++i) {
152  if(dNdEIntegral[i] > x) break;
153  }
154  */
155  // return position of first element with a value >= x
156  std::vector<double>::const_iterator p=lower_bound(dNdEIntegral.begin(),dNdEIntegral.end(),x);
157  if (p==dNdEIntegral.end()) i=isiz-1;
158  else i = p-dNdEIntegral.begin();
159 
160 
161  // now extrapolate between values
162  if( i == isiz-1 ) {
163  //edm::LogInfo("CSCDriftSim") << "Funky integral in CSCDriftSim " << x;
164  returnVal = STEP_SIZE * double(i) * dNdEIntegral[i];
165  }
166  else {
167  double x1 = dNdEIntegral[i];
168  double x2 = dNdEIntegral[i+1];
169  returnVal = STEP_SIZE * (double(i) + (x-x1)/(x2-x1));
170  }
171  LogTrace("CSCDriftSim") << "CSCDriftSim: avalanche fluc " << returnVal << " " << x ;
172 
173  return returnVal;
174 }
int i
Definition: DBlmapReader.cc:9
CLHEP::RandFlat * theRandFlat
Definition: CSCDriftSim.h:75
const double STEP_SIZE
Definition: CSCDriftSim.h:68
#define LogTrace(id)
std::vector< double > dNdEIntegral
Definition: CSCDriftSim.h:67
Definition: DDAxes.h:10
double CSCDriftSim::avgDrift ( ) const
private

Definition at line 8 of file CSCDriftParam.cc.

References bz, and zcell.

Referenced by getWireHit().

8  {
9  /* Initialized data */
10 
11  static const double coeff[6] = { -.08618265,-.0020471805,-7.7771331e-4,
12  -.0058433565,-5.0241491e-4,.0010223353 };
13 
14 
15 /* ! Parameterization of Lorentz drift in CSCs */
16 /* ***********************************************************************
17  * DOC MC_ALL_BDFT *
18  * *
19  * DOC Function : Parameterization of the Lorentz drift of electrons *
20  * DOC in the muon endcap CSCs. *
21  * *
22  * DOC References : None *
23  * *
24  * DOC Arguments : BZ - z componant of the local magnetic *
25  * field in kgauss *
26  * DOC ZCELL - distance from the anode wire in the wire *
27  * plane coordinate normalized to one *
28  * DOC Errors : None *
29  * *
30  * DOC Returns : Drift distance along the anode wire *
31  * *
32  * DOC Created : 15-OCT-1996 Author : Jeff Rowe *
33  * ***********************************************************************
34  */
35 
36 
37 
38 
39  const double x10 = 1.;
40  const double x11 = bz / 40.;
41  const double x12 = x11 * 2. * x11 - x10;
42  const double x13 = x11 * 2. * x12 - x11;
43  const double x14 = x11 * 2. * x13 - x12;
44  const double x15 = x11 * 2. * x14 - x13;
45  const double x16 = x11 * 2. * x15 - x14;
46  const double x17 = x11 * 2. * x16 - x15;
47  const double x18 = x11 * 2. * x17 - x16;
48  const double x19 = x11 * 2. * x18 - x17;
49  const double x20 = 1.;
50  const double x21 = zcell;
51  const double x22 = x21 * 2. * x21 - x20;
52  const double x23 = x21 * 2. * x22 - x21;
53  const double x24 = x21 * 2. * x23 - x22;
54  const double x25 = x21 * 2. * x24 - x23;
55  const double x26 = x21 * 2. * x25 - x24;
56  const double x27 = x21 * 2. * x26 - x25;
57 
58  // not sure why we need a minus sign for avgDrift, but we think the
59  // parametrization has a wrong sign. For the +z endcap, bz should
60  // be negative in local coord, so it should drift to the right
61  // if drifting up (neg zcell), and to the left if it drifts down. It doesn't.
62  // the first-order term here is -0.08 * bz/40 * zcell
63 
64  return -1 * (coeff[0] * x11 * x21 + coeff[1] * x17 * x21 + coeff[2] * x21 +
65  coeff[3] * x11 * x27 + coeff[4] * x22 + coeff[5] * x19);
66 }
double zcell
Definition: CSCDriftSim.h:65
double CSCDriftSim::avgDriftTimeHighB ( )
private

Definition at line 157 of file CSCDriftParamHighB.cc.

References ycell, and zcell.

Referenced by getWireHit().

157  {
158  /* Initialized data */
159 
160  static const double coeff[27] = { 22.384492,10.562894,14.032961,7.06233,
161  3.5523289,-5.0176704,1.999075,1.0635552,-3.2770096,-2.7384958,
162  .98411495,-2.0963696,-1.4006525,-.47542728,.64179451,-.80308436,
163  .42964647,-.4153324,.50423068,.35049792,-.42595896,-.30947641,
164  .16671267,-.21336584,.22979164,.23481052,.32550435 };
165 
166  /* System generated locals */
167  float ret_val;
168 
169  /* Local variables */
170  double x10, x11, x12, x13, x14, x15, x16, x17, x20, x21, x22,
171  x23, x24, x25, x26, x27;
172 
173 /* ! Parameterization of drift time - high field chambers */
174 /* ***********************************************************************
175  */
176 /* DOC MC_BHGH_TIME *
177  */
178 /* *
179 */
180 /* DOC Function : Parameterization of the drift time *
181  */
182 /* DOC in the muon endcap CSCs. *
183  */
184 /* *
185 */
186 /* DOC References : None *
187  */
188 /* *
189 */
190 /* DOC Arguments : YCELL - distance from the anode wire in the *
191  */
192 /* anode-cathode coordinate plane *
193 */
194 /* (ycell=1 > d_acat) *
195 */
196 /* DOC ZCELL - distance from the anode wire in the wire *
197  */
198 /* plane coordinate (zcell=1 > d_anod/2.) *
199 */
200 /* DOC Errors : None *
201  */
202 /* *
203 */
204 /* DOC Returns : Drift time for high field CSC chambers *
205  */
206 /* *
207 */
208 /* DOC Created : 15-OCT-1996 Author : Jeff Rowe *
209  */
210 /* ***********************************************************************
211  */
212 
213 
214  x10 = 1.;
215  x11 = fabs(ycell) * 2. - 1.;
216  x12 = x11 * 2. * x11 - x10;
217  x13 = x11 * 2. * x12 - x11;
218  x14 = x11 * 2. * x13 - x12;
219  x15 = x11 * 2. * x14 - x13;
220  x16 = x11 * 2. * x15 - x14;
221  x17 = x11 * 2. * x16 - x15;
222  x20 = 1.;
223  x21 = fabs(zcell) * 2. - 1.;
224  x22 = x21 * 2. * x21 - x20;
225  x23 = x21 * 2. * x22 - x21;
226  x24 = x21 * 2. * x23 - x22;
227  x25 = x21 * 2. * x24 - x23;
228  x26 = x21 * 2. * x25 - x24;
229  x27 = x21 * 2. * x26 - x25;
230 
231  ret_val = coeff[0] + coeff[1] * x11 + coeff[2] * x21 + coeff[3] * x22 +
232  coeff[4] * x23 + coeff[5] * x11 * x21 + coeff[6] * x24 + coeff[7]
233  * x12 + coeff[8] * x11 * x22 + coeff[9] * x11 * x23 + coeff[10] *
234  x25 + coeff[11] * x11 * x24 + coeff[12] * x11 * x25 + coeff[13] *
235  x13 + coeff[14] * x12 * x21 + coeff[15] * x11 * x26 + coeff[16] *
236  x26 + coeff[17] * x11 * x27 + coeff[18] * x17 * x21 + coeff[19] *
237  x15 * x21 + coeff[20] * x12 * x22 + coeff[21] * x12 * x23 + coeff[
238  22] * x27 + coeff[23] * x14 * x22 + coeff[24] * x16 * x21 + coeff[
239  25] * x17 + coeff[26] * x17 * x22;
240 
241  return ret_val;
242 }
double zcell
Definition: CSCDriftSim.h:65
double ycell
Definition: CSCDriftSim.h:65
double CSCDriftSim::avgDriftTimeLowB ( )
private

Definition at line 155 of file CSCDriftParamLowB.cc.

References ycell, and zcell.

Referenced by getWireHit().

155  {
156  /* Initialized data */
157 
158  static const double coeff[20] = { 42.981588,25.732805,26.539129,16.719016,
159  10.862044,7.4859085,5.0353142,3.3620548,1.9057762,2.2207695,
160  -2.6787582,1.2977292,-.8358091,1.2452612,.74813469,-.57581194,
161  .32705275,-.85426489,-.55688158,-.38384903 };
162 
163  /* System generated locals */
164  float ret_val;
165 
166  /* Local variables */
167  double x10, x11, x12, x13, x14, x20, x21, x22, x23, x24, x25,
168  x26, x27, x28, x29;
169 
170 /* ! Parameterization of drift time - low field chambers */
171 /* ***********************************************************************
172  */
173 /* DOC MC_BLOW_TIME *
174  */
175 /* *
176 */
177 /* DOC Function : Parameterization of the drift time *
178  */
179 /* DOC in the muon endcap CSCs. *
180  */
181 /* *
182 */
183 /* DOC References : None *
184  */
185 /* *
186 */
187 /* DOC Arguments : YCELL - distance from the anode wire in the *
188  */
189 /* anode-cathode coordinate plane *
190 */
191 /* (ycell=1 > d_acat) *
192 */
193 /* DOC ZCELL - distance from the anode wire in the wire *
194  */
195 /* plane coordinate (zcell=1 > d_anod/2.) *
196 */
197 /* DOC Errors : None *
198  */
199 /* *
200 */
201 /* DOC Returns : Drift time for low field CSC chambers *
202  */
203 /* *
204 */
205 /* DOC Created : 15-OCT-1996 Author : Jeff Rowe *
206  */
207 /* ***********************************************************************
208  */
209 
210 
211 
212 
213  x10 = 1.;
214  x11 = fabs(ycell) * 2. - 1.;
215  x12 = x11 * 2. * x11 - x10;
216  x13 = x11 * 2. * x12 - x11;
217  x14 = x11 * 2. * x13 - x12;
218  x20 = 1.;
219  x21 = fabs(zcell) * 2. - 1.;
220  x22 = x21 * 2. * x21 - x20;
221  x23 = x21 * 2. * x22 - x21;
222  x24 = x21 * 2. * x23 - x22;
223  x25 = x21 * 2. * x24 - x23;
224  x26 = x21 * 2. * x25 - x24;
225  x27 = x21 * 2. * x26 - x25;
226  x28 = x21 * 2. * x27 - x26;
227  x29 = x21 * 2. * x28 - x27;
228 
229  ret_val = coeff[0] + coeff[1] * x11 + coeff[2] * x21 + coeff[3] * x22 +
230  coeff[4] * x23 + coeff[5] * x24 + coeff[6] * x25 + coeff[7] * x26
231  + coeff[8] * x12 + coeff[9] * x27 + coeff[10] * x11 * x21 + coeff[
232  11] * x28 + coeff[12] * x13 + coeff[13] * x12 * x21 + coeff[14] *
233  x29 + coeff[15] * x13 * x21 + coeff[16] * x14 + coeff[17] * x11 *
234  x22 + coeff[18] * x11 * x23 + coeff[19] * x11 * x24;
235  return ret_val;
236 }
double zcell
Definition: CSCDriftSim.h:65
double ycell
Definition: CSCDriftSim.h:65
double CSCDriftSim::avgPathLengthHighB ( )
private

Definition at line 4 of file CSCDriftParamHighB.cc.

References ycell, and zcell.

Referenced by getWireHit().

4  {
5  /* Initialized data */
6 
7  static const double coeff[18] = { .16916627,.11057547,.054287448,.01179527,
8  .0062073273,-.013570915,-.0027121772,-.0053792764,-.0027452986,
9  -.0020556715,.0021511659,.0011376412,.0026183373,.0017980602,
10  -.0012975418,-.0010798782,-.0012322628,-8.3635924e-4 };
11 
12  /* Local variables */
13  double x10, x11, x12, x13, x14, x20, x21, x22, x23, x24, x25;
14 
15 /* ! Parameterization of drift path length - high field chambers */
16 /* ***********************************************************************
17  */
18 /* DOC MC_BHGH_SLEN *
19  */
20 /* *
21 */
22 /* DOC Function : Parameterization of the drift path length *
23  */
24 /* DOC in the muon endcap CSCs. *
25  */
26 /* *
27 */
28 /* DOC References : None *
29  */
30 /* *
31 */
32 /* DOC Arguments : YCELL - distance from the anode wire in the *
33  */
34 /* anode-cathode coordinate plane *
35 */
36 /* DOC ZCELL - distance from the anode wire in the wire *
37  */
38 /* plane coordinate *
39 */
40 /* DOC Errors : None *
41  */
42 /* *
43 */
44 /* DOC Returns : Drift path length for high field CSC chambers *
45  */
46 /* *
47 */
48 /* DOC Created : 15-OCT-1996 Author : Jeff Rowe *
49  */
50 /* ***********************************************************************
51  */
52 
53 
54 
55  x10 = 1.;
56  x11 = fabs(ycell) * 2. - 1.;
57  x12 = x11 * 2. * x11 - x10;
58  x13 = x11 * 2. * x12 - x11;
59  x14 = x11 * 2. * x13 - x12;
60  x20 = 1.;
61  x21 = fabs(zcell) * 2. - 1.;
62  x22 = x21 * 2. * x21 - x20;
63  x23 = x21 * 2. * x22 - x21;
64  x24 = x21 * 2. * x23 - x22;
65  x25 = x21 * 2. * x24 - x23;
66 
67  return coeff[0] + coeff[1] * x11 + coeff[2] * x21 + coeff[3] * x22 +
68  coeff[4] * x12 + coeff[5] * x11 * x21 + coeff[6] * x13 + coeff[7]
69  * x12 * x22 + coeff[8] * x12 * x23 + coeff[9] * x11 * x24 + coeff[
70  10] * x12 * x21 + coeff[11] * x14 + coeff[12] * x11 * x22 + coeff[
71  13] * x13 * x22 + coeff[14] * x13 * x21 + coeff[15] * x12 * x24 +
72  coeff[16] * x11 * x25 + coeff[17] * x11 * x23;
73 }
double zcell
Definition: CSCDriftSim.h:65
double ycell
Definition: CSCDriftSim.h:65
double CSCDriftSim::avgPathLengthLowB ( )
private

Definition at line 7 of file CSCDriftParamLowB.cc.

References ycell, and zcell.

Referenced by getWireHit().

7  {
8 
9  static const double coeff[7] = { .28872209,.21705601,.063908389,-.012224924,
10  .012901814,-.0089355058,-.015769145 };
11 
12  // System generated locals
13  float ret_val;
14 
15  // Local variables
16  double x10, x11, x12, x13, x20, x21, x22;
17 
18 /* ! Parameterization of drift path length - low field chambers */
19 /* ***********************************************************************
20  */
21 /* DOC MC_BHGH_SLEN *
22  */
23 /* *
24 */
25 /* DOC Function : Parameterization of the drift path length *
26  */
27 /* DOC in the muon endcap CSCs. *
28  */
29 /* *
30 */
31 /* DOC References : None *
32  */
33 /* *
34 */
35 /* DOC Arguments : YCELL - distance from the anode wire in the *
36  */
37 /* anode-cathode coordinate plane *
38 */
39 /* DOC ZCELL - distance from the anode wire in the wire *
40  */
41 /* plane coordinate *
42 */
43 /* DOC Errors : None *
44  */
45 /* *
46 */
47 /* DOC Returns : Drift path length for low field CSC chambers *
48 */
49 /* *
50 */
51 /* DOC Created : 15-OCT-1996 Author : Jeff Rowe *
52  */
53 /* ***********************************************************************
54  */
55 
56 
57  x10 = 1.;
58  x11 = fabs(ycell) * 2. - 1.;
59  x12 = x11 * 2. * x11 - x10;
60  x13 = x11 * 2. * x12 - x11;
61  x20 = 1.;
62  x21 = fabs(zcell) * 2. - 1.;
63  x22 = x21 * 2. * x21 - x20;
64  ret_val = coeff[0] + coeff[1] * x11 + coeff[2] * x21 + coeff[3] * x12 *
65  x22 + coeff[4] * x22 + coeff[5] * x13 + coeff[6] * x11 * x21;
66  return ret_val;
67 }
double zcell
Definition: CSCDriftSim.h:65
double ycell
Definition: CSCDriftSim.h:65
double CSCDriftSim::driftSigma ( ) const
private

Definition at line 69 of file CSCDriftParam.cc.

References bz, and zcell.

Referenced by getWireHit().

69  {
70  // Initialized data
71 
72  static const double coeff[3] = { .01069525,.010364504,.0021662697 };
73 
74 
75 /* ! Parameterization of Lorentz drift error in CSCs */
76 /*************************************************************************
77  * DOC MC_ALL_BSIG *
78  * *
79  * DOC Function : Parameterization of the dispersion in Lorentz Drift*
80  * DOC in the muon endcap CSCs. *
81  * *
82  * DOC References : None *
83  * *
84  * DOC Arguments : BZ - z componant of the local magnetic *
85  * DOC ZCELL - distance from the anode wire in the wire *
86  * plane coordinate normalized to 1 *
87  * DOC Errors : None *
88  * *
89  * DOC Returns : Dispersion in Lorentz drift along anode wire *
90  * *
91  * DOC Created : 15-OCT-1996 Author : Jeff Rowe *
92  * ***********************************************************************
93  */
94 
95 
96  const double x11 = bz / 40.;
97  const double x20 = 1.;
98  const double x21 = zcell;
99  const double x22 = x21 * 2. * x21 - x20;
100 
101  return coeff[0] + coeff[1] * x11 * x21 + coeff[2] * x22;
102 }
double zcell
Definition: CSCDriftSim.h:65
double CSCDriftSim::driftTimeSigmaHighB ( )
private

Definition at line 245 of file CSCDriftParamHighB.cc.

References ycell, and zcell.

Referenced by getWireHit().

245  {
246  /* Initialized data */
247 
248  static const double coeff[17] = { 5.5533465,3.3733352,3.776603,2.2673355,
249  1.3401485,.84209333,-.71621378,.57572407,-.52313936,-.78790514,
250  -.71786066,.43370011,.29223306,-.37791975,.21121024,.31513644,
251  .25382701 };
252 
253  /* System generated locals */
254  float ret_val;
255 
256  /* Local variables */
257  double x10, x11, x12, x13, x14, x15, x16, x17, x18, /*x19,*/ x20,
258  x21, x22, x23, x24, x25, x26, x27, x28, x29;
259 
260 /* ! Parameterization of drift time dispersion- high field chambers */
261 /* ***********************************************************************
262  */
263 /* DOC MC_BHGH_TSIG *
264  */
265 /* *
266 */
267 /* DOC Function : Parameterization of the drift time dispersion *
268  */
269 /* DOC in the muon endcap CSCs. *
270  */
271 /* *
272 */
273 /* DOC References : None *
274  */
275 /* *
276 */
277 /* DOC Arguments : YCELL - distance from the anode wire in the *
278  */
279 /* anode-cathode coordinate plane *
280 */
281 /* (ycell=1 > d_acat) *
282 */
283 /* DOC ZCELL - distance from the anode wire in the wire *
284  */
285 /* plane coordinate (zcell=1 > d_anod/2.) *
286 */
287 /* DOC Errors : None *
288  */
289 /* *
290 */
291 /* DOC Returns : Drift time dispersion for high field CSC chambers *
292  */
293 /* *
294 */
295 /* DOC Created : 15-OCT-1996 Author : Jeff Rowe *
296  */
297 /* ***********************************************************************
298  */
299 
300 
301 
302  x10 = 1.;
303  x11 = fabs(ycell) * 2. - 1.;
304  x12 = x11 * 2. * x11 - x10;
305  x13 = x11 * 2. * x12 - x11;
306  x14 = x11 * 2. * x13 - x12;
307  x15 = x11 * 2. * x14 - x13;
308  x16 = x11 * 2. * x15 - x14;
309  x17 = x11 * 2. * x16 - x15;
310  x18 = x11 * 2. * x17 - x16;
311  //x19 = x11 * 2. * x18 - x17; //not used later
312  x20 = 1.;
313  x21 = fabs(zcell) * 2. - 1.;
314  x22 = x21 * 2. * x21 - x20;
315  x23 = x21 * 2. * x22 - x21;
316  x24 = x21 * 2. * x23 - x22;
317  x25 = x21 * 2. * x24 - x23;
318  x26 = x21 * 2. * x25 - x24;
319  x27 = x21 * 2. * x26 - x25;
320  x28 = x21 * 2. * x27 - x26;
321  x29 = x21 * 2. * x28 - x27;
322 
323  ret_val = coeff[0] * x21 + coeff[1] + coeff[2] * x22 + coeff[3] * x23 +
324  coeff[4] * x24 + coeff[5] * x25 + coeff[6] * x11 * x23 + coeff[7]
325  * x26 + coeff[8] * x11 * x25 + coeff[9] * x11 * x24 + coeff[10] *
326  x11 * x22 + coeff[11] * x27 + coeff[12] * x28 + coeff[13] * x11 *
327  x26 + coeff[14] * x29 + coeff[15] * x16 * x21 + coeff[16] * x18 *
328  x21;
329 
330  return ret_val;
331 }
double zcell
Definition: CSCDriftSim.h:65
double ycell
Definition: CSCDriftSim.h:65
double CSCDriftSim::driftTimeSigmaLowB ( )
private

Definition at line 239 of file CSCDriftParamLowB.cc.

References ycell, and zcell.

Referenced by getWireHit().

239  {
240  /* Initialized data */
241 
242  static const double coeff[19] = { 6.2681223,3.5916437,5.5425809,4.6974052,
243  3.8472392,3.1019155,2.4323913,1.8695623,1.3909068,.99056625,
244  .52066638,.64671229,.68023389,.40512251,.40202738,.23908531,
245  -.41245784,-.32196924,-.29890696 };
246 
247  /* Local variables */
248  double /*x10,*/ x11, x20, x21, x22, x23, x24, x25, x26, x27, x28,
249  x29, x210, x211, x212;
250 
251 /* ! Parameterization of drift time dispersion- low field chambers */
252 /* ***********************************************************************
253  */
254 /* DOC MC_BHGH_TSIG *
255  */
256 /* *
257 */
258 /* DOC Function : Parameterization of the drift time dispersion *
259  */
260 /* DOC in the muon endcap CSCs. *
261  */
262 /* *
263 */
264 /* DOC References : None *
265  */
266 /* *
267 */
268 /* DOC Arguments : YCELL - distance from the anode wire in the *
269  */
270 /* anode-cathode coordinate plane *
271 */
272 /* (ycell=1 > d_acat) *
273 */
274 /* DOC ZCELL - distance from the anode wire in the wire *
275  */
276 /* plane coordinate (zcell=1 > d_anod/2.) *
277 */
278 /* DOC Errors : None *
279  */
280 /* *
281 */
282 /* DOC Returns : Drift time dispersion for low field CSC chambers *
283  */
284 /* *
285 */
286 /* DOC Created : 15-OCT-1996 Author : Jeff Rowe *
287  */
288 /* ***********************************************************************
289  */
290 
291 
292 
293  //x10 = 1.; //not used
294  x11 = fabs(ycell) * 2. - 1.;
295  x20 = 1.;
296  x21 = fabs(zcell) * 2. - 1.;
297  x22 = x21 * 2. * x21 - x20;
298  x23 = x21 * 2. * x22 - x21;
299  x24 = x21 * 2. * x23 - x22;
300  x25 = x21 * 2. * x24 - x23;
301  x26 = x21 * 2. * x25 - x24;
302  x27 = x21 * 2. * x26 - x25;
303  x28 = x21 * 2. * x27 - x26;
304  x29 = x21 * 2. * x28 - x27;
305  x210 = x21 * 2. * x29 - x28;
306  x211 = x21 * 2. * x210 - x29;
307  x212 = x21 * 2. * x211 - x210;
308 
309  return coeff[0] * x21 + coeff[1] + coeff[2] * x22 + coeff[3] * x23 +
310  coeff[4] * x24 + coeff[5] * x25 + coeff[6] * x26 + coeff[7] * x27
311  + coeff[8] * x28 + coeff[9] * x29 + coeff[10] * x11 + coeff[11] *
312  x11 * x21 + coeff[12] * x210 + coeff[13] * x11 * x22 + coeff[14] *
313  x211 + coeff[15] * x212 + coeff[16] * x11 * x25 + coeff[17] *
314  x11 * x27 + coeff[18] * x11 * x26;
315 }
double zcell
Definition: CSCDriftSim.h:65
double ycell
Definition: CSCDriftSim.h:65
double CSCDriftSim::gasGain ( const CSCDetId id) const
private

Definition at line 177 of file CSCDriftSim.cc.

References query::result, relativeConstraints::ring, CSCDetId::ring(), and CSCDetId::station().

Referenced by getWireHit().

178 {
179  double result = 130000.; // 1.30 E05
180  // if ME1/1, add some extra gas gain to compensate
181  // for a smaller gas gap
182  int ring = detId.ring();
183  if(detId.station() == 1 && (ring == 1 || ring == 4))
184  {
185  result = 213000.; // 2.13 E05 ( to match real world as of Jan-2011)
186  }
187  return result;
188 }
tuple result
Definition: query.py:137
CSCDetectorHit CSCDriftSim::getWireHit ( const Local3DPoint ionClusterPosition,
const CSCLayer layer,
int  wire,
const PSimHit simHit 
)

takes a point, and creates a signal on the wire

Definition at line 68 of file CSCDriftSim.cc.

References CSCChamberSpecs::anodeCathodeSpacing(), avalancheCharge(), avgDrift(), avgDriftTimeHighB(), avgDriftTimeLowB(), avgPathLengthHighB(), avgPathLengthLowB(), bz, CSCLayer::chamber(), DeDxDiscriminatorTools::charge(), driftSigma(), driftTimeSigmaHighB(), driftTimeSigmaLowB(), e_SI, ELECTRON_DIFFUSION_COEFF, gasGain(), relativeConstraints::geom, CSCLayer::geometry(), CSCLayer::id(), MagneticField::inKGauss(), LogTrace, max(), pathSigmaHighB(), pathSigmaLowB(), pos, idealTransformation::rotation, CSCChamber::specs(), mathSSE::sqrt(), GeomDet::surface(), lumiQTWidget::t, theMagneticField, theRandGaussQ, PSimHit::tof(), Surface::toGlobal(), GeomDet::toLocal(), CSCLayerGeometry::wireAngle(), CSCChamberSpecs::wireSpacing(), x, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), ycell, CSCLayerGeometry::yOfWire(), detailsBasic3DVector::z, PV3DBase< T, PVType, FrameType >::z(), and zcell.

Referenced by CSCWireHitSim::simulate().

69  {
70 
71  const CSCChamberSpecs * specs = layer->chamber()->specs();
72  const CSCLayerGeometry * geom = layer->geometry();
73  math::LocalPoint clusterPos(pos.x(), pos.y(), pos.z());
74  LogTrace("CSCDriftSim") << "CSCDriftSim: ionization cluster at: " << pos;
75  // set the coordinate system with the x-axis along the nearest wire,
76  // with the origin in the center of the chamber, on that wire.
77  math::LocalVector yShift(0, -1.*geom->yOfWire(nearestWire), 0.);
78  ROOT::Math::RotationZ rotation(-1.*geom->wireAngle());
79 
80  clusterPos = yShift + clusterPos;
81  clusterPos = rotation * clusterPos;
82  GlobalPoint globalPosition = layer->surface().toGlobal(pos);
83  assert(theMagneticField != 0);
84 
85  // bz = theMagneticField->inTesla(globalPosition).z() * 10.;
86 
87  // We need magnetic field in _local_ coordinates
88  // Interface now allows access in kGauss directly.
89  bz = layer->toLocal( theMagneticField->inKGauss( globalPosition ) ).z();
90 
91  // these subroutines label the coordinates in GEANT coords...
92  ycell = clusterPos.z() / specs->anodeCathodeSpacing();
93  zcell = 2.*clusterPos.y() / specs->wireSpacing();
94 
95  LogTrace("CSCDriftSim") << "CSCDriftSim: bz " << bz <<" avgDrift " << avgDrift()
96  << " wireAngle " << geom->wireAngle()
97  << " ycell " << ycell << " zcell " << zcell;
98 
99  double avgPathLength, pathSigma, avgDriftTime, driftTimeSigma;
100  static const float B_FIELD_CUT = 15.f;
101  if(fabs(bz) < B_FIELD_CUT) {
102  avgPathLength = avgPathLengthLowB();
103  pathSigma = pathSigmaLowB();
104  avgDriftTime = avgDriftTimeLowB();
105  driftTimeSigma = driftTimeSigmaLowB();
106  }
107  else {
108  avgPathLength = avgPathLengthHighB();
109  pathSigma = pathSigmaHighB();
110  avgDriftTime = avgDriftTimeHighB();
111  driftTimeSigma = driftTimeSigmaHighB();
112  }
113 
114  // electron drift path length
115  double pathLength = std::max(theRandGaussQ->fire(avgPathLength, pathSigma), 0.);
116 
117  // electron drift distance along the anode wire, including diffusion
118  double diffusionSigma = ELECTRON_DIFFUSION_COEFF * sqrt(pathLength);
119  double x = clusterPos.x() + theRandGaussQ->fire(avgDrift(), driftSigma())
120  + theRandGaussQ->fire(0., diffusionSigma);
121 
122  // electron drift time
123  double driftTime = std::max(theRandGaussQ->fire(avgDriftTime, driftTimeSigma), 0.);
124 
125  //@@ Parameters which should be defined outside the code
126  // f_att is the fraction of drift electrons lost due to attachment
127  //static const double f_att = 0.5;
128  static const double f_collected = 0.82;
129 
130  // Avalanche charge, with fluctuation ('avalancheCharge()' is the fluctuation generator!)
131  //double charge = avalancheCharge() * f_att * f_collected * gasGain(layer->id()) * e_SI * 1.e15;
132  // doing fattachment by random chance of killing
133  double charge = avalancheCharge() * f_collected * gasGain(layer->id()) * e_SI * 1.e15;
134 
135  float t = simHit.tof() + driftTime;
136  LogTrace("CSCDriftSim") << "CSCDriftSim: tof = " << simHit.tof() <<
137  " driftTime = " << driftTime <<
138  " MEDH = " << CSCDetectorHit(nearestWire, charge, x, t, &simHit);
139  return CSCDetectorHit(nearestWire, charge, x, t, &simHit);
140 }
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:114
double avgDrift() const
Definition: CSCDriftParam.cc:8
float tof() const
deprecated name for timeOfFlight()
Definition: PSimHit.h:72
double zcell
Definition: CSCDriftSim.h:65
double pathSigmaHighB()
CSCDetId id() const
Definition: CSCLayer.h:42
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:62
const MagneticField * theMagneticField
Definition: CSCDriftSim.h:72
double avgPathLengthHighB()
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:35
double charge(const std::vector< uint8_t > &Ampls)
float float float z
double driftTimeSigmaLowB()
double driftTimeSigmaHighB()
float wireAngle() const
double avgDriftTimeHighB()
#define e_SI
double avgDriftTimeLowB()
const double ELECTRON_DIFFUSION_COEFF
Definition: CSCDriftSim.h:70
float yOfWire(float wire, float x=0.) const
const CSCChamberSpecs * specs() const
Definition: CSCChamber.h:42
const T & max(const T &a, const T &b)
double pathSigmaLowB()
T sqrt(T t)
Definition: SSEVec.h:48
double avalancheCharge()
Definition: CSCDriftSim.cc:144
double ycell
Definition: CSCDriftSim.h:65
CLHEP::RandGaussQ * theRandGaussQ
Definition: CSCDriftSim.h:74
float wireSpacing() const
#define LogTrace(id)
double avgPathLengthLowB()
GlobalVector inKGauss(const GlobalPoint &gp) const
Field value ad specified global point, in KGauss.
Definition: MagneticField.h:35
double driftSigma() const
double gasGain(const CSCDetId &id) const
Definition: CSCDriftSim.cc:177
float anodeCathodeSpacing() const
Definition: DDAxes.h:10
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::LocalCoordinateSystemTag > LocalPoint
point in local coordinate system
Definition: Point3D.h:16
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::LocalCoordinateSystemTag > LocalVector
vector in local coordinate system
Definition: Vector3D.h:26
const CSCChamber * chamber() const
Definition: CSCLayer.h:52
const CSCLayerGeometry * geometry() const
Definition: CSCLayer.h:47
double CSCDriftSim::pathSigmaHighB ( )
private

Definition at line 76 of file CSCDriftParamHighB.cc.

References ycell, and zcell.

Referenced by getWireHit().

76  {
77  /* Initialized data */
78 
79  static const double coeff[9] = { .0049089564,.0091482062,.0024036507,
80  .0065285652,.0041487742,-.0038102526,-.0043923587,.0019230151,
81  .0013543258 };
82 
83  /* System generated locals */
84  float ret_val;
85 
86  /* Local variables */
87  double /*x10,*/ x11, x12, x13, x14, x15, x16, /*x20,*/ x21, x22, x23,
88  x24, x25, x26, x27, x28, x29;
89 
90 /* ! Parameterization of path length dispersion- high field chambers */
91 /* ***********************************************************************
92  */
93 /* DOC MC_BHGH_SSIG *
94  */
95 /* *
96 */
97 /* DOC Function : Parameterization of the drift path length *
98  */
99 /* DOC dispersion in the muon endcap CSCs. *
100  */
101 /* *
102 */
103 /* DOC References : None *
104  */
105 /* *
106 */
107 /* DOC Arguments : YCELL - distance from the anode wire in the *
108  */
109 /* anode-cathode coordinate plane *
110 */
111 /* DOC ZCELL - distance from the anode wire in the wire *
112  */
113 /* plane coordinate *
114 */
115 /* **NOTE** Both distances normalize to cell dim=1x1 *
116 */
117 /* DOC Errors : None *
118  */
119 /* *
120 */
121 /* DOC Returns : Path length dispersion for high field CSC chambers *
122  */
123 /* *
124 */
125 /* DOC Created : 15-OCT-1996 Author : Jeff Rowe *
126  */
127 /* ***********************************************************************
128  */
129 
130 
131  //x10 = 1.; //not used later
132  x11 = fabs(ycell) * 2. - 1.;
133  x12 = x11 * x11;
134  x13 = x11 * x12;
135  x14 = x11 * x13;
136  x15 = x11 * x14;
137  x16 = x11 * x15;
138  //x20 = 1.; //not used later
139  x21 = fabs(zcell) * 2. - 1.;
140  x22 = x21 * x21;
141  x23 = x21 * x22;
142  x24 = x21 * x23;
143  x25 = x21 * x24;
144  x26 = x21 * x25;
145  x27 = x21 * x26;
146  x28 = x21 * x27;
147  x29 = x21 * x28;
148 
149  ret_val = coeff[0] + coeff[1] * x21 + coeff[2] * x11 + coeff[3] * x22 +
150  coeff[4] * x11 * x21 + coeff[5] * x16 * x22 + coeff[6] * x16 *
151  x23 + coeff[7] * x11 * x22 + coeff[8] * x29;
152 
153  return ret_val;
154 }
double zcell
Definition: CSCDriftSim.h:65
double ycell
Definition: CSCDriftSim.h:65
double CSCDriftSim::pathSigmaLowB ( )
private

Definition at line 70 of file CSCDriftParamLowB.cc.

References ycell, and zcell.

Referenced by getWireHit().

70  {
71  /* Initialized data */
72 
73  static const double coeff[12] = { .002854441,8.701339e-4,.0053064193,
74  .0012356508,9.8627318e-4,.0013802449,-5.4633755e-4,.0026078648,
75  .0044171026,6.2029063e-4,.0011392474,-.0056275595 };
76 
77  /* System generated locals */
78  float ret_val;
79 
80  /* Local variables */
81  double /*x10,*/ x11, x12, x13, x14, x15, x16, /*x20,*/ x21, x22, x23,
82  x24, x25, x26, x27, x28, x29, x210, x211, x212, x213;
83 
84 /* ! Parameterization of path length dispersion- low field chambers */
85 /* ***********************************************************************
86  */
87 /* DOC MC_BHGH_SSIG *
88  */
89 /* *
90 */
91 /* DOC Function : Parameterization of the drift path length *
92  */
93 /* DOC dispersion in the muon endcap CSCs. *
94  */
95 /* *
96 */
97 /* DOC References : None *
98  */
99 /* *
100 */
101 /* DOC Arguments : YCELL - distance from the anode wire in the *
102  */
103 /* anode-cathode coordinate plane *
104 */
105 /* DOC ZCELL - distance from the anode wire in the wire *
106  */
107 /* plane coordinate *
108 */
109 /* **NOTE** Both distances normalize to cell dim=1x1 *
110 */
111 /* DOC Errors : None *
112  */
113 /* *
114 */
115 /* DOC Returns : Path length dispersion for low field CSC chambers *
116 */
117 /* *
118 */
119 /* DOC Created : 15-OCT-1996 Author : Jeff Rowe *
120  */
121 /* ***********************************************************************
122  */
123 
124 
125  //x10 = 1.; //not used later
126  x11 = fabs(ycell) * 2. - 1.;
127  x12 = x11 * x11;
128  x13 = x11 * x12;
129  x14 = x11 * x13;
130  x15 = x11 * x14;
131  x16 = x11 * x15;
132  //x20 = 1.; //not used later
133  x21 = fabs(zcell) * 2. - 1.;
134  x22 = x21 * x21;
135  x23 = x21 * x22;
136  x24 = x21 * x23;
137  x25 = x21 * x24;
138  x26 = x21 * x25;
139  x27 = x21 * x26;
140  x28 = x21 * x27;
141  x29 = x21 * x28;
142  x210 = x21 * x29;
143  x211 = x21 * x210;
144  x212 = x21 * x211;
145  x213 = x21 * x212;
146  ret_val = coeff[0] + coeff[1] * x23 + coeff[2] * x24 + coeff[3] * x13 +
147  coeff[4] * x11 * x21 + coeff[5] * x11 * x22 + coeff[6] * x16 +
148  coeff[7] * x213 + coeff[8] * x212 + coeff[9] * x21 + coeff[10] *
149  x11 * x23 + coeff[11] * x26;
150 
151  return ret_val;
152 }
double zcell
Definition: CSCDriftSim.h:65
double ycell
Definition: CSCDriftSim.h:65
void CSCDriftSim::setMagneticField ( const MagneticField field)
inline

Definition at line 43 of file CSCDriftSim.h.

References theMagneticField.

Referenced by CSCDigitizer::setMagneticField().

43 {theMagneticField = field;}
const MagneticField * theMagneticField
Definition: CSCDriftSim.h:72
void CSCDriftSim::setRandomEngine ( CLHEP::HepRandomEngine &  engine)

Definition at line 60 of file CSCDriftSim.cc.

References theRandFlat, and theRandGaussQ.

Referenced by CSCWireHitSim::setRandomEngine().

61 {
62  theRandGaussQ = new CLHEP::RandGaussQ(engine);
63  theRandFlat = new CLHEP::RandFlat(engine);
64 }
CLHEP::RandFlat * theRandFlat
Definition: CSCDriftSim.h:75
CLHEP::RandGaussQ * theRandGaussQ
Definition: CSCDriftSim.h:74

Member Data Documentation

float CSCDriftSim::bz
private

Definition at line 63 of file CSCDriftSim.h.

Referenced by avgDrift(), driftSigma(), and getWireHit().

std::vector<double> CSCDriftSim::dNdEIntegral
private

Definition at line 67 of file CSCDriftSim.h.

Referenced by avalancheCharge(), and CSCDriftSim().

const double CSCDriftSim::ELECTRON_DIFFUSION_COEFF
private

Definition at line 70 of file CSCDriftSim.h.

Referenced by getWireHit().

const double CSCDriftSim::STEP_SIZE
private

Definition at line 68 of file CSCDriftSim.h.

Referenced by avalancheCharge(), and CSCDriftSim().

const MagneticField* CSCDriftSim::theMagneticField
private

Definition at line 72 of file CSCDriftSim.h.

Referenced by getWireHit(), and setMagneticField().

CLHEP::RandFlat* CSCDriftSim::theRandFlat
private

Definition at line 75 of file CSCDriftSim.h.

Referenced by avalancheCharge(), setRandomEngine(), and ~CSCDriftSim().

CLHEP::RandGaussQ* CSCDriftSim::theRandGaussQ
private

Definition at line 74 of file CSCDriftSim.h.

Referenced by getWireHit(), setRandomEngine(), and ~CSCDriftSim().

double CSCDriftSim::ycell
private
double CSCDriftSim::zcell
private