/[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.44 - (hide annotations) (download)
Thu Feb 26 14:35:01 2015 UTC (9 years, 9 months ago) by mocchiut
Branch: MAIN
Changes since 1.43: +5 -87 lines
GetdEdxPaddle duplicated method rewritten, not compiling bug due new dEdx method fixed

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

  ViewVC Help
Powered by ViewVC 1.1.23