/[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.42 - (hide annotations) (download)
Fri Oct 17 07:54:17 2014 UTC (10 years, 4 months ago) by pam-fi
Branch: MAIN
CVS Tags: v10RED, v10REDr01
Changes since 1.41: +38 -0 lines
Some methods added

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.36 l0flag_adc = 0.;
25     l0flag_tdc = 0.;
26 mocchiut 1.4 }
27    
28     ToFPMT::ToFPMT(const ToFPMT &t){
29     pmt_id = t.pmt_id;
30     adc = t.adc;
31     tdc_tw = t.tdc_tw;
32 mocchiut 1.17 tdc = t.tdc;
33 mocchiut 1.4 }
34    
35 mocchiut 1.18 void ToFPMT::Clear(Option_t *t){
36 mocchiut 1.4 pmt_id = 0;
37     adc = 0.;
38     tdc_tw = 0.;
39 mocchiut 1.17 tdc = 0.;
40 mocchiut 1.4 }
41    
42    
43    
44 mocchiut 1.1 ToFTrkVar::ToFTrkVar() {
45 mocchiut 1.4 trkseqno = 0;
46     npmttdc = 0;
47     npmtadc = 0;
48     pmttdc = TArrayI(48);
49     pmtadc = TArrayI(48);
50 mocchiut 1.9 tdcflag = TArrayI(48); // gf: 30 Nov 2006
51     adcflag = TArrayI(48); // gf: 30 Nov 2006
52 mocchiut 1.4 dedx = TArrayF(48);
53     //
54     //
55     memset(beta, 0, 13*sizeof(Float_t));
56     memset(xtofpos, 0, 3*sizeof(Float_t));
57     memset(ytofpos, 0, 3*sizeof(Float_t));
58 mocchiut 1.16 memset(xtr_tof, 0, 6*sizeof(Float_t));
59     memset(ytr_tof, 0, 6*sizeof(Float_t));
60 mocchiut 1.4 //
61     };
62 mocchiut 1.1
63 mocchiut 1.18 void ToFTrkVar::Clear(Option_t *t) {
64 mocchiut 1.1 trkseqno = 0;
65 mocchiut 1.4 npmttdc = 0;
66     npmtadc = 0;
67     pmttdc.Reset();
68     pmtadc.Reset();
69 mocchiut 1.9 tdcflag.Reset(); // gf: 30 Nov 2006
70     adcflag.Reset(); // gf: 30 Nov 2006
71 mocchiut 1.4 dedx.Reset();
72     //
73     memset(beta, 0, 13*sizeof(Float_t));
74     memset(xtofpos, 0, 3*sizeof(Float_t));
75     memset(ytofpos, 0, 3*sizeof(Float_t));
76 mocchiut 1.16 memset(xtr_tof, 0, 6*sizeof(Float_t));
77     memset(ytr_tof, 0, 6*sizeof(Float_t));
78 mocchiut 1.4 //
79     };
80 mocchiut 1.1
81     ToFTrkVar::ToFTrkVar(const ToFTrkVar &t){
82    
83     trkseqno = t.trkseqno;
84 mocchiut 1.4 //
85     npmttdc = t.npmttdc;
86     npmtadc = t.npmtadc;
87     (t.pmttdc).Copy(pmttdc);
88     (t.pmtadc).Copy(pmtadc);
89 mocchiut 1.9 (t.tdcflag).Copy(tdcflag); // gf: 30 Nov 2006
90     (t.adcflag).Copy(adcflag); // gf: 30 Nov 2006
91 mocchiut 1.4 (t.dedx).Copy(dedx);
92     //
93     memcpy(beta,t.beta,sizeof(beta));
94     memcpy(xtofpos,t.xtofpos,sizeof(xtofpos));
95     memcpy(ytofpos,t.ytofpos,sizeof(ytofpos));
96 mocchiut 1.16 memcpy(xtr_tof,t.xtr_tof,sizeof(xtr_tof));
97     memcpy(ytr_tof,t.ytr_tof,sizeof(ytr_tof));
98 mocchiut 1.4 //
99     };
100 mocchiut 1.1
101     ToFLevel2::ToFLevel2() {
102     //
103 mocchiut 1.13 // PMT = new TClonesArray("ToFPMT",12); //ELENA
104     // ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
105     PMT = 0; //ELENA
106     ToFTrk = 0; //ELENA
107 mocchiut 1.1 //
108 mocchiut 1.8 this->Clear();
109     //
110 mocchiut 1.3 };
111    
112 mocchiut 1.13 void ToFLevel2::Set(){//ELENA
113     if(!PMT)PMT = new TClonesArray("ToFPMT",12); //ELENA
114     if(!ToFTrk)ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
115     }//ELENA
116 pam-fi 1.42 //--------------------------------------
117     //
118     //
119     //--------------------------------------
120     void ToFLevel2::SetTrackArray(TClonesArray *track){//ELENA
121     if(track && strcmp(track->GetClass()->GetName(),"ToFTrkVar")==0){
122     if(ToFTrk)ToFTrk->Clear("C");
123     ToFTrk = track;
124     }
125     }
126 mocchiut 1.13
127 mocchiut 1.18 void ToFLevel2::Clear(Option_t *t){
128 mocchiut 1.3 //
129 mocchiut 1.13 if(ToFTrk)ToFTrk->Delete(); //ELENA
130     if(PMT)PMT->Delete(); //ELENA
131 mocchiut 1.4 memset(tof_j_flag, 0, 6*sizeof(Int_t));
132 mocchiut 1.8 unpackError = 0;
133 mocchiut 1.36 unpackWarning = 0;
134 mocchiut 1.4 //
135 mocchiut 1.1 };
136    
137 mocchiut 1.18 void ToFLevel2::Delete(Option_t *t){ //ELENA
138 mocchiut 1.13 //
139     if(ToFTrk){
140     ToFTrk->Delete(); //ELENA
141     delete ToFTrk; //ELENA
142     }
143     if(PMT){
144     PMT->Delete(); //ELENA
145     delete PMT; //ELENA
146     } //ELENA
147     //
148     }; //ELENA
149    
150 mocchiut 1.1 ToFTrkVar *ToFLevel2::GetToFTrkVar(Int_t itrk){
151     //
152     if(itrk >= ntrk()){
153     printf(" ToFLevel2 ERROR: track related variables set %i does not exists! \n",itrk);
154     printf(" stored track related variables = %i \n",ntrk());
155     return(NULL);
156     }
157     //
158 mocchiut 1.13 if(!ToFTrk)return 0; //ELENA
159 mocchiut 1.1 TClonesArray &t = *(ToFTrk);
160     ToFTrkVar *toftrack = (ToFTrkVar*)t[itrk];
161     return toftrack;
162     }
163 mocchiut 1.4
164 pam-fi 1.42 /**
165     * Retrieves the tof track matching the seqno-th tracker stored track.
166     *
167     */
168     ToFTrkVar *ToFLevel2::GetToFStoredTrack(int seqno){
169    
170     if( ntrk()==0 ){
171     printf("ToFLevel2::GetToFStoredTrack(int) : requested tracker SeqNo %i but no ToFrimeter tracks are stored\n",seqno);
172     return NULL;
173     };
174    
175     ToFTrkVar *c = 0;
176     Int_t it_tof=0;
177    
178     do {
179     c = GetToFTrkVar(it_tof);
180     it_tof++;
181     } while( c && seqno != c->trkseqno && it_tof < ntrk());
182    
183     if(!c || seqno != c->trkseqno){
184     c = 0;
185     if(seqno!=-1 ) printf("ToFLevel2::GetToFStoredTrack(int) : requested tracker SeqNo %i does not match ToFrimeter stored tracks\n",seqno);
186     };
187     return c;
188    
189     }
190    
191    
192 mocchiut 1.4 ToFPMT *ToFLevel2::GetToFPMT(Int_t ihit){
193     //
194     if(ihit >= npmt()){
195     printf(" ToFLevel2 ERROR: pmt variables set %i does not exists! \n",ihit);
196     printf(" stored pmt variables = %i \n",npmt());
197     return(NULL);
198     }
199     //
200 mocchiut 1.13 if(!PMT)return 0; //ELENA
201 mocchiut 1.4 TClonesArray &t = *(PMT);
202     ToFPMT *tofpmt = (ToFPMT*)t[ihit];
203     return tofpmt;
204     }
205 mocchiut 1.1 //--------------------------------------
206     //
207     //
208     //--------------------------------------
209     /**
210 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)
211 mocchiut 1.16 * @param Plane index (0,1,2,3,4,5).
212 mocchiut 1.1 */
213     Int_t ToFLevel2::GetToFPlaneID(Int_t ip){
214     if(ip>=0 && ip<6)return 10*((int)(ip/2+1.1))+(ip%2)+1;
215     else return -1;
216     };
217     /**
218 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)
219 pam-de 1.15 * @param plane Plane ID (11, 12, 21, 22, 31, 32)
220 mocchiut 1.1 */
221     Int_t ToFLevel2::GetToFPlaneIndex(Int_t plane_id){
222     if(
223     plane_id == 11 ||
224     plane_id == 12 ||
225     plane_id == 21 ||
226     plane_id == 22 ||
227     plane_id == 31 ||
228     plane_id == 32 ||
229     false)return (Int_t)(plane_id/10)*2-1- plane_id%2;
230     else return -1;
231     };
232     /**
233 mocchiut 1.13 * Method to know if a given ToF paddle was hit, that is there is a TDC signal
234 pam-de 1.15 * from both PMTs. The method uses the "tof_j_flag" variable.
235 mocchiut 1.1 * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
236     * @param paddle_id Paddle ID.
237     * @return 1 if the paddle was hit.
238     */
239     Bool_t ToFLevel2::HitPaddle(Int_t plane, Int_t paddle_id){ //<<< NEW
240     Int_t ip = -1;
241     if (plane>=6 ) ip = GetToFPlaneIndex(plane);
242     else if(plane>=0 && plane < 6) ip = plane;
243     Int_t flag=0;
244 mocchiut 1.2 if(ip != -1)flag = tof_j_flag[ip] & (int)pow(2.,(double)paddle_id);
245 mocchiut 1.1 if(
246     (ip == 0 && paddle_id < 8 && flag) ||
247     (ip == 1 && paddle_id < 6 && flag) ||
248     (ip == 2 && paddle_id < 2 && flag) ||
249     (ip == 3 && paddle_id < 2 && flag) ||
250     (ip == 4 && paddle_id < 3 && flag) ||
251     (ip == 5 && paddle_id < 3 && flag) ||
252     false) return true;
253     else return false;
254     };
255     /**
256     * Method to get the number of hit paddles on a ToF plane.
257     * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
258     */
259     Int_t ToFLevel2::GetNHitPaddles(Int_t plane){
260     Int_t npad=0;
261     for(Int_t i=0; i<8; i++)npad = npad + (int)HitPaddle(plane,i);
262     return npad;
263     };
264 mocchiut 1.4
265 mocchiut 1.36 /**
266     * Method to get the number of hit paddles on a ToF plane.
267     * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
268     */
269     Int_t ToFLevel2::GetTrueNHitPaddles(Int_t plane){
270     Int_t npad=0;
271     TClonesArray* Pmt = this->PMT;
272     int paddle[24];
273     memset(paddle,0, 24*sizeof(int));
274     for(int i=0; i<Pmt->GetEntries(); i++) { //loop per vedere quale TOF è colpito
275     ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
276     int pplane = -1;
277     int ppaddle = -1;
278     GetPMTPaddle(pmthit->pmt_id,pplane,ppaddle);
279     if ( pplane == plane ) paddle[ppaddle]++;
280     }
281     for(int i=0;i<24;i++) if ( paddle[i]>0 ) npad++;
282    
283     return npad;
284     };
285    
286 pamelats 1.23 //wm Nov 08
287 mocchiut 1.16 //gf Apr 07
288 pam-de 1.14 /**
289 pamelats 1.23 * Method to get the mean dEdx from a ToF layer - ATTENTION:
290     * It will sum up the dEdx of all the paddles, but since by definition
291     * only the paddle hitted by the track gets a dEdx value and the other
292     * paddles are set to zero, the output is just the dEdx of the hitted
293     * paddle in each layer!
294     * The "adcfl" option is not very useful (an artificial dEdx is per
295     * definition= 1 mip and not a real measurement), anyway left in the code
296 pam-de 1.14 * @param notrack Track Number
297 mocchiut 1.16 * @param plane Plane index (0,1,2,3,4,5)
298     * @param adcflag in the plane (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
299 pam-de 1.14 */
300 mocchiut 1.39 Float_t ToFLevel2::GetdEdx(ToFTrkVar *trk, Int_t plane, Int_t adcfl){
301     // printf("fiffi\n");
302     Float_t dedx = 0.;
303     Float_t PadEdx =0.;
304     Int_t SatWarning;
305     Int_t pad=-1;
306     //
307     if(!trk) return 0; //ELENA
308     //
309     if ( trk->trkseqno == -1 ){ //standalone, only paddles along the track, or about...
310     // printf("ciccio\n");
311     Float_t xleft=0;
312     Float_t xright=0;
313     Float_t yleft=0;
314     Float_t yright=0;
315     Float_t xtof_temp[6]={100.,100.,100.,100.,100.,100.};
316     Float_t ytof_temp[6]={100.,100.,100.,100.,100.,100.};
317     ToFTrkVar *t_tof = trk;
318    
319     xtof_temp[0]=t_tof->xtofpos[0];
320     ytof_temp[0]=t_tof->ytofpos[0];
321     xtof_temp[1]=t_tof->xtofpos[0];
322     ytof_temp[1]=t_tof->ytofpos[0];
323    
324     xtof_temp[2]=t_tof->xtofpos[1];
325     ytof_temp[2]=t_tof->ytofpos[1];
326     xtof_temp[3]=t_tof->xtofpos[1];
327     ytof_temp[3]=t_tof->ytofpos[1];
328    
329     xtof_temp[4]=t_tof->xtofpos[2];
330     ytof_temp[4]=t_tof->ytofpos[2];
331     xtof_temp[5]=t_tof->xtofpos[2];
332     ytof_temp[5]=t_tof->ytofpos[2];
333    
334     if(t_tof->xtofpos[0]<100. && t_tof->ytofpos[0]<100.){
335     xtof_temp[1]=t_tof->xtofpos[0];
336     ytof_temp[0]=t_tof->ytofpos[0];
337     }else if(t_tof->xtofpos[0]>=100. && t_tof->ytofpos[0]<100.){
338     ytof_temp[0]=t_tof->ytofpos[0];
339     this->GetPaddleGeometry(0,(Int_t)log2(this->tof_j_flag[0]),xleft, xright, yleft, yright);
340     xtof_temp[1]=xleft+2.55;
341     }else if(t_tof->ytofpos[0]>=100. && t_tof->xtofpos[0]<100.){
342     xtof_temp[1]=t_tof->xtofpos[0];
343     this->GetPaddleGeometry(1,(Int_t)log2(this->tof_j_flag[1]),xleft, xright, yleft, yright);
344     ytof_temp[0]=yleft+2.75;
345     }
346    
347     if(t_tof->xtofpos[1]<100. && t_tof->ytofpos[1]<100.){
348     xtof_temp[2]=t_tof->xtofpos[1];
349     ytof_temp[3]=t_tof->ytofpos[1];
350     }else if(t_tof->xtofpos[1]>=100. && t_tof->ytofpos[1]<100.){
351     ytof_temp[3]=t_tof->ytofpos[1];
352     this->GetPaddleGeometry(3,(Int_t)log2(this->tof_j_flag[3]),xleft, xright, yleft, yright);
353     xtof_temp[2]=xleft+4.5;
354     }else if(t_tof->ytofpos[1]>=100. && t_tof->xtofpos[1]<100.){
355     xtof_temp[2]=t_tof->xtofpos[1];
356     this->GetPaddleGeometry(2,(Int_t)log2(this->tof_j_flag[2]),xleft, xright, yleft, yright);
357     ytof_temp[3]=yleft+3.75;
358     }
359    
360     if(t_tof->xtofpos[2]<100. && t_tof->ytofpos[2]<100.){
361     xtof_temp[5]=t_tof->xtofpos[2];
362     ytof_temp[4]=t_tof->ytofpos[2];
363     }else if(t_tof->xtofpos[2]>=100. && t_tof->ytofpos[2]<100.){
364     ytof_temp[4]=t_tof->ytofpos[2];
365     this->GetPaddleGeometry(4,(Int_t)log2(this->tof_j_flag[4]),xleft, xright, yleft, yright);
366     xtof_temp[5]=xleft+3;
367     }else if(t_tof->ytofpos[2]>=100. && t_tof->xtofpos[2]<100.){
368     xtof_temp[5]=t_tof->xtofpos[2];
369     this->GetPaddleGeometry(5,(Int_t)log2(this->tof_j_flag[5]),xleft, xright, yleft, yright);
370     ytof_temp[4]=yleft+2.5;
371     }
372    
373     if ( (xtof_temp[0])> 17.85 && fabs(xtof_temp[0])<17.85+4. ) xtof_temp[0] =17.84;
374     if ( (xtof_temp[1])> 17.85 && fabs(xtof_temp[1])<17.85+4. ) xtof_temp[1] =17.84;
375     if ( (ytof_temp[0])> 13.75 && fabs(ytof_temp[0])<13.75+4. ) ytof_temp[0] =13.74;
376     if ( (ytof_temp[1])> 13.75 && fabs(ytof_temp[1])<13.75+4. ) ytof_temp[1] =13.74;
377     if ( (xtof_temp[0])< -17.85 && fabs(xtof_temp[0])>-(17.85+4.) ) xtof_temp[0] =-17.84;
378     if ( (xtof_temp[1])< -17.85 && fabs(xtof_temp[1])>-(17.85+4.) ) xtof_temp[1] =-17.84;
379     if ( (ytof_temp[0])< -13.75 && fabs(ytof_temp[0])>-(13.75+4.) ) ytof_temp[0] =-13.74;
380     if ( (ytof_temp[1])< -13.75 && fabs(ytof_temp[1])>-(13.75+4.) ) ytof_temp[1] =-13.74;
381    
382     if ( (xtof_temp[2])> 4.5 && (xtof_temp[2])<4.5+4. ) xtof_temp[2] =4.4;
383     if ( (xtof_temp[3])> 4.45 && (xtof_temp[3])<4.5+4. ) xtof_temp[3] =4.4;
384     if ( (ytof_temp[2])> 3.75 && (ytof_temp[2])<3.75+4. ) ytof_temp[2] =3.74;
385     if ( (ytof_temp[3])> 3.75 && (ytof_temp[3])<3.75+4. ) ytof_temp[3] =3.74;
386     if ( (xtof_temp[2])< -4.5 && (xtof_temp[2])>-(4.5+4.) ) xtof_temp[2] =-4.4;
387     if ( (xtof_temp[3])< -4.45 && (xtof_temp[3])>-(4.5+4.) ) xtof_temp[3] =-4.4;
388     if ( (ytof_temp[2])< -3.75 && (ytof_temp[2])>-(3.75+4.) ) ytof_temp[2] =-3.74;
389     if ( (ytof_temp[3])< -3.75 && (ytof_temp[3])>-(3.75+4.) ) ytof_temp[3] =-3.74;
390    
391     if ( (xtof_temp[4])> 6. && (xtof_temp[4])<6.+4. ) xtof_temp[2] =5.9;
392     if ( (xtof_temp[5])> 6. && (xtof_temp[5])<6.+4. ) xtof_temp[3] =5.9;
393     if ( (ytof_temp[4])> 5. && (ytof_temp[4])<5.+4. ) ytof_temp[2] =4.9;
394     if ( (ytof_temp[5])> 5. && (ytof_temp[5])<5.+4. ) ytof_temp[3] =4.9;
395     if ( (xtof_temp[4])< -6. && (xtof_temp[4])>-(6.+4.) ) xtof_temp[2] =-5.9;
396     if ( (xtof_temp[5])< -6. && (xtof_temp[5])>-(6.+4.) ) xtof_temp[3] =-5.9;
397     if ( (ytof_temp[4])< -5. && (ytof_temp[4])>-(5.+4.) ) ytof_temp[2] =-4.9;
398     if ( (ytof_temp[5])< -5. && (ytof_temp[5])>-(5.+4.) ) ytof_temp[3] =-4.9;
399    
400    
401     for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
402     Int_t paddleid=ii;
403     pad = GetPaddleid(plane,paddleid);
404     Int_t IpaddleT=-1;
405     IpaddleT=this->GetPaddleIdOfTrack(xtof_temp[plane],ytof_temp[plane], plane,0.0);
406     // printf("SSS %i %i %f %f %f %f \n",IpaddleT,paddleid,xtof_temp[plane],ytof_temp[plane],t_tof->xtofpos[plane],t_tof->ytofpos[plane]);
407     // if ( IpaddleT == paddleid || IpaddleT-1 == paddleid || IpaddleT+1 == paddleid ){
408     if ( IpaddleT == paddleid || GetTrueNHitPaddles(plane) == 1 ){
409     //IpaddleT-1 == paddleid || IpaddleT+1 == paddleid ){
410     GetdEdxPaddle(trk, pad, adcfl, PadEdx, SatWarning);
411     dedx += PadEdx;
412     }
413     };
414     } else {
415     for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
416     Int_t paddleid=ii;
417     pad = GetPaddleid(plane,paddleid);
418     GetdEdxPaddle(trk, pad, adcfl, PadEdx, SatWarning);
419     dedx += PadEdx;
420     // printf("TTT %i %i %f\n",paddleid,plane,PadEdx);
421     };
422     }
423     //
424     return(dedx);
425     };
426    
427    
428     //wm Nov 08
429     //gf Apr 07
430     /**
431     * Method to get the mean dEdx from a ToF layer - ATTENTION:
432     * It will sum up the dEdx of all the paddles, but since by definition
433     * only the paddle hitted by the track gets a dEdx value and the other
434     * paddles are set to zero, the output is just the dEdx of the hitted
435     * paddle in each layer!
436     * The "adcfl" option is not very useful (an artificial dEdx is per
437     * definition= 1 mip and not a real measurement), anyway left in the code
438     * @param notrack Track Number
439     * @param plane Plane index (0,1,2,3,4,5)
440     * @param adcflag in the plane (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
441     */
442 mocchiut 1.16 Float_t ToFLevel2::GetdEdx(Int_t notrack, Int_t plane, Int_t adcfl){
443 mocchiut 1.36 // printf("fiffi\n");
444 mocchiut 1.4 Float_t dedx = 0.;
445 mocchiut 1.16 Float_t PadEdx =0.;
446     Int_t SatWarning;
447     Int_t pad=-1;
448 mocchiut 1.4 //
449     ToFTrkVar *trk = GetToFTrkVar(notrack);
450 mocchiut 1.13 if(!trk) return 0; //ELENA
451 mocchiut 1.4 //
452 mocchiut 1.36 if ( trk->trkseqno == -1 ){ //standalone, only paddles along the track, or about...
453     // printf("ciccio\n");
454     Float_t xleft=0;
455     Float_t xright=0;
456     Float_t yleft=0;
457     Float_t yright=0;
458     Float_t xtof_temp[6]={100.,100.,100.,100.,100.,100.};
459     Float_t ytof_temp[6]={100.,100.,100.,100.,100.,100.};
460     ToFTrkVar *t_tof = trk;
461    
462     xtof_temp[0]=t_tof->xtofpos[0];
463     ytof_temp[0]=t_tof->ytofpos[0];
464     xtof_temp[1]=t_tof->xtofpos[0];
465     ytof_temp[1]=t_tof->ytofpos[0];
466    
467     xtof_temp[2]=t_tof->xtofpos[1];
468     ytof_temp[2]=t_tof->ytofpos[1];
469     xtof_temp[3]=t_tof->xtofpos[1];
470     ytof_temp[3]=t_tof->ytofpos[1];
471    
472     xtof_temp[4]=t_tof->xtofpos[2];
473     ytof_temp[4]=t_tof->ytofpos[2];
474     xtof_temp[5]=t_tof->xtofpos[2];
475     ytof_temp[5]=t_tof->ytofpos[2];
476    
477     if(t_tof->xtofpos[0]<100. && t_tof->ytofpos[0]<100.){
478     xtof_temp[1]=t_tof->xtofpos[0];
479     ytof_temp[0]=t_tof->ytofpos[0];
480     }else if(t_tof->xtofpos[0]>=100. && t_tof->ytofpos[0]<100.){
481     ytof_temp[0]=t_tof->ytofpos[0];
482     this->GetPaddleGeometry(0,(Int_t)log2(this->tof_j_flag[0]),xleft, xright, yleft, yright);
483     xtof_temp[1]=xleft+2.55;
484     }else if(t_tof->ytofpos[0]>=100. && t_tof->xtofpos[0]<100.){
485     xtof_temp[1]=t_tof->xtofpos[0];
486     this->GetPaddleGeometry(1,(Int_t)log2(this->tof_j_flag[1]),xleft, xright, yleft, yright);
487     ytof_temp[0]=yleft+2.75;
488     }
489    
490     if(t_tof->xtofpos[1]<100. && t_tof->ytofpos[1]<100.){
491     xtof_temp[2]=t_tof->xtofpos[1];
492     ytof_temp[3]=t_tof->ytofpos[1];
493     }else if(t_tof->xtofpos[1]>=100. && t_tof->ytofpos[1]<100.){
494     ytof_temp[3]=t_tof->ytofpos[1];
495     this->GetPaddleGeometry(3,(Int_t)log2(this->tof_j_flag[3]),xleft, xright, yleft, yright);
496     xtof_temp[2]=xleft+4.5;
497     }else if(t_tof->ytofpos[1]>=100. && t_tof->xtofpos[1]<100.){
498     xtof_temp[2]=t_tof->xtofpos[1];
499     this->GetPaddleGeometry(2,(Int_t)log2(this->tof_j_flag[2]),xleft, xright, yleft, yright);
500     ytof_temp[3]=yleft+3.75;
501     }
502    
503     if(t_tof->xtofpos[2]<100. && t_tof->ytofpos[2]<100.){
504     xtof_temp[5]=t_tof->xtofpos[2];
505     ytof_temp[4]=t_tof->ytofpos[2];
506     }else if(t_tof->xtofpos[2]>=100. && t_tof->ytofpos[2]<100.){
507     ytof_temp[4]=t_tof->ytofpos[2];
508     this->GetPaddleGeometry(4,(Int_t)log2(this->tof_j_flag[4]),xleft, xright, yleft, yright);
509     xtof_temp[5]=xleft+3;
510     }else if(t_tof->ytofpos[2]>=100. && t_tof->xtofpos[2]<100.){
511     xtof_temp[5]=t_tof->xtofpos[2];
512     this->GetPaddleGeometry(5,(Int_t)log2(this->tof_j_flag[5]),xleft, xright, yleft, yright);
513     ytof_temp[4]=yleft+2.5;
514     }
515    
516     if ( (xtof_temp[0])> 17.85 && fabs(xtof_temp[0])<17.85+4. ) xtof_temp[0] =17.84;
517     if ( (xtof_temp[1])> 17.85 && fabs(xtof_temp[1])<17.85+4. ) xtof_temp[1] =17.84;
518     if ( (ytof_temp[0])> 13.75 && fabs(ytof_temp[0])<13.75+4. ) ytof_temp[0] =13.74;
519     if ( (ytof_temp[1])> 13.75 && fabs(ytof_temp[1])<13.75+4. ) ytof_temp[1] =13.74;
520     if ( (xtof_temp[0])< -17.85 && fabs(xtof_temp[0])>-(17.85+4.) ) xtof_temp[0] =-17.84;
521     if ( (xtof_temp[1])< -17.85 && fabs(xtof_temp[1])>-(17.85+4.) ) xtof_temp[1] =-17.84;
522     if ( (ytof_temp[0])< -13.75 && fabs(ytof_temp[0])>-(13.75+4.) ) ytof_temp[0] =-13.74;
523     if ( (ytof_temp[1])< -13.75 && fabs(ytof_temp[1])>-(13.75+4.) ) ytof_temp[1] =-13.74;
524    
525     if ( (xtof_temp[2])> 4.5 && (xtof_temp[2])<4.5+4. ) xtof_temp[2] =4.4;
526     if ( (xtof_temp[3])> 4.45 && (xtof_temp[3])<4.5+4. ) xtof_temp[3] =4.4;
527     if ( (ytof_temp[2])> 3.75 && (ytof_temp[2])<3.75+4. ) ytof_temp[2] =3.74;
528     if ( (ytof_temp[3])> 3.75 && (ytof_temp[3])<3.75+4. ) ytof_temp[3] =3.74;
529     if ( (xtof_temp[2])< -4.5 && (xtof_temp[2])>-(4.5+4.) ) xtof_temp[2] =-4.4;
530     if ( (xtof_temp[3])< -4.45 && (xtof_temp[3])>-(4.5+4.) ) xtof_temp[3] =-4.4;
531     if ( (ytof_temp[2])< -3.75 && (ytof_temp[2])>-(3.75+4.) ) ytof_temp[2] =-3.74;
532     if ( (ytof_temp[3])< -3.75 && (ytof_temp[3])>-(3.75+4.) ) ytof_temp[3] =-3.74;
533    
534     if ( (xtof_temp[4])> 6. && (xtof_temp[4])<6.+4. ) xtof_temp[2] =5.9;
535     if ( (xtof_temp[5])> 6. && (xtof_temp[5])<6.+4. ) xtof_temp[3] =5.9;
536     if ( (ytof_temp[4])> 5. && (ytof_temp[4])<5.+4. ) ytof_temp[2] =4.9;
537     if ( (ytof_temp[5])> 5. && (ytof_temp[5])<5.+4. ) ytof_temp[3] =4.9;
538     if ( (xtof_temp[4])< -6. && (xtof_temp[4])>-(6.+4.) ) xtof_temp[2] =-5.9;
539     if ( (xtof_temp[5])< -6. && (xtof_temp[5])>-(6.+4.) ) xtof_temp[3] =-5.9;
540     if ( (ytof_temp[4])< -5. && (ytof_temp[4])>-(5.+4.) ) ytof_temp[2] =-4.9;
541     if ( (ytof_temp[5])< -5. && (ytof_temp[5])>-(5.+4.) ) ytof_temp[3] =-4.9;
542    
543    
544     for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
545     Int_t paddleid=ii;
546     pad = GetPaddleid(plane,paddleid);
547     Int_t IpaddleT=-1;
548     IpaddleT=this->GetPaddleIdOfTrack(xtof_temp[plane],ytof_temp[plane], plane,0.0);
549     // printf("SSS %i %i %f %f %f %f \n",IpaddleT,paddleid,xtof_temp[plane],ytof_temp[plane],t_tof->xtofpos[plane],t_tof->ytofpos[plane]);
550     // if ( IpaddleT == paddleid || IpaddleT-1 == paddleid || IpaddleT+1 == paddleid ){
551     if ( IpaddleT == paddleid || GetTrueNHitPaddles(plane) == 1 ){
552     //IpaddleT-1 == paddleid || IpaddleT+1 == paddleid ){
553     GetdEdxPaddle(notrack, pad, adcfl, PadEdx, SatWarning);
554     dedx += PadEdx;
555     }
556     };
557     } else {
558     for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
559     Int_t paddleid=ii;
560     pad = GetPaddleid(plane,paddleid);
561     GetdEdxPaddle(notrack, pad, adcfl, PadEdx, SatWarning);
562     dedx += PadEdx;
563     // printf("TTT %i %i %f\n",paddleid,plane,PadEdx);
564     };
565     }
566 mocchiut 1.4 //
567     return(dedx);
568     };
569    
570 pam-de 1.14 /**
571 pam-de 1.15 * Method to fill the ADC_C 4x12 matrix with the dEdx values and the TDC 4x12 matrix
572     * with the time-walk corrected TDC values.
573 pam-de 1.14 * @param notrack Track Number
574     * @param adc ADC_C matrix with dEdx values
575     * @param tdc TDC matrix
576     */
577 mocchiut 1.4 void ToFLevel2::GetMatrix(Int_t notrack, Float_t adc[4][12], Float_t tdc[4][12]){
578     //
579     for (Int_t aa=0; aa<4;aa++){
580     for (Int_t bb=0; bb<12;bb++){
581     adc[aa][bb] = 1000.;
582     tdc[aa][bb] = 4095.;
583     };
584     };
585     //
586     Int_t pmt_id = 0;
587     Int_t hh = 0;
588     Int_t kk = 0;
589     //
590     ToFTrkVar *trk = GetToFTrkVar(notrack);
591 mocchiut 1.13 if(!trk)return; //ELENA
592 mocchiut 1.4 //
593     for (Int_t i=0; i<trk->npmtadc; i++){
594     //
595     pmt_id = (trk->pmtadc).At(i);
596     //
597     GetPMTIndex(pmt_id,hh,kk);
598 mocchiut 1.5 adc[kk][hh] = (trk->dedx).At(i);
599 mocchiut 1.4 //
600     };
601     //
602     for (Int_t i=0; i<npmt(); i++){
603     //
604     ToFPMT *pmt = GetToFPMT(i);
605 mocchiut 1.13 if(!pmt)break; //ELENA
606 mocchiut 1.4 //
607     GetPMTIndex(pmt->pmt_id,hh,kk);
608     //
609 mocchiut 1.5 tdc[kk][hh] = pmt->tdc_tw;
610 mocchiut 1.4 //
611     };
612     //
613     return;
614     };
615    
616    
617 pam-de 1.14 /**
618     * Method to get the plane index (0 - 5) for the PMT_ID as input
619     * @param pmt_id PMT_ID (0 - 47)
620     */
621 mocchiut 1.4 Int_t ToFLevel2::GetPlaneIndex(Int_t pmt_id){
622     TString pmtname = GetPMTName(pmt_id);
623     pmtname.Resize(3);
624     if ( !strcmp(pmtname,"S11") ) return(0);
625     if ( !strcmp(pmtname,"S12") ) return(1);
626     if ( !strcmp(pmtname,"S21") ) return(2);
627     if ( !strcmp(pmtname,"S22") ) return(3);
628     if ( !strcmp(pmtname,"S31") ) return(4);
629     if ( !strcmp(pmtname,"S32") ) return(5);
630     return(-1);
631     };
632    
633 mocchiut 1.16
634 pam-de 1.14 /**
635 pam-de 1.15 * Method to get the PMT_ID if the index (4,12) is given. We have 4 channels on
636     * each of the 12 half-boards, this method decodes which PMT is cables to which
637     * channel.
638 pam-de 1.14 * @param hh Channel
639     * @param kk HalfBoard
640     */
641 mocchiut 1.4 Int_t ToFLevel2::GetPMTid(Int_t hh, Int_t kk){
642     //
643     short tof[4][24] = {
644     {4, 4, 4, 4, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 2, 3, 3, 3, 3, 4},
645     {1, 3, 5, 7, 10, 12, 2, 4, 2, 4, 6, 8, 10, 12, 1, 5, 3, 9, 7, 9, 11, 1, 5, 9},
646     {2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 2, 1, 2, 1, 2, 2, 2, 3, 3, 4},
647     {6, 8, 12, 10, 8, 6, 4, 2, 12, 10, 8, 6, 4, 2, 9, 7, 11, 11, 5, 3, 1, 3, 7, 11}
648     };
649     //
650     Int_t ind = 0;
651     Int_t k = 0;
652     while (k < 24){
653     Int_t j = 0;
654     while (j < 2){
655     Int_t ch = tof[2*j][k] - 1;
656     Int_t hb = tof[2*j + 1][k] - 1;
657     /* tofEvent->tdc[ch][hb] */
658     if( ch == hh && hb == kk ){
659     ind = 2*k + j;
660     break;
661     };
662     j++;
663     };
664     k++;
665     };
666     return ind;
667     };
668    
669    
670 pam-de 1.14 /**
671 pam-de 1.15 * Method to get the PMT index if the PMT ID is given. This method is the
672     * "reverse" of method "GetPMTid"
673 pam-de 1.14 * @param ind PMT_ID (0 - 47)
674     * @param hb HalfBoard
675     * @param ch Channel
676     */
677 mocchiut 1.5 void ToFLevel2::GetPMTIndex(Int_t ind, Int_t &hb, Int_t &ch){
678 mocchiut 1.4 //
679     short tof[4][24] = {
680     {4, 4, 4, 4, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 2, 3, 3, 3, 3, 4},
681     {1, 3, 5, 7, 10, 12, 2, 4, 2, 4, 6, 8, 10, 12, 1, 5, 3, 9, 7, 9, 11, 1, 5, 9},
682     {2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 2, 1, 2, 1, 2, 2, 2, 3, 3, 4},
683     {6, 8, 12, 10, 8, 6, 4, 2, 12, 10, 8, 6, 4, 2, 9, 7, 11, 11, 5, 3, 1, 3, 7, 11}
684     };
685     //
686     Int_t k = 0;
687     while (k < 24){
688     Int_t j = 0;
689     while (j < 2){
690 mocchiut 1.5 /* tofEvent->tdc[ch][hb] */
691 mocchiut 1.4 if( ind == 2*k + j ){
692 mocchiut 1.5 ch = tof[2*j][k] - 1;
693     hb = tof[2*j + 1][k] - 1;
694     return;
695 mocchiut 1.4 };
696     j++;
697     };
698     k++;
699     };
700     return;
701     };
702 pam-fi 1.6
703 mocchiut 1.16
704    
705 pamelats 1.23 // wm Nov 08 revision - saturation values included
706 mocchiut 1.16 /// gf Apr 07
707     /**
708     * Method to get the dEdx from a given ToF paddle.
709 pamelats 1.23 * If two PMTs are good, the mean dEdx of both PMTs is taken, otherwise
710     * just the dEdx of the "good" PMT. If both PMTs are above saturation => dEdx=1000
711 mocchiut 1.16 * @param notrack Track Number
712     * @param Paddle index (0,1,...,23).
713     * @param adcflag in the paddle (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
714     * @param PadEdx dEdx from a given ToF paddle
715     * @param SatWarning 1 if the PMT ios near saturation region (adcraw ~3000)
716     */
717     void ToFLevel2::GetdEdxPaddle(Int_t notrack, Int_t paddleid, Int_t adcfl, Float_t &PadEdx, Int_t &SatWarning){
718    
719 mocchiut 1.36 /*
720     Float_t PMTsat[48] = {
721     3162.14, 3165.48, 3153.85, 3085.73, 3089.65, 3107.64, 3097.52, 3078.37,
722     3130.05, 3087.07, 3112.22, 3102.92, 3080.58, 3092.55, 3087.94, 3125.03,
723     3094.09, 3143.16, 3125.51, 3181.27, 3092.09, 3124.98, 3069.3, 3095.53,
724     3097.11, 3133.53, 3114.73, 3113.01, 3091.19, 3097.99, 3033.84, 3134.98,
725     3081.37, 3111.04, 3066.77, 3108.17, 3133, 3111.06, 3052.52, 3140.66,
726     3106.33, 3094.85, 3150.85, 3118.8, 3096.24, 3118.47,3111.36, 3117.11 } ;
727     */
728 pamelats 1.23
729 mocchiut 1.36 // new values from Napoli dec 2008
730     Float_t PMTsat[48] = {
731     3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
732     3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
733     3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
734     3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
735     3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
736     3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
737    
738     for (Int_t i=0; i<48;i++) PMTsat[i] = PMTsat[i] - 5.; // safety margin
739 pamelats 1.23
740    
741 mocchiut 1.16 PadEdx = 0.;
742 mocchiut 1.36 // SatWarning = 1000;
743 pamelats 1.23 SatWarning = 0; // 0=good, increase for each bad PMT
744 mocchiut 1.16
745     Float_t dEdx[48] = {0};
746     Int_t pmt_id = -1;
747     Float_t adcraw[48];
748     //
749     ToFTrkVar *trk = GetToFTrkVar(notrack);
750     if(!trk) return; //ELENA
751     //
752    
753     Int_t pmtleft=-1;
754     Int_t pmtright=-1;
755     GetPaddlePMT(paddleid, pmtleft, pmtright);
756    
757     adcraw[pmtleft] = 4095;
758     adcraw[pmtright] = 4095;
759    
760    
761     for (Int_t jj=0; jj<npmt(); jj++){
762    
763     ToFPMT *pmt = GetToFPMT(jj);
764     if(!pmt)break; //ELENA
765    
766     pmt_id = pmt->pmt_id;
767     if(pmt_id==pmtleft){
768     adcraw[pmtleft] = pmt->adc;
769     }
770    
771     if(pmt_id==pmtright){
772     adcraw[pmtright] = pmt->adc;
773     }
774     }
775 pamelats 1.23
776 mocchiut 1.16
777     for (Int_t i=0; i<trk->npmtadc; i++){
778    
779     if((trk->adcflag).At(i)==0 || adcfl==100){
780     if((trk->pmtadc).At(i) == pmtleft)dEdx[pmtleft] = (trk->dedx).At(i);
781     if((trk->pmtadc).At(i) == pmtright)dEdx[pmtright] = (trk->dedx).At(i);
782     }else{
783     if((trk->pmtadc).At(i) == pmtleft)dEdx[pmtleft] = 0.;
784     if((trk->pmtadc).At(i) == pmtright)dEdx[pmtright] = 0.;
785     }
786     }
787    
788 pamelats 1.23
789 mocchiut 1.36 // if( adcraw[pmtleft] >3000 || adcraw[pmtright] >3000)SatWarning=1; //old version
790 pamelats 1.23
791 mocchiut 1.36 // Increase SatWarning Counter for each PMT>Sat
792 pamelats 1.23 if( adcraw[pmtleft] > PMTsat[pmtleft])SatWarning++;
793     if( adcraw[pmtright] > PMTsat[pmtright])SatWarning++;
794    
795 mocchiut 1.36 // if ADC > sat set dEdx=1000
796 pamelats 1.23 if( adcraw[pmtleft] > PMTsat[pmtleft]) dEdx[pmtleft] = 1000.;
797     if( adcraw[pmtright] > PMTsat[pmtright]) dEdx[pmtright] = 1000. ;
798    
799 mocchiut 1.36 // if two PMT are good, take mean dEdx, otherwise only the good dEdx
800 pamelats 1.23 if(dEdx[pmtleft]<1000 && dEdx[pmtright]<1000) PadEdx = (dEdx[pmtleft]+dEdx[pmtright])*0.5;
801     if(dEdx[pmtleft]==1000 && dEdx[pmtright]<1000) PadEdx = dEdx[pmtright];
802     if(dEdx[pmtleft]<1000 && dEdx[pmtright]==1000) PadEdx = dEdx[pmtleft];
803 mocchiut 1.16
804     };
805 mocchiut 1.39
806 mocchiut 1.16 //
807 mocchiut 1.39 // wm Nov 08 revision - saturation values included
808     /// gf Apr 07
809     /**
810     * Method to get the dEdx from a given ToF paddle.
811     * If two PMTs are good, the mean dEdx of both PMTs is taken, otherwise
812     * just the dEdx of the "good" PMT. If both PMTs are above saturation => dEdx=1000
813     * @param notrack Track Number
814     * @param Paddle index (0,1,...,23).
815     * @param adcflag in the paddle (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
816     * @param PadEdx dEdx from a given ToF paddle
817     * @param SatWarning 1 if the PMT ios near saturation region (adcraw ~3000)
818     */
819     void ToFLevel2::GetdEdxPaddle(ToFTrkVar *trk, Int_t paddleid, Int_t adcfl, Float_t &PadEdx, Int_t &SatWarning){
820 mocchiut 1.16
821 mocchiut 1.39 /*
822     Float_t PMTsat[48] = {
823     3162.14, 3165.48, 3153.85, 3085.73, 3089.65, 3107.64, 3097.52, 3078.37,
824     3130.05, 3087.07, 3112.22, 3102.92, 3080.58, 3092.55, 3087.94, 3125.03,
825     3094.09, 3143.16, 3125.51, 3181.27, 3092.09, 3124.98, 3069.3, 3095.53,
826     3097.11, 3133.53, 3114.73, 3113.01, 3091.19, 3097.99, 3033.84, 3134.98,
827     3081.37, 3111.04, 3066.77, 3108.17, 3133, 3111.06, 3052.52, 3140.66,
828     3106.33, 3094.85, 3150.85, 3118.8, 3096.24, 3118.47,3111.36, 3117.11 } ;
829     */
830    
831     // new values from Napoli dec 2008
832     Float_t PMTsat[48] = {
833     3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
834     3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
835     3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
836     3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
837     3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
838     3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
839    
840     for (Int_t i=0; i<48;i++) PMTsat[i] = PMTsat[i] - 5.; // safety margin
841    
842    
843     PadEdx = 0.;
844     // SatWarning = 1000;
845     SatWarning = 0; // 0=good, increase for each bad PMT
846    
847     Float_t dEdx[48] = {0};
848     Int_t pmt_id = -1;
849     Float_t adcraw[48];
850     //
851     if(!trk) return; //ELENA
852     //
853    
854     Int_t pmtleft=-1;
855     Int_t pmtright=-1;
856     GetPaddlePMT(paddleid, pmtleft, pmtright);
857    
858     adcraw[pmtleft] = 4095;
859     adcraw[pmtright] = 4095;
860    
861    
862     for (Int_t jj=0; jj<npmt(); jj++){
863    
864     ToFPMT *pmt = GetToFPMT(jj);
865     if(!pmt)break; //ELENA
866    
867     pmt_id = pmt->pmt_id;
868     if(pmt_id==pmtleft){
869     adcraw[pmtleft] = pmt->adc;
870     }
871    
872     if(pmt_id==pmtright){
873     adcraw[pmtright] = pmt->adc;
874     }
875     }
876    
877    
878     for (Int_t i=0; i<trk->npmtadc; i++){
879    
880     if((trk->adcflag).At(i)==0 || adcfl==100){
881     if((trk->pmtadc).At(i) == pmtleft)dEdx[pmtleft] = (trk->dedx).At(i);
882     if((trk->pmtadc).At(i) == pmtright)dEdx[pmtright] = (trk->dedx).At(i);
883     }else{
884     if((trk->pmtadc).At(i) == pmtleft)dEdx[pmtleft] = 0.;
885     if((trk->pmtadc).At(i) == pmtright)dEdx[pmtright] = 0.;
886     }
887     }
888    
889    
890     // if( adcraw[pmtleft] >3000 || adcraw[pmtright] >3000)SatWarning=1; //old version
891    
892     // Increase SatWarning Counter for each PMT>Sat
893     if( adcraw[pmtleft] > PMTsat[pmtleft])SatWarning++;
894     if( adcraw[pmtright] > PMTsat[pmtright])SatWarning++;
895    
896     // if ADC > sat set dEdx=1000
897     if( adcraw[pmtleft] > PMTsat[pmtleft]) dEdx[pmtleft] = 1000.;
898     if( adcraw[pmtright] > PMTsat[pmtright]) dEdx[pmtright] = 1000. ;
899    
900     // if two PMT are good, take mean dEdx, otherwise only the good dEdx
901     if(dEdx[pmtleft]<1000 && dEdx[pmtright]<1000) PadEdx = (dEdx[pmtleft]+dEdx[pmtright])*0.5;
902     if(dEdx[pmtleft]==1000 && dEdx[pmtright]<1000) PadEdx = dEdx[pmtright];
903     if(dEdx[pmtleft]<1000 && dEdx[pmtright]==1000) PadEdx = dEdx[pmtleft];
904    
905     };
906 mocchiut 1.16
907     // gf Apr 07
908    
909     /**
910     * Method to get the PMT name (like "S11_1A") if the PMT_ID is given.
911     * Indexes of corresponding plane, paddle and pmt are also given as output.
912     * @param ind PMT_ID (0 - 47)
913     * @param iplane plane index (0 - 5)
914     * @param ipaddle paddle index (relative to the plane)
915     * @param ipmt pmt index (0(A), 1(B))
916     */
917     TString ToFLevel2::GetPMTName(Int_t ind, Int_t &iplane, Int_t &ipaddle,Int_t &ipmt){
918    
919     TString pmtname = " ";
920    
921     TString photoS[48] = {
922     "S11_1A", "S11_1B", "S11_2A", "S11_2B", "S11_3A", "S11_3B", "S11_4A",
923     "S11_4B",
924     "S11_5A", "S11_5B", "S11_6A", "S11_6B", "S11_7A", "S11_7B", "S11_8A",
925     "S11_8B",
926     "S12_1A", "S12_1B", "S12_2A", "S12_2B", "S12_3A", "S12_3B", "S12_4A",
927     "S12_4B", "S12_5A", "S12_5B", "S12_6A", "S12_6B",
928     "S21_1A", "S21_1B", "S21_2A", "S21_2B",
929     "S22_1A", "S22_1B", "S22_2A", "S22_2B",
930     "S31_1A", "S31_1B", "S31_2A", "S31_2B", "S31_3A", "S31_3B",
931     "S32_1A", "S32_1B", "S32_2A", "S32_2B", "S32_3A", "S32_3B"
932     };
933    
934    
935     pmtname = photoS[ind].Data();
936    
937     TString ss = pmtname(1,2);
938     iplane = (int)(atoi(ss.Data())/10)*2-3+atoi(ss.Data())%10;
939     ss = pmtname(4);
940     ipaddle = atoi(ss.Data())-1 ;
941     if( pmtname.Contains("A") )ipmt=0;
942     if( pmtname.Contains("B") )ipmt=1;
943    
944     return pmtname;
945     };
946     /**
947     * Method to get the PMT name (like "S11_1A") if the PMT_ID is given
948     * @param ind PMT_ID (0 - 47)
949     */
950     TString ToFLevel2::GetPMTName(Int_t ind){
951    
952     Int_t iplane = -1;
953     Int_t ipaddle = -1;
954     Int_t ipmt = -1;
955     return GetPMTName(ind,iplane,ipaddle,ipmt);
956    
957     };
958    
959 pamela 1.22 // wm jun 08
960     Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane){
961     return GetPaddleIdOfTrack(xtr ,ytr ,plane, 0.4);
962     }
963 mocchiut 1.16
964     // gf Apr 07
965 pamela 1.22 Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane, Float_t margin){
966 pamelats 1.23
967 mocchiut 1.16 Double_t xt,yt,xl,xh,yl,yh;
968    
969     Float_t tof11_x[8] = {-17.85,-12.75,-7.65,-2.55,2.55,7.65,12.75,17.85};
970     Float_t tof12_y[6] = { -13.75,-8.25,-2.75,2.75,8.25,13.75};
971     Float_t tof21_y[2] = { 3.75,-3.75};
972     Float_t tof22_x[2] = { -4.5,4.5};
973     Float_t tof31_x[3] = { -6.0,0.,6.0};
974     Float_t tof32_y[3] = { -5.0,0.0,5.0};
975    
976     // S11 8 paddles 33.0 x 5.1 cm
977     // S12 6 paddles 40.8 x 5.5 cm
978     // S21 2 paddles 18.0 x 7.5 cm
979     // S22 2 paddles 15.0 x 9.0 cm
980     // S31 3 paddles 15.0 x 6.0 cm
981     // S32 3 paddles 18.0 x 5.0 cm
982    
983     Int_t paddleidoftrack=-1;
984     //
985    
986     //--- S11 ------
987    
988     if(plane==0){
989     xt = xtr;
990     yt = ytr;
991     paddleidoftrack=-1;
992     yl = -33.0/2. ;
993     yh = 33.0/2. ;
994     if ((yt>yl)&&(yt<yh)) {
995     for (Int_t i1=0; i1<8;i1++){
996 pamela 1.22 xl = tof11_x[i1] - (5.1-margin)/2. ;
997     xh = tof11_x[i1] + (5.1-margin)/2. ;
998 mocchiut 1.16 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
999     }
1000     }
1001     }
1002     // cout<<"S11 "<<paddleidoftrack[0]<<"\n";
1003    
1004     //--- S12 -------
1005     if(plane==1){
1006     xt = xtr;
1007     yt = ytr;
1008     paddleidoftrack=-1;
1009     xl = -40.8/2. ;
1010     xh = 40.8/2. ;
1011    
1012     if ((xt>xl)&&(xt<xh)) {
1013     for (Int_t i1=0; i1<6;i1++){
1014 pamela 1.22 yl = tof12_y[i1] - (5.5-margin)/2. ;
1015     yh = tof12_y[i1] + (5.5-margin)/2. ;
1016 mocchiut 1.16 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
1017     }
1018     }
1019     }
1020    
1021     //--- S21 ------
1022    
1023     if(plane==2){
1024     xt = xtr;
1025     yt = ytr;
1026     paddleidoftrack=-1;
1027     xl = -18./2. ;
1028     xh = 18./2. ;
1029    
1030     if ((xt>xl)&&(xt<xh)) {
1031     for (Int_t i1=0; i1<2;i1++){
1032 pamela 1.22 yl = tof21_y[i1] - (7.5-margin)/2. ;
1033     yh = tof21_y[i1] + (7.5-margin)/2. ;
1034 mocchiut 1.16 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
1035     }
1036     }
1037     }
1038    
1039     //--- S22 ------
1040     if(plane==3){
1041     xt = xtr;
1042     yt = ytr;
1043     paddleidoftrack=-1;
1044     yl = -15./2. ;
1045     yh = 15./2. ;
1046    
1047     if ((yt>yl)&&(yt<yh)) {
1048     for (Int_t i1=0; i1<2;i1++){
1049 pamela 1.22 xl = tof22_x[i1] - (9.0-margin)/2. ;
1050     xh = tof22_x[i1] + (9.0-margin)/2. ;
1051 mocchiut 1.16 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
1052     }
1053     }
1054     }
1055    
1056     //--- S31 ------
1057     if(plane==4){
1058     xt = xtr;
1059     yt = ytr;
1060     paddleidoftrack=-1;
1061     yl = -15.0/2. ;
1062     yh = 15.0/2. ;
1063    
1064     if ((yt>yl)&&(yt<yh)) {
1065     for (Int_t i1=0; i1<3;i1++){
1066 pamela 1.22 xl = tof31_x[i1] - (6.0-margin)/2. ;
1067     xh = tof31_x[i1] + (6.0-margin)/2. ;
1068 mocchiut 1.16 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
1069     }
1070     }
1071     }
1072    
1073     //--- S32 ------
1074     if(plane==5){
1075     xt = xtr;
1076     yt = ytr;
1077     paddleidoftrack=-1;
1078     xl = -18.0/2. ;
1079     xh = 18.0/2. ;
1080    
1081     if ((xt>xl)&&(xt<xh)) {
1082     for (Int_t i1=0; i1<3;i1++){
1083 pamela 1.22 yl = tof32_y[i1] - (5.0-margin)/2. ;
1084     yh = tof32_y[i1] + (5.0-margin)/2. ;
1085 mocchiut 1.16 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
1086     }
1087     }
1088     }
1089    
1090     return paddleidoftrack;
1091    
1092     }
1093    
1094     //
1095    
1096     // gf Apr 07
1097    
1098     void ToFLevel2::GetPMTPaddle(Int_t pmt_id, Int_t &plane, Int_t &paddle){
1099    
1100     plane = GetPlaneIndex(pmt_id);
1101    
1102     if(plane == 0){
1103     if(pmt_id==0 || pmt_id==1)paddle=0;
1104     if(pmt_id==2 || pmt_id==3)paddle=1;
1105     if(pmt_id==4 || pmt_id==5)paddle=2;
1106     if(pmt_id==6 || pmt_id==7)paddle=3;
1107     if(pmt_id==8 || pmt_id==9)paddle=4;
1108     if(pmt_id==10 || pmt_id==11)paddle=5;
1109     if(pmt_id==12 || pmt_id==13)paddle=6;
1110     if(pmt_id==14 || pmt_id==15)paddle=7;
1111     }
1112    
1113     if(plane == 1){
1114     if(pmt_id==16 || pmt_id==17)paddle=0;
1115     if(pmt_id==18 || pmt_id==19)paddle=1;
1116     if(pmt_id==20 || pmt_id==21)paddle=2;
1117     if(pmt_id==22 || pmt_id==23)paddle=3;
1118     if(pmt_id==24 || pmt_id==25)paddle=4;
1119     if(pmt_id==26 || pmt_id==27)paddle=5;
1120     }
1121    
1122     if(plane == 2){
1123     if(pmt_id==28 || pmt_id==29)paddle=0;
1124     if(pmt_id==30 || pmt_id==31)paddle=1;
1125     }
1126    
1127     if(plane == 3){
1128     if(pmt_id==32 || pmt_id==33)paddle=0;
1129     if(pmt_id==34 || pmt_id==35)paddle=1;
1130     }
1131    
1132     if(plane == 4){
1133     if(pmt_id==36 || pmt_id==37)paddle=0;
1134     if(pmt_id==38 || pmt_id==39)paddle=1;
1135     if(pmt_id==40 || pmt_id==41)paddle=2;
1136     }
1137    
1138     if(plane == 5){
1139     if(pmt_id==42 || pmt_id==43)paddle=0;
1140     if(pmt_id==44 || pmt_id==45)paddle=1;
1141     if(pmt_id==46 || pmt_id==47)paddle=2;
1142     }
1143     return;
1144     }
1145    
1146     //
1147    
1148     // gf Apr 07
1149    
1150     void ToFLevel2::GetPaddlePMT(Int_t paddle, Int_t &pmtleft, Int_t &pmtright){
1151 mocchiut 1.24 pmtleft=paddle*2;
1152     pmtright= pmtleft+1;
1153 mocchiut 1.16 return;
1154     }
1155    
1156     //
1157    
1158    
1159    
1160     // // gf Apr 07
1161    
1162     void ToFLevel2::GetPaddleGeometry(Int_t plane, Int_t paddle, Float_t &xleft, Float_t &xright, Float_t &yleft, Float_t &yright){
1163    
1164     Int_t i1;
1165    
1166     Float_t tof11_x[8] = {-17.85,-12.75,-7.65,-2.55,2.55,7.65,12.75,17.85};
1167     Float_t tof12_y[6] = { -13.75,-8.25,-2.75,2.75,8.25,13.75};
1168     Float_t tof21_y[2] = { 3.75,-3.75};
1169     Float_t tof22_x[2] = { -4.5,4.5};
1170     Float_t tof31_x[3] = { -6.0,0.,6.0};
1171     Float_t tof32_y[3] = { -5.0,0.0,5.0};
1172    
1173     // S11 8 paddles 33.0 x 5.1 cm
1174     // S12 6 paddles 40.8 x 5.5 cm
1175     // S21 2 paddles 18.0 x 7.5 cm
1176     // S22 2 paddles 15.0 x 9.0 cm
1177     // S31 3 paddles 15.0 x 6.0 cm
1178     // S32 3 paddles 18.0 x 5.0 cm
1179    
1180     if(plane==0)
1181     {
1182     for (i1=0; i1<8;i1++){
1183     if(i1 == paddle){
1184     xleft = tof11_x[i1] - 5.1/2.;
1185     xright = tof11_x[i1] + 5.1/2.;
1186     yleft = -33.0/2.;
1187     yright = 33.0/2.;
1188     }
1189     }
1190     }
1191    
1192     if(plane==1)
1193     {
1194     for (i1=0; i1<6;i1++){
1195     if(i1 == paddle){
1196     xleft = -40.8/2.;
1197     xright = 40.8/2.;
1198     yleft = tof12_y[i1] - 5.5/2.;
1199     yright = tof12_y[i1] + 5.5/2.;
1200     }
1201     }
1202     }
1203    
1204     if(plane==2)
1205     {
1206     for (i1=0; i1<2;i1++){
1207     if(i1 == paddle){
1208     xleft = -18./2.;
1209     xright = 18./2.;
1210     yleft = tof21_y[i1] - 7.5/2.;
1211     yright = tof21_y[i1] + 7.5/2.;
1212     }
1213     }
1214     }
1215    
1216     if(plane==3)
1217     {
1218     for (i1=0; i1<2;i1++){
1219     if(i1 == paddle){
1220     xleft = tof22_x[i1] - 9.0/2.;
1221     xright = tof22_x[i1] + 9.0/2.;
1222     yleft = -15./2.;
1223     yright = 15./2.;
1224     }
1225     }
1226     }
1227    
1228    
1229     if(plane==4)
1230     {
1231     for (i1=0; i1<3;i1++){
1232     if(i1 == paddle){
1233     xleft = tof31_x[i1] - 6.0/2.;
1234     xright = tof31_x[i1] + 6.0/2.;
1235     yleft = -15./2.;
1236     yright = 15./2.;
1237     }
1238     }
1239     }
1240    
1241     if(plane==5)
1242     {
1243     for (i1=0; i1<3;i1++){
1244     if(i1 == paddle){
1245     xleft = -18.0/2.;
1246     xright = 18.0/2.;
1247     yleft = tof32_y[i1] - 5.0/2.;
1248     yright = tof32_y[i1] + 5.0/2.;
1249     }
1250     }
1251     }
1252     return;
1253     }
1254    
1255     // gf Apr 07
1256     /**
1257     * Method to get the paddle index (0,...23) if the plane ID and the paddle id in the plane is given.
1258     * This method is the
1259     * "reverse" of method "GetPaddlePlane"
1260     * @param plane (0 - 5)
1261     * @param paddle (plane=0, paddle = 0,...5)
1262     * @param padid (0 - 23)
1263     */
1264     Int_t ToFLevel2::GetPaddleid(Int_t plane, Int_t paddle)
1265     {
1266     Int_t padid=-1;
1267 mocchiut 1.24 Int_t pads[6]={8,6,2,2,3,3};
1268 mocchiut 1.16
1269 mocchiut 1.24 int somma=0;
1270     int np=plane;
1271     for(Int_t j=0; j<np; j++){
1272     somma+=pads[j];
1273 pamelats 1.23 }
1274 mocchiut 1.24 padid=paddle+somma;
1275 mocchiut 1.16 return padid;
1276 pamelats 1.23
1277 mocchiut 1.16 }
1278    
1279    
1280     // gf Apr 07
1281     /**
1282     * Method to get the plane ID and the paddle id in the plane if the paddle index (0,...23) is given.
1283     * This method is the
1284     * "reverse" of method "GetPaddleid"
1285     * @param pad (0 - 23)
1286     * @param plane (0 - 5)
1287     * @param paddle (plane=0, paddle = 0,...5)
1288     */
1289     void ToFLevel2::GetPaddlePlane(Int_t pad, Int_t &plane, Int_t &paddle)
1290     {
1291    
1292     Int_t pads11=8;
1293     Int_t pads12=6;
1294     Int_t pads21=2;
1295     Int_t pads22=2;
1296     Int_t pads31=3;
1297     // Int_t pads32=3;
1298    
1299     if(pad<8){
1300     plane=0;
1301     paddle=pad;
1302     return;
1303     }
1304    
1305 pamelats 1.25 if((7<pad)&&(pad<14)){
1306 mocchiut 1.16 plane=1;
1307     paddle=pad-pads11;
1308     return;
1309     }
1310    
1311 pamelats 1.25 if((13<pad)&&(pad<16)){
1312 mocchiut 1.16 plane=2;
1313     paddle=pad-pads11-pads12;
1314     return;
1315     }
1316    
1317 pamelats 1.25 if((15<pad)&&(pad<18)){
1318 mocchiut 1.16 plane=3;
1319     paddle=pad-pads11-pads12-pads21;
1320     return;
1321     }
1322    
1323 pamelats 1.25 if((17<pad)&&(pad<21)){
1324 mocchiut 1.16 plane=4;
1325     paddle=pad-pads11-pads12-pads21-pads22;
1326     return;
1327     }
1328    
1329 pamelats 1.25 if((20<pad)&&(pad<24)){
1330 mocchiut 1.16 plane=5;
1331     paddle=pad-pads11-pads12-pads21-pads22-pads31;
1332     return;
1333     }
1334    
1335     }
1336    
1337    
1338     Int_t ToFLevel2::GetNPaddle(Int_t plane){
1339    
1340     Int_t npaddle=-1;
1341    
1342     Int_t pads11=8;
1343     Int_t pads12=6;
1344     Int_t pads21=2;
1345     Int_t pads22=2;
1346     Int_t pads31=3;
1347     Int_t pads32=3;
1348    
1349     if(plane==0)npaddle=pads11;
1350     if(plane==1)npaddle=pads12;
1351     if(plane==2)npaddle=pads21;
1352     if(plane==3)npaddle=pads22;
1353     if(plane==4)npaddle=pads31;
1354     if(plane==5)npaddle=pads32;
1355    
1356     return npaddle;
1357    
1358     }
1359    
1360 pamelats 1.23
1361    
1362 mocchiut 1.19 /// wm feb 08
1363    
1364     /**
1365     * Method to calculate Beta from the 12 single measurements
1366     * we check the individual weights for artificial TDC values, then calculate
1367     * am mean beta for the first time. In a second step we loop again through
1368     * the single measurements, checking for the residual from the mean
1369     * The cut on the residual reject measurements > "x"-sigma. A chi2 value is
1370     * calculated, furthermore a "quality" value by adding the weights which
1371     * are finally used. If all measurements are taken, "quality" will be = 22.47.
1372     * A chi2 cut around 3-4 and a quality-cut > 20 is needed for clean beta
1373     * measurements like antiprotons etc.
1374     * The Level2 output is derived in the fortran routines using: 10.,10.,20.
1375     * @param notrack Track Number
1376     * @param cut on residual: difference between single measurement and mean
1377     * @param cut on "quality"
1378     * @param cut on chi2
1379     */
1380    
1381     Float_t ToFLevel2::CalcBeta(Int_t notrack, Float_t resmax, Float_t qualitycut, Float_t chi2cut){
1382    
1383     // cout<<" in CalcBeta "<<resmax<<" "<<chi2cut<<" "<<qualitycut<<endl;
1384    
1385     Float_t bxx = 100.;
1386     //
1387     ToFTrkVar *trk = GetToFTrkVar(notrack);
1388     if(!trk) return 0; //ELENA
1389    
1390    
1391     Float_t chi2,xhelp,beta_mean;
1392     Float_t w_i[12],quality,sw,sxw,res,betachi,beta_mean_inv;
1393     Float_t b[12],tdcfl;
1394     Int_t pmt_id,pmt_plane;
1395    
1396     for (Int_t i=0; i<12; i++){
1397     b[i] = trk->beta[i];
1398     }
1399    
1400    
1401     //========================================================================
1402     //--- Find out ToF layers with artificial TDC values & fill vector ---
1403     //========================================================================
1404    
1405     Float_t w_il[6];
1406    
1407     for (Int_t jj=0; jj<6;jj++) {
1408     w_il[jj] = 1000.;
1409     }
1410    
1411    
1412     for (Int_t i=0; i<trk->npmttdc; i++){
1413     //
1414     pmt_id = (trk->pmttdc).At(i);
1415     pmt_plane = GetPlaneIndex(pmt_id);
1416     tdcfl = (trk->tdcflag).At(i);
1417     if (w_il[pmt_plane] != 1.) w_il[pmt_plane] = tdcfl; //tdcflag
1418     };
1419    
1420     //========================================================================
1421     //--- Set weights for the 12 measurements using information for top and bottom:
1422     //--- if no measurements: weight = set to very high value=> not used
1423     //--- top or bottom artificial: weight*sqrt(2)
1424     //--- top and bottom artificial: weight*sqrt(2)*sqrt(2)
1425     //========================================================================
1426    
1427     Int_t itop[12] = {0,0,1,1,2,2,3,3,0,0,1,1};
1428     Int_t ibot[12] = {4,5,4,5,4,5,4,5,2,3,2,3};
1429    
1430     xhelp= 1E09;
1431    
1432     for (Int_t jj=0; jj<12;jj++) {
1433     if (jj<4) xhelp = 0.11; // S1-S3
1434     if ((jj>3)&&(jj<8)) xhelp = 0.18; // S2-S3
1435     if (jj>7) xhelp = 0.28; // S1-S2
1436     if ((w_il[itop[jj]] == 1000.) && (w_il[ibot[jj]] == 1000.)) xhelp = 1E09;
1437     if ((w_il[itop[jj]] == 1) || (w_il[ibot[jj]] == 1.)) xhelp = xhelp*1.414 ;
1438     if ((w_il[itop[jj]] == 1) && (w_il[ibot[jj]] == 1.)) xhelp = xhelp*2. ;
1439    
1440     w_i[jj] = 1./xhelp;
1441     }
1442    
1443    
1444     //========================================================================
1445     //--- Calculate mean beta for the first time -----------------------------
1446     //--- We are using "1/beta" since its error is gaussian ------------------
1447     //========================================================================
1448    
1449     Int_t icount=0;
1450     sw=0.;
1451     sxw=0.;
1452     beta_mean=100.;
1453    
1454     for (Int_t jj=0; jj<12;jj++){
1455     if ((fabs(1./b[jj])>0.1)&&(fabs(1./b[jj])<15.))
1456     {
1457     icount= icount+1;
1458     sxw=sxw + (1./b[jj])*w_i[jj]*w_i[jj] ;
1459     sw =sw + w_i[jj]*w_i[jj] ;
1460    
1461     }
1462     }
1463    
1464     if (icount>0) beta_mean=1./(sxw/sw);
1465     beta_mean_inv = 1./beta_mean;
1466    
1467     //========================================================================
1468     //--- Calculate beta for the second time, use residuals of the single
1469     //--- measurements to get a chi2 value
1470     //========================================================================
1471    
1472     icount=0;
1473     sw=0.;
1474     sxw=0.;
1475     betachi = 100.;
1476     chi2 = 0.;
1477     quality=0.;
1478    
1479    
1480     for (Int_t jj=0; jj<12;jj++){
1481     if ((fabs(1./b[jj])>0.1)&&(fabs(1./b[jj])<15.)&&(w_i[jj]>0.01)) {
1482     res = beta_mean_inv - (1./b[jj]) ;
1483     if (fabs(res*w_i[jj])<resmax) {;
1484     chi2 = chi2 + pow((res*w_i[jj]),2) ;
1485     icount= icount+1;
1486     sxw=sxw + (1./b[jj])*w_i[jj]*w_i[jj] ;
1487     sw =sw + w_i[jj]*w_i[jj] ;
1488     }
1489     }
1490     }
1491     quality = sqrt(sw) ;
1492    
1493     if (icount==0) chi2 = 1000.;
1494     if (icount>0) chi2 = chi2/(icount) ;
1495     if (icount>0) betachi=1./(sxw/sw);
1496    
1497     bxx = 100.;
1498     if ((chi2 < chi2cut)&&(quality>qualitycut)) bxx = betachi;
1499     //
1500     return(bxx);
1501     };
1502    
1503    
1504     ////////////////////////////////////////////////////
1505 mocchiut 1.16 ////////////////////////////////////////////////////
1506    
1507    
1508 pam-fi 1.6 /**
1509     * Fills a struct cToFLevel2 with values from a ToFLevel2 object (to put data into a F77 common).
1510     */
1511     void ToFLevel2::GetLevel2Struct(cToFLevel2 *l2) const{
1512    
1513     for(Int_t i=0;i<6;i++)
1514     l2->tof_j_flag[i]=tof_j_flag[i];
1515    
1516 mocchiut 1.13 if(ToFTrk){ //ELENA
1517     l2->ntoftrk = ToFTrk->GetEntries();
1518     for(Int_t j=0;j<l2->ntoftrk;j++){
1519     l2->toftrkseqno[j]= ((ToFTrkVar*)ToFTrk->At(j))->trkseqno;
1520     l2->npmttdc[j]= ((ToFTrkVar*)ToFTrk->At(j))->npmttdc;
1521     for(Int_t i=0;i<l2->npmttdc[j];i++){
1522     l2->pmttdc[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->pmttdc.At(i);
1523     l2->tdcflag[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->tdcflag.At(i); // gf: 30 Nov 2006
1524     }
1525     for(Int_t i=0;i<13;i++)
1526     l2->beta[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->beta[i];
1527    
1528     l2->npmtadc[j]= ((ToFTrkVar*)ToFTrk->At(j))->npmtadc;
1529     for(Int_t i=0;i<l2->npmtadc[j];i++){
1530     l2->pmtadc[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->pmtadc.At(i);
1531     l2->adcflag[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->adcflag.At(i); // gf: 30 Nov 2006
1532     l2->dedx[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->dedx.At(i);
1533     }
1534     for(Int_t i=0;i<3;i++){
1535     l2->xtofpos[i][j]=((ToFTrkVar*)ToFTrk->At(j))->xtofpos[i];
1536     l2->ytofpos[i][j]=((ToFTrkVar*)ToFTrk->At(j))->ytofpos[i];
1537     }
1538 mocchiut 1.16 for(Int_t i=0;i<6;i++){
1539     l2->xtr_tof[i][j]=((ToFTrkVar*)ToFTrk->At(j))->xtr_tof[i];
1540     l2->ytr_tof[i][j]=((ToFTrkVar*)ToFTrk->At(j))->ytr_tof[i];
1541     }
1542 mocchiut 1.13 }
1543     } //ELENA
1544 pam-fi 1.6
1545 mocchiut 1.13 if(PMT){ //ELENA
1546     l2->npmt = PMT->GetEntries();
1547     for(Int_t j=0;j<l2->npmt;j++){
1548     l2->pmt_id[j] = ((ToFPMT*)PMT->At(j))->pmt_id;
1549     l2->adc[j] =((ToFPMT*)PMT->At(j))->adc;
1550     l2->tdc_tw[j] =((ToFPMT*)PMT->At(j))->tdc_tw;
1551     }
1552     } //ELENA
1553 pam-fi 1.6 }
1554 mocchiut 1.24
1555    
1556     //
1557     // Reprocessing tool // Emiliano 08/04/07
1558     //
1559     Int_t ToFLevel2::Process(TrkLevel2 *trk, TrigLevel2 *trg, GL_RUN *run, OrbitalInfo *orb, Bool_t force){
1560     //
1561     // Copiare qui qualcosa di simile a calonuclei per evitare di riprocessare sempre tutto
1562     //
1563 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");
1564     return(-1);
1565     // //
1566     // // structures to communicate with F77
1567     // //
1568     // extern struct ToFInput tofinput_;
1569     // extern struct ToFOutput tofoutput_;
1570     // //
1571     // // DB connection
1572     // //
1573     // TString host;
1574     // TString user;
1575     // TString psw;
1576     // const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
1577     // const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
1578     // const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
1579     // if ( !pamdbhost ) pamdbhost = "";
1580     // if ( !pamdbuser ) pamdbuser = "";
1581     // if ( !pamdbpsw ) pamdbpsw = "";
1582     // if ( strcmp(pamdbhost,"") ) host = pamdbhost;
1583     // if ( strcmp(pamdbuser,"") ) user = pamdbuser;
1584     // if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
1585     // //
1586     // //
1587     // TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
1588     // if ( !dbc->IsConnected() ) return 1;
1589     // stringstream myquery;
1590     // myquery.str("");
1591 mocchiut 1.41 // myquery << "SET time_zone='+0:00';";
1592 mocchiut 1.27 // dbc->Query(myquery.str().c_str());
1593 mocchiut 1.41 // delete dbc->Query("SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';");
1594 mocchiut 1.27 // GL_PARAM *glparam = new GL_PARAM();
1595     // glparam->Query_GL_PARAM(1,1,dbc); // parameters stored in DB in GL_PRAM table
1596     // trk->LoadField(glparam->PATH+glparam->NAME);
1597     // //
1598     // Bool_t defcal = true;
1599     // Int_t error=glparam->Query_GL_PARAM(run->RUNHEADER_TIME,201,dbc); // parameters stored in DB in GL_PRAM table
1600     // if ( error<0 ) {
1601     // return(1);
1602     // };
1603     // printf(" Reading ToF parameter file: %s \n",(glparam->PATH+glparam->NAME).Data());
1604     // if ( (UInt_t)glparam->TO_TIME != (UInt_t)4294967295UL ) defcal = false;
1605     // //
1606     // Int_t nlen = (Int_t)(glparam->PATH+glparam->NAME).Length();
1607     // rdtofcal((char *)(glparam->PATH+glparam->NAME).Data(),&nlen);
1608     // //
1609     // Int_t adc[4][12];
1610     // Int_t tdc[4][12];
1611     // Float_t tdcc[4][12];
1612     // //
1613     // // process tof data
1614     // //
1615     // for (Int_t hh=0; hh<12;hh++){
1616     // for (Int_t kk=0; kk<4;kk++){
1617     // adc[kk][hh] = 4095;
1618     // tdc[kk][hh] = 4095;
1619     // tdcc[kk][hh] = 4095.;
1620     // tofinput_.adc[hh][kk] = 4095;
1621     // tofinput_.tdc[hh][kk] = 4095;
1622     // };
1623     // };
1624     // Int_t ntrkentry = 0;
1625     // Int_t npmtentry = 0;
1626     // Int_t gg = 0;
1627     // Int_t hh = 0;
1628     // Int_t adcf[48];
1629     // memset(adcf, 0, 48*sizeof(Int_t));
1630     // Int_t tdcf[48];
1631     // memset(tdcf, 0, 48*sizeof(Int_t));
1632     // for (Int_t pm=0; pm < this->ntrk() ; pm++){
1633     // ToFTrkVar *ttf = this->GetToFTrkVar(pm);
1634     // for ( Int_t nc=0; nc < ttf->npmttdc; nc++){
1635     // if ( (ttf->tdcflag).At(nc) != 0 ) tdcf[(ttf->pmttdc).At(nc)] = 1;
1636     // };
1637     // for ( Int_t nc=0; nc < ttf->npmtadc; nc++){
1638     // if ( (ttf->adcflag).At(nc) != 0 ) adcf[(ttf->pmtadc).At(nc)] = 1;
1639     // };
1640     // };
1641     // //
1642     // for (Int_t pm=0; pm < this->npmt() ; pm++){
1643     // ToFPMT *pmt = this->GetToFPMT(pm);
1644     // this->GetPMTIndex(pmt->pmt_id, gg, hh);
1645     // if ( adcf[pmt->pmt_id] == 0 ){
1646     // tofinput_.adc[gg][hh] = (int)pmt->adc;
1647     // adc[hh][gg] = (int)pmt->adc;
1648     // };
1649     // if ( tdcf[pmt->pmt_id] == 0 ){
1650     // tofinput_.tdc[gg][hh] = (int)pmt->tdc;
1651     // tdc[hh][gg] = (int)pmt->tdc;
1652     // };
1653     // tdcc[hh][gg] = (float)pmt->tdc_tw;
1654     // // Int_t pppid = this->GetPMTid(hh,gg);
1655     // // 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);
1656     // };
1657     // //
1658     // Int_t unpackError = this->unpackError;
1659     // //
1660     // for (Int_t hh=0; hh<5;hh++){
1661     // tofinput_.patterntrig[hh]=trg->patterntrig[hh];
1662     // };
1663     // //
1664     // this->Clear();
1665     // //
1666     // Int_t pmt_id = 0;
1667     // ToFPMT *t_pmt = new ToFPMT();
1668     // if(!(this->PMT)) this->PMT = new TClonesArray("ToFPMT",12); //ELENA
1669     // TClonesArray &tpmt = *this->PMT;
1670     // ToFTrkVar *t_tof = new ToFTrkVar();
1671     // if(!(this->ToFTrk)) this->ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
1672     // TClonesArray &t = *this->ToFTrk;
1673     // //
1674     // //
1675     // // Here we have calibrated data, ready to be passed to the FORTRAN routine which will extract common and track-related variables.
1676     // //
1677     // npmtentry = 0;
1678     // //
1679     // ntrkentry = 0;
1680     // //
1681     // // Calculate tracks informations from ToF alone
1682     // //
1683     // tofl2com();
1684     // //
1685     // memcpy(this->tof_j_flag,tofoutput_.tof_j_flag,6*sizeof(Int_t));
1686     // //
1687     // t_tof->trkseqno = -1;
1688     // //
1689     // // and now we must copy from the output structure to the level2 class:
1690     // //
1691     // t_tof->npmttdc = 0;
1692     // //
1693     // for (Int_t hh=0; hh<12;hh++){
1694     // for (Int_t kk=0; kk<4;kk++){
1695     // if ( tofoutput_.tofmask[hh][kk] != 0 ){
1696     // pmt_id = this->GetPMTid(kk,hh);
1697     // t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc);
1698     // t_tof->tdcflag.AddAt(tofoutput_.tdcflagtof[hh][kk],t_tof->npmttdc); // gf: Jan 09/07
1699     // t_tof->npmttdc++;
1700     // };
1701     // };
1702     // };
1703     // for (Int_t kk=0; kk<13;kk++){
1704     // t_tof->beta[kk] = tofoutput_.betatof_a[kk];
1705     // }
1706     // //
1707     // t_tof->npmtadc = 0;
1708     // for (Int_t hh=0; hh<12;hh++){
1709     // for (Int_t kk=0; kk<4;kk++){
1710     // if ( tofoutput_.adctof_c[hh][kk] < 1000 ){
1711     // t_tof->dedx.AddAt(tofoutput_.adctof_c[hh][kk],t_tof->npmtadc);
1712     // pmt_id = this->GetPMTid(kk,hh);
1713     // t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc);
1714     // t_tof->adcflag.AddAt(tofoutput_.adcflagtof[hh][kk],t_tof->npmtadc); // gf: Jan 09/07
1715     // t_tof->npmtadc++;
1716     // };
1717     // };
1718     // };
1719     // //
1720     // memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos));
1721     // memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos));
1722     // memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof));
1723     // memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof));
1724     // //
1725     // new(t[ntrkentry]) ToFTrkVar(*t_tof);
1726     // ntrkentry++;
1727     // t_tof->Clear();
1728     // //
1729     // //
1730     // //
1731     // t_pmt->Clear();
1732     // //
1733     // for (Int_t hh=0; hh<12;hh++){
1734     // for (Int_t kk=0; kk<4;kk++){
1735     // // new WM
1736     // if ( tofoutput_.tdc_c[hh][kk] < 4095 || adc[kk][hh] < 4095 || tdc[kk][hh] < 4095 ){
1737     // // if ( tdcc[kk][hh] < 4095. || adc[kk][hh] < 4095 || tdc[kk][hh] < 4095 ){
1738     // //
1739     // t_pmt->pmt_id = this->GetPMTid(kk,hh);
1740     // t_pmt->tdc_tw = tofoutput_.tdc_c[hh][kk];
1741     // t_pmt->adc = (Float_t)adc[kk][hh];
1742     // t_pmt->tdc = (Float_t)tdc[kk][hh];
1743     // //
1744     // new(tpmt[npmtentry]) ToFPMT(*t_pmt);
1745     // npmtentry++;
1746     // t_pmt->Clear();
1747     // };
1748     // };
1749     // };
1750     // //
1751     // // Calculate track-related variables
1752     // //
1753     // if ( trk->ntrk() > 0 ){
1754     // //
1755     // // We have at least one track
1756     // //
1757     // //
1758     // // Run over tracks
1759     // //
1760     // for(Int_t nt=0; nt < trk->ntrk(); nt++){
1761     // //
1762     // TrkTrack *ptt = trk->GetStoredTrack(nt);
1763     // //
1764     // // Copy the alpha vector in the input structure
1765     // //
1766     // for (Int_t e = 0; e < 5 ; e++){
1767     // tofinput_.al_pp[e] = ptt->al[e];
1768     // };
1769     // //
1770     // // Get tracker related variables for this track
1771     // //
1772     // toftrk();
1773     // //
1774     // // Copy values in the class from the structure (we need to use a temporary class to store variables).
1775     // //
1776     // t_tof->npmttdc = 0;
1777     // for (Int_t hh=0; hh<12;hh++){
1778     // for (Int_t kk=0; kk<4;kk++){
1779     // if ( tofoutput_.tofmask[hh][kk] != 0 ){
1780     // pmt_id = this->GetPMTid(kk,hh);
1781     // t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc);
1782     // t_tof->tdcflag.AddAt(tofoutput_.tdcflag[hh][kk],t_tof->npmttdc); // gf: Jan 09/07
1783     // t_tof->npmttdc++;
1784     // };
1785     // };
1786     // };
1787     // for (Int_t kk=0; kk<13;kk++){
1788     // t_tof->beta[kk] = tofoutput_.beta_a[kk];
1789     // };
1790     // //
1791     // t_tof->npmtadc = 0;
1792     // for (Int_t hh=0; hh<12;hh++){
1793     // for (Int_t kk=0; kk<4;kk++){
1794     // if ( tofoutput_.adc_c[hh][kk] < 1000 ){
1795     // t_tof->dedx.AddAt(tofoutput_.adc_c[hh][kk],t_tof->npmtadc);
1796     // pmt_id = this->GetPMTid(kk,hh);
1797     // t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc);
1798     // t_tof->adcflag.AddAt(tofoutput_.adcflag[hh][kk],t_tof->npmtadc); // gf: Jan 09/07
1799     // t_tof->npmtadc++;
1800     // };
1801     // };
1802     // };
1803     // //
1804     // memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos));
1805     // memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos));
1806     // memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof));
1807     // memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof));
1808     // //
1809     // // Store the tracker track number in order to be sure to have shyncronized data during analysis
1810     // //
1811     // t_tof->trkseqno = nt;
1812     // //
1813     // // create a new object for this event with track-related variables
1814     // //
1815     // new(t[ntrkentry]) ToFTrkVar(*t_tof);
1816     // ntrkentry++;
1817     // t_tof->Clear();
1818     // //
1819     // }; // loop on all the tracks
1820     // //
1821     // this->unpackError = unpackError;
1822     // if ( defcal ){
1823     // this->default_calib = 1;
1824     // } else {
1825     // this->default_calib = 0;
1826     // };
1827     //};
1828     // return(0);
1829 mocchiut 1.24 }
1830 carbone 1.26
1831 mocchiut 1.36 bool ToFLevel2::bit(int decimal, char pos){
1832     return( (decimal>>pos)%2 );
1833     }
1834    
1835     bool ToFLevel2::checkPMT(TString givenpmt){
1836     TClonesArray* Pmt = this->PMT;
1837     // printf(" ou %s entries %i \n",givenpmt.Data(),Pmt->GetEntries());
1838     for(int i=0; i<Pmt->GetEntries(); i++) {
1839     ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1840     TString pmtname = this->GetPMTName(pmthit->pmt_id);
1841     // printf(" name %s \n",pmtname.Data());
1842     if ( !strcmp(pmtname.Data(),givenpmt.Data()) )
1843     return true;
1844     }
1845     // printf(" PMT %s missing \n",givenpmt.Data());
1846     return false;
1847     }
1848    
1849     bool ToFLevel2::checkPMTpatternPMThit(TrigLevel2 *trg, int &pmtpattern, int &pmtnosignal){
1850     UInt_t *patterntrig = trg->patterntrig;
1851     pmtpattern = 0;
1852     pmtnosignal = 0;
1853     bool good = true;
1854     //S3
1855     if ( this->bit(patterntrig[2],0) ){ pmtpattern++; if ( !this->checkPMT("S31_1A")){ pmtnosignal++; good = false;}}
1856     if ( this->bit(patterntrig[2],1) ){ pmtpattern++; if ( !this->checkPMT("S31_2A")){ pmtnosignal++; good = false;}}
1857     if ( this->bit(patterntrig[2],2) ){ pmtpattern++; if ( !this->checkPMT("S31_3A")){ pmtnosignal++; good = false;}}
1858     if ( this->bit(patterntrig[2],3) ){ pmtpattern++; if ( !this->checkPMT("S31_1B")){ pmtnosignal++; good = false;}}
1859     if ( this->bit(patterntrig[2],4) ){ pmtpattern++; if ( !this->checkPMT("S31_2B")){ pmtnosignal++; good = false;}}
1860     if ( this->bit(patterntrig[2],5) ){ pmtpattern++; if ( !this->checkPMT("S31_3B")){ pmtnosignal++; good = false;}}
1861     if ( this->bit(patterntrig[2],6) ){ pmtpattern++; if ( !this->checkPMT("S32_1A")){ pmtnosignal++; good = false;}}
1862     if ( this->bit(patterntrig[2],7) ){ pmtpattern++; if ( !this->checkPMT("S32_2A")){ pmtnosignal++; good = false;}}
1863     if ( this->bit(patterntrig[2],8) ){ pmtpattern++; if ( !this->checkPMT("S32_3A")){ pmtnosignal++; good = false;}}
1864     if ( this->bit(patterntrig[2],9) ){ pmtpattern++; if ( !this->checkPMT("S32_1B")){ pmtnosignal++; good = false;}}
1865     if ( this->bit(patterntrig[2],10) ){ pmtpattern++; if ( !this->checkPMT("S32_2B")){ pmtnosignal++; good = false;}}
1866     if ( this->bit(patterntrig[2],11) ){ pmtpattern++; if ( !this->checkPMT("S32_3B")){ pmtnosignal++; good = false;}}
1867     //S2
1868     if ( this->bit(patterntrig[3],0) ){ pmtpattern++; if ( !this->checkPMT("S21_1A")){ pmtnosignal++; good = false;}}
1869     if ( this->bit(patterntrig[3],1) ){ pmtpattern++; if ( !this->checkPMT("S21_2A")){ pmtnosignal++; good = false;}}
1870     if ( this->bit(patterntrig[3],2) ){ pmtpattern++; if ( !this->checkPMT("S21_1B")){ pmtnosignal++; good = false;}}
1871     if ( this->bit(patterntrig[3],3) ){ pmtpattern++; if ( !this->checkPMT("S21_2B")){ pmtnosignal++; good = false;}}
1872     if ( this->bit(patterntrig[3],4) ){ pmtpattern++; if ( !this->checkPMT("S22_1A")){ pmtnosignal++; good = false;}}
1873     if ( this->bit(patterntrig[3],5) ){ pmtpattern++; if ( !this->checkPMT("S22_2A")){ pmtnosignal++; good = false;}}
1874     if ( this->bit(patterntrig[3],6) ){ pmtpattern++; if ( !this->checkPMT("S22_1B")){ pmtnosignal++; good = false;}}
1875     if ( this->bit(patterntrig[3],7) ){ pmtpattern++; if ( !this->checkPMT("S22_2B")){ pmtnosignal++; good = false;}}
1876     //S12
1877     if ( this->bit(patterntrig[4],0) ){ pmtpattern++; if ( !this->checkPMT("S12_1A")){ pmtnosignal++; good = false;}}
1878     if ( this->bit(patterntrig[4],1) ){ pmtpattern++; if ( !this->checkPMT("S12_2A")){ pmtnosignal++; good = false;}}
1879     if ( this->bit(patterntrig[4],2) ){ pmtpattern++; if ( !this->checkPMT("S12_3A")){ pmtnosignal++; good = false;}}
1880     if ( this->bit(patterntrig[4],3) ){ pmtpattern++; if ( !this->checkPMT("S12_4A")){ pmtnosignal++; good = false;}}
1881     if ( this->bit(patterntrig[4],4) ){ pmtpattern++; if ( !this->checkPMT("S12_5A")){ pmtnosignal++; good = false;}}
1882     if ( this->bit(patterntrig[4],5) ){ pmtpattern++; if ( !this->checkPMT("S12_6A")){ pmtnosignal++; good = false;}}
1883     if ( this->bit(patterntrig[4],6) ){ pmtpattern++; if ( !this->checkPMT("S12_1A")){ pmtnosignal++; good = false;}}
1884     if ( this->bit(patterntrig[4],7) ){ pmtpattern++; if ( !this->checkPMT("S12_2A")){ pmtnosignal++; good = false;}}
1885     if ( this->bit(patterntrig[4],8) ){ pmtpattern++; if ( !this->checkPMT("S12_3A")){ pmtnosignal++; good = false;}}
1886     if ( this->bit(patterntrig[4],9) ){ pmtpattern++; if ( !this->checkPMT("S12_4B")){ pmtnosignal++; good = false;}}
1887     if ( this->bit(patterntrig[4],10) ){ pmtpattern++; if ( !this->checkPMT("S12_5B")){ pmtnosignal++; good = false;}}
1888     if ( this->bit(patterntrig[4],11) ){ pmtpattern++; if ( !this->checkPMT("S12_6B")){ pmtnosignal++; good = false;}}
1889     //S11
1890     if ( this->bit(patterntrig[5],0) ){ pmtpattern++; if ( !this->checkPMT("S11_1A")){ pmtnosignal++; good = false;}}
1891     if ( this->bit(patterntrig[5],1) ){ pmtpattern++; if ( !this->checkPMT("S11_2A")){ pmtnosignal++; good = false;}}
1892     if ( this->bit(patterntrig[5],2) ){ pmtpattern++; if ( !this->checkPMT("S11_3A")){ pmtnosignal++; good = false;}}
1893     if ( this->bit(patterntrig[5],3) ){ pmtpattern++; if ( !this->checkPMT("S11_4A")){ pmtnosignal++; good = false;}}
1894     if ( this->bit(patterntrig[5],4) ){ pmtpattern++; if ( !this->checkPMT("S11_5A")){ pmtnosignal++; good = false;}}
1895     if ( this->bit(patterntrig[5],5) ){ pmtpattern++; if ( !this->checkPMT("S11_6A")){ pmtnosignal++; good = false;}}
1896     if ( this->bit(patterntrig[5],6) ){ pmtpattern++; if ( !this->checkPMT("S11_7A")){ pmtnosignal++; good = false;}}
1897     if ( this->bit(patterntrig[5],7) ){ pmtpattern++; if ( !this->checkPMT("S11_8A")){ pmtnosignal++; good = false;}}
1898     if ( this->bit(patterntrig[5],8) ){ pmtpattern++; if ( !this->checkPMT("S11_1B")){ pmtnosignal++; good = false;}}
1899     if ( this->bit(patterntrig[5],9) ){ pmtpattern++; if ( !this->checkPMT("S11_2B")){ pmtnosignal++; good = false;}}
1900     if ( this->bit(patterntrig[5],10) ){ pmtpattern++; if ( !this->checkPMT("S11_3B")){ pmtnosignal++; good = false;}}
1901     if ( this->bit(patterntrig[5],11) ){ pmtpattern++; if ( !this->checkPMT("S11_4B")){ pmtnosignal++; good = false;}}
1902     if ( this->bit(patterntrig[5],12) ){ pmtpattern++; if ( !this->checkPMT("S11_5B")){ pmtnosignal++; good = false;}}
1903     if ( this->bit(patterntrig[5],13) ){ pmtpattern++; if ( !this->checkPMT("S11_6B")){ pmtnosignal++; good = false;}}
1904     if ( this->bit(patterntrig[5],14) ){ pmtpattern++; if ( !this->checkPMT("S11_7B")){ pmtnosignal++; good = false;}}
1905     if ( this->bit(patterntrig[5],15) ){ pmtpattern++; if ( !this->checkPMT("S11_8B")){ pmtnosignal++; good = false;}}
1906    
1907     return good;
1908     }
1909    
1910     bool ToFLevel2::checkPMTpmttrig(TrigLevel2 *trg){
1911     // UInt_t *patterntrig = trg->patterntrig;
1912     int rS11 = 0;
1913     int rS12 = 0;
1914     int rS21 = 0;
1915     int rS22 = 0;
1916     int rS31 = 0;
1917     int rS32 = 0;
1918    
1919     // trigger configuration for the event from saved pmts
1920     TClonesArray* Pmt = this->PMT;
1921     for(int i=0; i<Pmt->GetEntries(); i++) {
1922     ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1923     TString pmtname = this->GetPMTName(pmthit->pmt_id);
1924     if ( pmtname.Contains("S11") ) rS11++;
1925     if ( pmtname.Contains("S12") ) rS12++;
1926     if ( pmtname.Contains("S21") ) rS21++;
1927     if ( pmtname.Contains("S22") ) rS22++;
1928     if ( pmtname.Contains("S31") ) rS31++;
1929     if ( pmtname.Contains("S32") ) rS32++;
1930     }
1931     int rTOF1 = (rS11 + rS12) * (rS21 + rS22) * (rS31 + rS32);
1932     int rTOF2 = (rS11 * rS12) * (rS21 * rS22) * (rS31 * rS32);
1933    
1934     int rTOF3 = (rS21 + rS22) * (rS31 + rS32);
1935     int rTOF4 = (rS21 * rS22) * (rS31 * rS32);
1936    
1937     int rTOF5 = rS12 * (rS21 * rS22);
1938    
1939     int rTOF6 = (rS11 + rS12) * (rS31 + rS32);
1940     int rTOF7 = (rS11 * rS12) * (rS31 * rS32);
1941    
1942    
1943     // trigger configuration of the run
1944     bool TCTOF1 = false;
1945     bool TCTOF2 = false;
1946     bool TCTOF3 = false;
1947     bool TCTOF4 = false;
1948     bool TCTOF5 = false;
1949     bool TCTOF6 = false;
1950     bool TCTOF7 = false;
1951     if ( trg->trigconf & (1<<0) ) TCTOF1 = true;
1952     if ( trg->trigconf & (1<<1) ) TCTOF2 = true;
1953     if ( trg->trigconf & (1<<2) ) TCTOF3 = true;
1954     if ( trg->trigconf & (1<<3) ) TCTOF4 = true;
1955     if ( trg->trigconf & (1<<4) ) TCTOF5 = true;
1956     if ( trg->trigconf & (1<<5) ) TCTOF6 = true;
1957     if ( trg->trigconf & (1<<6) ) TCTOF7 = true;
1958    
1959     // do patterntrig pmts match the trigger configuration?
1960     bool pmtsconf_trigconf_match = true;
1961     if ( rTOF1 == 0 && TCTOF1 ) pmtsconf_trigconf_match = false;
1962     if ( rTOF2 == 0 && TCTOF2 ) pmtsconf_trigconf_match = false;
1963     if ( rTOF3 == 0 && TCTOF3 ) pmtsconf_trigconf_match = false;
1964     if ( rTOF4 == 0 && TCTOF4 ) pmtsconf_trigconf_match = false;
1965     if ( rTOF5 == 0 && TCTOF5 ) pmtsconf_trigconf_match = false;
1966     if ( rTOF6 == 0 && TCTOF6 ) pmtsconf_trigconf_match = false;
1967     if ( rTOF7 == 0 && TCTOF7 ) pmtsconf_trigconf_match = false;
1968    
1969     return pmtsconf_trigconf_match;
1970     }
1971    
1972     void ToFLevel2::printPMT(){
1973     TClonesArray* Pmt = this->PMT;
1974     for(int i=0; i<Pmt->GetEntries(); i++) {
1975     ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1976     TString pmtname = this->GetPMTName(pmthit->pmt_id);
1977     printf(" PMT hit: %s \n",pmtname.Data());
1978     }
1979     }
1980    
1981 carbone 1.26
1982     ToFdEdx::ToFdEdx()
1983     {
1984     memset(conn,0,12*sizeof(Bool_t));
1985     memset(ts,0,12*sizeof(UInt_t));
1986     memset(te,0,12*sizeof(UInt_t));
1987 mocchiut 1.34 eDEDXpmt = new TArrayF(48);
1988 carbone 1.26 Define_PMTsat();
1989     Clear();
1990     }
1991 mocchiut 1.35
1992     ToFdEdx::~ToFdEdx(){
1993     Clear();
1994     Delete();
1995     }
1996    
1997     void ToFdEdx::Delete(Option_t *option){
1998     if ( eDEDXpmt ){
1999     eDEDXpmt->Set(0);
2000     if ( eDEDXpmt) delete eDEDXpmt;
2001     }
2002     }
2003    
2004 carbone 1.26 //------------------------------------------------------------------------
2005     void ToFdEdx::CheckConnectors(UInt_t atime, GL_PARAM *glparam, TSQLServer *dbc)
2006     {
2007     for(int i=0; i<12; i++){
2008     if(atime<=ts[i] || atime>te[i]){
2009     Int_t error=glparam->Query_GL_PARAM(atime,210+i,dbc); // parameters stored in DB in GL_PRAM table
2010     if ( error<0 ) {
2011     conn[i]=false;
2012     ts[i]=0;
2013     te[i]=numeric_limits<UInt_t>::max();
2014     };
2015     if ( !error ){
2016     conn[i]=true;
2017     ts[i]=glparam->FROM_TIME;
2018     te[i]=glparam->TO_TIME;
2019     }
2020     if ( error>0 ){
2021     conn[i]=false;
2022     ts[i]=glparam->TO_TIME;
2023     TSQLResult *pResult;
2024     TSQLRow *row;
2025     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);
2026     pResult=dbc->Query(query.Data());
2027     if(!pResult->GetRowCount()){
2028     te[i]=numeric_limits<UInt_t>::max();
2029     }else{
2030     row=pResult->Next();
2031     te[i]=(UInt_t)atoll(row->GetField(0));
2032     }
2033     }
2034     //
2035    
2036     }
2037     }
2038    
2039     }
2040     //------------------------------------------------------------------------
2041     void ToFdEdx::Clear(Option_t *option)
2042     {
2043     //
2044     // Set arrays and initialize structure
2045 mocchiut 1.34 // eDEDXpmt.Set(48); eDEDXpmt.Reset(-1); // Set array size and reset structure
2046     eDEDXpmt->Set(48); eDEDXpmt->Reset(-1); // Set array size and reset structure
2047 carbone 1.26 //
2048     };
2049    
2050     //------------------------------------------------------------------------
2051     void ToFdEdx::Print(Option_t *option)
2052     {
2053     //
2054     printf("========================================================================\n");
2055    
2056     };
2057    
2058 mocchiut 1.27 //------------------------------------------------------------------------
2059     void ToFdEdx::Init(pamela::tof::TofEvent *tofl0)
2060     {
2061     //
2062     ToFLevel2 tf;
2063     for (Int_t gg=0; gg<4;gg++){
2064     for (Int_t hh=0; hh<12;hh++){
2065     // tofinput_.tdc[hh][gg]=tofEvent->tdc[gg][hh];
2066     int mm = tf.GetPMTid(gg,hh);
2067 mocchiut 1.37 adc[mm]= (0xFFF & tofl0->adc[gg][hh]); // EM, exclude warning bits
2068 mocchiut 1.27 };
2069     };
2070    
2071     };
2072 carbone 1.26
2073     //------------------------------------------------------------------------
2074 mocchiut 1.27 void ToFdEdx::Init(Int_t gg, Int_t hh, Float_t adce)
2075     {
2076     //
2077     ToFLevel2 tf;
2078     // for (Int_t gg=0; gg<4;gg++){
2079     // for (Int_t hh=0; hh<12;hh++){
2080     int mm = tf.GetPMTid(gg,hh);
2081     adc[mm]=adce;
2082    
2083     };
2084 carbone 1.26 //------------------------------------------------------------------------
2085 mocchiut 1.32 void ToFdEdx::Process(UInt_t atime, Float_t betamean, Float_t *xtr_tof, Float_t *ytr_tof, Int_t exitat)
2086 carbone 1.26 {
2087 mocchiut 1.36 bool debug = false;
2088     if ( debug ) printf(" INSIDE TOFDEDX PROCESS \n");
2089 carbone 1.26 // the parameters should be already initialised by InitPar()
2090 mocchiut 1.34 // printf(" in process \n");
2091 carbone 1.26 Clear();
2092    
2093     // define angle:
2094     double dx = xtr_tof[1] - xtr_tof[5];
2095     double dy = ytr_tof[0] - ytr_tof[4];
2096     double dr = sqrt(dx*dx+dy*dy);
2097     double theta=atan(dr/76.81);
2098 mocchiut 1.27 //
2099 mocchiut 1.28 if ( xtr_tof[1] > 99. || xtr_tof[5] > 99. || ytr_tof[0] > 99. || ytr_tof[4] > 99. ) theta = 0.;
2100 mocchiut 1.29 for (Int_t ii=0; ii<6; ii++){
2101     if ( xtr_tof[ii] > 99. ) xtr_tof[ii] = 0.;
2102 mocchiut 1.30 if ( ytr_tof[ii] > 99. ) ytr_tof[ii] = 0.;
2103 mocchiut 1.29 };
2104 mocchiut 1.28 //
2105 mocchiut 1.36 if ( debug ) printf(" theta %f \n",theta);
2106     if ( debug ) printf(" xtr_tof %.1f %.1f %.1f %.1f %.1f %.1f \n",xtr_tof[0],xtr_tof[1],xtr_tof[2],xtr_tof[3],xtr_tof[4],xtr_tof[5]);
2107     if ( debug ) printf(" ytr_tof %.1f %.1f %.1f %.1f %.1f %.1f \n",ytr_tof[0],ytr_tof[1],ytr_tof[2],ytr_tof[3],ytr_tof[4],ytr_tof[5]);
2108 mocchiut 1.32 //--------------------- TABLE OF PERIODS WITH HV PROBLEMS ----------------------------
2109    
2110     int Aconn=conn[0]; // PMT 0,20,22,24
2111     int Bconn=conn[1]; // PMT 6,12,26,34
2112     int Cconn=conn[2]; // PMT 4,14,28,32
2113     int Dconn=conn[3]; // PMT 2,8,10,30
2114     int Econn=conn[4]; // PMT 42,43,44,47
2115     int Fconn=conn[5]; // PMT 7,19,23,27
2116     int Gconn=conn[6]; // PMT 3,11,25,33
2117     int Hconn=conn[7]; // PMT 1,9,13,21
2118     int Iconn=conn[8]; // PMT 5,29,31,35
2119     int Lconn=conn[9]; // PMT 37,40,45,46
2120     int Mconn=conn[10]; // PMT 15,16,17,18
2121     int Nconn=conn[11]; // PMT 36,38,39,41
2122     if( false ) cout << Gconn << Iconn << Lconn <<endl; // to avoid compilation warnings
2123    
2124 mocchiut 1.34 // printf(" size %i \n",eDEDXpmt.GetSize());
2125 carbone 1.26 for( int ii=0; ii<48; ii++ ) {
2126 mocchiut 1.27 //
2127 mocchiut 1.34 // eDEDXpmt.SetAt(-1.,ii);
2128 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]);
2129 mocchiut 1.36 if ( debug ) printf("II %i adc %f \n",ii,adc[ii]);
2130 mocchiut 1.33
2131 mocchiut 1.34 if( adc[ii] >= 4095. ){
2132     // eDEDXpmt[ii] = 0.;
2133     eDEDXpmt->AddAt(0.,ii);
2134 mocchiut 1.36 if ( debug ) printf(" %i adc>4095 \n",ii);
2135 mocchiut 1.33 continue; // EMILIANO
2136     };
2137    
2138 mocchiut 1.34 if( adc[ii] >= (PMTsat[ii]-5.) && adc[ii] < 4095. ){
2139     eDEDXpmt->AddAt(1000.,ii);
2140 mocchiut 1.36 if ( debug ) printf(" %i adc> pmtsat && adc<4095 \n",ii);
2141 mocchiut 1.33 continue; // EMILIANO
2142     };
2143    
2144     if( adc[ii] <= 0. ) {
2145 mocchiut 1.34 eDEDXpmt->AddAt(1500.,ii);
2146 mocchiut 1.36 if ( debug ) printf(" %i adc<=0 \n",ii);
2147 mocchiut 1.33 continue;
2148     };
2149 mocchiut 1.27 //
2150 carbone 1.26 double adcpC = f_adcPC( adc[ii] ); // - adc conversion in pC
2151 mocchiut 1.32 if ( exitat == 0 ){
2152 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adcpC,ii);
2153 mocchiut 1.32 continue;
2154     }
2155 mocchiut 1.34 // printf(" e qua? \n");
2156 mocchiut 1.32
2157     double adccorr = adcpC*fabs(cos(theta));
2158 mocchiut 1.36 if ( debug ) printf(" adccorr %f \n",adccorr);
2159     if(adccorr<=0.){
2160     if ( debug ) printf(" %i adccorr<=0 \n",ii);
2161     // eDEDXpmt->AddAt((Float_t)adcpC,ii);//?
2162     continue;
2163     }
2164 mocchiut 1.32 if ( exitat == 1 ){
2165 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adccorr,ii);
2166 mocchiut 1.32 continue;
2167     }
2168 mocchiut 1.34 // printf(" e quo? \n");
2169 carbone 1.26
2170     // int standard=0;
2171     int S115B_ok=0;
2172     int S115B_break=0;
2173    
2174     if(atime<1158720000)S115B_ok=1;
2175     else S115B_break=1;
2176    
2177    
2178 mocchiut 1.27 //------------------------------------------------------------------------
2179 mocchiut 1.34 // printf(" e qui? \n");
2180 mocchiut 1.27 //---------------------------------------------------- Z reconstruction
2181 carbone 1.26
2182 mocchiut 1.38 double adcHe, adcnorm, adclin, dEdx;//, Zeta; // EM GCC4.7
2183 carbone 1.26
2184 mocchiut 1.27 adcHe=-2;
2185     adcnorm=-2;
2186     adclin=-2;
2187     dEdx=-2;
2188 mocchiut 1.38 // Zeta=-2;//EM GCC4.7
2189 mocchiut 1.32 Double_t correction = 1.;
2190 carbone 1.26
2191     if(Aconn==1 && (ii==0 || ii==20 || ii==22 || ii==24)){
2192 mocchiut 1.32 correction = 1.675;
2193 carbone 1.26 }
2194     else if(Bconn==1 && (ii==6 || ii==12 || ii==26 || ii==34)){
2195 mocchiut 1.32 correction = 2.482;
2196 carbone 1.26 }
2197     else if(Cconn==1 && (ii==4 || ii==14 || ii==28 || ii==32)){
2198 mocchiut 1.32 correction = 1.464;
2199 carbone 1.26 }
2200     else if(Dconn==1 && (ii==2 || ii==8 || ii==10 || ii==30)){
2201 mocchiut 1.32 correction = 1.995;
2202 carbone 1.26 }
2203     else if(Econn==1 && (ii==42 || ii==43 || ii==44 || ii==47)){
2204 mocchiut 1.32 correction = 1.273;
2205 carbone 1.26 }
2206     else if(Fconn==1 && (ii==7 || ii==19 || ii==23 || ii==27)){
2207 mocchiut 1.32 correction = 1.565;
2208 carbone 1.26 }
2209     else if(Mconn==1 && (ii==15 || ii==16 || ii==17 || ii==18)){
2210 mocchiut 1.32 correction = 1.565;
2211 carbone 1.26 }
2212     else if(Nconn==1 && (ii==36 || ii==38 || ii==39 || ii==41)){
2213 mocchiut 1.32 correction = 1.018;
2214 carbone 1.26 }
2215     else if(Hconn==1 && (ii==1 || ii==13 || ii==21 || (ii==9&&S115B_ok==1))){
2216 mocchiut 1.32 correction = 1.84;
2217 carbone 1.26 }
2218     else if(S115B_break==1 && ii==9 && Hconn==1){
2219 mocchiut 1.32 correction = 1.64;
2220 carbone 1.26 }
2221 mocchiut 1.32 else correction = 1.;
2222    
2223 mocchiut 1.34 if( ii==9 && S115B_break==1 ){
2224 mocchiut 1.32 adcHe = f_att5B( ytr_tof[0] )/correction;
2225     } else {
2226     adcHe = Get_adc_he(ii, xtr_tof, ytr_tof)/correction;
2227     };
2228 mocchiut 1.36 if(adcHe<=0){
2229     if ( debug ) printf(" %i adcHe<=0 \n",ii);
2230     // eDEDXpmt->AddAt((Float_t)adccorr,ii); //?
2231     continue;
2232     }
2233 mocchiut 1.32 if ( exitat == 2 ){
2234 mocchiut 1.34 if(ii==9 && S115B_break==1) eDEDXpmt->AddAt(36.*(Float_t)adccorr/adcHe,ii);
2235 mocchiut 1.32 else adclin = 4.*(Float_t)adccorr/adcHe;
2236     continue;
2237     }
2238 carbone 1.26
2239     if(ii==9 && S115B_break==1) adcnorm = f_pos5B(adccorr);
2240     else adcnorm = f_pos( (parPos[ii]), adccorr);
2241 mocchiut 1.36 if(adcnorm<=0){
2242     if ( debug ) printf(" %i adcnorm<=0 \n",ii);
2243     // eDEDXpmt->AddAt((Float_t)adccorr,ii);//?
2244     continue;
2245     }
2246     if ( debug ) printf(" adcnorm %f \n",adcnorm);
2247    
2248 carbone 1.26 if(ii==9 && S115B_break==1) adclin = 36.*adcnorm/adcHe;
2249     else adclin = 4.*adcnorm/adcHe;
2250 mocchiut 1.36 if ( debug ) printf(" adclin %f \n",adclin);
2251     if(adclin<=0){
2252     if ( debug ) printf(" %i adclin<=0 \n",ii);
2253     // eDEDXpmt->AddAt((Float_t)adccorr,ii);//?
2254     continue;
2255     }
2256 mocchiut 1.32 if ( exitat == 3 ){
2257 mocchiut 1.34 if(ii==9 && S115B_break==1) eDEDXpmt->AddAt((Float_t)adclin,ii);
2258     else eDEDXpmt->AddAt((Float_t)adclin,ii);
2259 mocchiut 1.32 continue;
2260     }
2261 mocchiut 1.27 //
2262     if ( betamean > 99. ){
2263 mocchiut 1.31 // eDEDXpmt.AddAt((Float_t)adclin,ii);
2264 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adclin,ii);
2265 mocchiut 1.31 // printf(" AAPMT IS %i dedx is %f vector is %f \n",ii,adclin,eDEDXpmt[ii]);
2266 mocchiut 1.36 if ( debug ) printf(" %i betamean > 99 \n",ii);
2267 mocchiut 1.27 continue;
2268     };
2269     //
2270 carbone 1.26 double dEdxHe=-2;
2271     if(ii==9 && S115B_break==1){
2272     if( betamean <1. ) dEdxHe = f_BB5B( betamean );
2273     else dEdxHe = 33;
2274     } else {
2275     if( betamean <1. ) dEdxHe = f_BB( (parBBneg[ii]), betamean );
2276     else dEdxHe = parBBpos[ii];
2277     }
2278 mocchiut 1.27
2279 mocchiut 1.36 if ( debug ) printf(" dEdxHe %f \n",dEdxHe);
2280 mocchiut 1.32
2281     if(dEdxHe<=0){
2282 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adclin,ii);
2283 mocchiut 1.36 if ( debug ) printf(" %i dEdxHe<=0 \n",ii);
2284 mocchiut 1.32 continue;
2285     };
2286 carbone 1.26
2287     if(ii==9 && S115B_break==1) dEdx = f_desatBB5B( adclin );
2288     else dEdx = f_desatBB((parDesatBB[ii]), adclin );
2289    
2290 mocchiut 1.32 if(dEdx<=0){
2291 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)adclin,ii);
2292 mocchiut 1.36 if ( debug ) printf(" %i dEdx<=0 \n",ii);
2293 mocchiut 1.32 continue;
2294     };
2295 carbone 1.26
2296 mocchiut 1.36 if ( debug ) printf(" dEdx %f \n",dEdx);
2297 mocchiut 1.34 eDEDXpmt->AddAt((Float_t)dEdx,ii);
2298 mocchiut 1.31 // eDEDXpmt.AddAt((Float_t)dEdx,ii);
2299 carbone 1.26
2300 mocchiut 1.31 // printf(" PMT IS %i dedx is %f vector is %f \n",ii,dEdx,eDEDXpmt[ii]);
2301 carbone 1.26
2302 mocchiut 1.27 } //end loop on 48 PMT
2303 carbone 1.26
2304     };
2305    
2306    
2307     //------------------------------------------------------------------------
2308     void ToFdEdx::Define_PMTsat()
2309     {
2310     Float_t sat[48] = {
2311     3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
2312     3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
2313     3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
2314     3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
2315     3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
2316     3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
2317     PMTsat.Set(48,sat);
2318     }
2319    
2320     //------------------------------------------------------------------------
2321     void ToFdEdx::ReadParBBpos( const char *fname )
2322     {
2323 mocchiut 1.27 // printf("read %s\n",fname);
2324 carbone 1.26 parBBpos.Set(48);
2325     FILE *fattin = fopen( fname , "r" );
2326     for (int i=0; i<48; i++) {
2327     int tid=0;
2328     float tp;
2329     if(fscanf(fattin,"%d %f",
2330     &tid, &tp )!=2) break;
2331     parBBpos[i]=tp;
2332     }
2333     fclose(fattin);
2334     }
2335    
2336     //------------------------------------------------------------------------
2337     void ToFdEdx::ReadParDesatBB( const char *fname )
2338     {
2339 mocchiut 1.27 // printf("read %s\n",fname);
2340 carbone 1.26 FILE *fattin = fopen( fname , "r" );
2341     for (int i=0; i<48; i++) {
2342     int tid=0;
2343     float tp[3];
2344     if(fscanf(fattin,"%d %f %f %f",
2345     &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
2346     parDesatBB[i].Set(3,tp);
2347     }
2348     fclose(fattin);
2349     }
2350    
2351    
2352     //------------------------------------------------------------------------
2353     void ToFdEdx::ReadParBBneg( const char *fname )
2354    
2355     {
2356 mocchiut 1.27 // printf("read %s\n",fname);
2357 carbone 1.26 FILE *fattin = fopen( fname , "r" );
2358     for (int i=0; i<48; i++) {
2359     int tid=0;
2360     float tp[3];
2361     if(fscanf(fattin,"%d %f %f %f",
2362     &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
2363     parBBneg[i].Set(3,tp);
2364     }
2365     fclose(fattin);
2366     }
2367    
2368     //------------------------------------------------------------------------
2369     void ToFdEdx::ReadParPos( const char *fname )
2370     {
2371 mocchiut 1.27 // printf("read %s\n",fname);
2372 carbone 1.26 FILE *fattin = fopen( fname , "r" );
2373     for (int i=0; i<48; i++) {
2374     int tid=0;
2375     float tp[4];
2376     if(fscanf(fattin,"%d %f %f %f %f",
2377     &tid, &tp[0], &tp[1], &tp[2], &tp[3])!=5) break;
2378     parPos[i].Set(4,tp);
2379     }
2380     fclose(fattin);
2381     }
2382    
2383     //------------------------------------------------------------------------
2384     void ToFdEdx::ReadParAtt( const char *fname )
2385     {
2386 mocchiut 1.27 // printf("read %s\n",fname);
2387 carbone 1.26 FILE *fattin = fopen( fname , "r" );
2388     for (int i=0; i<48; i++) {
2389     int tid=0;
2390     float tp[6];
2391     if(fscanf(fattin,"%d %f %f %f %f %f %f",
2392     &tid, &tp[0], &tp[1], &tp[2], &tp[3], &tp[4], &tp[5] )!=7) break;
2393     parAtt[i].Set(6,tp);
2394     }
2395     fclose(fattin);
2396     }
2397    
2398    
2399    
2400    
2401    
2402    
2403     double ToFdEdx::f_att( TArrayF &p, float x )
2404     {
2405     return
2406     p[0] +
2407     p[1]*x +
2408     p[2]*x*x +
2409     p[3]*x*x*x +
2410     p[4]*x*x*x*x +
2411     p[5]*x*x*x*x*x;
2412     }
2413     //------------------------------------------------------------------------
2414     double ToFdEdx::f_att5B( float x )
2415     {
2416     return
2417     101.9409 +
2418     6.643781*x +
2419     0.2765518*x*x +
2420     0.004617647*x*x*x +
2421     0.0006195132*x*x*x*x +
2422     0.00002813734*x*x*x*x*x;
2423     }
2424    
2425    
2426     double ToFdEdx::f_pos( TArrayF &p, float x )
2427     {
2428     return
2429     p[0] +
2430     p[1]*x +
2431     p[2]*x*x +
2432     p[3]*x*x*x;
2433     }
2434    
2435     double ToFdEdx::f_pos5B( float x )
2436     {
2437     return
2438     15.45132 +
2439     0.8369721*x +
2440     0.0005*x*x;
2441     }
2442    
2443    
2444    
2445     double ToFdEdx::f_adcPC( float x )
2446     {
2447     return 28.12+0.6312*x-5.647e-05*x*x+3.064e-08*x*x*x;
2448     }
2449    
2450    
2451     float ToFdEdx::Get_adc_he( int id, float pl_x[6], float pl_y[6])
2452     {
2453    
2454     //
2455     // input: id - pmt [0:47}
2456     // pl_x - coord x of the tof plane
2457     // pl_y - coord y
2458    
2459 mocchiut 1.27 adc_he = 0;
2460 carbone 1.26 if( eGeom.GetXY(id)==1 ) adc_he = f_att( (parAtt[id]), pl_x[eGeom.GetPlane(id)] );
2461     if( eGeom.GetXY(id)==2 ) adc_he = f_att( (parAtt[id]), pl_y[eGeom.GetPlane(id)] );
2462     return adc_he;
2463     }
2464    
2465     //------------------------------------------------------------------------
2466     double ToFdEdx::f_BB( TArrayF &p, float x )
2467     {
2468     return p[0]/(x*x)*(log(x*x/(1-x*x)) - p[1]*x*x - p[2]);
2469     }
2470    
2471     //------------------------------------------------------------------------
2472     double ToFdEdx::f_BB5B( float x )
2473     {
2474     return 0.165797/(x*x)*(log(x*x/(1-x*x)) + 140.481*x*x + 52.9258);
2475     }
2476     //------------------------------------------------------------------------
2477     double ToFdEdx::f_desatBB( TArrayF &p, float x )
2478     {
2479     return
2480     p[0] +
2481     p[1]*x +
2482     p[2]*x*x;
2483     }
2484    
2485     //------------------------------------------------------------------------
2486     double ToFdEdx::f_desatBB5B( float x )
2487     {
2488     return
2489     -2.4 +
2490     0.75*x +
2491     0.009*x*x;
2492     }
2493    

  ViewVC Help
Powered by ViewVC 1.1.23