/[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.35 - (hide annotations) (download)
Tue Dec 20 14:16:37 2011 UTC (13 years, 2 months ago) by mocchiut
Branch: MAIN
Changes since 1.34: +13 -0 lines
ToFdEdx destructor changed

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 mocchiut 1.34 eDEDXpmt = new TArrayF(48);
1426 carbone 1.26 Define_PMTsat();
1427     Clear();
1428     }
1429 mocchiut 1.35
1430     ToFdEdx::~ToFdEdx(){
1431     Clear();
1432     Delete();
1433     }
1434    
1435     void ToFdEdx::Delete(Option_t *option){
1436     if ( eDEDXpmt ){
1437     eDEDXpmt->Set(0);
1438     if ( eDEDXpmt) delete eDEDXpmt;
1439     }
1440     }
1441    
1442 carbone 1.26 //------------------------------------------------------------------------
1443     void ToFdEdx::CheckConnectors(UInt_t atime, GL_PARAM *glparam, TSQLServer *dbc)
1444     {
1445     for(int i=0; i<12; i++){
1446     if(atime<=ts[i] || atime>te[i]){
1447     Int_t error=glparam->Query_GL_PARAM(atime,210+i,dbc); // parameters stored in DB in GL_PRAM table
1448     if ( error<0 ) {
1449     conn[i]=false;
1450     ts[i]=0;
1451     te[i]=numeric_limits<UInt_t>::max();
1452     };
1453     if ( !error ){
1454     conn[i]=true;
1455     ts[i]=glparam->FROM_TIME;
1456     te[i]=glparam->TO_TIME;
1457     }
1458     if ( error>0 ){
1459     conn[i]=false;
1460     ts[i]=glparam->TO_TIME;
1461     TSQLResult *pResult;
1462     TSQLRow *row;
1463     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);
1464     pResult=dbc->Query(query.Data());
1465     if(!pResult->GetRowCount()){
1466     te[i]=numeric_limits<UInt_t>::max();
1467     }else{
1468     row=pResult->Next();
1469     te[i]=(UInt_t)atoll(row->GetField(0));
1470     }
1471     }
1472     //
1473    
1474     }
1475     }
1476    
1477     }
1478     //------------------------------------------------------------------------
1479     void ToFdEdx::Clear(Option_t *option)
1480     {
1481     //
1482     // Set arrays and initialize structure
1483 mocchiut 1.34 // eDEDXpmt.Set(48); eDEDXpmt.Reset(-1); // Set array size and reset structure
1484     eDEDXpmt->Set(48); eDEDXpmt->Reset(-1); // Set array size and reset structure
1485 carbone 1.26 //
1486     };
1487    
1488     //------------------------------------------------------------------------
1489     void ToFdEdx::Print(Option_t *option)
1490     {
1491     //
1492     printf("========================================================================\n");
1493    
1494     };
1495    
1496 mocchiut 1.27 //------------------------------------------------------------------------
1497     void ToFdEdx::Init(pamela::tof::TofEvent *tofl0)
1498     {
1499     //
1500     ToFLevel2 tf;
1501     for (Int_t gg=0; gg<4;gg++){
1502     for (Int_t hh=0; hh<12;hh++){
1503     // tofinput_.tdc[hh][gg]=tofEvent->tdc[gg][hh];
1504     int mm = tf.GetPMTid(gg,hh);
1505     adc[mm]=tofl0->adc[gg][hh];
1506     };
1507     };
1508    
1509     };
1510 carbone 1.26
1511     //------------------------------------------------------------------------
1512 mocchiut 1.27 void ToFdEdx::Init(Int_t gg, Int_t hh, Float_t adce)
1513     {
1514     //
1515     ToFLevel2 tf;
1516     // for (Int_t gg=0; gg<4;gg++){
1517     // for (Int_t hh=0; hh<12;hh++){
1518     int mm = tf.GetPMTid(gg,hh);
1519     adc[mm]=adce;
1520    
1521     };
1522 carbone 1.26 //------------------------------------------------------------------------
1523 mocchiut 1.32 void ToFdEdx::Process(UInt_t atime, Float_t betamean, Float_t *xtr_tof, Float_t *ytr_tof, Int_t exitat)
1524 carbone 1.26 {
1525     // the parameters should be already initialised by InitPar()
1526 mocchiut 1.34 // printf(" in process \n");
1527 carbone 1.26 Clear();
1528    
1529     // define angle:
1530     double dx = xtr_tof[1] - xtr_tof[5];
1531     double dy = ytr_tof[0] - ytr_tof[4];
1532     double dr = sqrt(dx*dx+dy*dy);
1533     double theta=atan(dr/76.81);
1534 mocchiut 1.27 //
1535 mocchiut 1.28 if ( xtr_tof[1] > 99. || xtr_tof[5] > 99. || ytr_tof[0] > 99. || ytr_tof[4] > 99. ) theta = 0.;
1536 mocchiut 1.29 for (Int_t ii=0; ii<6; ii++){
1537     if ( xtr_tof[ii] > 99. ) xtr_tof[ii] = 0.;
1538 mocchiut 1.30 if ( ytr_tof[ii] > 99. ) ytr_tof[ii] = 0.;
1539 mocchiut 1.29 };
1540 mocchiut 1.28 //
1541 carbone 1.26
1542 mocchiut 1.28
1543 mocchiut 1.32 //--------------------- TABLE OF PERIODS WITH HV PROBLEMS ----------------------------
1544    
1545     int Aconn=conn[0]; // PMT 0,20,22,24
1546     int Bconn=conn[1]; // PMT 6,12,26,34
1547     int Cconn=conn[2]; // PMT 4,14,28,32
1548     int Dconn=conn[3]; // PMT 2,8,10,30
1549     int Econn=conn[4]; // PMT 42,43,44,47
1550     int Fconn=conn[5]; // PMT 7,19,23,27
1551     int Gconn=conn[6]; // PMT 3,11,25,33
1552     int Hconn=conn[7]; // PMT 1,9,13,21
1553     int Iconn=conn[8]; // PMT 5,29,31,35
1554     int Lconn=conn[9]; // PMT 37,40,45,46
1555     int Mconn=conn[10]; // PMT 15,16,17,18
1556     int Nconn=conn[11]; // PMT 36,38,39,41
1557     if( false ) cout << Gconn << Iconn << Lconn <<endl; // to avoid compilation warnings
1558    
1559 mocchiut 1.34 // printf(" size %i \n",eDEDXpmt.GetSize());
1560 carbone 1.26 for( int ii=0; ii<48; ii++ ) {
1561 mocchiut 1.27 //
1562 mocchiut 1.34 // eDEDXpmt.SetAt(-1.,ii);
1563 mocchiut 1.27 // 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]);
1564 mocchiut 1.33
1565 mocchiut 1.34 if( adc[ii] >= 4095. ){
1566     // eDEDXpmt[ii] = 0.;
1567     eDEDXpmt->AddAt(0.,ii);
1568 mocchiut 1.33 continue; // EMILIANO
1569     };
1570    
1571 mocchiut 1.34 if( adc[ii] >= (PMTsat[ii]-5.) && adc[ii] < 4095. ){
1572     eDEDXpmt->AddAt(1000.,ii);
1573 mocchiut 1.33 continue; // EMILIANO
1574     };
1575    
1576     if( adc[ii] <= 0. ) {
1577 mocchiut 1.34 eDEDXpmt->AddAt(1500.,ii);
1578 mocchiut 1.33 continue;
1579     };
1580 mocchiut 1.27 //
1581 carbone 1.26 double adcpC = f_adcPC( adc[ii] ); // - adc conversion in pC
1582 mocchiut 1.32 if ( exitat == 0 ){
1583 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adcpC,ii);
1584 mocchiut 1.32 continue;
1585     }
1586 mocchiut 1.34 // printf(" e qua? \n");
1587 mocchiut 1.32
1588     double adccorr = adcpC*fabs(cos(theta));
1589 mocchiut 1.27 if(adccorr<=0.) continue;
1590 mocchiut 1.32 if ( exitat == 1 ){
1591 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adccorr,ii);
1592 mocchiut 1.32 continue;
1593     }
1594 mocchiut 1.34 // printf(" e quo? \n");
1595 carbone 1.26
1596     // int standard=0;
1597     int S115B_ok=0;
1598     int S115B_break=0;
1599    
1600     if(atime<1158720000)S115B_ok=1;
1601     else S115B_break=1;
1602    
1603    
1604 mocchiut 1.27 //------------------------------------------------------------------------
1605 mocchiut 1.34 // printf(" e qui? \n");
1606 mocchiut 1.27 //---------------------------------------------------- Z reconstruction
1607 carbone 1.26
1608 mocchiut 1.27 double adcHe, adcnorm, adclin, dEdx, Zeta;
1609 carbone 1.26
1610 mocchiut 1.27 adcHe=-2;
1611     adcnorm=-2;
1612     adclin=-2;
1613     dEdx=-2;
1614     Zeta=-2;
1615 mocchiut 1.32 Double_t correction = 1.;
1616 carbone 1.26
1617     if(Aconn==1 && (ii==0 || ii==20 || ii==22 || ii==24)){
1618 mocchiut 1.32 correction = 1.675;
1619 carbone 1.26 }
1620     else if(Bconn==1 && (ii==6 || ii==12 || ii==26 || ii==34)){
1621 mocchiut 1.32 correction = 2.482;
1622 carbone 1.26 }
1623     else if(Cconn==1 && (ii==4 || ii==14 || ii==28 || ii==32)){
1624 mocchiut 1.32 correction = 1.464;
1625 carbone 1.26 }
1626     else if(Dconn==1 && (ii==2 || ii==8 || ii==10 || ii==30)){
1627 mocchiut 1.32 correction = 1.995;
1628 carbone 1.26 }
1629     else if(Econn==1 && (ii==42 || ii==43 || ii==44 || ii==47)){
1630 mocchiut 1.32 correction = 1.273;
1631 carbone 1.26 }
1632     else if(Fconn==1 && (ii==7 || ii==19 || ii==23 || ii==27)){
1633 mocchiut 1.32 correction = 1.565;
1634 carbone 1.26 }
1635     else if(Mconn==1 && (ii==15 || ii==16 || ii==17 || ii==18)){
1636 mocchiut 1.32 correction = 1.565;
1637 carbone 1.26 }
1638     else if(Nconn==1 && (ii==36 || ii==38 || ii==39 || ii==41)){
1639 mocchiut 1.32 correction = 1.018;
1640 carbone 1.26 }
1641     else if(Hconn==1 && (ii==1 || ii==13 || ii==21 || (ii==9&&S115B_ok==1))){
1642 mocchiut 1.32 correction = 1.84;
1643 carbone 1.26 }
1644     else if(S115B_break==1 && ii==9 && Hconn==1){
1645 mocchiut 1.32 correction = 1.64;
1646 carbone 1.26 }
1647 mocchiut 1.32 else correction = 1.;
1648    
1649 mocchiut 1.34 if( ii==9 && S115B_break==1 ){
1650 mocchiut 1.32 adcHe = f_att5B( ytr_tof[0] )/correction;
1651     } else {
1652     adcHe = Get_adc_he(ii, xtr_tof, ytr_tof)/correction;
1653     };
1654 carbone 1.26 if(adcHe<=0) continue;
1655 mocchiut 1.32 if ( exitat == 2 ){
1656 mocchiut 1.34 if(ii==9 && S115B_break==1) eDEDXpmt->AddAt(36.*(Float_t)adccorr/adcHe,ii);
1657 mocchiut 1.32 else adclin = 4.*(Float_t)adccorr/adcHe;
1658     continue;
1659     }
1660 carbone 1.26
1661     if(ii==9 && S115B_break==1) adcnorm = f_pos5B(adccorr);
1662     else adcnorm = f_pos( (parPos[ii]), adccorr);
1663     if(adcnorm<=0) continue;
1664     if(ii==9 && S115B_break==1) adclin = 36.*adcnorm/adcHe;
1665     else adclin = 4.*adcnorm/adcHe;
1666     if(adclin<=0) continue;
1667 mocchiut 1.32 if ( exitat == 3 ){
1668 mocchiut 1.34 if(ii==9 && S115B_break==1) eDEDXpmt->AddAt((Float_t)adclin,ii);
1669     else eDEDXpmt->AddAt((Float_t)adclin,ii);
1670 mocchiut 1.32 continue;
1671     }
1672 mocchiut 1.27 //
1673     if ( betamean > 99. ){
1674 mocchiut 1.31 // eDEDXpmt.AddAt((Float_t)adclin,ii);
1675 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adclin,ii);
1676 mocchiut 1.31 // printf(" AAPMT IS %i dedx is %f vector is %f \n",ii,adclin,eDEDXpmt[ii]);
1677 mocchiut 1.27 continue;
1678     };
1679     //
1680 carbone 1.26 double dEdxHe=-2;
1681     if(ii==9 && S115B_break==1){
1682     if( betamean <1. ) dEdxHe = f_BB5B( betamean );
1683     else dEdxHe = 33;
1684     } else {
1685     if( betamean <1. ) dEdxHe = f_BB( (parBBneg[ii]), betamean );
1686     else dEdxHe = parBBpos[ii];
1687     }
1688 mocchiut 1.27
1689 mocchiut 1.32
1690     if(dEdxHe<=0){
1691 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adclin,ii);
1692 mocchiut 1.32 continue;
1693     };
1694 carbone 1.26
1695     if(ii==9 && S115B_break==1) dEdx = f_desatBB5B( adclin );
1696     else dEdx = f_desatBB((parDesatBB[ii]), adclin );
1697    
1698 mocchiut 1.32 if(dEdx<=0){
1699 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adclin,ii);
1700 mocchiut 1.32 continue;
1701     };
1702 carbone 1.26
1703 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)dEdx,ii);
1704 mocchiut 1.31 // eDEDXpmt.AddAt((Float_t)dEdx,ii);
1705 carbone 1.26
1706 mocchiut 1.31 // printf(" PMT IS %i dedx is %f vector is %f \n",ii,dEdx,eDEDXpmt[ii]);
1707 carbone 1.26
1708 mocchiut 1.27 } //end loop on 48 PMT
1709 carbone 1.26
1710     };
1711    
1712    
1713     //------------------------------------------------------------------------
1714     void ToFdEdx::Define_PMTsat()
1715     {
1716     Float_t sat[48] = {
1717     3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
1718     3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
1719     3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
1720     3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
1721     3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
1722     3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
1723     PMTsat.Set(48,sat);
1724     }
1725    
1726     //------------------------------------------------------------------------
1727     void ToFdEdx::ReadParBBpos( const char *fname )
1728     {
1729 mocchiut 1.27 // printf("read %s\n",fname);
1730 carbone 1.26 parBBpos.Set(48);
1731     FILE *fattin = fopen( fname , "r" );
1732     for (int i=0; i<48; i++) {
1733     int tid=0;
1734     float tp;
1735     if(fscanf(fattin,"%d %f",
1736     &tid, &tp )!=2) break;
1737     parBBpos[i]=tp;
1738     }
1739     fclose(fattin);
1740     }
1741    
1742     //------------------------------------------------------------------------
1743     void ToFdEdx::ReadParDesatBB( const char *fname )
1744     {
1745 mocchiut 1.27 // printf("read %s\n",fname);
1746 carbone 1.26 FILE *fattin = fopen( fname , "r" );
1747     for (int i=0; i<48; i++) {
1748     int tid=0;
1749     float tp[3];
1750     if(fscanf(fattin,"%d %f %f %f",
1751     &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
1752     parDesatBB[i].Set(3,tp);
1753     }
1754     fclose(fattin);
1755     }
1756    
1757    
1758     //------------------------------------------------------------------------
1759     void ToFdEdx::ReadParBBneg( const char *fname )
1760    
1761     {
1762 mocchiut 1.27 // printf("read %s\n",fname);
1763 carbone 1.26 FILE *fattin = fopen( fname , "r" );
1764     for (int i=0; i<48; i++) {
1765     int tid=0;
1766     float tp[3];
1767     if(fscanf(fattin,"%d %f %f %f",
1768     &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
1769     parBBneg[i].Set(3,tp);
1770     }
1771     fclose(fattin);
1772     }
1773    
1774     //------------------------------------------------------------------------
1775     void ToFdEdx::ReadParPos( const char *fname )
1776     {
1777 mocchiut 1.27 // printf("read %s\n",fname);
1778 carbone 1.26 FILE *fattin = fopen( fname , "r" );
1779     for (int i=0; i<48; i++) {
1780     int tid=0;
1781     float tp[4];
1782     if(fscanf(fattin,"%d %f %f %f %f",
1783     &tid, &tp[0], &tp[1], &tp[2], &tp[3])!=5) break;
1784     parPos[i].Set(4,tp);
1785     }
1786     fclose(fattin);
1787     }
1788    
1789     //------------------------------------------------------------------------
1790     void ToFdEdx::ReadParAtt( const char *fname )
1791     {
1792 mocchiut 1.27 // printf("read %s\n",fname);
1793 carbone 1.26 FILE *fattin = fopen( fname , "r" );
1794     for (int i=0; i<48; i++) {
1795     int tid=0;
1796     float tp[6];
1797     if(fscanf(fattin,"%d %f %f %f %f %f %f",
1798     &tid, &tp[0], &tp[1], &tp[2], &tp[3], &tp[4], &tp[5] )!=7) break;
1799     parAtt[i].Set(6,tp);
1800     }
1801     fclose(fattin);
1802     }
1803    
1804    
1805    
1806    
1807    
1808    
1809     double ToFdEdx::f_att( TArrayF &p, float x )
1810     {
1811     return
1812     p[0] +
1813     p[1]*x +
1814     p[2]*x*x +
1815     p[3]*x*x*x +
1816     p[4]*x*x*x*x +
1817     p[5]*x*x*x*x*x;
1818     }
1819     //------------------------------------------------------------------------
1820     double ToFdEdx::f_att5B( float x )
1821     {
1822     return
1823     101.9409 +
1824     6.643781*x +
1825     0.2765518*x*x +
1826     0.004617647*x*x*x +
1827     0.0006195132*x*x*x*x +
1828     0.00002813734*x*x*x*x*x;
1829     }
1830    
1831    
1832     double ToFdEdx::f_pos( TArrayF &p, float x )
1833     {
1834     return
1835     p[0] +
1836     p[1]*x +
1837     p[2]*x*x +
1838     p[3]*x*x*x;
1839     }
1840    
1841     double ToFdEdx::f_pos5B( float x )
1842     {
1843     return
1844     15.45132 +
1845     0.8369721*x +
1846     0.0005*x*x;
1847     }
1848    
1849    
1850    
1851     double ToFdEdx::f_adcPC( float x )
1852     {
1853     return 28.12+0.6312*x-5.647e-05*x*x+3.064e-08*x*x*x;
1854     }
1855    
1856    
1857     float ToFdEdx::Get_adc_he( int id, float pl_x[6], float pl_y[6])
1858     {
1859    
1860     //
1861     // input: id - pmt [0:47}
1862     // pl_x - coord x of the tof plane
1863     // pl_y - coord y
1864    
1865 mocchiut 1.27 adc_he = 0;
1866 carbone 1.26 if( eGeom.GetXY(id)==1 ) adc_he = f_att( (parAtt[id]), pl_x[eGeom.GetPlane(id)] );
1867     if( eGeom.GetXY(id)==2 ) adc_he = f_att( (parAtt[id]), pl_y[eGeom.GetPlane(id)] );
1868     return adc_he;
1869     }
1870    
1871     //------------------------------------------------------------------------
1872     double ToFdEdx::f_BB( TArrayF &p, float x )
1873     {
1874     return p[0]/(x*x)*(log(x*x/(1-x*x)) - p[1]*x*x - p[2]);
1875     }
1876    
1877     //------------------------------------------------------------------------
1878     double ToFdEdx::f_BB5B( float x )
1879     {
1880     return 0.165797/(x*x)*(log(x*x/(1-x*x)) + 140.481*x*x + 52.9258);
1881     }
1882     //------------------------------------------------------------------------
1883     double ToFdEdx::f_desatBB( TArrayF &p, float x )
1884     {
1885     return
1886     p[0] +
1887     p[1]*x +
1888     p[2]*x*x;
1889     }
1890    
1891     //------------------------------------------------------------------------
1892     double ToFdEdx::f_desatBB5B( float x )
1893     {
1894     return
1895     -2.4 +
1896     0.75*x +
1897     0.009*x*x;
1898     }
1899    
1900    
1901    
1902    
1903    
1904    
1905    
1906    
1907    
1908    
1909    
1910    
1911    
1912    
1913    
1914    

  ViewVC Help
Powered by ViewVC 1.1.23