CMS 3D CMS Logo

HcalPulseShapes.cc
Go to the documentation of this file.
6 #include "CLHEP/Random/RandFlat.h"
8 
9 // #include "CalibCalorimetry/HcalAlgos/interface/HcalDbASCIIIO.h"
10 #include <cmath>
11 #include <iostream>
12 #include <fstream>
13 #include "TMath.h"
14 
16 : theDbService(nullptr),
17  theShapes()
18 {
19 /*
20 
21 Reco MC
22 -------------------------------------------------------------------------------------------
23 000 not used (reserved)
24 101 101 hpdShape_ HPD (original version)
25 102 102 =101 HPD BV 30 volts in HBP iphi54
26 103 123 hpdShape_v2,hpdShapeMC_v2 HPD (2011. oct version)
27 104 124 hpdBV30Shape_v2,hpdBV30ShapeMC_v2 HPD bv30 in HBP iph54
28 105 125 hpdShape_v2,hpdShapeMC_v2 HPD (2011.11.12 version)
29 201 201 siPMShapeHO_ SiPMs Zecotec shape (HO)
30 202 202 =201, SiPMs Hamamatsu shape (HO)
31 205 203 siPMShapeData2017_,siPMShapeMC2017_ SiPMs from Data, Hamamatsu shape (HE 2017)
32 207 206 siPMShapeData2018_,siPMShapeMC2018_ SiPMs from Data, Hamamatsu shape (HE 2018)
33 301 301 hfShape_ regular HF PMT shape
34 401 401 regular ZDC shape
35 -------------------------------------------------------------------------------------------
36 
37 */
38 
39 
40  float ts1, ts2, ts3, thpd, tpre, wd1, wd2, wd3;
41 
42  // HPD Shape Version 1 (used before CMSSW5, until Oct 2011)
43  ts1=8. ; ts2=10. ; ts3=29.3; thpd=4.0; tpre=9.0; wd1=2.0; wd2=0.7; wd3=1.0;
44  computeHPDShape(ts1,ts2,ts3,thpd,tpre,wd1,wd2,wd3, hpdShape_);
45  theShapes[101] = &hpdShape_;
46  theShapes[102] = theShapes[101];
47 
48  // HPD Shape Version 2 for CMSSW 5. Nov 2011 (RECO and MC separately)
49  ts1=8. ; ts2=10. ; ts3=25.0; thpd=4.0; tpre=9.0; wd1=2.0; wd2=0.7; wd3=1.0;
50  computeHPDShape(ts1,ts2,ts3,thpd,tpre,wd1,wd2,wd3, hpdShape_v2);
51  theShapes[103] = &hpdShape_v2;
52 
53  ts1=8. ; ts2=10. ; ts3=29.3; thpd=4.0; tpre=7.0; wd1=2.0; wd2=0.7; wd3=1.0;
54  computeHPDShape(ts1,ts2,ts3,thpd,tpre,wd1,wd2,wd3, hpdShapeMC_v2);
55  theShapes[123] = &hpdShapeMC_v2;
56 
57  // HPD Shape Version 3 for CMSSW 5. Nov 2011 (RECO and MC separately)
58  ts1=8. ; ts2=19. ; ts3=29.3; thpd=4.0; tpre=9.0; wd1=2.0; wd2=0.7; wd3=0.32;
59  computeHPDShape(ts1,ts2,ts3,thpd,tpre,wd1,wd2,wd3, hpdShape_v3);
60  theShapes[105] = &hpdShape_v3;
61 
62  ts1=8. ; ts2=10. ; ts3=22.3; thpd=4.0; tpre=7.0; wd1=2.0; wd2=0.7; wd3=1.0;
63  computeHPDShape(ts1,ts2,ts3,thpd,tpre,wd1,wd2,wd3, hpdShapeMC_v3);
64  theShapes[125] = &hpdShapeMC_v3;
65 
66  // HPD with Bias Voltage 30 volts, wider pulse. (HBPlus iphi54)
67 
68  ts1=8. ; ts2=12. ; ts3=31.7; thpd=9.0; tpre=9.0; wd1=2.0; wd2=0.7; wd3=1.0;
69  computeHPDShape(ts1,ts2,ts3,thpd,tpre,wd1,wd2,wd3, hpdBV30Shape_v2);
70  theShapes[104] = &hpdBV30Shape_v2;
71 
72  ts1=8. ; ts2=12. ; ts3=31.7; thpd=9.0; tpre=9.0; wd1=2.0; wd2=0.7; wd3=1.0;
73  computeHPDShape(ts1,ts2,ts3,thpd,tpre,wd1,wd2,wd3, hpdBV30ShapeMC_v2);
75 
76  // HF and SiPM
77 
82 
83  theShapes[201] = &siPMShapeHO_;
84  theShapes[202] = theShapes[201];
85  theShapes[203] = &(computeSiPMShapeHE203());
87  theShapes[206] = &(computeSiPMShapeHE206());
89  theShapes[301] = &hfShape_;
90  //theShapes[401] = new CaloCachedShapeIntegrator(&theZDCShape);
91 
92 }
93 
94 
96 }
97 
98 
100 {
101  edm::ESHandle<HcalDbService> conditions;
102  es.get<HcalDbRecord>().get(conditions);
103  theDbService = conditions.product();
104 }
105 
107 {
108  theDbService = conditions;
109 }
110 
111 //void HcalPulseShapes::computeHPDShape()
112 void HcalPulseShapes::computeHPDShape(float ts1, float ts2, float ts3, float thpd, float tpre,
113  float wd1, float wd2, float wd3, Shape &tmphpdShape_)
114 {
115 
116 // pulse shape time constants in ns
117 /*
118  const float ts1 = 8.; // scintillation time constants : 1,2,3
119  const float ts2 = 10.;
120  const float ts3 = 29.3;
121  const float thpd = 4.; // HPD current collection drift time
122  const float tpre = 9.; // preamp time constant (refit on TB04 data)
123 
124  const float wd1 = 2.; // relative weights of decay exponents
125  const float wd2 = 0.7;
126  const float wd3 = 1.;
127 */
128  // pulse shape components over a range of time 0 ns to 255 ns in 1 ns steps
129  unsigned int nbin = 256;
130  tmphpdShape_.setNBin(nbin);
131  std::vector<float> ntmp(nbin,0.0); // zeroing output pulse shape
132  std::vector<float> nth(nbin,0.0); // zeroing HPD drift shape
133  std::vector<float> ntp(nbin,0.0); // zeroing Binkley preamp shape
134  std::vector<float> ntd(nbin,0.0); // zeroing Scintillator decay shape
135 
136  unsigned int i,j,k;
137  float norm;
138 
139  // HPD starts at I and rises to 2I in thpd of time
140  norm=0.0;
141  for(j=0;j<thpd && j<nbin;j++){
142  nth[j] = 1.0 + ((float)j)/thpd;
143  norm += nth[j];
144  }
145  // normalize integrated current to 1.0
146  for(j=0;j<thpd && j<nbin;j++){
147  nth[j] /= norm;
148  }
149 
150  // Binkley shape over 6 time constants
151  norm=0.0;
152  for(j=0;j<6*tpre && j<nbin;j++){
153  ntp[j] = ((float)j)*exp(-((float)(j*j))/(tpre*tpre));
154  norm += ntp[j];
155  }
156  // normalize pulse area to 1.0
157  for(j=0;j<6*tpre && j<nbin;j++){
158  ntp[j] /= norm;
159  }
160 
161 // ignore stochastic variation of photoelectron emission
162 // <...>
163 
164 // effective tile plus wave-length shifter decay time over 4 time constants
165  unsigned int tmax = 6 * (int)ts3;
166 
167  norm=0.0;
168  for(j=0;j<tmax && j<nbin;j++){
169  ntd[j] = wd1 * exp(-((float)j)/ts1) +
170  wd2 * exp(-((float)j)/ts2) +
171  wd3 * exp(-((float)j)/ts3) ;
172  norm += ntd[j];
173  }
174  // normalize pulse area to 1.0
175  for(j=0;j<tmax && j<nbin;j++){
176  ntd[j] /= norm;
177  }
178 
179  unsigned int t1,t2,t3,t4;
180  for(i=0;i<tmax && i<nbin;i++){
181  t1 = i;
182  // t2 = t1 + top*rand;
183  // ignoring jitter from optical path length
184  t2 = t1;
185  for(j=0;j<thpd && j<nbin;j++){
186  t3 = t2 + j;
187  for(k=0;k<4*tpre && k<nbin;k++){ // here "4" is set deliberately,
188  t4 = t3 + k; // as in test fortran toy MC ...
189  if(t4<nbin){
190  unsigned int ntb=t4;
191  ntmp[ntb] += ntd[i]*nth[j]*ntp[k];
192  }
193  }
194  }
195  }
196 
197  // normalize for 1 GeV pulse height
198  norm = 0.;
199  for(i=0;i<nbin;i++){
200  norm += ntmp[i];
201  }
202 
203  for(i=0; i<nbin; i++){
204  ntmp[i] /= norm;
205  }
206 
207  for(i=0; i<nbin; i++){
208  tmphpdShape_.setShapeBin(i,ntmp[i]);
209  }
210 }
211 
213  // first create pulse shape over a range of time 0 ns to 255 ns in 1 ns steps
214  unsigned int nbin = 256;
215  hfShape_.setNBin(nbin);
216  std::vector<float> ntmp(nbin,0.0); //
217 
218  const float k0=0.7956; // shape parameters
219  const float p2=1.355;
220  const float p4=2.327;
221  const float p1=4.3; // position parameter
222 
223  float norm = 0.0;
224 
225  for(unsigned int j = 0; j < 25 && j < nbin; ++j){
226 
227  float r0 = j-p1;
228  float sigma0 = (r0<0) ? p2 : p2*p4;
229  r0 /= sigma0;
230  if(r0 < k0) ntmp[j] = exp(-0.5*r0*r0);
231  else ntmp[j] = exp(0.5*k0*k0-k0*r0);
232  norm += ntmp[j];
233  }
234  // normalize pulse area to 1.0
235  for(unsigned int j = 0; j < 25 && j < nbin; ++j){
236  ntmp[j] /= norm;
237  hfShape_.setShapeBin(j,ntmp[j]);
238  }
239 }
240 
241 
243 {
244 
245  //Combination of all phase scan data (May,Jul,Oct2017)
246  //runs: 294736-294740, 294929-294950, 298594-298598 and 305744-305758
247 
248  unsigned int nbin = 250;
249 
250  std::array<float, 250> nt {{
251  5.22174e-12, 7.04852e-10, 3.49584e-08, 7.78029e-07, 9.11847e-06, 6.39666e-05, 0.000297587, 0.000996661, 0.00256618, 0.00535396,
252  0.00944073, 0.0145521, 0.020145, 0.0255936, 0.0303632, 0.0341078, 0.0366849, 0.0381183, 0.0385392, 0.0381327,
253  0.0370956, 0.0356113, 0.0338366, 0.0318978, 0.029891, 0.0278866, 0.0259336, 0.0240643, 0.0222981, 0.0206453,
254  0.0191097, 0.0176902, 0.0163832, 0.0151829, 0.0140826, 0.0130752, 0.0121533, 0.01131, 0.0105382, 0.00983178,
255  0.00918467, 0.00859143, 0.00804709, 0.0075471, 0.00708733, 0.00666406, 0.00627393, 0.00591389, 0.00558122, 0.00527344,
256  0.00498834, 0.00472392, 0.00447837, 0.00425007, 0.00403754, 0.00383947, 0.00365465, 0.00348199, 0.00332052, 0.00316934,
257  0.00302764, 0.0028947, 0.00276983, 0.00265242, 0.00254193, 0.00243785, 0.00233971, 0.00224709, 0.0021596, 0.00207687,
258  0.0019986, 0.00192447, 0.00185421, 0.00178756, 0.0017243, 0.00166419, 0.00160705, 0.00155268, 0.00150093, 0.00145162,
259  0.00140461, 0.00135976, 0.00131696, 0.00127607, 0.00123699, 0.00119962, 0.00116386, 0.00112963, 0.00109683, 0.0010654,
260  0.00103526, 0.00100634, 0.000978578, 0.000951917, 0.000926299, 0.000901672, 0.000877987, 0.000855198, 0.00083326, 0.000812133,
261  0.000791778, 0.000772159, 0.000753242, 0.000734994, 0.000717384, 0.000700385, 0.000683967, 0.000668107, 0.000652779, 0.00063796,
262  0.000623629, 0.000609764, 0.000596346, 0.000583356, 0.000570777, 0.000558592, 0.000546785, 0.00053534, 0.000524243, 0.000513481,
263  0.00050304, 0.000492907, 0.000483072, 0.000473523, 0.000464248, 0.000455238, 0.000446483, 0.000437974, 0.0004297, 0.000421655,
264  0.00041383, 0.000406216, 0.000398807, 0.000391595, 0.000384574, 0.000377736, 0.000371076, 0.000364588, 0.000358266, 0.000352104,
265  0.000346097, 0.00034024, 0.000334528, 0.000328956, 0.00032352, 0.000318216, 0.000313039, 0.000307986, 0.000303052, 0.000298234,
266  0.000293528, 0.000288931, 0.000284439, 0.00028005, 0.000275761, 0.000271567, 0.000267468, 0.000263459, 0.000259538, 0.000255703,
267  0.000251951, 0.00024828, 0.000244688, 0.000241172, 0.00023773, 0.000234361, 0.000231061, 0.00022783, 0.000224666, 0.000221566,
268  0.000218528, 0.000215553, 0.000212636, 0.000209778, 0.000206977, 0.00020423, 0.000201537, 0.000198896, 0.000196307, 0.000193767,
269  0.000191275, 0.000188831, 0.000186432, 0.000184079, 0.000181769, 0.000179502, 0.000177277, 0.000175092, 0.000172947, 0.000170841,
270  0.000168772, 0.000166741, 0.000164745, 0.000162785, 0.000160859, 0.000158967, 0.000157108, 0.00015528, 0.000153484, 0.000151719,
271  0.000149984, 0.000148278, 0.000146601, 0.000144951, 0.000143329, 0.000141734, 0.000140165, 0.000138622, 0.000137104, 0.00013561,
272  0.000134141, 0.000132695, 0.000131272, 0.000129871, 0.000128493, 0.000127136, 0.000125801, 0.000124486, 0.000123191, 0.000121917,
273  0.000120662, 0.000119426, 0.000118209, 0.00011701, 0.000115829, 0.000114665, 0.000113519, 0.00011239, 0.000111278, 0.000110182,
274  0.000109102, 0.000108037, 0.000106988, 0.000105954, 0.000104935, 0.00010393, 0.000102939, 0.000101963, 0.000101, 0.000100051,
275  9.91146e-05, 9.81915e-05, 9.7281e-05, 9.63831e-05, 9.54975e-05, 9.46239e-05, 9.37621e-05, 9.2912e-05, 9.20733e-05, 9.12458e-05
276  }};
277 
279 
280  double norm = 0.;
281  for (unsigned int j = 0; j < nbin; ++j) {
282  norm += (nt[j]>0) ? nt[j] : 0.;
283  }
284 
285  for (unsigned int j = 0; j < nbin; ++j) {
286  nt[j] /= norm;
288  }
289 }
290 
291 
292 
294 {
295  //From Jay Lawhorn: derived from data Edward Laird phase scan may2017
296  //https://indico.cern.ch/event/641978/contributions/2604491/attachments/1468666/2271582/17-05-31-hcal-hep17-pulse-shape.pdf
297  //Run numbers are 294736-294740 and 294929-294950
298 
299  unsigned int nbin = 250;
300 
301  std::array<float, 250> nt {{
302  3.97958e-29, 1.11634e-22, 9.96106e-18, 6.25334e-14, 5.08863e-11, 8.59141e-09, 4.32285e-07, 8.56617e-06, 8.28549e-05, 0.000461447,
303  0.00168052, 0.00441395, 0.00901637, 0.0151806, 0.0220314, 0.028528, 0.0338471, 0.0375578, 0.0395985, 0.0401567,
304  0.0395398, 0.0380776, 0.0360669, 0.0337474, 0.0312984, 0.0288457, 0.0264721, 0.0242276, 0.0221393, 0.0202181,
305  0.0184647, 0.0168731, 0.0154335, 0.0141346, 0.0129639, 0.0119094, 0.0109594, 0.0101031, 0.0093305, 0.00863267,
306  0.0080015, 0.00742977, 0.00691107, 0.00643969, 0.00601059, 0.00561931, 0.00526188, 0.00493483, 0.00463505, 0.00435981,
307  0.00410667, 0.00387348, 0.00365832, 0.00345949, 0.00327547, 0.0031049, 0.00294656, 0.00279938, 0.00266237, 0.00253467,
308  0.00241548, 0.0023041, 0.00219989, 0.00210227, 0.00201072, 0.00192476, 0.00184397, 0.00176795, 0.00169634, 0.00162884,
309  0.00156512, 0.00150494, 0.00144803, 0.00139418, 0.00134317, 0.00129481, 0.00124894, 0.00120537, 0.00116398, 0.00112461,
310  0.00108715, 0.00105147, 0.00101747, 0.000985042, 0.000954096, 0.000924545, 0.000896308, 0.000869311, 0.000843482, 0.000818758,
311  0.000795077, 0.000772383, 0.000750623, 0.000729747, 0.00070971, 0.000690466, 0.000671977, 0.000654204, 0.00063711, 0.000620663,
312  0.000604831, 0.000589584, 0.000574894, 0.000560735, 0.000547081, 0.00053391, 0.0005212, 0.000508929, 0.000497078, 0.000485628,
313  0.000474561, 0.000463862, 0.000453514, 0.000443501, 0.000433811, 0.000424429, 0.000415343, 0.00040654, 0.00039801, 0.000389741,
314  0.000381722, 0.000373944, 0.000366398, 0.000359074, 0.000351964, 0.00034506, 0.000338353, 0.000331838, 0.000325505, 0.00031935,
315  0.000313365, 0.000307544, 0.000301881, 0.000296371, 0.000291009, 0.000285788, 0.000280705, 0.000275755, 0.000270932, 0.000266233,
316  0.000261653, 0.00025719, 0.000252837, 0.000248593, 0.000244454, 0.000240416, 0.000236475, 0.00023263, 0.000228876, 0.000225212,
317  0.000221633, 0.000218138, 0.000214724, 0.000211389, 0.00020813, 0.000204945, 0.000201831, 0.000198787, 0.000195811, 0.0001929,
318  0.000190053, 0.000187268, 0.000184543, 0.000181876, 0.000179266, 0.000176711, 0.00017421, 0.000171761, 0.000169363, 0.000167014,
319  0.000164713, 0.000162459, 0.00016025, 0.000158086, 0.000155964, 0.000153885, 0.000151847, 0.000149848, 0.000147888, 0.000145966,
320  0.000144081, 0.000142232, 0.000140418, 0.000138638, 0.000136891, 0.000135177, 0.000133494, 0.000131843, 0.000130221, 0.00012863,
321  0.000127066, 0.000125531, 0.000124023, 0.000122543, 0.000121088, 0.000119658, 0.000118254, 0.000116874, 0.000115518, 0.000114185,
322  0.000112875, 0.000111587, 0.000110321, 0.000109076, 0.000107851, 0.000106648, 0.000105464, 0.000104299, 0.000103154, 0.000102027,
323  0.000100918, 9.98271e-05, 9.87537e-05, 9.76974e-05, 9.66578e-05, 9.56346e-05, 9.46274e-05, 9.3636e-05, 9.26599e-05, 9.16989e-05,
324  9.07526e-05, 8.98208e-05, 8.89032e-05, 8.79995e-05, 8.71093e-05, 8.62325e-05, 8.53688e-05, 8.45179e-05, 8.36796e-05, 8.28536e-05,
325  8.20397e-05, 8.12376e-05, 8.04471e-05, 7.96681e-05, 7.89002e-05, 7.81433e-05, 7.73972e-05, 7.66616e-05, 7.59364e-05, 7.52213e-05,
326  7.45163e-05, 7.3821e-05, 7.31354e-05, 7.24592e-05, 7.17923e-05, 7.11345e-05, 7.04856e-05, 6.98455e-05, 6.9214e-05, 6.8591e-05
327  }};
328 
329 
331 
332  double norm = 0.;
333  for (unsigned int j = 0; j < nbin; ++j) {
334  norm += (nt[j]>0) ? nt[j] : 0.;
335  }
336 
337  for (unsigned int j = 0; j < nbin; ++j) {
338  nt[j] /= norm;
340  }
341 }
342 
344 {
345 
346  unsigned int nbin = 128;
347 
348 //From Jake Anderson: toy MC convolution of SiPM pulse + WLS fiber shape + SiPM nonlinear response
349  std::array<float, 128> nt {{
350  2.782980485851731e-6, 4.518134885954626e-5, 2.7689305197392056e-4, 9.18328418900969e-4, .002110072599166349, .003867856860331454, .006120046224897771, .008754774090536956,
351  0.0116469503358586, .01467007449455966, .01770489955229477, .02064621450689512, .02340678093764222, .02591874610854916, .02813325527435303, 0.0300189241965647,
352  .03155968107671164, .03275234052577155, .03360415306318798, .03413048377960748, .03435270899678218, .03429637464659661, .03398962975487166, .03346192884394954,
353  .03274298516247742, .03186195009136525, .03084679116113031, 0.0297238406141036, .02851748748929785, .02724998816332392, .02594137274487424, .02460942736731527,
354  .02326973510736116, .02193576080366117, 0.0206189674254987, .01932895378564653, 0.0180736052958666, .01685925112650875, 0.0156908225633535, .01457200857138456,
355  .01350540559602467, .01249265947824805, .01153459805300423, .01063135355597282, .009782474412011936, .008987026319784546, 0.00824368281357106, .007550805679909604,
356  .006906515742762193, .006308754629755056, .005755338185695127, .005244002229973356, .004772441359900532, .004338341490928299, .003939406800854143, 0.00357338171220501,
357  0.0032380685079891, .002931341133259233, .002651155690306086, .002395558090237333, .002162689279320922, .001950788415487319, .001758194329648101, .001583345567913682,
358  .001424779275191974, .001281129147671334, 0.00115112265163774, .001033577678808199, 9.273987838127585e-4, 8.315731274976846e-4, 7.451662302008696e-4, 6.673176219006913e-4,
359  5.972364609644049e-4, 5.341971801529036e-4, 4.775352065178378e-4, 4.266427928961177e-4, 3.8096498904225923e-4, 3.3999577417327287e-4, 3.032743659102713e-4, 2.703817158798329e-4,
360  2.4093719775272793e-4, 2.145954900503894e-4, 1.9104365317752797e-4, 1.6999839784346724e-4, 1.5120354022478893e-4, 1.3442763782650755e-4, 1.1946179895521507e-4, 1.0611765796993575e-4,
361  9.422550797617687e-5, 8.363258233342666e-5, 7.420147621931836e-5, 6.580869950304933e-5, 5.834335229919868e-5, 5.17059147771959e-5, 4.5807143072062634e-5, 4.0567063461299446e-5,
362  3.591405732740723e-5, 3.178402980354131e-5, 2.811965539165646e-5, 2.4869694240316126e-5, 2.1988373166730962e-5, 1.9434825899529382e-5, 1.717258740121378e-5, 1.5169137499243157e-5,
363  1.339548941011129e-5, 1.1825819079078403e-5, 1.0437131581057595e-5, 9.208961130078894e-6, 8.12310153137994e-6, 7.163364176588591e-6, 6.315360932244386e-6, 5.566309502463164e-6,
364  4.904859063429651e-6, 4.320934164082596e-6, 3.8055950719111903e-6, 3.350912911083174e-6, 2.9498580949517117e-6, 2.596200697612328e-6, 2.2844215378879293e-6, 2.0096328693141094e-6,
365  1.7675076766686654e-6, 1.5542166787225756e-6, 1.366372225473431e-6, 1.200978365778838e-6, 1.0553864128982371e-6, 9.272554464808518e-7, 8.145171945902259e-7, 7.153448381918271e-7
366  }};
367 
368  siPMShapeHO_.setNBin(nbin);
369 
370  double norm = 0.;
371  for (unsigned int j = 0; j < nbin; ++j) {
372  norm += (nt[j]>0) ? nt[j] : 0.;
373  }
374 
375  for (unsigned int j = 0; j < nbin; ++j) {
376  nt[j] /= norm;
378  }
379 }
380 
382 {
383  //numerical convolution of SiPM pulse + WLS fiber shape
385  return siPMShapeMC2017;
386 }
387 
389 {
390  //numerical convolution of SiPM pulse + WLS fiber shape
391  //shift: aligning 206 phase closer to 205 in order to have good reco agreement
393  return siPMShapeMC2018;
394 }
395 
397 HcalPulseShapes::getShape(int shapeType) const
398 {
399  ShapeMap::const_iterator shapeMapItr = theShapes.find(shapeType);
400  if(shapeMapItr == theShapes.end()) {
401  throw cms::Exception("HcalPulseShapes") << "unknown shapeType";
402  return hpdShape_; // should not return this, but...
403  } else {
404  return *(shapeMapItr->second);
405  }
406 }
407 
408 
410 HcalPulseShapes::shape(const HcalDetId & detId) const
411 {
412  if(!theDbService) {
413  return defaultShape(detId);
414  }
415  int shapeType = theDbService->getHcalMCParam(detId)->signalShape();
416 
417  ShapeMap::const_iterator shapeMapItr = theShapes.find(shapeType);
418  if(shapeMapItr == theShapes.end()) {
419  return defaultShape(detId);
420  } else {
421  return *(shapeMapItr->second);
422  }
423 }
424 
427 {
428  if(!theDbService) {
429  return defaultShape(detId);
430  }
431  int shapeType = theDbService->getHcalRecoParam(detId.rawId())->pulseShapeID();
432 
433  ShapeMap::const_iterator shapeMapItr = theShapes.find(shapeType);
434  if(shapeMapItr == theShapes.end()) {
435  return defaultShape(detId);
436  } else {
437  return *(shapeMapItr->second);
438  }
439 }
440 
441 
444 {
445  edm::LogWarning("HcalPulseShapes") << "Cannot find HCAL MC Params ";
446  HcalSubdetector subdet = detId.subdet();
447  switch(subdet) {
448  case HcalBarrel:
449  return hbShape();
450  case HcalEndcap:
451  return heShape();
452  case HcalForward:
453  return hfShape();
454  case HcalOuter:
455  //FIXME doesn't look for SiPMs
456  return hoShape(false);
457  default:
458  throw cms::Exception("HcalPulseShapes") << "unknown detId";
459  break;
460  }
461 }
462 
463 //SiPM helpers
464 
465 inline double gexp(double t, double A, double c, double t0, double s) {
466  static double const root2(sqrt(2));
467  return -A*0.5*exp(c*t+0.5*c*c*s*s-c*s)*(erf(-0.5*root2/s*(t-t0+c*s*s))-1);
468 }
469 
470 inline double onePulse(double t, double A, double sigma, double theta, double m) {
471  return (t<theta) ? 0 : A*TMath::LogNormal(t,sigma,theta,m);
472 }
473 
475  // HO SiPM pulse shape fit from Jake Anderson ca. 2013
476  double A1(0.08757), c1(-0.5257), t01(2.4013), s1(0.6721);
477  double A2(0.007598), c2(-0.1501), t02(6.9412), s2(0.8710);
478  return gexp(t,A1,c1,t01,s1) + gexp(t,A2,c2,t02,s2);
479 }
480 
482  // taken from fit to laser measurement taken by Iouri M. in Spring 2016.
483  double A1(5.204/6.94419), sigma1_shape(0.5387), theta1_loc(-0.3976), m1_scale(4.428);
484  double A2(1.855/6.94419), sigma2_shape(0.8132), theta2_loc(7.025), m2_scale(12.29);
485  return
486  onePulse(t,A1,sigma1_shape,theta1_loc,m1_scale) +
487  onePulse(t,A2,sigma2_shape,theta2_loc,m2_scale);
488 }
489 
490 double HcalPulseShapes::generatePhotonTime(CLHEP::HepRandomEngine* engine, unsigned int signalShape) {
491  if(signalShape==206) return generatePhotonTime206(engine);
492  else return generatePhotonTime203(engine);
493 }
494 
495 double HcalPulseShapes::generatePhotonTime203(CLHEP::HepRandomEngine* engine) {
496  double result(0.);
497  while (true) {
498  result = CLHEP::RandFlat::shoot(engine, HcalPulseShapes::Y11RANGE_);
499  if (CLHEP::RandFlat::shoot(engine, HcalPulseShapes::Y11MAX203_) < HcalPulseShapes::Y11203(result))
500  return result;
501  }
502 }
503 
504 double HcalPulseShapes::generatePhotonTime206(CLHEP::HepRandomEngine* engine) {
505  double result(0.);
506  while (true) {
507  result = CLHEP::RandFlat::shoot(engine, HcalPulseShapes::Y11RANGE_);
508  if (CLHEP::RandFlat::shoot(engine, HcalPulseShapes::Y11MAX206_) < HcalPulseShapes::Y11206(result))
509  return result;
510  }
511 }
512 
513 //Original scintillator+Y11 fit from Vasken's 2001 measurement
514 double HcalPulseShapes::Y11203(double t) {
515  return exp(-0.0635-0.1518*t + log(t)*2.528)/2485.9;
516 }
517 
518 //New scintillator+Y11 model from Vasken's 2017 measurement plus a Landau correction term
519 double HcalPulseShapes::Y11206(double t) {
520  //Shifting phase to have better comparison of digi shape with data
521  //If necessary, further digi phase adjustment can be done here:
522  //SimCalorimetry/HcalSimProducers/python/hcalSimParameters_cfi.py
523  //by changing "timePhase"
524  double shift = 7.2;
525 
526  //Fit From Deconvolved Data
527  double A,n,t0,fit;
528  A=0.104204; n=0.44064; t0=10.0186;
529  if(t>shift) fit = A*(1-exp(-(t-shift)/n))*exp(-(t-shift)/t0);
530  else fit = 0.0;
531 
532  //Correction Term
533  double norm,mpv,sigma,corTerm;
534  norm=0.0809882; mpv=0; sigma=20;
535  if(t>shift) corTerm = norm*TMath::Landau((t-shift),mpv,sigma);
536  else corTerm = 0.0;
537 
538  //Overall Y11
539  double frac = 0.11;
540  double val = (1-frac)*fit + frac*corTerm;
541 
542  if(val >= 0) return val;
543  else return 0.0;
544 }
const Shape & getShape(int shapeType) const
void setNBin(int n)
const Shape & heShape() const
static std::vector< double > normalizeShift(std::vector< double > nt, unsigned nbin, int shift)
HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:142
void setShapeBin(int i, float f)
const Shape & hoShape(bool sipm=false) const
const HcalRecoParam * getHcalRecoParam(const HcalGenericDetId &fId) const
void beginRun(edm::EventSetup const &es)
static double generatePhotonTime206(CLHEP::HepRandomEngine *engine)
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:47
Geom::Theta< T > theta() const
static float Y11RANGE_
static const int nBinsSiPM_
const Shape & shapeForReco(const HcalDetId &detId) const
static double analyticPulseShapeSiPMHE(double t)
#define nullptr
double onePulse(double t, double A, double sigma, double theta, double m)
static float Y11MAX203_
static std::vector< double > normalize(std::vector< double > nt, unsigned nbin)
const Shape & shape(const HcalDetId &detId) const
automatically figures out which shape to return
static float Y11MAX206_
const HcalPulseShape & computeSiPMShapeHE206()
static std::vector< double > convolve(unsigned nbin, F1 f1, F2 f2)
T sqrt(T t)
Definition: SSEVec.h:18
double p4[4]
Definition: TauolaWrapper.h:92
static double Y11206(double t)
void computeSiPMShapeData2017()
HcalSubdetector
Definition: HcalAssistant.h:31
const HcalPulseShape & computeSiPMShapeHE203()
void computeSiPMShapeData2018()
const HcalMCParam * getHcalMCParam(const HcalGenericDetId &fId) const
double p2[4]
Definition: TauolaWrapper.h:90
const HcalDbService * theDbService
int nt
Definition: AMPTWrapper.h:32
int k[5][pyjets_maxn]
static const double tmax[3]
const Shape & defaultShape(const HcalDetId &detId) const
in case of conditions problems
const Shape & hfShape() const
void computeHPDShape(float, float, float, float, float, float, float, float, Shape &)
static double generatePhotonTime(CLHEP::HepRandomEngine *engine, unsigned int signalShape)
double gexp(double t, double A, double c, double t0, double s)
unsigned int signalShape() const
Definition: HcalMCParam.h:40
const Shape & hbShape() const
static double Y11203(double t)
double p1[4]
Definition: TauolaWrapper.h:89
T get() const
Definition: EventSetup.h:62
static unsigned int const shift
static double generatePhotonTime203(CLHEP::HepRandomEngine *engine)
T const * product() const
Definition: ESHandle.h:86
static double analyticPulseShapeSiPMHO(double t)