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

Annotation of /DarthVader/ToFLevel2/src/ToFLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.28 - (hide annotations) (download)
Mon Dec 28 10:22:39 2009 UTC (14 years, 11 months ago) by mocchiut
Branch: MAIN
Changes since 1.27: +3 -0 lines
Saving only dEdx for track-related PMTs

1 pam-de 1.14 /**
2     * \file ToFLevel2.cpp
3     * \author Gianfranca DeRosa, Wolfgang Menn
4 pamelats 1.23 *
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 pamelats 1.25 * WM apr 2009: bug found by Nicola in method "GetPaddlePlane"
9 pam-de 1.14 */
10    
11 mocchiut 1.1 #include <ToFLevel2.h>
12     using namespace std;
13 mocchiut 1.4 ClassImp(ToFPMT);
14 carbone 1.26 ClassImp(ToFdEdx);
15     ClassImp(ToFGeom);
16 mocchiut 1.1 ClassImp(ToFTrkVar);
17     ClassImp(ToFLevel2);
18    
19 mocchiut 1.4 ToFPMT::ToFPMT(){
20     pmt_id = 0;
21     adc = 0.;
22     tdc_tw = 0.;
23 mocchiut 1.17 tdc = 0.;
24 mocchiut 1.4 }
25    
26     ToFPMT::ToFPMT(const ToFPMT &t){
27     pmt_id = t.pmt_id;
28     adc = t.adc;
29     tdc_tw = t.tdc_tw;
30 mocchiut 1.17 tdc = t.tdc;
31 mocchiut 1.4 }
32    
33 mocchiut 1.18 void ToFPMT::Clear(Option_t *t){
34 mocchiut 1.4 pmt_id = 0;
35     adc = 0.;
36     tdc_tw = 0.;
37 mocchiut 1.17 tdc = 0.;
38 mocchiut 1.4 }
39    
40    
41    
42 mocchiut 1.1 ToFTrkVar::ToFTrkVar() {
43 mocchiut 1.4 trkseqno = 0;
44     npmttdc = 0;
45     npmtadc = 0;
46     pmttdc = TArrayI(48);
47     pmtadc = TArrayI(48);
48 mocchiut 1.9 tdcflag = TArrayI(48); // gf: 30 Nov 2006
49     adcflag = TArrayI(48); // gf: 30 Nov 2006
50 mocchiut 1.4 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 mocchiut 1.16 memset(xtr_tof, 0, 6*sizeof(Float_t));
57     memset(ytr_tof, 0, 6*sizeof(Float_t));
58 mocchiut 1.4 //
59     };
60 mocchiut 1.1
61 mocchiut 1.18 void ToFTrkVar::Clear(Option_t *t) {
62 mocchiut 1.1 trkseqno = 0;
63 mocchiut 1.4 npmttdc = 0;
64     npmtadc = 0;
65     pmttdc.Reset();
66     pmtadc.Reset();
67 mocchiut 1.9 tdcflag.Reset(); // gf: 30 Nov 2006
68     adcflag.Reset(); // gf: 30 Nov 2006
69 mocchiut 1.4 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 mocchiut 1.16 memset(xtr_tof, 0, 6*sizeof(Float_t));
75     memset(ytr_tof, 0, 6*sizeof(Float_t));
76 mocchiut 1.4 //
77     };
78 mocchiut 1.1
79     ToFTrkVar::ToFTrkVar(const ToFTrkVar &t){
80    
81     trkseqno = t.trkseqno;
82 mocchiut 1.4 //
83     npmttdc = t.npmttdc;
84     npmtadc = t.npmtadc;
85     (t.pmttdc).Copy(pmttdc);
86     (t.pmtadc).Copy(pmtadc);
87 mocchiut 1.9 (t.tdcflag).Copy(tdcflag); // gf: 30 Nov 2006
88     (t.adcflag).Copy(adcflag); // gf: 30 Nov 2006
89 mocchiut 1.4 (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 mocchiut 1.16 memcpy(xtr_tof,t.xtr_tof,sizeof(xtr_tof));
95     memcpy(ytr_tof,t.ytr_tof,sizeof(ytr_tof));
96 mocchiut 1.4 //
97     };
98 mocchiut 1.1
99     ToFLevel2::ToFLevel2() {
100     //
101 mocchiut 1.13 // PMT = new TClonesArray("ToFPMT",12); //ELENA
102     // ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
103     PMT = 0; //ELENA
104     ToFTrk = 0; //ELENA
105 mocchiut 1.1 //
106 mocchiut 1.8 this->Clear();
107     //
108 mocchiut 1.3 };
109    
110 mocchiut 1.13 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 mocchiut 1.18 void ToFLevel2::Clear(Option_t *t){
116 mocchiut 1.3 //
117 mocchiut 1.13 if(ToFTrk)ToFTrk->Delete(); //ELENA
118     if(PMT)PMT->Delete(); //ELENA
119 mocchiut 1.4 memset(tof_j_flag, 0, 6*sizeof(Int_t));
120 mocchiut 1.8 unpackError = 0;
121 mocchiut 1.4 //
122 mocchiut 1.1 };
123    
124 mocchiut 1.18 void ToFLevel2::Delete(Option_t *t){ //ELENA
125 mocchiut 1.13 //
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 mocchiut 1.1 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 mocchiut 1.13 if(!ToFTrk)return 0; //ELENA
146 mocchiut 1.1 TClonesArray &t = *(ToFTrk);
147     ToFTrkVar *toftrack = (ToFTrkVar*)t[itrk];
148     return toftrack;
149     }
150 mocchiut 1.4
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 mocchiut 1.13 if(!PMT)return 0; //ELENA
160 mocchiut 1.4 TClonesArray &t = *(PMT);
161     ToFPMT *tofpmt = (ToFPMT*)t[ihit];
162     return tofpmt;
163     }
164 mocchiut 1.1 //--------------------------------------
165     //
166     //
167     //--------------------------------------
168     /**
169 mocchiut 1.4 * Method to get the plane ID (11 12 21 22 31 32) from the plane index (0 1 2 3 4 5)
170 mocchiut 1.16 * @param Plane index (0,1,2,3,4,5).
171 mocchiut 1.1 */
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 mocchiut 1.4 * Method to get the plane index (0 1 2 3 4 5) from the plane ID (11 12 21 22 31 32)
178 pam-de 1.15 * @param plane Plane ID (11, 12, 21, 22, 31, 32)
179 mocchiut 1.1 */
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 mocchiut 1.13 * Method to know if a given ToF paddle was hit, that is there is a TDC signal
193 pam-de 1.15 * from both PMTs. The method uses the "tof_j_flag" variable.
194 mocchiut 1.1 * @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 mocchiut 1.2 if(ip != -1)flag = tof_j_flag[ip] & (int)pow(2.,(double)paddle_id);
204 mocchiut 1.1 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 mocchiut 1.4
224 pamelats 1.23 //wm Nov 08
225 mocchiut 1.16 //gf Apr 07
226 pam-de 1.14 /**
227 pamelats 1.23 * 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 pam-de 1.14 * @param notrack Track Number
235 mocchiut 1.16 * @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 pam-de 1.14 */
238 mocchiut 1.16 Float_t ToFLevel2::GetdEdx(Int_t notrack, Int_t plane, Int_t adcfl){
239 mocchiut 1.13
240 mocchiut 1.4 Float_t dedx = 0.;
241 mocchiut 1.16 Float_t PadEdx =0.;
242     Int_t SatWarning;
243     Int_t pad=-1;
244 mocchiut 1.4 //
245     ToFTrkVar *trk = GetToFTrkVar(notrack);
246 mocchiut 1.13 if(!trk) return 0; //ELENA
247 mocchiut 1.4 //
248 mocchiut 1.16 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 mocchiut 1.4 };
254     //
255     return(dedx);
256     };
257    
258 pam-de 1.14 /**
259 pam-de 1.15 * 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 pam-de 1.14 * @param notrack Track Number
262     * @param adc ADC_C matrix with dEdx values
263     * @param tdc TDC matrix
264     */
265 mocchiut 1.4 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 mocchiut 1.13 if(!trk)return; //ELENA
280 mocchiut 1.4 //
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 mocchiut 1.5 adc[kk][hh] = (trk->dedx).At(i);
287 mocchiut 1.4 //
288     };
289     //
290     for (Int_t i=0; i<npmt(); i++){
291     //
292     ToFPMT *pmt = GetToFPMT(i);
293 mocchiut 1.13 if(!pmt)break; //ELENA
294 mocchiut 1.4 //
295     GetPMTIndex(pmt->pmt_id,hh,kk);
296     //
297 mocchiut 1.5 tdc[kk][hh] = pmt->tdc_tw;
298 mocchiut 1.4 //
299     };
300     //
301     return;
302     };
303    
304    
305 pam-de 1.14 /**
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 mocchiut 1.4 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 mocchiut 1.16
322 pam-de 1.14 /**
323 pam-de 1.15 * 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 pam-de 1.14 * @param hh Channel
327     * @param kk HalfBoard
328     */
329 mocchiut 1.4 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 pam-de 1.14 /**
359 pam-de 1.15 * Method to get the PMT index if the PMT ID is given. This method is the
360     * "reverse" of method "GetPMTid"
361 pam-de 1.14 * @param ind PMT_ID (0 - 47)
362     * @param hb HalfBoard
363     * @param ch Channel
364     */
365 mocchiut 1.5 void ToFLevel2::GetPMTIndex(Int_t ind, Int_t &hb, Int_t &ch){
366 mocchiut 1.4 //
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 mocchiut 1.5 /* tofEvent->tdc[ch][hb] */
379 mocchiut 1.4 if( ind == 2*k + j ){
380 mocchiut 1.5 ch = tof[2*j][k] - 1;
381     hb = tof[2*j + 1][k] - 1;
382     return;
383 mocchiut 1.4 };
384     j++;
385     };
386     k++;
387     };
388     return;
389     };
390 pam-fi 1.6
391 mocchiut 1.16
392    
393 pamelats 1.23 // wm Nov 08 revision - saturation values included
394 mocchiut 1.16 /// gf Apr 07
395     /**
396     * Method to get the dEdx from a given ToF paddle.
397 pamelats 1.23 * 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 mocchiut 1.16 * @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 pamelats 1.23 /*
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 mocchiut 1.16 PadEdx = 0.;
430 pamelats 1.23 // SatWarning = 1000;
431     SatWarning = 0; // 0=good, increase for each bad PMT
432 mocchiut 1.16
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 pamelats 1.23
464 mocchiut 1.16
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 pamelats 1.23
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 mocchiut 1.16
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 pamela 1.22 // 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 mocchiut 1.16
553     // gf Apr 07
554 pamela 1.22 Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane, Float_t margin){
555 pamelats 1.23
556 mocchiut 1.16 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 pamela 1.22 xl = tof11_x[i1] - (5.1-margin)/2. ;
586     xh = tof11_x[i1] + (5.1-margin)/2. ;
587 mocchiut 1.16 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 pamela 1.22 yl = tof12_y[i1] - (5.5-margin)/2. ;
604     yh = tof12_y[i1] + (5.5-margin)/2. ;
605 mocchiut 1.16 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 pamela 1.22 yl = tof21_y[i1] - (7.5-margin)/2. ;
622     yh = tof21_y[i1] + (7.5-margin)/2. ;
623 mocchiut 1.16 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 pamela 1.22 xl = tof22_x[i1] - (9.0-margin)/2. ;
639     xh = tof22_x[i1] + (9.0-margin)/2. ;
640 mocchiut 1.16 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 pamela 1.22 xl = tof31_x[i1] - (6.0-margin)/2. ;
656     xh = tof31_x[i1] + (6.0-margin)/2. ;
657 mocchiut 1.16 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 pamela 1.22 yl = tof32_y[i1] - (5.0-margin)/2. ;
673     yh = tof32_y[i1] + (5.0-margin)/2. ;
674 mocchiut 1.16 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 mocchiut 1.24 pmtleft=paddle*2;
741     pmtright= pmtleft+1;
742 mocchiut 1.16 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 mocchiut 1.24 Int_t pads[6]={8,6,2,2,3,3};
857 mocchiut 1.16
858 mocchiut 1.24 int somma=0;
859     int np=plane;
860     for(Int_t j=0; j<np; j++){
861     somma+=pads[j];
862 pamelats 1.23 }
863 mocchiut 1.24 padid=paddle+somma;
864 mocchiut 1.16 return padid;
865 pamelats 1.23
866 mocchiut 1.16 }
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 pamelats 1.25 if((7<pad)&&(pad<14)){
895 mocchiut 1.16 plane=1;
896     paddle=pad-pads11;
897     return;
898     }
899    
900 pamelats 1.25 if((13<pad)&&(pad<16)){
901 mocchiut 1.16 plane=2;
902     paddle=pad-pads11-pads12;
903     return;
904     }
905    
906 pamelats 1.25 if((15<pad)&&(pad<18)){
907 mocchiut 1.16 plane=3;
908     paddle=pad-pads11-pads12-pads21;
909     return;
910     }
911    
912 pamelats 1.25 if((17<pad)&&(pad<21)){
913 mocchiut 1.16 plane=4;
914     paddle=pad-pads11-pads12-pads21-pads22;
915     return;
916     }
917    
918 pamelats 1.25 if((20<pad)&&(pad<24)){
919 mocchiut 1.16 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 pamelats 1.23
950    
951 mocchiut 1.19 /// 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 mocchiut 1.16 ////////////////////////////////////////////////////
1095    
1096    
1097 pam-fi 1.6 /**
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 mocchiut 1.13 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 mocchiut 1.16 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 mocchiut 1.13 }
1132     } //ELENA
1133 pam-fi 1.6
1134 mocchiut 1.13 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 pam-fi 1.6 }
1143 mocchiut 1.24
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 mocchiut 1.27 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 mocchiut 1.24 }
1418 carbone 1.26
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 mocchiut 1.27 //------------------------------------------------------------------------
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 carbone 1.26
1496     //------------------------------------------------------------------------
1497 mocchiut 1.27 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 carbone 1.26 //------------------------------------------------------------------------
1508 mocchiut 1.27 void ToFdEdx::Process(UInt_t atime, Float_t betamean, Float_t *xtr_tof, Float_t *ytr_tof)
1509 carbone 1.26 {
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 mocchiut 1.27 //
1519 mocchiut 1.28 if ( xtr_tof[1] > 99. || xtr_tof[5] > 99. || ytr_tof[0] > 99. || ytr_tof[4] > 99. ) theta = 0.;
1520     //
1521 carbone 1.26
1522 mocchiut 1.28
1523 carbone 1.26 for( int ii=0; ii<48; ii++ ) {
1524 mocchiut 1.27 //
1525     // 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]);
1526 carbone 1.26 if( adc[ii] >= PMTsat[ii]-5 ) continue;
1527     if( adc[ii] <= 0. ) continue;
1528 mocchiut 1.27 //
1529 carbone 1.26 double adcpC = f_adcPC( adc[ii] ); // - adc conversion in pC
1530     double adccorr = adcpC*fabs(cos(theta));
1531 mocchiut 1.27 //
1532     if(adccorr<=0.) continue;
1533 carbone 1.26
1534     //--------------------- TABLE OF PERIODS WITH HV PROBLEMS ----------------------------
1535    
1536     int Aconn=conn[0]; // PMT 0,20,22,24
1537     int Bconn=conn[1]; // PMT 6,12,26,34
1538     int Cconn=conn[2]; // PMT 4,14,28,32
1539     int Dconn=conn[3]; // PMT 2,8,10,30
1540     int Econn=conn[4]; // PMT 42,43,44,47
1541     int Fconn=conn[5]; // PMT 7,19,23,27
1542     int Gconn=conn[6]; // PMT 3,11,25,33
1543     int Hconn=conn[7]; // PMT 1,9,13,21
1544     int Iconn=conn[8]; // PMT 5,29,31,35
1545     int Lconn=conn[9]; // PMT 37,40,45,46
1546     int Mconn=conn[10]; // PMT 15,16,17,18
1547     int Nconn=conn[11]; // PMT 36,38,39,41
1548    
1549     // int standard=0;
1550     if( false ) cout << Gconn << Iconn << Lconn <<endl;
1551     int S115B_ok=0;
1552     int S115B_break=0;
1553    
1554     if(atime<1158720000)S115B_ok=1;
1555     else S115B_break=1;
1556    
1557    
1558 mocchiut 1.27 //------------------------------------------------------------------------
1559 carbone 1.26
1560 mocchiut 1.27 //---------------------------------------------------- Z reconstruction
1561 carbone 1.26
1562 mocchiut 1.27 double adcHe, adcnorm, adclin, dEdx, Zeta;
1563 carbone 1.26
1564 mocchiut 1.27 adcHe=-2;
1565     adcnorm=-2;
1566     adclin=-2;
1567     dEdx=-2;
1568     Zeta=-2;
1569 carbone 1.26
1570     if(Aconn==1 && (ii==0 || ii==20 || ii==22 || ii==24)){
1571 mocchiut 1.27 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.675;
1572 carbone 1.26 }
1573     else if(Bconn==1 && (ii==6 || ii==12 || ii==26 || ii==34)){
1574 mocchiut 1.27 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/2.482;
1575 carbone 1.26 }
1576     else if(Cconn==1 && (ii==4 || ii==14 || ii==28 || ii==32)){
1577     adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.464;
1578     }
1579     else if(Dconn==1 && (ii==2 || ii==8 || ii==10 || ii==30)){
1580 mocchiut 1.27 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.995;
1581 carbone 1.26 }
1582     else if(Econn==1 && (ii==42 || ii==43 || ii==44 || ii==47)){
1583 mocchiut 1.27 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.273;
1584 carbone 1.26 }
1585     else if(Fconn==1 && (ii==7 || ii==19 || ii==23 || ii==27)){
1586 mocchiut 1.27 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.565;
1587 carbone 1.26 }
1588     else if(Mconn==1 && (ii==15 || ii==16 || ii==17 || ii==18)){
1589 mocchiut 1.27 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.565;
1590 carbone 1.26 }
1591     else if(Nconn==1 && (ii==36 || ii==38 || ii==39 || ii==41)){
1592 mocchiut 1.27 adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.018;
1593 carbone 1.26 }
1594     else if(Hconn==1 && (ii==1 || ii==13 || ii==21 || (ii==9&&S115B_ok==1))){
1595     adcHe = (Get_adc_he(ii, xtr_tof, ytr_tof))/1.84;
1596     }
1597     else if(S115B_break==1 && ii==9 && Hconn==0){
1598 mocchiut 1.27 adcHe = f_att5B( ytr_tof[0] ); //N.B.: this function refers to the Carbon!!!
1599 carbone 1.26 }
1600     else if(S115B_break==1 && ii==9 && Hconn==1){
1601 mocchiut 1.27 adcHe = (f_att5B( ytr_tof[0] ))/1.64;
1602 carbone 1.26 }
1603     else adcHe = Get_adc_he(ii, xtr_tof, ytr_tof);
1604    
1605     if(adcHe<=0) continue;
1606    
1607     if(ii==9 && S115B_break==1) adcnorm = f_pos5B(adccorr);
1608     else adcnorm = f_pos( (parPos[ii]), adccorr);
1609    
1610     if(adcnorm<=0) continue;
1611    
1612     if(ii==9 && S115B_break==1) adclin = 36.*adcnorm/adcHe;
1613     else adclin = 4.*adcnorm/adcHe;
1614    
1615     if(adclin<=0) continue;
1616 mocchiut 1.27 //
1617     if ( betamean > 99. ){
1618     eDEDXpmt[ii]=(Float_t)adclin;
1619     continue;
1620     };
1621     //
1622 carbone 1.26 double dEdxHe=-2;
1623     if(ii==9 && S115B_break==1){
1624     if( betamean <1. ) dEdxHe = f_BB5B( betamean );
1625     else dEdxHe = 33;
1626     } else {
1627     if( betamean <1. ) dEdxHe = f_BB( (parBBneg[ii]), betamean );
1628     else dEdxHe = parBBpos[ii];
1629     }
1630 mocchiut 1.27
1631 carbone 1.26 if(dEdxHe<=0) continue;
1632    
1633     if(ii==9 && S115B_break==1) dEdx = f_desatBB5B( adclin );
1634     else dEdx = f_desatBB((parDesatBB[ii]), adclin );
1635    
1636     if(dEdx<=0) continue;
1637    
1638     eDEDXpmt[ii]=(Float_t)dEdx;
1639    
1640    
1641 mocchiut 1.27 } //end loop on 48 PMT
1642 carbone 1.26
1643     };
1644    
1645    
1646     //------------------------------------------------------------------------
1647     void ToFdEdx::Define_PMTsat()
1648     {
1649     Float_t sat[48] = {
1650     3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
1651     3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
1652     3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
1653     3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
1654     3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
1655     3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
1656     PMTsat.Set(48,sat);
1657     }
1658    
1659     //------------------------------------------------------------------------
1660     void ToFdEdx::ReadParBBpos( const char *fname )
1661     {
1662 mocchiut 1.27 // printf("read %s\n",fname);
1663 carbone 1.26 parBBpos.Set(48);
1664     FILE *fattin = fopen( fname , "r" );
1665     for (int i=0; i<48; i++) {
1666     int tid=0;
1667     float tp;
1668     if(fscanf(fattin,"%d %f",
1669     &tid, &tp )!=2) break;
1670     parBBpos[i]=tp;
1671     }
1672     fclose(fattin);
1673     }
1674    
1675     //------------------------------------------------------------------------
1676     void ToFdEdx::ReadParDesatBB( const char *fname )
1677     {
1678 mocchiut 1.27 // printf("read %s\n",fname);
1679 carbone 1.26 FILE *fattin = fopen( fname , "r" );
1680     for (int i=0; i<48; i++) {
1681     int tid=0;
1682     float tp[3];
1683     if(fscanf(fattin,"%d %f %f %f",
1684     &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
1685     parDesatBB[i].Set(3,tp);
1686     }
1687     fclose(fattin);
1688     }
1689    
1690    
1691     //------------------------------------------------------------------------
1692     void ToFdEdx::ReadParBBneg( const char *fname )
1693    
1694     {
1695 mocchiut 1.27 // printf("read %s\n",fname);
1696 carbone 1.26 FILE *fattin = fopen( fname , "r" );
1697     for (int i=0; i<48; i++) {
1698     int tid=0;
1699     float tp[3];
1700     if(fscanf(fattin,"%d %f %f %f",
1701     &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
1702     parBBneg[i].Set(3,tp);
1703     }
1704     fclose(fattin);
1705     }
1706    
1707     //------------------------------------------------------------------------
1708     void ToFdEdx::ReadParPos( const char *fname )
1709     {
1710 mocchiut 1.27 // printf("read %s\n",fname);
1711 carbone 1.26 FILE *fattin = fopen( fname , "r" );
1712     for (int i=0; i<48; i++) {
1713     int tid=0;
1714     float tp[4];
1715     if(fscanf(fattin,"%d %f %f %f %f",
1716     &tid, &tp[0], &tp[1], &tp[2], &tp[3])!=5) break;
1717     parPos[i].Set(4,tp);
1718     }
1719     fclose(fattin);
1720     }
1721    
1722     //------------------------------------------------------------------------
1723     void ToFdEdx::ReadParAtt( const char *fname )
1724     {
1725 mocchiut 1.27 // printf("read %s\n",fname);
1726 carbone 1.26 FILE *fattin = fopen( fname , "r" );
1727     for (int i=0; i<48; i++) {
1728     int tid=0;
1729     float tp[6];
1730     if(fscanf(fattin,"%d %f %f %f %f %f %f",
1731     &tid, &tp[0], &tp[1], &tp[2], &tp[3], &tp[4], &tp[5] )!=7) break;
1732     parAtt[i].Set(6,tp);
1733     }
1734     fclose(fattin);
1735     }
1736    
1737    
1738    
1739    
1740    
1741    
1742     double ToFdEdx::f_att( TArrayF &p, float x )
1743     {
1744     return
1745     p[0] +
1746     p[1]*x +
1747     p[2]*x*x +
1748     p[3]*x*x*x +
1749     p[4]*x*x*x*x +
1750     p[5]*x*x*x*x*x;
1751     }
1752     //------------------------------------------------------------------------
1753     double ToFdEdx::f_att5B( float x )
1754     {
1755     return
1756     101.9409 +
1757     6.643781*x +
1758     0.2765518*x*x +
1759     0.004617647*x*x*x +
1760     0.0006195132*x*x*x*x +
1761     0.00002813734*x*x*x*x*x;
1762     }
1763    
1764    
1765     double ToFdEdx::f_pos( TArrayF &p, float x )
1766     {
1767     return
1768     p[0] +
1769     p[1]*x +
1770     p[2]*x*x +
1771     p[3]*x*x*x;
1772     }
1773    
1774     double ToFdEdx::f_pos5B( float x )
1775     {
1776     return
1777     15.45132 +
1778     0.8369721*x +
1779     0.0005*x*x;
1780     }
1781    
1782    
1783    
1784     double ToFdEdx::f_adcPC( float x )
1785     {
1786     return 28.12+0.6312*x-5.647e-05*x*x+3.064e-08*x*x*x;
1787     }
1788    
1789    
1790     float ToFdEdx::Get_adc_he( int id, float pl_x[6], float pl_y[6])
1791     {
1792    
1793     //
1794     // input: id - pmt [0:47}
1795     // pl_x - coord x of the tof plane
1796     // pl_y - coord y
1797    
1798 mocchiut 1.27 adc_he = 0;
1799 carbone 1.26 if( eGeom.GetXY(id)==1 ) adc_he = f_att( (parAtt[id]), pl_x[eGeom.GetPlane(id)] );
1800     if( eGeom.GetXY(id)==2 ) adc_he = f_att( (parAtt[id]), pl_y[eGeom.GetPlane(id)] );
1801     return adc_he;
1802     }
1803    
1804     //------------------------------------------------------------------------
1805     double ToFdEdx::f_BB( TArrayF &p, float x )
1806     {
1807     return p[0]/(x*x)*(log(x*x/(1-x*x)) - p[1]*x*x - p[2]);
1808     }
1809    
1810     //------------------------------------------------------------------------
1811     double ToFdEdx::f_BB5B( float x )
1812     {
1813     return 0.165797/(x*x)*(log(x*x/(1-x*x)) + 140.481*x*x + 52.9258);
1814     }
1815     //------------------------------------------------------------------------
1816     double ToFdEdx::f_desatBB( TArrayF &p, float x )
1817     {
1818     return
1819     p[0] +
1820     p[1]*x +
1821     p[2]*x*x;
1822     }
1823    
1824     //------------------------------------------------------------------------
1825     double ToFdEdx::f_desatBB5B( float x )
1826     {
1827     return
1828     -2.4 +
1829     0.75*x +
1830     0.009*x*x;
1831     }
1832    
1833    
1834    
1835    
1836    
1837    
1838    
1839    
1840    
1841    
1842    
1843    
1844    
1845    
1846    
1847    

  ViewVC Help
Powered by ViewVC 1.1.23