/[PAMELA software]/DarthVader/ToFLevel2/src/ToFLevel2.cpp
ViewVC logotype

Contents of /DarthVader/ToFLevel2/src/ToFLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.29 - (show annotations) (download)
Thu Dec 31 07:55:53 2009 UTC (14 years, 11 months ago) by mocchiut
Branch: MAIN
Changes since 1.28: +4 -0 lines
Small bug fixed

1 /**
2 * \file ToFLevel2.cpp
3 * \author Gianfranca DeRosa, Wolfgang Menn
4 *
5 * WM dec 2008: Description of "GetdEdx" changed
6 * WM dec 2008: "GetdEdxPaddle" modified: Now includes saturation limit
7 * PMTs higher than the saturation limit are not used for dEdx
8 * WM apr 2009: bug found by Nicola in method "GetPaddlePlane"
9 */
10
11 #include <ToFLevel2.h>
12 using namespace std;
13 ClassImp(ToFPMT);
14 ClassImp(ToFdEdx);
15 ClassImp(ToFGeom);
16 ClassImp(ToFTrkVar);
17 ClassImp(ToFLevel2);
18
19 ToFPMT::ToFPMT(){
20 pmt_id = 0;
21 adc = 0.;
22 tdc_tw = 0.;
23 tdc = 0.;
24 }
25
26 ToFPMT::ToFPMT(const ToFPMT &t){
27 pmt_id = t.pmt_id;
28 adc = t.adc;
29 tdc_tw = t.tdc_tw;
30 tdc = t.tdc;
31 }
32
33 void ToFPMT::Clear(Option_t *t){
34 pmt_id = 0;
35 adc = 0.;
36 tdc_tw = 0.;
37 tdc = 0.;
38 }
39
40
41
42 ToFTrkVar::ToFTrkVar() {
43 trkseqno = 0;
44 npmttdc = 0;
45 npmtadc = 0;
46 pmttdc = TArrayI(48);
47 pmtadc = TArrayI(48);
48 tdcflag = TArrayI(48); // gf: 30 Nov 2006
49 adcflag = TArrayI(48); // gf: 30 Nov 2006
50 dedx = TArrayF(48);
51 //
52 //
53 memset(beta, 0, 13*sizeof(Float_t));
54 memset(xtofpos, 0, 3*sizeof(Float_t));
55 memset(ytofpos, 0, 3*sizeof(Float_t));
56 memset(xtr_tof, 0, 6*sizeof(Float_t));
57 memset(ytr_tof, 0, 6*sizeof(Float_t));
58 //
59 };
60
61 void ToFTrkVar::Clear(Option_t *t) {
62 trkseqno = 0;
63 npmttdc = 0;
64 npmtadc = 0;
65 pmttdc.Reset();
66 pmtadc.Reset();
67 tdcflag.Reset(); // gf: 30 Nov 2006
68 adcflag.Reset(); // gf: 30 Nov 2006
69 dedx.Reset();
70 //
71 memset(beta, 0, 13*sizeof(Float_t));
72 memset(xtofpos, 0, 3*sizeof(Float_t));
73 memset(ytofpos, 0, 3*sizeof(Float_t));
74 memset(xtr_tof, 0, 6*sizeof(Float_t));
75 memset(ytr_tof, 0, 6*sizeof(Float_t));
76 //
77 };
78
79 ToFTrkVar::ToFTrkVar(const ToFTrkVar &t){
80
81 trkseqno = t.trkseqno;
82 //
83 npmttdc = t.npmttdc;
84 npmtadc = t.npmtadc;
85 (t.pmttdc).Copy(pmttdc);
86 (t.pmtadc).Copy(pmtadc);
87 (t.tdcflag).Copy(tdcflag); // gf: 30 Nov 2006
88 (t.adcflag).Copy(adcflag); // gf: 30 Nov 2006
89 (t.dedx).Copy(dedx);
90 //
91 memcpy(beta,t.beta,sizeof(beta));
92 memcpy(xtofpos,t.xtofpos,sizeof(xtofpos));
93 memcpy(ytofpos,t.ytofpos,sizeof(ytofpos));
94 memcpy(xtr_tof,t.xtr_tof,sizeof(xtr_tof));
95 memcpy(ytr_tof,t.ytr_tof,sizeof(ytr_tof));
96 //
97 };
98
99 ToFLevel2::ToFLevel2() {
100 //
101 // PMT = new TClonesArray("ToFPMT",12); //ELENA
102 // ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
103 PMT = 0; //ELENA
104 ToFTrk = 0; //ELENA
105 //
106 this->Clear();
107 //
108 };
109
110 void ToFLevel2::Set(){//ELENA
111 if(!PMT)PMT = new TClonesArray("ToFPMT",12); //ELENA
112 if(!ToFTrk)ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
113 }//ELENA
114
115 void ToFLevel2::Clear(Option_t *t){
116 //
117 if(ToFTrk)ToFTrk->Delete(); //ELENA
118 if(PMT)PMT->Delete(); //ELENA
119 memset(tof_j_flag, 0, 6*sizeof(Int_t));
120 unpackError = 0;
121 //
122 };
123
124 void ToFLevel2::Delete(Option_t *t){ //ELENA
125 //
126 if(ToFTrk){
127 ToFTrk->Delete(); //ELENA
128 delete ToFTrk; //ELENA
129 }
130 if(PMT){
131 PMT->Delete(); //ELENA
132 delete PMT; //ELENA
133 } //ELENA
134 //
135 }; //ELENA
136
137 ToFTrkVar *ToFLevel2::GetToFTrkVar(Int_t itrk){
138 //
139 if(itrk >= ntrk()){
140 printf(" ToFLevel2 ERROR: track related variables set %i does not exists! \n",itrk);
141 printf(" stored track related variables = %i \n",ntrk());
142 return(NULL);
143 }
144 //
145 if(!ToFTrk)return 0; //ELENA
146 TClonesArray &t = *(ToFTrk);
147 ToFTrkVar *toftrack = (ToFTrkVar*)t[itrk];
148 return toftrack;
149 }
150
151 ToFPMT *ToFLevel2::GetToFPMT(Int_t ihit){
152 //
153 if(ihit >= npmt()){
154 printf(" ToFLevel2 ERROR: pmt variables set %i does not exists! \n",ihit);
155 printf(" stored pmt variables = %i \n",npmt());
156 return(NULL);
157 }
158 //
159 if(!PMT)return 0; //ELENA
160 TClonesArray &t = *(PMT);
161 ToFPMT *tofpmt = (ToFPMT*)t[ihit];
162 return tofpmt;
163 }
164 //--------------------------------------
165 //
166 //
167 //--------------------------------------
168 /**
169 * Method to get the plane ID (11 12 21 22 31 32) from the plane index (0 1 2 3 4 5)
170 * @param Plane index (0,1,2,3,4,5).
171 */
172 Int_t ToFLevel2::GetToFPlaneID(Int_t ip){
173 if(ip>=0 && ip<6)return 10*((int)(ip/2+1.1))+(ip%2)+1;
174 else return -1;
175 };
176 /**
177 * Method to get the plane index (0 1 2 3 4 5) from the plane ID (11 12 21 22 31 32)
178 * @param plane Plane ID (11, 12, 21, 22, 31, 32)
179 */
180 Int_t ToFLevel2::GetToFPlaneIndex(Int_t plane_id){
181 if(
182 plane_id == 11 ||
183 plane_id == 12 ||
184 plane_id == 21 ||
185 plane_id == 22 ||
186 plane_id == 31 ||
187 plane_id == 32 ||
188 false)return (Int_t)(plane_id/10)*2-1- plane_id%2;
189 else return -1;
190 };
191 /**
192 * Method to know if a given ToF paddle was hit, that is there is a TDC signal
193 * from both PMTs. The method uses the "tof_j_flag" variable.
194 * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
195 * @param paddle_id Paddle ID.
196 * @return 1 if the paddle was hit.
197 */
198 Bool_t ToFLevel2::HitPaddle(Int_t plane, Int_t paddle_id){ //<<< NEW
199 Int_t ip = -1;
200 if (plane>=6 ) ip = GetToFPlaneIndex(plane);
201 else if(plane>=0 && plane < 6) ip = plane;
202 Int_t flag=0;
203 if(ip != -1)flag = tof_j_flag[ip] & (int)pow(2.,(double)paddle_id);
204 if(
205 (ip == 0 && paddle_id < 8 && flag) ||
206 (ip == 1 && paddle_id < 6 && flag) ||
207 (ip == 2 && paddle_id < 2 && flag) ||
208 (ip == 3 && paddle_id < 2 && flag) ||
209 (ip == 4 && paddle_id < 3 && flag) ||
210 (ip == 5 && paddle_id < 3 && flag) ||
211 false) return true;
212 else return false;
213 };
214 /**
215 * Method to get the number of hit paddles on a ToF plane.
216 * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
217 */
218 Int_t ToFLevel2::GetNHitPaddles(Int_t plane){
219 Int_t npad=0;
220 for(Int_t i=0; i<8; i++)npad = npad + (int)HitPaddle(plane,i);
221 return npad;
222 };
223
224 //wm Nov 08
225 //gf Apr 07
226 /**
227 * Method to get the mean dEdx from a ToF layer - ATTENTION:
228 * It will sum up the dEdx of all the paddles, but since by definition
229 * only the paddle hitted by the track gets a dEdx value and the other
230 * paddles are set to zero, the output is just the dEdx of the hitted
231 * paddle in each layer!
232 * The "adcfl" option is not very useful (an artificial dEdx is per
233 * definition= 1 mip and not a real measurement), anyway left in the code
234 * @param notrack Track Number
235 * @param plane Plane index (0,1,2,3,4,5)
236 * @param adcflag in the plane (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
237 */
238 Float_t ToFLevel2::GetdEdx(Int_t notrack, Int_t plane, Int_t adcfl){
239
240 Float_t dedx = 0.;
241 Float_t PadEdx =0.;
242 Int_t SatWarning;
243 Int_t pad=-1;
244 //
245 ToFTrkVar *trk = GetToFTrkVar(notrack);
246 if(!trk) return 0; //ELENA
247 //
248 for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
249 Int_t paddleid=ii;
250 pad = GetPaddleid(plane,paddleid);
251 GetdEdxPaddle(notrack, pad, adcfl, PadEdx, SatWarning);
252 dedx += PadEdx;
253 };
254 //
255 return(dedx);
256 };
257
258 /**
259 * Method to fill the ADC_C 4x12 matrix with the dEdx values and the TDC 4x12 matrix
260 * with the time-walk corrected TDC values.
261 * @param notrack Track Number
262 * @param adc ADC_C matrix with dEdx values
263 * @param tdc TDC matrix
264 */
265 void ToFLevel2::GetMatrix(Int_t notrack, Float_t adc[4][12], Float_t tdc[4][12]){
266 //
267 for (Int_t aa=0; aa<4;aa++){
268 for (Int_t bb=0; bb<12;bb++){
269 adc[aa][bb] = 1000.;
270 tdc[aa][bb] = 4095.;
271 };
272 };
273 //
274 Int_t pmt_id = 0;
275 Int_t hh = 0;
276 Int_t kk = 0;
277 //
278 ToFTrkVar *trk = GetToFTrkVar(notrack);
279 if(!trk)return; //ELENA
280 //
281 for (Int_t i=0; i<trk->npmtadc; i++){
282 //
283 pmt_id = (trk->pmtadc).At(i);
284 //
285 GetPMTIndex(pmt_id,hh,kk);
286 adc[kk][hh] = (trk->dedx).At(i);
287 //
288 };
289 //
290 for (Int_t i=0; i<npmt(); i++){
291 //
292 ToFPMT *pmt = GetToFPMT(i);
293 if(!pmt)break; //ELENA
294 //
295 GetPMTIndex(pmt->pmt_id,hh,kk);
296 //
297 tdc[kk][hh] = pmt->tdc_tw;
298 //
299 };
300 //
301 return;
302 };
303
304
305 /**
306 * Method to get the plane index (0 - 5) for the PMT_ID as input
307 * @param pmt_id PMT_ID (0 - 47)
308 */
309 Int_t ToFLevel2::GetPlaneIndex(Int_t pmt_id){
310 TString pmtname = GetPMTName(pmt_id);
311 pmtname.Resize(3);
312 if ( !strcmp(pmtname,"S11") ) return(0);
313 if ( !strcmp(pmtname,"S12") ) return(1);
314 if ( !strcmp(pmtname,"S21") ) return(2);
315 if ( !strcmp(pmtname,"S22") ) return(3);
316 if ( !strcmp(pmtname,"S31") ) return(4);
317 if ( !strcmp(pmtname,"S32") ) return(5);
318 return(-1);
319 };
320
321
322 /**
323 * Method to get the PMT_ID if the index (4,12) is given. We have 4 channels on
324 * each of the 12 half-boards, this method decodes which PMT is cables to which
325 * channel.
326 * @param hh Channel
327 * @param kk HalfBoard
328 */
329 Int_t ToFLevel2::GetPMTid(Int_t hh, Int_t kk){
330 //
331 short tof[4][24] = {
332 {4, 4, 4, 4, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 2, 3, 3, 3, 3, 4},
333 {1, 3, 5, 7, 10, 12, 2, 4, 2, 4, 6, 8, 10, 12, 1, 5, 3, 9, 7, 9, 11, 1, 5, 9},
334 {2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 2, 1, 2, 1, 2, 2, 2, 3, 3, 4},
335 {6, 8, 12, 10, 8, 6, 4, 2, 12, 10, 8, 6, 4, 2, 9, 7, 11, 11, 5, 3, 1, 3, 7, 11}
336 };
337 //
338 Int_t ind = 0;
339 Int_t k = 0;
340 while (k < 24){
341 Int_t j = 0;
342 while (j < 2){
343 Int_t ch = tof[2*j][k] - 1;
344 Int_t hb = tof[2*j + 1][k] - 1;
345 /* tofEvent->tdc[ch][hb] */
346 if( ch == hh && hb == kk ){
347 ind = 2*k + j;
348 break;
349 };
350 j++;
351 };
352 k++;
353 };
354 return ind;
355 };
356
357
358 /**
359 * Method to get the PMT index if the PMT ID is given. This method is the
360 * "reverse" of method "GetPMTid"
361 * @param ind PMT_ID (0 - 47)
362 * @param hb HalfBoard
363 * @param ch Channel
364 */
365 void ToFLevel2::GetPMTIndex(Int_t ind, Int_t &hb, Int_t &ch){
366 //
367 short tof[4][24] = {
368 {4, 4, 4, 4, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 2, 3, 3, 3, 3, 4},
369 {1, 3, 5, 7, 10, 12, 2, 4, 2, 4, 6, 8, 10, 12, 1, 5, 3, 9, 7, 9, 11, 1, 5, 9},
370 {2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 2, 1, 2, 1, 2, 2, 2, 3, 3, 4},
371 {6, 8, 12, 10, 8, 6, 4, 2, 12, 10, 8, 6, 4, 2, 9, 7, 11, 11, 5, 3, 1, 3, 7, 11}
372 };
373 //
374 Int_t k = 0;
375 while (k < 24){
376 Int_t j = 0;
377 while (j < 2){
378 /* tofEvent->tdc[ch][hb] */
379 if( ind == 2*k + j ){
380 ch = tof[2*j][k] - 1;
381 hb = tof[2*j + 1][k] - 1;
382 return;
383 };
384 j++;
385 };
386 k++;
387 };
388 return;
389 };
390
391
392
393 // wm Nov 08 revision - saturation values included
394 /// gf Apr 07
395 /**
396 * Method to get the dEdx from a given ToF paddle.
397 * If two PMTs are good, the mean dEdx of both PMTs is taken, otherwise
398 * just the dEdx of the "good" PMT. If both PMTs are above saturation => dEdx=1000
399 * @param notrack Track Number
400 * @param Paddle index (0,1,...,23).
401 * @param adcflag in the paddle (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
402 * @param PadEdx dEdx from a given ToF paddle
403 * @param SatWarning 1 if the PMT ios near saturation region (adcraw ~3000)
404 */
405 void ToFLevel2::GetdEdxPaddle(Int_t notrack, Int_t paddleid, Int_t adcfl, Float_t &PadEdx, Int_t &SatWarning){
406
407 /*
408 Float_t PMTsat[48] = {
409 3162.14, 3165.48, 3153.85, 3085.73, 3089.65, 3107.64, 3097.52, 3078.37,
410 3130.05, 3087.07, 3112.22, 3102.92, 3080.58, 3092.55, 3087.94, 3125.03,
411 3094.09, 3143.16, 3125.51, 3181.27, 3092.09, 3124.98, 3069.3, 3095.53,
412 3097.11, 3133.53, 3114.73, 3113.01, 3091.19, 3097.99, 3033.84, 3134.98,
413 3081.37, 3111.04, 3066.77, 3108.17, 3133, 3111.06, 3052.52, 3140.66,
414 3106.33, 3094.85, 3150.85, 3118.8, 3096.24, 3118.47,3111.36, 3117.11 } ;
415 */
416
417 // new values from Napoli dec 2008
418 Float_t PMTsat[48] = {
419 3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
420 3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
421 3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
422 3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
423 3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
424 3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
425
426 for (Int_t i=0; i<48;i++) PMTsat[i] = PMTsat[i] - 5.; // safety margin
427
428
429 PadEdx = 0.;
430 // SatWarning = 1000;
431 SatWarning = 0; // 0=good, increase for each bad PMT
432
433 Float_t dEdx[48] = {0};
434 Int_t pmt_id = -1;
435 Float_t adcraw[48];
436 //
437 ToFTrkVar *trk = GetToFTrkVar(notrack);
438 if(!trk) return; //ELENA
439 //
440
441 Int_t pmtleft=-1;
442 Int_t pmtright=-1;
443 GetPaddlePMT(paddleid, pmtleft, pmtright);
444
445 adcraw[pmtleft] = 4095;
446 adcraw[pmtright] = 4095;
447
448
449 for (Int_t jj=0; jj<npmt(); jj++){
450
451 ToFPMT *pmt = GetToFPMT(jj);
452 if(!pmt)break; //ELENA
453
454 pmt_id = pmt->pmt_id;
455 if(pmt_id==pmtleft){
456 adcraw[pmtleft] = pmt->adc;
457 }
458
459 if(pmt_id==pmtright){
460 adcraw[pmtright] = pmt->adc;
461 }
462 }
463
464
465 for (Int_t i=0; i<trk->npmtadc; i++){
466
467 if((trk->adcflag).At(i)==0 || adcfl==100){
468 if((trk->pmtadc).At(i) == pmtleft)dEdx[pmtleft] = (trk->dedx).At(i);
469 if((trk->pmtadc).At(i) == pmtright)dEdx[pmtright] = (trk->dedx).At(i);
470 }else{
471 if((trk->pmtadc).At(i) == pmtleft)dEdx[pmtleft] = 0.;
472 if((trk->pmtadc).At(i) == pmtright)dEdx[pmtright] = 0.;
473 }
474 }
475
476
477 // if( adcraw[pmtleft] >3000 || adcraw[pmtright] >3000)SatWarning=1; //old version
478
479 // Increase SatWarning Counter for each PMT>Sat
480 if( adcraw[pmtleft] > PMTsat[pmtleft])SatWarning++;
481 if( adcraw[pmtright] > PMTsat[pmtright])SatWarning++;
482
483 // if ADC > sat set dEdx=1000
484 if( adcraw[pmtleft] > PMTsat[pmtleft]) dEdx[pmtleft] = 1000.;
485 if( adcraw[pmtright] > PMTsat[pmtright]) dEdx[pmtright] = 1000. ;
486
487 // if two PMT are good, take mean dEdx, otherwise only the good dEdx
488 if(dEdx[pmtleft]<1000 && dEdx[pmtright]<1000) PadEdx = (dEdx[pmtleft]+dEdx[pmtright])*0.5;
489 if(dEdx[pmtleft]==1000 && dEdx[pmtright]<1000) PadEdx = dEdx[pmtright];
490 if(dEdx[pmtleft]<1000 && dEdx[pmtright]==1000) PadEdx = dEdx[pmtleft];
491
492 };
493 //
494
495
496 // gf Apr 07
497
498 /**
499 * Method to get the PMT name (like "S11_1A") if the PMT_ID is given.
500 * Indexes of corresponding plane, paddle and pmt are also given as output.
501 * @param ind PMT_ID (0 - 47)
502 * @param iplane plane index (0 - 5)
503 * @param ipaddle paddle index (relative to the plane)
504 * @param ipmt pmt index (0(A), 1(B))
505 */
506 TString ToFLevel2::GetPMTName(Int_t ind, Int_t &iplane, Int_t &ipaddle,Int_t &ipmt){
507
508 TString pmtname = " ";
509
510 TString photoS[48] = {
511 "S11_1A", "S11_1B", "S11_2A", "S11_2B", "S11_3A", "S11_3B", "S11_4A",
512 "S11_4B",
513 "S11_5A", "S11_5B", "S11_6A", "S11_6B", "S11_7A", "S11_7B", "S11_8A",
514 "S11_8B",
515 "S12_1A", "S12_1B", "S12_2A", "S12_2B", "S12_3A", "S12_3B", "S12_4A",
516 "S12_4B", "S12_5A", "S12_5B", "S12_6A", "S12_6B",
517 "S21_1A", "S21_1B", "S21_2A", "S21_2B",
518 "S22_1A", "S22_1B", "S22_2A", "S22_2B",
519 "S31_1A", "S31_1B", "S31_2A", "S31_2B", "S31_3A", "S31_3B",
520 "S32_1A", "S32_1B", "S32_2A", "S32_2B", "S32_3A", "S32_3B"
521 };
522
523
524 pmtname = photoS[ind].Data();
525
526 TString ss = pmtname(1,2);
527 iplane = (int)(atoi(ss.Data())/10)*2-3+atoi(ss.Data())%10;
528 ss = pmtname(4);
529 ipaddle = atoi(ss.Data())-1 ;
530 if( pmtname.Contains("A") )ipmt=0;
531 if( pmtname.Contains("B") )ipmt=1;
532
533 return pmtname;
534 };
535 /**
536 * Method to get the PMT name (like "S11_1A") if the PMT_ID is given
537 * @param ind PMT_ID (0 - 47)
538 */
539 TString ToFLevel2::GetPMTName(Int_t ind){
540
541 Int_t iplane = -1;
542 Int_t ipaddle = -1;
543 Int_t ipmt = -1;
544 return GetPMTName(ind,iplane,ipaddle,ipmt);
545
546 };
547
548 // wm jun 08
549 Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane){
550 return GetPaddleIdOfTrack(xtr ,ytr ,plane, 0.4);
551 }
552
553 // gf Apr 07
554 Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane, Float_t margin){
555
556 Double_t xt,yt,xl,xh,yl,yh;
557
558 Float_t tof11_x[8] = {-17.85,-12.75,-7.65,-2.55,2.55,7.65,12.75,17.85};
559 Float_t tof12_y[6] = { -13.75,-8.25,-2.75,2.75,8.25,13.75};
560 Float_t tof21_y[2] = { 3.75,-3.75};
561 Float_t tof22_x[2] = { -4.5,4.5};
562 Float_t tof31_x[3] = { -6.0,0.,6.0};
563 Float_t tof32_y[3] = { -5.0,0.0,5.0};
564
565 // S11 8 paddles 33.0 x 5.1 cm
566 // S12 6 paddles 40.8 x 5.5 cm
567 // S21 2 paddles 18.0 x 7.5 cm
568 // S22 2 paddles 15.0 x 9.0 cm
569 // S31 3 paddles 15.0 x 6.0 cm
570 // S32 3 paddles 18.0 x 5.0 cm
571
572 Int_t paddleidoftrack=-1;
573 //
574
575 //--- S11 ------
576
577 if(plane==0){
578 xt = xtr;
579 yt = ytr;
580 paddleidoftrack=-1;
581 yl = -33.0/2. ;
582 yh = 33.0/2. ;
583 if ((yt>yl)&&(yt<yh)) {
584 for (Int_t i1=0; i1<8;i1++){
585 xl = tof11_x[i1] - (5.1-margin)/2. ;
586 xh = tof11_x[i1] + (5.1-margin)/2. ;
587 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
588 }
589 }
590 }
591 // cout<<"S11 "<<paddleidoftrack[0]<<"\n";
592
593 //--- S12 -------
594 if(plane==1){
595 xt = xtr;
596 yt = ytr;
597 paddleidoftrack=-1;
598 xl = -40.8/2. ;
599 xh = 40.8/2. ;
600
601 if ((xt>xl)&&(xt<xh)) {
602 for (Int_t i1=0; i1<6;i1++){
603 yl = tof12_y[i1] - (5.5-margin)/2. ;
604 yh = tof12_y[i1] + (5.5-margin)/2. ;
605 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
606 }
607 }
608 }
609
610 //--- S21 ------
611
612 if(plane==2){
613 xt = xtr;
614 yt = ytr;
615 paddleidoftrack=-1;
616 xl = -18./2. ;
617 xh = 18./2. ;
618
619 if ((xt>xl)&&(xt<xh)) {
620 for (Int_t i1=0; i1<2;i1++){
621 yl = tof21_y[i1] - (7.5-margin)/2. ;
622 yh = tof21_y[i1] + (7.5-margin)/2. ;
623 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
624 }
625 }
626 }
627
628 //--- S22 ------
629 if(plane==3){
630 xt = xtr;
631 yt = ytr;
632 paddleidoftrack=-1;
633 yl = -15./2. ;
634 yh = 15./2. ;
635
636 if ((yt>yl)&&(yt<yh)) {
637 for (Int_t i1=0; i1<2;i1++){
638 xl = tof22_x[i1] - (9.0-margin)/2. ;
639 xh = tof22_x[i1] + (9.0-margin)/2. ;
640 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
641 }
642 }
643 }
644
645 //--- S31 ------
646 if(plane==4){
647 xt = xtr;
648 yt = ytr;
649 paddleidoftrack=-1;
650 yl = -15.0/2. ;
651 yh = 15.0/2. ;
652
653 if ((yt>yl)&&(yt<yh)) {
654 for (Int_t i1=0; i1<3;i1++){
655 xl = tof31_x[i1] - (6.0-margin)/2. ;
656 xh = tof31_x[i1] + (6.0-margin)/2. ;
657 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
658 }
659 }
660 }
661
662 //--- S32 ------
663 if(plane==5){
664 xt = xtr;
665 yt = ytr;
666 paddleidoftrack=-1;
667 xl = -18.0/2. ;
668 xh = 18.0/2. ;
669
670 if ((xt>xl)&&(xt<xh)) {
671 for (Int_t i1=0; i1<3;i1++){
672 yl = tof32_y[i1] - (5.0-margin)/2. ;
673 yh = tof32_y[i1] + (5.0-margin)/2. ;
674 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
675 }
676 }
677 }
678
679 return paddleidoftrack;
680
681 }
682
683 //
684
685 // gf Apr 07
686
687 void ToFLevel2::GetPMTPaddle(Int_t pmt_id, Int_t &plane, Int_t &paddle){
688
689 plane = GetPlaneIndex(pmt_id);
690
691 if(plane == 0){
692 if(pmt_id==0 || pmt_id==1)paddle=0;
693 if(pmt_id==2 || pmt_id==3)paddle=1;
694 if(pmt_id==4 || pmt_id==5)paddle=2;
695 if(pmt_id==6 || pmt_id==7)paddle=3;
696 if(pmt_id==8 || pmt_id==9)paddle=4;
697 if(pmt_id==10 || pmt_id==11)paddle=5;
698 if(pmt_id==12 || pmt_id==13)paddle=6;
699 if(pmt_id==14 || pmt_id==15)paddle=7;
700 }
701
702 if(plane == 1){
703 if(pmt_id==16 || pmt_id==17)paddle=0;
704 if(pmt_id==18 || pmt_id==19)paddle=1;
705 if(pmt_id==20 || pmt_id==21)paddle=2;
706 if(pmt_id==22 || pmt_id==23)paddle=3;
707 if(pmt_id==24 || pmt_id==25)paddle=4;
708 if(pmt_id==26 || pmt_id==27)paddle=5;
709 }
710
711 if(plane == 2){
712 if(pmt_id==28 || pmt_id==29)paddle=0;
713 if(pmt_id==30 || pmt_id==31)paddle=1;
714 }
715
716 if(plane == 3){
717 if(pmt_id==32 || pmt_id==33)paddle=0;
718 if(pmt_id==34 || pmt_id==35)paddle=1;
719 }
720
721 if(plane == 4){
722 if(pmt_id==36 || pmt_id==37)paddle=0;
723 if(pmt_id==38 || pmt_id==39)paddle=1;
724 if(pmt_id==40 || pmt_id==41)paddle=2;
725 }
726
727 if(plane == 5){
728 if(pmt_id==42 || pmt_id==43)paddle=0;
729 if(pmt_id==44 || pmt_id==45)paddle=1;
730 if(pmt_id==46 || pmt_id==47)paddle=2;
731 }
732 return;
733 }
734
735 //
736
737 // gf Apr 07
738
739 void ToFLevel2::GetPaddlePMT(Int_t paddle, Int_t &pmtleft, Int_t &pmtright){
740 pmtleft=paddle*2;
741 pmtright= pmtleft+1;
742 return;
743 }
744
745 //
746
747
748
749 // // gf Apr 07
750
751 void ToFLevel2::GetPaddleGeometry(Int_t plane, Int_t paddle, Float_t &xleft, Float_t &xright, Float_t &yleft, Float_t &yright){
752
753 Int_t i1;
754
755 Float_t tof11_x[8] = {-17.85,-12.75,-7.65,-2.55,2.55,7.65,12.75,17.85};
756 Float_t tof12_y[6] = { -13.75,-8.25,-2.75,2.75,8.25,13.75};
757 Float_t tof21_y[2] = { 3.75,-3.75};
758 Float_t tof22_x[2] = { -4.5,4.5};
759 Float_t tof31_x[3] = { -6.0,0.,6.0};
760 Float_t tof32_y[3] = { -5.0,0.0,5.0};
761
762 // S11 8 paddles 33.0 x 5.1 cm
763 // S12 6 paddles 40.8 x 5.5 cm
764 // S21 2 paddles 18.0 x 7.5 cm
765 // S22 2 paddles 15.0 x 9.0 cm
766 // S31 3 paddles 15.0 x 6.0 cm
767 // S32 3 paddles 18.0 x 5.0 cm
768
769 if(plane==0)
770 {
771 for (i1=0; i1<8;i1++){
772 if(i1 == paddle){
773 xleft = tof11_x[i1] - 5.1/2.;
774 xright = tof11_x[i1] + 5.1/2.;
775 yleft = -33.0/2.;
776 yright = 33.0/2.;
777 }
778 }
779 }
780
781 if(plane==1)
782 {
783 for (i1=0; i1<6;i1++){
784 if(i1 == paddle){
785 xleft = -40.8/2.;
786 xright = 40.8/2.;
787 yleft = tof12_y[i1] - 5.5/2.;
788 yright = tof12_y[i1] + 5.5/2.;
789 }
790 }
791 }
792
793 if(plane==2)
794 {
795 for (i1=0; i1<2;i1++){
796 if(i1 == paddle){
797 xleft = -18./2.;
798 xright = 18./2.;
799 yleft = tof21_y[i1] - 7.5/2.;
800 yright = tof21_y[i1] + 7.5/2.;
801 }
802 }
803 }
804
805 if(plane==3)
806 {
807 for (i1=0; i1<2;i1++){
808 if(i1 == paddle){
809 xleft = tof22_x[i1] - 9.0/2.;
810 xright = tof22_x[i1] + 9.0/2.;
811 yleft = -15./2.;
812 yright = 15./2.;
813 }
814 }
815 }
816
817
818 if(plane==4)
819 {
820 for (i1=0; i1<3;i1++){
821 if(i1 == paddle){
822 xleft = tof31_x[i1] - 6.0/2.;
823 xright = tof31_x[i1] + 6.0/2.;
824 yleft = -15./2.;
825 yright = 15./2.;
826 }
827 }
828 }
829
830 if(plane==5)
831 {
832 for (i1=0; i1<3;i1++){
833 if(i1 == paddle){
834 xleft = -18.0/2.;
835 xright = 18.0/2.;
836 yleft = tof32_y[i1] - 5.0/2.;
837 yright = tof32_y[i1] + 5.0/2.;
838 }
839 }
840 }
841 return;
842 }
843
844 // gf Apr 07
845 /**
846 * Method to get the paddle index (0,...23) if the plane ID and the paddle id in the plane is given.
847 * This method is the
848 * "reverse" of method "GetPaddlePlane"
849 * @param plane (0 - 5)
850 * @param paddle (plane=0, paddle = 0,...5)
851 * @param padid (0 - 23)
852 */
853 Int_t ToFLevel2::GetPaddleid(Int_t plane, Int_t paddle)
854 {
855 Int_t padid=-1;
856 Int_t pads[6]={8,6,2,2,3,3};
857
858 int somma=0;
859 int np=plane;
860 for(Int_t j=0; j<np; j++){
861 somma+=pads[j];
862 }
863 padid=paddle+somma;
864 return padid;
865
866 }
867
868
869 // gf Apr 07
870 /**
871 * Method to get the plane ID and the paddle id in the plane if the paddle index (0,...23) is given.
872 * This method is the
873 * "reverse" of method "GetPaddleid"
874 * @param pad (0 - 23)
875 * @param plane (0 - 5)
876 * @param paddle (plane=0, paddle = 0,...5)
877 */
878 void ToFLevel2::GetPaddlePlane(Int_t pad, Int_t &plane, Int_t &paddle)
879 {
880
881 Int_t pads11=8;
882 Int_t pads12=6;
883 Int_t pads21=2;
884 Int_t pads22=2;
885 Int_t pads31=3;
886 // Int_t pads32=3;
887
888 if(pad<8){
889 plane=0;
890 paddle=pad;
891 return;
892 }
893
894 if((7<pad)&&(pad<14)){
895 plane=1;
896 paddle=pad-pads11;
897 return;
898 }
899
900 if((13<pad)&&(pad<16)){
901 plane=2;
902 paddle=pad-pads11-pads12;
903 return;
904 }
905
906 if((15<pad)&&(pad<18)){
907 plane=3;
908 paddle=pad-pads11-pads12-pads21;
909 return;
910 }
911
912 if((17<pad)&&(pad<21)){
913 plane=4;
914 paddle=pad-pads11-pads12-pads21-pads22;
915 return;
916 }
917
918 if((20<pad)&&(pad<24)){
919 plane=5;
920 paddle=pad-pads11-pads12-pads21-pads22-pads31;
921 return;
922 }
923
924 }
925
926
927 Int_t ToFLevel2::GetNPaddle(Int_t plane){
928
929 Int_t npaddle=-1;
930
931 Int_t pads11=8;
932 Int_t pads12=6;
933 Int_t pads21=2;
934 Int_t pads22=2;
935 Int_t pads31=3;
936 Int_t pads32=3;
937
938 if(plane==0)npaddle=pads11;
939 if(plane==1)npaddle=pads12;
940 if(plane==2)npaddle=pads21;
941 if(plane==3)npaddle=pads22;
942 if(plane==4)npaddle=pads31;
943 if(plane==5)npaddle=pads32;
944
945 return npaddle;
946
947 }
948
949
950
951 /// wm feb 08
952
953 /**
954 * Method to calculate Beta from the 12 single measurements
955 * we check the individual weights for artificial TDC values, then calculate
956 * am mean beta for the first time. In a second step we loop again through
957 * the single measurements, checking for the residual from the mean
958 * The cut on the residual reject measurements > "x"-sigma. A chi2 value is
959 * calculated, furthermore a "quality" value by adding the weights which
960 * are finally used. If all measurements are taken, "quality" will be = 22.47.
961 * A chi2 cut around 3-4 and a quality-cut > 20 is needed for clean beta
962 * measurements like antiprotons etc.
963 * The Level2 output is derived in the fortran routines using: 10.,10.,20.
964 * @param notrack Track Number
965 * @param cut on residual: difference between single measurement and mean
966 * @param cut on "quality"
967 * @param cut on chi2
968 */
969
970 Float_t ToFLevel2::CalcBeta(Int_t notrack, Float_t resmax, Float_t qualitycut, Float_t chi2cut){
971
972 // cout<<" in CalcBeta "<<resmax<<" "<<chi2cut<<" "<<qualitycut<<endl;
973
974 Float_t bxx = 100.;
975 //
976 ToFTrkVar *trk = GetToFTrkVar(notrack);
977 if(!trk) return 0; //ELENA
978
979
980 Float_t chi2,xhelp,beta_mean;
981 Float_t w_i[12],quality,sw,sxw,res,betachi,beta_mean_inv;
982 Float_t b[12],tdcfl;
983 Int_t pmt_id,pmt_plane;
984
985 for (Int_t i=0; i<12; i++){
986 b[i] = trk->beta[i];
987 }
988
989
990 //========================================================================
991 //--- Find out ToF layers with artificial TDC values & fill vector ---
992 //========================================================================
993
994 Float_t w_il[6];
995
996 for (Int_t jj=0; jj<6;jj++) {
997 w_il[jj] = 1000.;
998 }
999
1000
1001 for (Int_t i=0; i<trk->npmttdc; i++){
1002 //
1003 pmt_id = (trk->pmttdc).At(i);
1004 pmt_plane = GetPlaneIndex(pmt_id);
1005 tdcfl = (trk->tdcflag).At(i);
1006 if (w_il[pmt_plane] != 1.) w_il[pmt_plane] = tdcfl; //tdcflag
1007 };
1008
1009 //========================================================================
1010 //--- Set weights for the 12 measurements using information for top and bottom:
1011 //--- if no measurements: weight = set to very high value=> not used
1012 //--- top or bottom artificial: weight*sqrt(2)
1013 //--- top and bottom artificial: weight*sqrt(2)*sqrt(2)
1014 //========================================================================
1015
1016 Int_t itop[12] = {0,0,1,1,2,2,3,3,0,0,1,1};
1017 Int_t ibot[12] = {4,5,4,5,4,5,4,5,2,3,2,3};
1018
1019 xhelp= 1E09;
1020
1021 for (Int_t jj=0; jj<12;jj++) {
1022 if (jj<4) xhelp = 0.11; // S1-S3
1023 if ((jj>3)&&(jj<8)) xhelp = 0.18; // S2-S3
1024 if (jj>7) xhelp = 0.28; // S1-S2
1025 if ((w_il[itop[jj]] == 1000.) && (w_il[ibot[jj]] == 1000.)) xhelp = 1E09;
1026 if ((w_il[itop[jj]] == 1) || (w_il[ibot[jj]] == 1.)) xhelp = xhelp*1.414 ;
1027 if ((w_il[itop[jj]] == 1) && (w_il[ibot[jj]] == 1.)) xhelp = xhelp*2. ;
1028
1029 w_i[jj] = 1./xhelp;
1030 }
1031
1032
1033 //========================================================================
1034 //--- Calculate mean beta for the first time -----------------------------
1035 //--- We are using "1/beta" since its error is gaussian ------------------
1036 //========================================================================
1037
1038 Int_t icount=0;
1039 sw=0.;
1040 sxw=0.;
1041 beta_mean=100.;
1042
1043 for (Int_t jj=0; jj<12;jj++){
1044 if ((fabs(1./b[jj])>0.1)&&(fabs(1./b[jj])<15.))
1045 {
1046 icount= icount+1;
1047 sxw=sxw + (1./b[jj])*w_i[jj]*w_i[jj] ;
1048 sw =sw + w_i[jj]*w_i[jj] ;
1049
1050 }
1051 }
1052
1053 if (icount>0) beta_mean=1./(sxw/sw);
1054 beta_mean_inv = 1./beta_mean;
1055
1056 //========================================================================
1057 //--- Calculate beta for the second time, use residuals of the single
1058 //--- measurements to get a chi2 value
1059 //========================================================================
1060
1061 icount=0;
1062 sw=0.;
1063 sxw=0.;
1064 betachi = 100.;
1065 chi2 = 0.;
1066 quality=0.;
1067
1068
1069 for (Int_t jj=0; jj<12;jj++){
1070 if ((fabs(1./b[jj])>0.1)&&(fabs(1./b[jj])<15.)&&(w_i[jj]>0.01)) {
1071 res = beta_mean_inv - (1./b[jj]) ;
1072 if (fabs(res*w_i[jj])<resmax) {;
1073 chi2 = chi2 + pow((res*w_i[jj]),2) ;
1074 icount= icount+1;
1075 sxw=sxw + (1./b[jj])*w_i[jj]*w_i[jj] ;
1076 sw =sw + w_i[jj]*w_i[jj] ;
1077 }
1078 }
1079 }
1080 quality = sqrt(sw) ;
1081
1082 if (icount==0) chi2 = 1000.;
1083 if (icount>0) chi2 = chi2/(icount) ;
1084 if (icount>0) betachi=1./(sxw/sw);
1085
1086 bxx = 100.;
1087 if ((chi2 < chi2cut)&&(quality>qualitycut)) bxx = betachi;
1088 //
1089 return(bxx);
1090 };
1091
1092
1093 ////////////////////////////////////////////////////
1094 ////////////////////////////////////////////////////
1095
1096
1097 /**
1098 * Fills a struct cToFLevel2 with values from a ToFLevel2 object (to put data into a F77 common).
1099 */
1100 void ToFLevel2::GetLevel2Struct(cToFLevel2 *l2) const{
1101
1102 for(Int_t i=0;i<6;i++)
1103 l2->tof_j_flag[i]=tof_j_flag[i];
1104
1105 if(ToFTrk){ //ELENA
1106 l2->ntoftrk = ToFTrk->GetEntries();
1107 for(Int_t j=0;j<l2->ntoftrk;j++){
1108 l2->toftrkseqno[j]= ((ToFTrkVar*)ToFTrk->At(j))->trkseqno;
1109 l2->npmttdc[j]= ((ToFTrkVar*)ToFTrk->At(j))->npmttdc;
1110 for(Int_t i=0;i<l2->npmttdc[j];i++){
1111 l2->pmttdc[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->pmttdc.At(i);
1112 l2->tdcflag[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->tdcflag.At(i); // gf: 30 Nov 2006
1113 }
1114 for(Int_t i=0;i<13;i++)
1115 l2->beta[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->beta[i];
1116
1117 l2->npmtadc[j]= ((ToFTrkVar*)ToFTrk->At(j))->npmtadc;
1118 for(Int_t i=0;i<l2->npmtadc[j];i++){
1119 l2->pmtadc[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->pmtadc.At(i);
1120 l2->adcflag[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->adcflag.At(i); // gf: 30 Nov 2006
1121 l2->dedx[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->dedx.At(i);
1122 }
1123 for(Int_t i=0;i<3;i++){
1124 l2->xtofpos[i][j]=((ToFTrkVar*)ToFTrk->At(j))->xtofpos[i];
1125 l2->ytofpos[i][j]=((ToFTrkVar*)ToFTrk->At(j))->ytofpos[i];
1126 }
1127 for(Int_t i=0;i<6;i++){
1128 l2->xtr_tof[i][j]=((ToFTrkVar*)ToFTrk->At(j))->xtr_tof[i];
1129 l2->ytr_tof[i][j]=((ToFTrkVar*)ToFTrk->At(j))->ytr_tof[i];
1130 }
1131 }
1132 } //ELENA
1133
1134 if(PMT){ //ELENA
1135 l2->npmt = PMT->GetEntries();
1136 for(Int_t j=0;j<l2->npmt;j++){
1137 l2->pmt_id[j] = ((ToFPMT*)PMT->At(j))->pmt_id;
1138 l2->adc[j] =((ToFPMT*)PMT->At(j))->adc;
1139 l2->tdc_tw[j] =((ToFPMT*)PMT->At(j))->tdc_tw;
1140 }
1141 } //ELENA
1142 }
1143
1144
1145 //
1146 // Reprocessing tool // Emiliano 08/04/07
1147 //
1148 Int_t ToFLevel2::Process(TrkLevel2 *trk, TrigLevel2 *trg, GL_RUN *run, OrbitalInfo *orb, Bool_t force){
1149 //
1150 // Copiare qui qualcosa di simile a calonuclei per evitare di riprocessare sempre tutto
1151 //
1152 printf("\n\n\n ERROR: NOT IMPLEMENTED ANYMORE, write Emiliano if you need this method (Emiliano.Mocchiutti@ts.infn.it) \n\n\n");
1153 return(-1);
1154 // //
1155 // // structures to communicate with F77
1156 // //
1157 // extern struct ToFInput tofinput_;
1158 // extern struct ToFOutput tofoutput_;
1159 // //
1160 // // DB connection
1161 // //
1162 // TString host;
1163 // TString user;
1164 // TString psw;
1165 // const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
1166 // const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
1167 // const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
1168 // if ( !pamdbhost ) pamdbhost = "";
1169 // if ( !pamdbuser ) pamdbuser = "";
1170 // if ( !pamdbpsw ) pamdbpsw = "";
1171 // if ( strcmp(pamdbhost,"") ) host = pamdbhost;
1172 // if ( strcmp(pamdbuser,"") ) user = pamdbuser;
1173 // if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
1174 // //
1175 // //
1176 // TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
1177 // if ( !dbc->IsConnected() ) return 1;
1178 // stringstream myquery;
1179 // myquery.str("");
1180 // myquery << "SET time_zone='+0:00'";
1181 // dbc->Query(myquery.str().c_str());
1182 // GL_PARAM *glparam = new GL_PARAM();
1183 // glparam->Query_GL_PARAM(1,1,dbc); // parameters stored in DB in GL_PRAM table
1184 // trk->LoadField(glparam->PATH+glparam->NAME);
1185 // //
1186 // Bool_t defcal = true;
1187 // Int_t error=glparam->Query_GL_PARAM(run->RUNHEADER_TIME,201,dbc); // parameters stored in DB in GL_PRAM table
1188 // if ( error<0 ) {
1189 // return(1);
1190 // };
1191 // printf(" Reading ToF parameter file: %s \n",(glparam->PATH+glparam->NAME).Data());
1192 // if ( (UInt_t)glparam->TO_TIME != (UInt_t)4294967295UL ) defcal = false;
1193 // //
1194 // Int_t nlen = (Int_t)(glparam->PATH+glparam->NAME).Length();
1195 // rdtofcal((char *)(glparam->PATH+glparam->NAME).Data(),&nlen);
1196 // //
1197 // Int_t adc[4][12];
1198 // Int_t tdc[4][12];
1199 // Float_t tdcc[4][12];
1200 // //
1201 // // process tof data
1202 // //
1203 // for (Int_t hh=0; hh<12;hh++){
1204 // for (Int_t kk=0; kk<4;kk++){
1205 // adc[kk][hh] = 4095;
1206 // tdc[kk][hh] = 4095;
1207 // tdcc[kk][hh] = 4095.;
1208 // tofinput_.adc[hh][kk] = 4095;
1209 // tofinput_.tdc[hh][kk] = 4095;
1210 // };
1211 // };
1212 // Int_t ntrkentry = 0;
1213 // Int_t npmtentry = 0;
1214 // Int_t gg = 0;
1215 // Int_t hh = 0;
1216 // Int_t adcf[48];
1217 // memset(adcf, 0, 48*sizeof(Int_t));
1218 // Int_t tdcf[48];
1219 // memset(tdcf, 0, 48*sizeof(Int_t));
1220 // for (Int_t pm=0; pm < this->ntrk() ; pm++){
1221 // ToFTrkVar *ttf = this->GetToFTrkVar(pm);
1222 // for ( Int_t nc=0; nc < ttf->npmttdc; nc++){
1223 // if ( (ttf->tdcflag).At(nc) != 0 ) tdcf[(ttf->pmttdc).At(nc)] = 1;
1224 // };
1225 // for ( Int_t nc=0; nc < ttf->npmtadc; nc++){
1226 // if ( (ttf->adcflag).At(nc) != 0 ) adcf[(ttf->pmtadc).At(nc)] = 1;
1227 // };
1228 // };
1229 // //
1230 // for (Int_t pm=0; pm < this->npmt() ; pm++){
1231 // ToFPMT *pmt = this->GetToFPMT(pm);
1232 // this->GetPMTIndex(pmt->pmt_id, gg, hh);
1233 // if ( adcf[pmt->pmt_id] == 0 ){
1234 // tofinput_.adc[gg][hh] = (int)pmt->adc;
1235 // adc[hh][gg] = (int)pmt->adc;
1236 // };
1237 // if ( tdcf[pmt->pmt_id] == 0 ){
1238 // tofinput_.tdc[gg][hh] = (int)pmt->tdc;
1239 // tdc[hh][gg] = (int)pmt->tdc;
1240 // };
1241 // tdcc[hh][gg] = (float)pmt->tdc_tw;
1242 // // Int_t pppid = this->GetPMTid(hh,gg);
1243 // // printf(" pm %i pmt_id %i pppid %i hh %i gg %i tdcc %f tdc %f adc %f \n",pm,pmt->pmt_id,pppid,hh,gg,pmt->tdc_tw,pmt->tdc,pmt->adc);
1244 // };
1245 // //
1246 // Int_t unpackError = this->unpackError;
1247 // //
1248 // for (Int_t hh=0; hh<5;hh++){
1249 // tofinput_.patterntrig[hh]=trg->patterntrig[hh];
1250 // };
1251 // //
1252 // this->Clear();
1253 // //
1254 // Int_t pmt_id = 0;
1255 // ToFPMT *t_pmt = new ToFPMT();
1256 // if(!(this->PMT)) this->PMT = new TClonesArray("ToFPMT",12); //ELENA
1257 // TClonesArray &tpmt = *this->PMT;
1258 // ToFTrkVar *t_tof = new ToFTrkVar();
1259 // if(!(this->ToFTrk)) this->ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
1260 // TClonesArray &t = *this->ToFTrk;
1261 // //
1262 // //
1263 // // Here we have calibrated data, ready to be passed to the FORTRAN routine which will extract common and track-related variables.
1264 // //
1265 // npmtentry = 0;
1266 // //
1267 // ntrkentry = 0;
1268 // //
1269 // // Calculate tracks informations from ToF alone
1270 // //
1271 // tofl2com();
1272 // //
1273 // memcpy(this->tof_j_flag,tofoutput_.tof_j_flag,6*sizeof(Int_t));
1274 // //
1275 // t_tof->trkseqno = -1;
1276 // //
1277 // // and now we must copy from the output structure to the level2 class:
1278 // //
1279 // t_tof->npmttdc = 0;
1280 // //
1281 // for (Int_t hh=0; hh<12;hh++){
1282 // for (Int_t kk=0; kk<4;kk++){
1283 // if ( tofoutput_.tofmask[hh][kk] != 0 ){
1284 // pmt_id = this->GetPMTid(kk,hh);
1285 // t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc);
1286 // t_tof->tdcflag.AddAt(tofoutput_.tdcflagtof[hh][kk],t_tof->npmttdc); // gf: Jan 09/07
1287 // t_tof->npmttdc++;
1288 // };
1289 // };
1290 // };
1291 // for (Int_t kk=0; kk<13;kk++){
1292 // t_tof->beta[kk] = tofoutput_.betatof_a[kk];
1293 // }
1294 // //
1295 // t_tof->npmtadc = 0;
1296 // for (Int_t hh=0; hh<12;hh++){
1297 // for (Int_t kk=0; kk<4;kk++){
1298 // if ( tofoutput_.adctof_c[hh][kk] < 1000 ){
1299 // t_tof->dedx.AddAt(tofoutput_.adctof_c[hh][kk],t_tof->npmtadc);
1300 // pmt_id = this->GetPMTid(kk,hh);
1301 // t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc);
1302 // t_tof->adcflag.AddAt(tofoutput_.adcflagtof[hh][kk],t_tof->npmtadc); // gf: Jan 09/07
1303 // t_tof->npmtadc++;
1304 // };
1305 // };
1306 // };
1307 // //
1308 // memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos));
1309 // memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos));
1310 // memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof));
1311 // memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof));
1312 // //
1313 // new(t[ntrkentry]) ToFTrkVar(*t_tof);
1314 // ntrkentry++;
1315 // t_tof->Clear();
1316 // //
1317 // //
1318 // //
1319 // t_pmt->Clear();
1320 // //
1321 // for (Int_t hh=0; hh<12;hh++){
1322 // for (Int_t kk=0; kk<4;kk++){
1323 // // new WM
1324 // if ( tofoutput_.tdc_c[hh][kk] < 4095 || adc[kk][hh] < 4095 || tdc[kk][hh] < 4095 ){
1325 // // if ( tdcc[kk][hh] < 4095. || adc[kk][hh] < 4095 || tdc[kk][hh] < 4095 ){
1326 // //
1327 // t_pmt->pmt_id = this->GetPMTid(kk,hh);
1328 // t_pmt->tdc_tw = tofoutput_.tdc_c[hh][kk];
1329 // t_pmt->adc = (Float_t)adc[kk][hh];
1330 // t_pmt->tdc = (Float_t)tdc[kk][hh];
1331 // //
1332 // new(tpmt[npmtentry]) ToFPMT(*t_pmt);
1333 // npmtentry++;
1334 // t_pmt->Clear();
1335 // };
1336 // };
1337 // };
1338 // //
1339 // // Calculate track-related variables
1340 // //
1341 // if ( trk->ntrk() > 0 ){
1342 // //
1343 // // We have at least one track
1344 // //
1345 // //
1346 // // Run over tracks
1347 // //
1348 // for(Int_t nt=0; nt < trk->ntrk(); nt++){
1349 // //
1350 // TrkTrack *ptt = trk->GetStoredTrack(nt);
1351 // //
1352 // // Copy the alpha vector in the input structure
1353 // //
1354 // for (Int_t e = 0; e < 5 ; e++){
1355 // tofinput_.al_pp[e] = ptt->al[e];
1356 // };
1357 // //
1358 // // Get tracker related variables for this track
1359 // //
1360 // toftrk();
1361 // //
1362 // // Copy values in the class from the structure (we need to use a temporary class to store variables).
1363 // //
1364 // t_tof->npmttdc = 0;
1365 // for (Int_t hh=0; hh<12;hh++){
1366 // for (Int_t kk=0; kk<4;kk++){
1367 // if ( tofoutput_.tofmask[hh][kk] != 0 ){
1368 // pmt_id = this->GetPMTid(kk,hh);
1369 // t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc);
1370 // t_tof->tdcflag.AddAt(tofoutput_.tdcflag[hh][kk],t_tof->npmttdc); // gf: Jan 09/07
1371 // t_tof->npmttdc++;
1372 // };
1373 // };
1374 // };
1375 // for (Int_t kk=0; kk<13;kk++){
1376 // t_tof->beta[kk] = tofoutput_.beta_a[kk];
1377 // };
1378 // //
1379 // t_tof->npmtadc = 0;
1380 // for (Int_t hh=0; hh<12;hh++){
1381 // for (Int_t kk=0; kk<4;kk++){
1382 // if ( tofoutput_.adc_c[hh][kk] < 1000 ){
1383 // t_tof->dedx.AddAt(tofoutput_.adc_c[hh][kk],t_tof->npmtadc);
1384 // pmt_id = this->GetPMTid(kk,hh);
1385 // t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc);
1386 // t_tof->adcflag.AddAt(tofoutput_.adcflag[hh][kk],t_tof->npmtadc); // gf: Jan 09/07
1387 // t_tof->npmtadc++;
1388 // };
1389 // };
1390 // };
1391 // //
1392 // memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos));
1393 // memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos));
1394 // memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof));
1395 // memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof));
1396 // //
1397 // // Store the tracker track number in order to be sure to have shyncronized data during analysis
1398 // //
1399 // t_tof->trkseqno = nt;
1400 // //
1401 // // create a new object for this event with track-related variables
1402 // //
1403 // new(t[ntrkentry]) ToFTrkVar(*t_tof);
1404 // ntrkentry++;
1405 // t_tof->Clear();
1406 // //
1407 // }; // loop on all the tracks
1408 // //
1409 // this->unpackError = unpackError;
1410 // if ( defcal ){
1411 // this->default_calib = 1;
1412 // } else {
1413 // this->default_calib = 0;
1414 // };
1415 //};
1416 // return(0);
1417 }
1418
1419
1420 ToFdEdx::ToFdEdx()
1421 {
1422 memset(conn,0,12*sizeof(Bool_t));
1423 memset(ts,0,12*sizeof(UInt_t));
1424 memset(te,0,12*sizeof(UInt_t));
1425 Define_PMTsat();
1426 Clear();
1427 }
1428 //------------------------------------------------------------------------
1429 void ToFdEdx::CheckConnectors(UInt_t atime, GL_PARAM *glparam, TSQLServer *dbc)
1430 {
1431 for(int i=0; i<12; i++){
1432 if(atime<=ts[i] || atime>te[i]){
1433 Int_t error=glparam->Query_GL_PARAM(atime,210+i,dbc); // parameters stored in DB in GL_PRAM table
1434 if ( error<0 ) {
1435 conn[i]=false;
1436 ts[i]=0;
1437 te[i]=numeric_limits<UInt_t>::max();
1438 };
1439 if ( !error ){
1440 conn[i]=true;
1441 ts[i]=glparam->FROM_TIME;
1442 te[i]=glparam->TO_TIME;
1443 }
1444 if ( error>0 ){
1445 conn[i]=false;
1446 ts[i]=glparam->TO_TIME;
1447 TSQLResult *pResult;
1448 TSQLRow *row;
1449 TString query= Form("SELECT FROM_TIME FROM GL_PARAM WHERE TYPE=%i AND FROM_TIME>=%i ORDER BY FROM_TIME ASC LIMIT 1;",210+i,atime);
1450 pResult=dbc->Query(query.Data());
1451 if(!pResult->GetRowCount()){
1452 te[i]=numeric_limits<UInt_t>::max();
1453 }else{
1454 row=pResult->Next();
1455 te[i]=(UInt_t)atoll(row->GetField(0));
1456 }
1457 }
1458 //
1459
1460 }
1461 }
1462
1463 }
1464 //------------------------------------------------------------------------
1465 void ToFdEdx::Clear(Option_t *option)
1466 {
1467 //
1468 // Set arrays and initialize structure
1469 eDEDXpmt.Set(48); eDEDXpmt.Reset(-1); // Set array size and reset structure
1470 //
1471 };
1472
1473 //------------------------------------------------------------------------
1474 void ToFdEdx::Print(Option_t *option)
1475 {
1476 //
1477 printf("========================================================================\n");
1478
1479 };
1480
1481 //------------------------------------------------------------------------
1482 void ToFdEdx::Init(pamela::tof::TofEvent *tofl0)
1483 {
1484 //
1485 ToFLevel2 tf;
1486 for (Int_t gg=0; gg<4;gg++){
1487 for (Int_t hh=0; hh<12;hh++){
1488 // tofinput_.tdc[hh][gg]=tofEvent->tdc[gg][hh];
1489 int mm = tf.GetPMTid(gg,hh);
1490 adc[mm]=tofl0->adc[gg][hh];
1491 };
1492 };
1493
1494 };
1495
1496 //------------------------------------------------------------------------
1497 void ToFdEdx::Init(Int_t gg, Int_t hh, Float_t adce)
1498 {
1499 //
1500 ToFLevel2 tf;
1501 // for (Int_t gg=0; gg<4;gg++){
1502 // for (Int_t hh=0; hh<12;hh++){
1503 int mm = tf.GetPMTid(gg,hh);
1504 adc[mm]=adce;
1505
1506 };
1507 //------------------------------------------------------------------------
1508 void ToFdEdx::Process(UInt_t atime, Float_t betamean, Float_t *xtr_tof, Float_t *ytr_tof)
1509 {
1510 // the parameters should be already initialised by InitPar()
1511 Clear();
1512
1513 // define angle:
1514 double dx = xtr_tof[1] - xtr_tof[5];
1515 double dy = ytr_tof[0] - ytr_tof[4];
1516 double dr = sqrt(dx*dx+dy*dy);
1517 double theta=atan(dr/76.81);
1518 //
1519 if ( xtr_tof[1] > 99. || xtr_tof[5] > 99. || ytr_tof[0] > 99. || ytr_tof[4] > 99. ) theta = 0.;
1520 for (Int_t ii=0; ii<6; ii++){
1521 if ( xtr_tof[ii] > 99. ) xtr_tof[ii] = 0.;
1522 if ( ytr_tof[ii] > 99. ) xtr_tof[ii] = 0.;
1523 };
1524 //
1525
1526
1527 for( int ii=0; ii<48; ii++ ) {
1528 //
1529 // printf(" ii %i beta %f atime %u xtr 1 %f ytr 1 %f adc %f \n",ii,betamean,atime,xtr_tof[0],ytr_tof[0],adc[ii]);
1530 if( adc[ii] >= PMTsat[ii]-5 ) continue;
1531 if( adc[ii] <= 0. ) continue;
1532 //
1533 double adcpC = f_adcPC( adc[ii] ); // - adc conversion in pC
1534 double adccorr = adcpC*fabs(cos(theta));
1535 //
1536 if(adccorr<=0.) continue;
1537
1538 //--------------------- TABLE OF PERIODS WITH HV PROBLEMS ----------------------------
1539
1540 int Aconn=conn[0]; // PMT 0,20,22,24
1541 int Bconn=conn[1]; // PMT 6,12,26,34
1542 int Cconn=conn[2]; // PMT 4,14,28,32
1543 int Dconn=conn[3]; // PMT 2,8,10,30
1544 int Econn=conn[4]; // PMT 42,43,44,47
1545 int Fconn=conn[5]; // PMT 7,19,23,27
1546 int Gconn=conn[6]; // PMT 3,11,25,33
1547 int Hconn=conn[7]; // PMT 1,9,13,21
1548 int Iconn=conn[8]; // PMT 5,29,31,35
1549 int Lconn=conn[9]; // PMT 37,40,45,46
1550 int Mconn=conn[10]; // PMT 15,16,17,18
1551 int Nconn=conn[11]; // PMT 36,38,39,41
1552
1553 // int standard=0;
1554 if( false ) cout << Gconn << Iconn << Lconn <<endl;
1555 int S115B_ok=0;
1556 int S115B_break=0;
1557
1558 if(atime<1158720000)S115B_ok=1;
1559 else S115B_break=1;
1560
1561
1562 //------------------------------------------------------------------------
1563
1564 //---------------------------------------------------- Z reconstruction
1565
1566 double adcHe, adcnorm, adclin, dEdx, Zeta;
1567
1568 adcHe=-2;
1569 adcnorm=-2;
1570 adclin=-2;
1571 dEdx=-2;
1572 Zeta=-2;
1573
1574 if(Aconn==1 && (ii==0 || ii==20 || ii==22 || ii==24)){
1575 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.675;
1576 }
1577 else if(Bconn==1 && (ii==6 || ii==12 || ii==26 || ii==34)){
1578 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/2.482;
1579 }
1580 else if(Cconn==1 && (ii==4 || ii==14 || ii==28 || ii==32)){
1581 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.464;
1582 }
1583 else if(Dconn==1 && (ii==2 || ii==8 || ii==10 || ii==30)){
1584 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.995;
1585 }
1586 else if(Econn==1 && (ii==42 || ii==43 || ii==44 || ii==47)){
1587 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.273;
1588 }
1589 else if(Fconn==1 && (ii==7 || ii==19 || ii==23 || ii==27)){
1590 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.565;
1591 }
1592 else if(Mconn==1 && (ii==15 || ii==16 || ii==17 || ii==18)){
1593 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.565;
1594 }
1595 else if(Nconn==1 && (ii==36 || ii==38 || ii==39 || ii==41)){
1596 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.018;
1597 }
1598 else if(Hconn==1 && (ii==1 || ii==13 || ii==21 || (ii==9&&S115B_ok==1))){
1599 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.84;
1600 }
1601 else if(S115B_break==1 && ii==9 && Hconn==0){
1602 adcHe = f_att5B( ytr_tof[0] ); //N.B.: this function refers to the Carbon!!!
1603 }
1604 else if(S115B_break==1 && ii==9 && Hconn==1){
1605 adcHe = (f_att5B( ytr_tof[0] ))/1.64;
1606 }
1607 else adcHe = Get_adc_he(ii, xtr_tof, ytr_tof);
1608
1609 if(adcHe<=0) continue;
1610
1611 if(ii==9 && S115B_break==1) adcnorm = f_pos5B(adccorr);
1612 else adcnorm = f_pos( (parPos[ii]), adccorr);
1613
1614 if(adcnorm<=0) continue;
1615
1616 if(ii==9 && S115B_break==1) adclin = 36.*adcnorm/adcHe;
1617 else adclin = 4.*adcnorm/adcHe;
1618
1619 if(adclin<=0) continue;
1620 //
1621 if ( betamean > 99. ){
1622 eDEDXpmt[ii]=(Float_t)adclin;
1623 continue;
1624 };
1625 //
1626 double dEdxHe=-2;
1627 if(ii==9 && S115B_break==1){
1628 if( betamean <1. ) dEdxHe = f_BB5B( betamean );
1629 else dEdxHe = 33;
1630 } else {
1631 if( betamean <1. ) dEdxHe = f_BB( (parBBneg[ii]), betamean );
1632 else dEdxHe = parBBpos[ii];
1633 }
1634
1635 if(dEdxHe<=0) continue;
1636
1637 if(ii==9 && S115B_break==1) dEdx = f_desatBB5B( adclin );
1638 else dEdx = f_desatBB((parDesatBB[ii]), adclin );
1639
1640 if(dEdx<=0) continue;
1641
1642 eDEDXpmt[ii]=(Float_t)dEdx;
1643
1644
1645 } //end loop on 48 PMT
1646
1647 };
1648
1649
1650 //------------------------------------------------------------------------
1651 void ToFdEdx::Define_PMTsat()
1652 {
1653 Float_t sat[48] = {
1654 3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
1655 3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
1656 3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
1657 3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
1658 3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
1659 3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
1660 PMTsat.Set(48,sat);
1661 }
1662
1663 //------------------------------------------------------------------------
1664 void ToFdEdx::ReadParBBpos( const char *fname )
1665 {
1666 // printf("read %s\n",fname);
1667 parBBpos.Set(48);
1668 FILE *fattin = fopen( fname , "r" );
1669 for (int i=0; i<48; i++) {
1670 int tid=0;
1671 float tp;
1672 if(fscanf(fattin,"%d %f",
1673 &tid, &tp )!=2) break;
1674 parBBpos[i]=tp;
1675 }
1676 fclose(fattin);
1677 }
1678
1679 //------------------------------------------------------------------------
1680 void ToFdEdx::ReadParDesatBB( const char *fname )
1681 {
1682 // printf("read %s\n",fname);
1683 FILE *fattin = fopen( fname , "r" );
1684 for (int i=0; i<48; i++) {
1685 int tid=0;
1686 float tp[3];
1687 if(fscanf(fattin,"%d %f %f %f",
1688 &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
1689 parDesatBB[i].Set(3,tp);
1690 }
1691 fclose(fattin);
1692 }
1693
1694
1695 //------------------------------------------------------------------------
1696 void ToFdEdx::ReadParBBneg( const char *fname )
1697
1698 {
1699 // printf("read %s\n",fname);
1700 FILE *fattin = fopen( fname , "r" );
1701 for (int i=0; i<48; i++) {
1702 int tid=0;
1703 float tp[3];
1704 if(fscanf(fattin,"%d %f %f %f",
1705 &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
1706 parBBneg[i].Set(3,tp);
1707 }
1708 fclose(fattin);
1709 }
1710
1711 //------------------------------------------------------------------------
1712 void ToFdEdx::ReadParPos( const char *fname )
1713 {
1714 // printf("read %s\n",fname);
1715 FILE *fattin = fopen( fname , "r" );
1716 for (int i=0; i<48; i++) {
1717 int tid=0;
1718 float tp[4];
1719 if(fscanf(fattin,"%d %f %f %f %f",
1720 &tid, &tp[0], &tp[1], &tp[2], &tp[3])!=5) break;
1721 parPos[i].Set(4,tp);
1722 }
1723 fclose(fattin);
1724 }
1725
1726 //------------------------------------------------------------------------
1727 void ToFdEdx::ReadParAtt( const char *fname )
1728 {
1729 // printf("read %s\n",fname);
1730 FILE *fattin = fopen( fname , "r" );
1731 for (int i=0; i<48; i++) {
1732 int tid=0;
1733 float tp[6];
1734 if(fscanf(fattin,"%d %f %f %f %f %f %f",
1735 &tid, &tp[0], &tp[1], &tp[2], &tp[3], &tp[4], &tp[5] )!=7) break;
1736 parAtt[i].Set(6,tp);
1737 }
1738 fclose(fattin);
1739 }
1740
1741
1742
1743
1744
1745
1746 double ToFdEdx::f_att( TArrayF &p, float x )
1747 {
1748 return
1749 p[0] +
1750 p[1]*x +
1751 p[2]*x*x +
1752 p[3]*x*x*x +
1753 p[4]*x*x*x*x +
1754 p[5]*x*x*x*x*x;
1755 }
1756 //------------------------------------------------------------------------
1757 double ToFdEdx::f_att5B( float x )
1758 {
1759 return
1760 101.9409 +
1761 6.643781*x +
1762 0.2765518*x*x +
1763 0.004617647*x*x*x +
1764 0.0006195132*x*x*x*x +
1765 0.00002813734*x*x*x*x*x;
1766 }
1767
1768
1769 double ToFdEdx::f_pos( TArrayF &p, float x )
1770 {
1771 return
1772 p[0] +
1773 p[1]*x +
1774 p[2]*x*x +
1775 p[3]*x*x*x;
1776 }
1777
1778 double ToFdEdx::f_pos5B( float x )
1779 {
1780 return
1781 15.45132 +
1782 0.8369721*x +
1783 0.0005*x*x;
1784 }
1785
1786
1787
1788 double ToFdEdx::f_adcPC( float x )
1789 {
1790 return 28.12+0.6312*x-5.647e-05*x*x+3.064e-08*x*x*x;
1791 }
1792
1793
1794 float ToFdEdx::Get_adc_he( int id, float pl_x[6], float pl_y[6])
1795 {
1796
1797 //
1798 // input: id - pmt [0:47}
1799 // pl_x - coord x of the tof plane
1800 // pl_y - coord y
1801
1802 adc_he = 0;
1803 if( eGeom.GetXY(id)==1 ) adc_he = f_att( (parAtt[id]), pl_x[eGeom.GetPlane(id)] );
1804 if( eGeom.GetXY(id)==2 ) adc_he = f_att( (parAtt[id]), pl_y[eGeom.GetPlane(id)] );
1805 return adc_he;
1806 }
1807
1808 //------------------------------------------------------------------------
1809 double ToFdEdx::f_BB( TArrayF &p, float x )
1810 {
1811 return p[0]/(x*x)*(log(x*x/(1-x*x)) - p[1]*x*x - p[2]);
1812 }
1813
1814 //------------------------------------------------------------------------
1815 double ToFdEdx::f_BB5B( float x )
1816 {
1817 return 0.165797/(x*x)*(log(x*x/(1-x*x)) + 140.481*x*x + 52.9258);
1818 }
1819 //------------------------------------------------------------------------
1820 double ToFdEdx::f_desatBB( TArrayF &p, float x )
1821 {
1822 return
1823 p[0] +
1824 p[1]*x +
1825 p[2]*x*x;
1826 }
1827
1828 //------------------------------------------------------------------------
1829 double ToFdEdx::f_desatBB5B( float x )
1830 {
1831 return
1832 -2.4 +
1833 0.75*x +
1834 0.009*x*x;
1835 }
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851

  ViewVC Help
Powered by ViewVC 1.1.23