/[PAMELA software]/DarthVader/ToFLevel2/src/ToFLevel2.cpp
ViewVC logotype

Diff of /DarthVader/ToFLevel2/src/ToFLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.20 by mocchiut, Thu Mar 6 14:51:07 2008 UTC revision 1.42 by pam-fi, Fri Oct 17 07:54:17 2014 UTC
# Line 1  Line 1 
1  /**  /**
2   * \file ToFLevel2.cpp   * \file ToFLevel2.cpp
3   * \author Gianfranca DeRosa, Wolfgang Menn   * \author Gianfranca DeRosa, Wolfgang Menn
4     *
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     * WM apr 2009: bug found by Nicola in method "GetPaddlePlane"
9   */   */
10    
 #include <TObject.h>  
11  #include <ToFLevel2.h>  #include <ToFLevel2.h>
 #include <iostream>  
12  using namespace std;  using namespace std;
13  ClassImp(ToFPMT);  ClassImp(ToFPMT);
14    ClassImp(ToFdEdx);
15    ClassImp(ToFGeom);
16  ClassImp(ToFTrkVar);  ClassImp(ToFTrkVar);
17  ClassImp(ToFLevel2);  ClassImp(ToFLevel2);
18    
# Line 16  ToFPMT::ToFPMT(){ Line 21  ToFPMT::ToFPMT(){
21    adc = 0.;    adc = 0.;
22    tdc_tw = 0.;    tdc_tw = 0.;
23    tdc = 0.;    tdc = 0.;
24      l0flag_adc = 0.;
25      l0flag_tdc = 0.;
26  }  }
27    
28  ToFPMT::ToFPMT(const ToFPMT &t){  ToFPMT::ToFPMT(const ToFPMT &t){
# Line 106  void ToFLevel2::Set(){//ELENA Line 113  void ToFLevel2::Set(){//ELENA
113      if(!PMT)PMT = new TClonesArray("ToFPMT",12); //ELENA      if(!PMT)PMT = new TClonesArray("ToFPMT",12); //ELENA
114      if(!ToFTrk)ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA      if(!ToFTrk)ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
115  }//ELENA  }//ELENA
116    //--------------------------------------
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    
127  void ToFLevel2::Clear(Option_t *t){  void ToFLevel2::Clear(Option_t *t){
128    //    //
# Line 113  void ToFLevel2::Clear(Option_t *t){ Line 130  void ToFLevel2::Clear(Option_t *t){
130    if(PMT)PMT->Delete(); //ELENA    if(PMT)PMT->Delete(); //ELENA
131    memset(tof_j_flag, 0, 6*sizeof(Int_t));    memset(tof_j_flag, 0, 6*sizeof(Int_t));
132    unpackError = 0;    unpackError = 0;
133      unpackWarning = 0;
134    //    //
135  };  };
136    
# Line 143  ToFTrkVar *ToFLevel2::GetToFTrkVar(Int_t Line 161  ToFTrkVar *ToFLevel2::GetToFTrkVar(Int_t
161    return toftrack;    return toftrack;
162  }  }
163    
164    /**
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  ToFPMT *ToFLevel2::GetToFPMT(Int_t ihit){  ToFPMT *ToFLevel2::GetToFPMT(Int_t ihit){
193    //        //    
194    if(ihit >= npmt()){    if(ihit >= npmt()){
# Line 216  Int_t ToFLevel2::GetNHitPaddles(Int_t pl Line 262  Int_t ToFLevel2::GetNHitPaddles(Int_t pl
262      return npad;      return npad;
263  };  };
264    
265    /**
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    //wm Nov 08
287  //gf Apr 07  //gf Apr 07
288  /**  /**
289   * Method to get the mean dEdx from a given ToF plane. This current version   * Method to get the mean dEdx from a ToF layer - ATTENTION:
290   * is just summing up all PMT signals, which will not give proper results,   * It will sum up the dEdx of all the paddles, but since by definition
291   *  and needs a revision.   * 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   * @param notrack Track Number   * @param notrack Track Number
297   * @param plane Plane index (0,1,2,3,4,5)   * @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; )   * @param adcflag in the plane (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
299   */   */
300  Float_t ToFLevel2::GetdEdx(Int_t notrack, Int_t plane, Int_t adcfl){  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    Float_t ToFLevel2::GetdEdx(Int_t notrack, Int_t plane, Int_t adcfl){
443      //  printf("fiffi\n");
444    Float_t dedx = 0.;    Float_t dedx = 0.;
445    Float_t PadEdx =0.;    Float_t PadEdx =0.;
446    Int_t SatWarning;    Int_t SatWarning;
# Line 236  Float_t ToFLevel2::GetdEdx(Int_t notrack Line 449  Float_t ToFLevel2::GetdEdx(Int_t notrack
449    ToFTrkVar *trk = GetToFTrkVar(notrack);    ToFTrkVar *trk = GetToFTrkVar(notrack);
450    if(!trk) return 0; //ELENA    if(!trk) return 0; //ELENA
451    //    //
452    for (Int_t ii=0; ii<GetNPaddle(plane); ii++){    if ( trk->trkseqno == -1 ){ //standalone, only paddles along the track, or about...
453      Int_t paddleid=ii;      //    printf("ciccio\n");
454      pad = GetPaddleid(plane,paddleid);      Float_t xleft=0;
455      GetdEdxPaddle(notrack, pad, adcfl, PadEdx, SatWarning);      Float_t xright=0;
456      dedx += PadEdx;      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    //    //
567    return(dedx);    return(dedx);
568  };  };
# Line 381  void ToFLevel2::GetPMTIndex(Int_t ind, I Line 702  void ToFLevel2::GetPMTIndex(Int_t ind, I
702    
703    
704    
705    //  wm Nov 08 revision - saturation values included
706  /// gf Apr 07  /// gf Apr 07
   
707  /**  /**
708   * Method to get the dEdx from a given ToF paddle.   * Method to get the dEdx from a given ToF paddle.
709     * 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   * @param notrack Track Number   * @param notrack Track Number
712   * @param Paddle index (0,1,...,23).   * @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; )   * @param adcflag in the paddle (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
# Line 394  void ToFLevel2::GetPMTIndex(Int_t ind, I Line 716  void ToFLevel2::GetPMTIndex(Int_t ind, I
716   */   */
717  void ToFLevel2::GetdEdxPaddle(Int_t notrack, Int_t paddleid, Int_t adcfl, Float_t &PadEdx, Int_t &SatWarning){  void ToFLevel2::GetdEdxPaddle(Int_t notrack, Int_t paddleid, Int_t adcfl, Float_t &PadEdx, Int_t &SatWarning){
718    
719      /*
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    
729      // 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    
740    
741    PadEdx = 0.;    PadEdx = 0.;
742    SatWarning = 1000;    //  SatWarning = 1000;
743      SatWarning = 0;   // 0=good, increase for each bad PMT
744    
745    Float_t dEdx[48] = {0};    Float_t dEdx[48] = {0};
746    Int_t pmt_id = -1;    Int_t pmt_id = -1;
# Line 427  void ToFLevel2::GetdEdxPaddle(Int_t notr Line 772  void ToFLevel2::GetdEdxPaddle(Int_t notr
772        adcraw[pmtright] = pmt->adc;        adcraw[pmtright] = pmt->adc;
773      }      }
774    }    }
775    
776        
777    for (Int_t i=0; i<trk->npmtadc; i++){    for (Int_t i=0; i<trk->npmtadc; i++){
778    
# Line 439  void ToFLevel2::GetdEdxPaddle(Int_t notr Line 785  void ToFLevel2::GetdEdxPaddle(Int_t notr
785      }      }
786    }    }
787    
788    if( adcraw[pmtleft] >3000 || adcraw[pmtright] >3000)SatWarning=1;  
789      //  if( adcraw[pmtleft] >3000 || adcraw[pmtright] >3000)SatWarning=1;  //old version
790    
791      // Increase SatWarning Counter for each PMT>Sat
792      if( adcraw[pmtleft] > PMTsat[pmtleft])SatWarning++;  
793      if( adcraw[pmtright] > PMTsat[pmtright])SatWarning++;
794    
795      // if ADC  > sat set dEdx=1000
796      if( adcraw[pmtleft] > PMTsat[pmtleft]) dEdx[pmtleft] = 1000.;
797      if( adcraw[pmtright] > PMTsat[pmtright]) dEdx[pmtright] = 1000. ;
798    
799      // if two PMT are good, take mean dEdx, otherwise only the good dEdx
800      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      
804    };
805    
806    //
807    //  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    
821      /*
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    if(dEdx[pmtleft]!=0 && dEdx[pmtright]!=0){      ToFPMT *pmt = GetToFPMT(jj);
865      PadEdx = (dEdx[pmtleft]+dEdx[pmtright])*0.5;      if(!pmt)break; //ELENA
866    }      
867    if(dEdx[pmtleft]==0 && dEdx[pmtright]!=0){      pmt_id = pmt->pmt_id;
868      PadEdx = dEdx[pmtright];      if(pmt_id==pmtleft){
869          adcraw[pmtleft] = pmt->adc;
870        }
871        
872        if(pmt_id==pmtright){
873          adcraw[pmtright] = pmt->adc;
874        }
875    }    }
876    if(dEdx[pmtleft]!=0 && dEdx[pmtright]==0){  
877      PadEdx = dEdx[pmtleft];    
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        
   return;  
905  };  };
 //  
   
906    
907  // gf Apr 07  // gf Apr 07
908    
# Line 508  TString ToFLevel2::GetPMTName(Int_t ind) Line 956  TString ToFLevel2::GetPMTName(Int_t ind)
956        
957  };  };
958    
959    // wm jun 08
 // gf Apr 07  
960  Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane){  Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane){
961    return GetPaddleIdOfTrack(xtr ,ytr ,plane, 0.4);
962    }
963    
964    // gf Apr 07
965    Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane, Float_t margin){
966      
967    Double_t xt,yt,xl,xh,yl,yh;    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};    Float_t tof11_x[8] = {-17.85,-12.75,-7.65,-2.55,2.55,7.65,12.75,17.85};
# Line 541  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 993  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
993      yh =  33.0/2. ;      yh =  33.0/2. ;
994      if ((yt>yl)&&(yt<yh)) {      if ((yt>yl)&&(yt<yh)) {
995        for (Int_t i1=0; i1<8;i1++){        for (Int_t i1=0; i1<8;i1++){
996          xl = tof11_x[i1] - (5.1-0.4)/2. ;          xl = tof11_x[i1] - (5.1-margin)/2. ;
997          xh = tof11_x[i1] + (5.1-0.4)/2. ;          xh = tof11_x[i1] + (5.1-margin)/2. ;
998          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;
999        }        }
1000      }      }
# Line 559  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 1011  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
1011            
1012      if ((xt>xl)&&(xt<xh)) {      if ((xt>xl)&&(xt<xh)) {
1013        for (Int_t i1=0; i1<6;i1++){        for (Int_t i1=0; i1<6;i1++){
1014          yl = tof12_y[i1] - (5.5-0.4)/2. ;          yl = tof12_y[i1] - (5.5-margin)/2. ;
1015          yh = tof12_y[i1] + (5.5-0.4)/2. ;          yh = tof12_y[i1] + (5.5-margin)/2. ;
1016          if ((yt>yl)&&(yt<yh))  paddleidoftrack=i1;          if ((yt>yl)&&(yt<yh))  paddleidoftrack=i1;
1017        }        }
1018      }      }
# Line 577  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 1029  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
1029            
1030      if ((xt>xl)&&(xt<xh)) {      if ((xt>xl)&&(xt<xh)) {
1031        for (Int_t i1=0; i1<2;i1++){        for (Int_t i1=0; i1<2;i1++){
1032          yl = tof21_y[i1] - (7.5-0.4)/2. ;          yl = tof21_y[i1] - (7.5-margin)/2. ;
1033          yh = tof21_y[i1] + (7.5-0.4)/2. ;          yh = tof21_y[i1] + (7.5-margin)/2. ;
1034          if ((yt>yl)&&(yt<yh))  paddleidoftrack=i1;          if ((yt>yl)&&(yt<yh))  paddleidoftrack=i1;
1035        }        }
1036      }      }
# Line 594  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 1046  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
1046            
1047      if ((yt>yl)&&(yt<yh)) {      if ((yt>yl)&&(yt<yh)) {
1048        for (Int_t i1=0; i1<2;i1++){        for (Int_t i1=0; i1<2;i1++){
1049          xl = tof22_x[i1] - (9.0-0.4)/2. ;          xl = tof22_x[i1] - (9.0-margin)/2. ;
1050          xh = tof22_x[i1] + (9.0-0.4)/2. ;          xh = tof22_x[i1] + (9.0-margin)/2. ;
1051          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;
1052        }        }
1053      }      }
# Line 611  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 1063  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
1063            
1064      if ((yt>yl)&&(yt<yh)) {      if ((yt>yl)&&(yt<yh)) {
1065        for (Int_t i1=0; i1<3;i1++){        for (Int_t i1=0; i1<3;i1++){
1066          xl = tof31_x[i1] - (6.0-0.4)/2. ;          xl = tof31_x[i1] - (6.0-margin)/2. ;
1067          xh = tof31_x[i1] + (6.0-0.4)/2. ;          xh = tof31_x[i1] + (6.0-margin)/2. ;
1068          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;
1069        }        }
1070      }      }
# Line 628  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 1080  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
1080            
1081      if ((xt>xl)&&(xt<xh)) {      if ((xt>xl)&&(xt<xh)) {
1082        for (Int_t i1=0; i1<3;i1++){        for (Int_t i1=0; i1<3;i1++){
1083          yl = tof32_y[i1] - (5.0-0.4)/2. ;          yl = tof32_y[i1] - (5.0-margin)/2. ;
1084          yh = tof32_y[i1] + (5.0-0.4)/2. ;          yh = tof32_y[i1] + (5.0-margin)/2. ;
1085          if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;          if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
1086        }        }
1087      }      }
# Line 697  void ToFLevel2::GetPMTPaddle(Int_t pmt_i Line 1149  void ToFLevel2::GetPMTPaddle(Int_t pmt_i
1149    
1150  void ToFLevel2::GetPaddlePMT(Int_t paddle, Int_t &pmtleft, Int_t &pmtright){  void ToFLevel2::GetPaddlePMT(Int_t paddle, Int_t &pmtleft, Int_t &pmtright){
1151    pmtleft=paddle*2;    pmtleft=paddle*2;
1152    pmtright= pmtleft+1;    pmtright= pmtleft+1;  
1153    return;    return;
1154  }  }
1155    
# Line 821  Int_t ToFLevel2::GetPaddleid(Int_t plane Line 1273  Int_t ToFLevel2::GetPaddleid(Int_t plane
1273    }    }
1274    padid=paddle+somma;    padid=paddle+somma;
1275    return padid;    return padid;
1276    
1277  }  }
1278    
1279    
# Line 849  void ToFLevel2::GetPaddlePlane(Int_t pad Line 1302  void ToFLevel2::GetPaddlePlane(Int_t pad
1302      return;      return;
1303    }    }
1304    
1305    if(7<pad<14){    if((7<pad)&&(pad<14)){
1306      plane=1;      plane=1;
1307      paddle=pad-pads11;      paddle=pad-pads11;
1308      return;      return;
1309    }    }
1310        
1311    if(13<pad<16){    if((13<pad)&&(pad<16)){
1312      plane=2;      plane=2;
1313      paddle=pad-pads11-pads12;      paddle=pad-pads11-pads12;
1314      return;      return;
1315    }    }
1316    
1317    if(15<pad<18){    if((15<pad)&&(pad<18)){
1318      plane=3;      plane=3;
1319      paddle=pad-pads11-pads12-pads21;      paddle=pad-pads11-pads12-pads21;
1320      return;      return;
1321    }    }
1322    
1323    if(17<pad<21){    if((17<pad)&&(pad<21)){
1324      plane=4;      plane=4;
1325      paddle=pad-pads11-pads12-pads21-pads22;      paddle=pad-pads11-pads12-pads21-pads22;
1326      return;      return;
1327    }    }
1328    
1329    if(20<pad<24){    if((20<pad)&&(pad<24)){
1330      plane=5;      plane=5;
1331      paddle=pad-pads11-pads12-pads21-pads22-pads31;      paddle=pad-pads11-pads12-pads21-pads22-pads31;
1332      return;      return;
# Line 904  Int_t ToFLevel2::GetNPaddle(Int_t plane) Line 1357  Int_t ToFLevel2::GetNPaddle(Int_t plane)
1357    
1358  }  }
1359    
1360    
1361    
1362  /// wm feb 08  /// wm feb 08
1363    
1364  /**  /**
# Line 1050  Int_t ibot[12] = {4,5,4,5,4,5,4,5,2,3,2, Line 1505  Int_t ibot[12] = {4,5,4,5,4,5,4,5,2,3,2,
1505  ////////////////////////////////////////////////////  ////////////////////////////////////////////////////
1506    
1507    
   
1508  /**  /**
1509   * Fills a struct cToFLevel2 with values from a ToFLevel2 object (to put data into a F77 common).   * Fills a struct cToFLevel2 with values from a ToFLevel2 object (to put data into a F77 common).
1510   */   */
# Line 1097  void ToFLevel2::GetLevel2Struct(cToFLeve Line 1551  void ToFLevel2::GetLevel2Struct(cToFLeve
1551        }        }
1552    } //ELENA    } //ELENA
1553  }  }
1554    
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      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    //   myquery << "SET time_zone='+0:00';";
1592    //   dbc->Query(myquery.str().c_str());
1593    //   delete dbc->Query("SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';");
1594    //   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    }
1830    
1831    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    
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      eDEDXpmt = new TArrayF(48);
1988      Define_PMTsat();
1989      Clear();
1990    }
1991    
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    //------------------------------------------------------------------------
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      //  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      //
2048    };
2049    
2050    //------------------------------------------------------------------------
2051    void ToFdEdx::Print(Option_t *option)
2052    {
2053      //
2054      printf("========================================================================\n");
2055    
2056    };
2057    
2058    //------------------------------------------------------------------------
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          adc[mm]= (0xFFF & tofl0->adc[gg][hh]); // EM, exclude warning bits
2068        };      
2069      };
2070      
2071    };
2072    
2073    //------------------------------------------------------------------------
2074    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    //------------------------------------------------------------------------
2085    void ToFdEdx::Process(UInt_t atime, Float_t betamean, Float_t *xtr_tof, Float_t *ytr_tof, Int_t exitat)
2086    {
2087      bool debug = false;
2088      if ( debug ) printf(" INSIDE TOFDEDX PROCESS \n");
2089      // the parameters should be already initialised by InitPar()
2090      //  printf(" in process \n");
2091      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      //
2099      if ( xtr_tof[1] > 99. ||  xtr_tof[5] > 99. || ytr_tof[0] > 99. ||  ytr_tof[4] > 99. ) theta = 0.;
2100      for (Int_t ii=0; ii<6; ii++){
2101        if ( xtr_tof[ii] > 99. ) xtr_tof[ii] = 0.;
2102        if ( ytr_tof[ii] > 99. ) ytr_tof[ii] = 0.;
2103      };
2104      //
2105      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      //--------------------- 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      //  printf(" size %i \n",eDEDXpmt.GetSize());
2125      for( int ii=0; ii<48; ii++ ) {
2126        //
2127        //    eDEDXpmt.SetAt(-1.,ii);
2128        //    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        if ( debug ) printf("II %i adc %f \n",ii,adc[ii]);
2130    
2131        if( adc[ii] >= 4095. ){
2132          //      eDEDXpmt[ii] = 0.;
2133          eDEDXpmt->AddAt(0.,ii);
2134          if ( debug ) printf(" %i adc>4095 \n",ii);
2135          continue; // EMILIANO
2136        };
2137    
2138        if( adc[ii] >= (PMTsat[ii]-5.) && adc[ii] < 4095. ){
2139          eDEDXpmt->AddAt(1000.,ii);
2140          if ( debug ) printf(" %i adc> pmtsat && adc<4095 \n",ii);
2141          continue; // EMILIANO
2142        };
2143    
2144        if( adc[ii] <= 0. ) {
2145          eDEDXpmt->AddAt(1500.,ii);
2146          if ( debug ) printf(" %i adc<=0 \n",ii);
2147          continue;
2148        };
2149        //
2150        double adcpC   = f_adcPC( adc[ii] );    // - adc conversion in pC
2151        if ( exitat == 0 ){
2152          eDEDXpmt->AddAt((Float_t)adcpC,ii);
2153          continue;
2154        }
2155        //    printf(" e qua? \n");
2156    
2157        double adccorr = adcpC*fabs(cos(theta));    
2158        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        if ( exitat == 1 ){
2165          eDEDXpmt->AddAt((Float_t)adccorr,ii);
2166          continue;
2167        }
2168        //    printf(" e quo? \n");
2169    
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        //------------------------------------------------------------------------
2179        //    printf(" e qui? \n");
2180        //---------------------------------------------------- Z reconstruction
2181    
2182        double adcHe, adcnorm, adclin, dEdx;//, Zeta; // EM GCC4.7
2183    
2184        adcHe=-2;
2185        adcnorm=-2;
2186        adclin=-2;
2187        dEdx=-2;
2188        //    Zeta=-2;//EM GCC4.7
2189        Double_t correction = 1.;
2190    
2191        if(Aconn==1 && (ii==0 || ii==20 || ii==22 || ii==24)){
2192          correction = 1.675;
2193        }
2194        else if(Bconn==1 && (ii==6 || ii==12 || ii==26 || ii==34)){
2195          correction = 2.482;
2196        }
2197        else if(Cconn==1 && (ii==4 || ii==14 || ii==28 || ii==32)){
2198          correction = 1.464;
2199        }
2200        else if(Dconn==1 && (ii==2 || ii==8 || ii==10 || ii==30)){
2201          correction = 1.995;
2202        }
2203        else if(Econn==1 && (ii==42 || ii==43 || ii==44 || ii==47)){
2204          correction = 1.273;
2205        }
2206        else if(Fconn==1 && (ii==7 || ii==19 || ii==23 || ii==27)){
2207          correction = 1.565;
2208        }
2209        else if(Mconn==1 && (ii==15 || ii==16 || ii==17 || ii==18)){
2210          correction = 1.565;
2211        }
2212        else if(Nconn==1 && (ii==36 || ii==38 || ii==39 || ii==41)){
2213          correction = 1.018;
2214        }
2215        else if(Hconn==1 && (ii==1 || ii==13 || ii==21 || (ii==9&&S115B_ok==1))){
2216          correction = 1.84;
2217        }
2218        else if(S115B_break==1 && ii==9 && Hconn==1){
2219          correction = 1.64;
2220        }
2221        else correction = 1.;
2222        
2223        if( ii==9 && S115B_break==1 ){
2224          adcHe   = f_att5B( ytr_tof[0] )/correction;
2225        } else {
2226          adcHe   = Get_adc_he(ii, xtr_tof, ytr_tof)/correction;
2227        };
2228        if(adcHe<=0){
2229          if ( debug ) printf(" %i adcHe<=0 \n",ii);
2230          //      eDEDXpmt->AddAt((Float_t)adccorr,ii); //?
2231          continue;
2232        }
2233        if ( exitat == 2 ){
2234          if(ii==9 && S115B_break==1)  eDEDXpmt->AddAt(36.*(Float_t)adccorr/adcHe,ii);
2235          else  adclin  = 4.*(Float_t)adccorr/adcHe;
2236          continue;
2237        }
2238    
2239        if(ii==9 && S115B_break==1)  adcnorm = f_pos5B(adccorr);
2240        else adcnorm = f_pos( (parPos[ii]), adccorr);
2241        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        if(ii==9 && S115B_break==1)  adclin  = 36.*adcnorm/adcHe;
2249        else  adclin  = 4.*adcnorm/adcHe;
2250        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        if ( exitat == 3 ){
2257          if(ii==9 && S115B_break==1)  eDEDXpmt->AddAt((Float_t)adclin,ii);
2258          else  eDEDXpmt->AddAt((Float_t)adclin,ii);
2259          continue;
2260        }
2261        //
2262        if ( betamean > 99. ){
2263          //      eDEDXpmt.AddAt((Float_t)adclin,ii);
2264          eDEDXpmt->AddAt((Float_t)adclin,ii);
2265          //      printf(" AAPMT IS %i dedx is %f vector is %f \n",ii,adclin,eDEDXpmt[ii]);
2266          if ( debug ) printf(" %i betamean > 99 \n",ii);
2267          continue;
2268        };
2269        //
2270        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        
2279        if ( debug ) printf(" dEdxHe %f \n",dEdxHe);
2280        
2281        if(dEdxHe<=0){
2282          eDEDXpmt->AddAt((Float_t)adclin,ii);
2283          if ( debug ) printf(" %i dEdxHe<=0 \n",ii);
2284          continue;
2285        };
2286    
2287        if(ii==9 && S115B_break==1)  dEdx = f_desatBB5B( adclin );
2288        else  dEdx = f_desatBB((parDesatBB[ii]), adclin );
2289    
2290        if(dEdx<=0){
2291          eDEDXpmt->AddAt((Float_t)adclin,ii);
2292          if ( debug ) printf(" %i dEdx<=0 \n",ii);
2293          continue;
2294        };
2295    
2296        if ( debug ) printf(" dEdx %f \n",dEdx);
2297        eDEDXpmt->AddAt((Float_t)dEdx,ii);
2298        //    eDEDXpmt.AddAt((Float_t)dEdx,ii);
2299    
2300        //    printf(" PMT IS %i dedx is %f vector is %f \n",ii,dEdx,eDEDXpmt[ii]);
2301    
2302      }  //end loop on 48 PMT
2303    
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      //  printf("read %s\n",fname);
2324      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      //  printf("read %s\n",fname);
2340      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      //  printf("read %s\n",fname);
2357      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      //  printf("read %s\n",fname);
2372      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      //  printf("read %s\n",fname);
2387      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      adc_he = 0;
2460      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    

Legend:
Removed from v.1.20  
changed lines
  Added in v.1.42

  ViewVC Help
Powered by ViewVC 1.1.23