/[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.34 - (hide annotations) (download)
Wed Nov 23 21:19:38 2011 UTC (13 years ago) by mocchiut
Branch: MAIN
Changes since 1.33: +25 -17 lines
New ToF stuff, new IGRF handling and parameter files

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

  ViewVC Help
Powered by ViewVC 1.1.23