/[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.31 - (hide annotations) (download)
Fri Feb 5 12:51:44 2010 UTC (14 years, 9 months ago) by mocchiut
Branch: MAIN
CVS Tags: v9r00, v9r01
Changes since 1.30: +4 -0 lines
Bug ToFcore.cpp fixed

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

  ViewVC Help
Powered by ViewVC 1.1.23