/[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.32 - (show annotations) (download)
Mon Oct 25 13:22:11 2010 UTC (14 years, 1 month ago) by mocchiut
Branch: MAIN
Changes since 1.31: +66 -41 lines
Saturated PMTs not saved in level2, 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, Int_t exitat)
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. ) ytr_tof[ii] = 0.;
1523 };
1524 //
1525
1526
1527 //--------------------- TABLE OF PERIODS WITH HV PROBLEMS ----------------------------
1528
1529 int Aconn=conn[0]; // PMT 0,20,22,24
1530 int Bconn=conn[1]; // PMT 6,12,26,34
1531 int Cconn=conn[2]; // PMT 4,14,28,32
1532 int Dconn=conn[3]; // PMT 2,8,10,30
1533 int Econn=conn[4]; // PMT 42,43,44,47
1534 int Fconn=conn[5]; // PMT 7,19,23,27
1535 int Gconn=conn[6]; // PMT 3,11,25,33
1536 int Hconn=conn[7]; // PMT 1,9,13,21
1537 int Iconn=conn[8]; // PMT 5,29,31,35
1538 int Lconn=conn[9]; // PMT 37,40,45,46
1539 int Mconn=conn[10]; // PMT 15,16,17,18
1540 int Nconn=conn[11]; // PMT 36,38,39,41
1541 if( false ) cout << Gconn << Iconn << Lconn <<endl; // to avoid compilation warnings
1542
1543 for( int ii=0; ii<48; ii++ ) {
1544 //
1545 // 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]);
1546 // if( adc[ii] >= PMTsat[ii]-5 ) continue; // EMILIANO
1547 if( adc[ii] <= 0. ) continue;
1548 //
1549 double adcpC = f_adcPC( adc[ii] ); // - adc conversion in pC
1550 if ( exitat == 0 ){
1551 eDEDXpmt[ii]=(Float_t)adcpC;
1552 continue;
1553 }
1554
1555 double adccorr = adcpC*fabs(cos(theta));
1556 if(adccorr<=0.) continue;
1557 if ( exitat == 1 ){
1558 eDEDXpmt[ii]=(Float_t)adccorr;
1559 continue;
1560 }
1561
1562 // int standard=0;
1563 int S115B_ok=0;
1564 int S115B_break=0;
1565
1566 if(atime<1158720000)S115B_ok=1;
1567 else S115B_break=1;
1568
1569
1570 //------------------------------------------------------------------------
1571
1572 //---------------------------------------------------- Z reconstruction
1573
1574 double adcHe, adcnorm, adclin, dEdx, Zeta;
1575
1576 adcHe=-2;
1577 adcnorm=-2;
1578 adclin=-2;
1579 dEdx=-2;
1580 Zeta=-2;
1581 Double_t correction = 1.;
1582
1583 if(Aconn==1 && (ii==0 || ii==20 || ii==22 || ii==24)){
1584 correction = 1.675;
1585 }
1586 else if(Bconn==1 && (ii==6 || ii==12 || ii==26 || ii==34)){
1587 correction = 2.482;
1588 }
1589 else if(Cconn==1 && (ii==4 || ii==14 || ii==28 || ii==32)){
1590 correction = 1.464;
1591 }
1592 else if(Dconn==1 && (ii==2 || ii==8 || ii==10 || ii==30)){
1593 correction = 1.995;
1594 }
1595 else if(Econn==1 && (ii==42 || ii==43 || ii==44 || ii==47)){
1596 correction = 1.273;
1597 }
1598 else if(Fconn==1 && (ii==7 || ii==19 || ii==23 || ii==27)){
1599 correction = 1.565;
1600 }
1601 else if(Mconn==1 && (ii==15 || ii==16 || ii==17 || ii==18)){
1602 correction = 1.565;
1603 }
1604 else if(Nconn==1 && (ii==36 || ii==38 || ii==39 || ii==41)){
1605 correction = 1.018;
1606 }
1607 else if(Hconn==1 && (ii==1 || ii==13 || ii==21 || (ii==9&&S115B_ok==1))){
1608 correction = 1.84;
1609 }
1610 else if(S115B_break==1 && ii==9 && Hconn==1){
1611 correction = 1.64;
1612 }
1613 else correction = 1.;
1614
1615 if( S115B_break==1 ){
1616 adcHe = f_att5B( ytr_tof[0] )/correction;
1617 } else {
1618 adcHe = Get_adc_he(ii, xtr_tof, ytr_tof)/correction;
1619 };
1620 if(adcHe<=0) continue;
1621 if ( exitat == 2 ){
1622 if(ii==9 && S115B_break==1) eDEDXpmt[ii]=36.*(Float_t)adccorr/adcHe;
1623 else adclin = 4.*(Float_t)adccorr/adcHe;
1624 continue;
1625 }
1626
1627 if(ii==9 && S115B_break==1) adcnorm = f_pos5B(adccorr);
1628 else adcnorm = f_pos( (parPos[ii]), adccorr);
1629 if(adcnorm<=0) continue;
1630 if(ii==9 && S115B_break==1) adclin = 36.*adcnorm/adcHe;
1631 else adclin = 4.*adcnorm/adcHe;
1632 if(adclin<=0) continue;
1633 if ( exitat == 3 ){
1634 if(ii==9 && S115B_break==1) eDEDXpmt[ii]=(Float_t)adclin;
1635 else eDEDXpmt[ii]=(Float_t)adclin;
1636 continue;
1637 }
1638 //
1639 if ( betamean > 99. ){
1640 // eDEDXpmt.AddAt((Float_t)adclin,ii);
1641 eDEDXpmt[ii]=(Float_t)adclin;
1642 // printf(" AAPMT IS %i dedx is %f vector is %f \n",ii,adclin,eDEDXpmt[ii]);
1643 continue;
1644 };
1645 //
1646 double dEdxHe=-2;
1647 if(ii==9 && S115B_break==1){
1648 if( betamean <1. ) dEdxHe = f_BB5B( betamean );
1649 else dEdxHe = 33;
1650 } else {
1651 if( betamean <1. ) dEdxHe = f_BB( (parBBneg[ii]), betamean );
1652 else dEdxHe = parBBpos[ii];
1653 }
1654
1655
1656 if(dEdxHe<=0){
1657 eDEDXpmt[ii]=(Float_t)adclin;
1658 continue;
1659 };
1660
1661 if(ii==9 && S115B_break==1) dEdx = f_desatBB5B( adclin );
1662 else dEdx = f_desatBB((parDesatBB[ii]), adclin );
1663
1664 if(dEdx<=0){
1665 eDEDXpmt[ii]=(Float_t)adclin;
1666 continue;
1667 };
1668
1669 eDEDXpmt[ii]=(Float_t)dEdx;
1670 // eDEDXpmt.AddAt((Float_t)dEdx,ii);
1671
1672 // printf(" PMT IS %i dedx is %f vector is %f \n",ii,dEdx,eDEDXpmt[ii]);
1673
1674 } //end loop on 48 PMT
1675
1676 };
1677
1678
1679 //------------------------------------------------------------------------
1680 void ToFdEdx::Define_PMTsat()
1681 {
1682 Float_t sat[48] = {
1683 3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
1684 3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
1685 3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
1686 3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
1687 3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
1688 3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
1689 PMTsat.Set(48,sat);
1690 }
1691
1692 //------------------------------------------------------------------------
1693 void ToFdEdx::ReadParBBpos( const char *fname )
1694 {
1695 // printf("read %s\n",fname);
1696 parBBpos.Set(48);
1697 FILE *fattin = fopen( fname , "r" );
1698 for (int i=0; i<48; i++) {
1699 int tid=0;
1700 float tp;
1701 if(fscanf(fattin,"%d %f",
1702 &tid, &tp )!=2) break;
1703 parBBpos[i]=tp;
1704 }
1705 fclose(fattin);
1706 }
1707
1708 //------------------------------------------------------------------------
1709 void ToFdEdx::ReadParDesatBB( const char *fname )
1710 {
1711 // printf("read %s\n",fname);
1712 FILE *fattin = fopen( fname , "r" );
1713 for (int i=0; i<48; i++) {
1714 int tid=0;
1715 float tp[3];
1716 if(fscanf(fattin,"%d %f %f %f",
1717 &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
1718 parDesatBB[i].Set(3,tp);
1719 }
1720 fclose(fattin);
1721 }
1722
1723
1724 //------------------------------------------------------------------------
1725 void ToFdEdx::ReadParBBneg( const char *fname )
1726
1727 {
1728 // printf("read %s\n",fname);
1729 FILE *fattin = fopen( fname , "r" );
1730 for (int i=0; i<48; i++) {
1731 int tid=0;
1732 float tp[3];
1733 if(fscanf(fattin,"%d %f %f %f",
1734 &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
1735 parBBneg[i].Set(3,tp);
1736 }
1737 fclose(fattin);
1738 }
1739
1740 //------------------------------------------------------------------------
1741 void ToFdEdx::ReadParPos( const char *fname )
1742 {
1743 // printf("read %s\n",fname);
1744 FILE *fattin = fopen( fname , "r" );
1745 for (int i=0; i<48; i++) {
1746 int tid=0;
1747 float tp[4];
1748 if(fscanf(fattin,"%d %f %f %f %f",
1749 &tid, &tp[0], &tp[1], &tp[2], &tp[3])!=5) break;
1750 parPos[i].Set(4,tp);
1751 }
1752 fclose(fattin);
1753 }
1754
1755 //------------------------------------------------------------------------
1756 void ToFdEdx::ReadParAtt( const char *fname )
1757 {
1758 // printf("read %s\n",fname);
1759 FILE *fattin = fopen( fname , "r" );
1760 for (int i=0; i<48; i++) {
1761 int tid=0;
1762 float tp[6];
1763 if(fscanf(fattin,"%d %f %f %f %f %f %f",
1764 &tid, &tp[0], &tp[1], &tp[2], &tp[3], &tp[4], &tp[5] )!=7) break;
1765 parAtt[i].Set(6,tp);
1766 }
1767 fclose(fattin);
1768 }
1769
1770
1771
1772
1773
1774
1775 double ToFdEdx::f_att( TArrayF &p, float x )
1776 {
1777 return
1778 p[0] +
1779 p[1]*x +
1780 p[2]*x*x +
1781 p[3]*x*x*x +
1782 p[4]*x*x*x*x +
1783 p[5]*x*x*x*x*x;
1784 }
1785 //------------------------------------------------------------------------
1786 double ToFdEdx::f_att5B( float x )
1787 {
1788 return
1789 101.9409 +
1790 6.643781*x +
1791 0.2765518*x*x +
1792 0.004617647*x*x*x +
1793 0.0006195132*x*x*x*x +
1794 0.00002813734*x*x*x*x*x;
1795 }
1796
1797
1798 double ToFdEdx::f_pos( TArrayF &p, float x )
1799 {
1800 return
1801 p[0] +
1802 p[1]*x +
1803 p[2]*x*x +
1804 p[3]*x*x*x;
1805 }
1806
1807 double ToFdEdx::f_pos5B( float x )
1808 {
1809 return
1810 15.45132 +
1811 0.8369721*x +
1812 0.0005*x*x;
1813 }
1814
1815
1816
1817 double ToFdEdx::f_adcPC( float x )
1818 {
1819 return 28.12+0.6312*x-5.647e-05*x*x+3.064e-08*x*x*x;
1820 }
1821
1822
1823 float ToFdEdx::Get_adc_he( int id, float pl_x[6], float pl_y[6])
1824 {
1825
1826 //
1827 // input: id - pmt [0:47}
1828 // pl_x - coord x of the tof plane
1829 // pl_y - coord y
1830
1831 adc_he = 0;
1832 if( eGeom.GetXY(id)==1 ) adc_he = f_att( (parAtt[id]), pl_x[eGeom.GetPlane(id)] );
1833 if( eGeom.GetXY(id)==2 ) adc_he = f_att( (parAtt[id]), pl_y[eGeom.GetPlane(id)] );
1834 return adc_he;
1835 }
1836
1837 //------------------------------------------------------------------------
1838 double ToFdEdx::f_BB( TArrayF &p, float x )
1839 {
1840 return p[0]/(x*x)*(log(x*x/(1-x*x)) - p[1]*x*x - p[2]);
1841 }
1842
1843 //------------------------------------------------------------------------
1844 double ToFdEdx::f_BB5B( float x )
1845 {
1846 return 0.165797/(x*x)*(log(x*x/(1-x*x)) + 140.481*x*x + 52.9258);
1847 }
1848 //------------------------------------------------------------------------
1849 double ToFdEdx::f_desatBB( TArrayF &p, float x )
1850 {
1851 return
1852 p[0] +
1853 p[1]*x +
1854 p[2]*x*x;
1855 }
1856
1857 //------------------------------------------------------------------------
1858 double ToFdEdx::f_desatBB5B( float x )
1859 {
1860 return
1861 -2.4 +
1862 0.75*x +
1863 0.009*x*x;
1864 }
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880

  ViewVC Help
Powered by ViewVC 1.1.23