/[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.17 by mocchiut, Wed Oct 10 16:01:33 2007 UTC revision 1.37 by mocchiut, Tue May 15 14:31:34 2012 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 25  ToFPMT::ToFPMT(const ToFPMT &t){ Line 32  ToFPMT::ToFPMT(const ToFPMT &t){
32    tdc = t.tdc;    tdc = t.tdc;
33  }  }
34    
35  void ToFPMT::Clear(){  void ToFPMT::Clear(Option_t *t){
36    pmt_id = 0;    pmt_id = 0;
37    adc = 0.;    adc = 0.;
38    tdc_tw = 0.;    tdc_tw = 0.;
# Line 53  ToFTrkVar::ToFTrkVar() { Line 60  ToFTrkVar::ToFTrkVar() {
60    //    //
61  };  };
62    
63  void ToFTrkVar::Clear() {  void ToFTrkVar::Clear(Option_t *t) {
64    trkseqno = 0;    trkseqno = 0;
65    npmttdc = 0;    npmttdc = 0;
66    npmtadc = 0;    npmtadc = 0;
# Line 107  void ToFLevel2::Set(){//ELENA Line 114  void ToFLevel2::Set(){//ELENA
114      if(!ToFTrk)ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA      if(!ToFTrk)ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
115  }//ELENA  }//ELENA
116    
117  void ToFLevel2::Clear(){  void ToFLevel2::Clear(Option_t *t){
118    //    //
119    if(ToFTrk)ToFTrk->Delete(); //ELENA    if(ToFTrk)ToFTrk->Delete(); //ELENA
120    if(PMT)PMT->Delete(); //ELENA    if(PMT)PMT->Delete(); //ELENA
121    memset(tof_j_flag, 0, 6*sizeof(Int_t));    memset(tof_j_flag, 0, 6*sizeof(Int_t));
122    unpackError = 0;    unpackError = 0;
123      unpackWarning = 0;
124    //    //
125  };  };
126    
127  void ToFLevel2::Delete(){ //ELENA  void ToFLevel2::Delete(Option_t *t){ //ELENA
128    //    //
129    if(ToFTrk){    if(ToFTrk){
130        ToFTrk->Delete(); //ELENA        ToFTrk->Delete(); //ELENA
# Line 216  Int_t ToFLevel2::GetNHitPaddles(Int_t pl Line 224  Int_t ToFLevel2::GetNHitPaddles(Int_t pl
224      return npad;      return npad;
225  };  };
226    
227    /**
228     * Method to get the number of hit paddles on a ToF plane.
229     * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
230     */
231    Int_t ToFLevel2::GetTrueNHitPaddles(Int_t plane){
232        Int_t npad=0;
233        TClonesArray* Pmt = this->PMT;
234        int paddle[24];
235        memset(paddle,0, 24*sizeof(int));
236        for(int i=0; i<Pmt->GetEntries(); i++) {  //loop per vedere quale TOF è colpito
237          ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
238          int pplane = -1;
239          int ppaddle = -1;
240          GetPMTPaddle(pmthit->pmt_id,pplane,ppaddle);
241          if ( pplane == plane ) paddle[ppaddle]++;
242        }
243        for(int i=0;i<24;i++) if ( paddle[i]>0 ) npad++;
244    
245        return npad;
246    };
247    
248    //wm Nov 08
249  //gf Apr 07  //gf Apr 07
250  /**  /**
251   * 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:
252   * 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
253   *  and needs a revision.   * only the paddle hitted by the track gets a dEdx value and the other
254     * paddles are set to zero, the output is just the dEdx of the hitted
255     * paddle in each layer!
256     * The "adcfl" option is not very useful (an artificial dEdx is per
257     * definition= 1 mip and not a real measurement), anyway left in the code
258   * @param notrack Track Number   * @param notrack Track Number
259   * @param plane Plane index (0,1,2,3,4,5)   * @param plane Plane index (0,1,2,3,4,5)
260   * @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; )
261   */   */
262  Float_t ToFLevel2::GetdEdx(Int_t notrack, Int_t plane, Int_t adcfl){  Float_t ToFLevel2::GetdEdx(Int_t notrack, Int_t plane, Int_t adcfl){
263      //  printf("fiffi\n");
264    Float_t dedx = 0.;    Float_t dedx = 0.;
265    Float_t PadEdx =0.;    Float_t PadEdx =0.;
266    Int_t SatWarning;    Int_t SatWarning;
# Line 236  Float_t ToFLevel2::GetdEdx(Int_t notrack Line 269  Float_t ToFLevel2::GetdEdx(Int_t notrack
269    ToFTrkVar *trk = GetToFTrkVar(notrack);    ToFTrkVar *trk = GetToFTrkVar(notrack);
270    if(!trk) return 0; //ELENA    if(!trk) return 0; //ELENA
271    //    //
272    for (Int_t ii=0; ii<GetNPaddle(plane); ii++){    if ( trk->trkseqno == -1 ){ //standalone, only paddles along the track, or about...
273      Int_t paddleid=ii;      //    printf("ciccio\n");
274      pad = GetPaddleid(plane,paddleid);      Float_t xleft=0;
275      GetdEdxPaddle(notrack, pad, adcfl, PadEdx, SatWarning);      Float_t xright=0;
276      dedx += PadEdx;      Float_t yleft=0;
277    };      Float_t yright=0;
278        Float_t xtof_temp[6]={100.,100.,100.,100.,100.,100.};
279        Float_t ytof_temp[6]={100.,100.,100.,100.,100.,100.};
280        ToFTrkVar *t_tof = trk;
281        
282        xtof_temp[0]=t_tof->xtofpos[0];
283        ytof_temp[0]=t_tof->ytofpos[0];
284        xtof_temp[1]=t_tof->xtofpos[0];
285        ytof_temp[1]=t_tof->ytofpos[0];
286    
287        xtof_temp[2]=t_tof->xtofpos[1];
288        ytof_temp[2]=t_tof->ytofpos[1];
289        xtof_temp[3]=t_tof->xtofpos[1];
290        ytof_temp[3]=t_tof->ytofpos[1];
291    
292        xtof_temp[4]=t_tof->xtofpos[2];
293        ytof_temp[4]=t_tof->ytofpos[2];
294        xtof_temp[5]=t_tof->xtofpos[2];
295        ytof_temp[5]=t_tof->ytofpos[2];
296    
297        if(t_tof->xtofpos[0]<100. && t_tof->ytofpos[0]<100.){
298          xtof_temp[1]=t_tof->xtofpos[0];
299          ytof_temp[0]=t_tof->ytofpos[0];
300        }else if(t_tof->xtofpos[0]>=100. && t_tof->ytofpos[0]<100.){
301          ytof_temp[0]=t_tof->ytofpos[0];
302          this->GetPaddleGeometry(0,(Int_t)log2(this->tof_j_flag[0]),xleft, xright, yleft, yright);
303          xtof_temp[1]=xleft+2.55;
304        }else if(t_tof->ytofpos[0]>=100. && t_tof->xtofpos[0]<100.){
305          xtof_temp[1]=t_tof->xtofpos[0];
306          this->GetPaddleGeometry(1,(Int_t)log2(this->tof_j_flag[1]),xleft, xright, yleft, yright);
307          ytof_temp[0]=yleft+2.75;
308        }
309        
310        if(t_tof->xtofpos[1]<100. && t_tof->ytofpos[1]<100.){
311          xtof_temp[2]=t_tof->xtofpos[1];
312          ytof_temp[3]=t_tof->ytofpos[1];
313        }else if(t_tof->xtofpos[1]>=100. && t_tof->ytofpos[1]<100.){
314          ytof_temp[3]=t_tof->ytofpos[1];
315          this->GetPaddleGeometry(3,(Int_t)log2(this->tof_j_flag[3]),xleft, xright, yleft, yright);
316          xtof_temp[2]=xleft+4.5;
317        }else if(t_tof->ytofpos[1]>=100. && t_tof->xtofpos[1]<100.){
318          xtof_temp[2]=t_tof->xtofpos[1];
319          this->GetPaddleGeometry(2,(Int_t)log2(this->tof_j_flag[2]),xleft, xright, yleft, yright);
320          ytof_temp[3]=yleft+3.75;
321        }
322        
323        if(t_tof->xtofpos[2]<100. && t_tof->ytofpos[2]<100.){
324          xtof_temp[5]=t_tof->xtofpos[2];
325          ytof_temp[4]=t_tof->ytofpos[2];
326        }else if(t_tof->xtofpos[2]>=100. && t_tof->ytofpos[2]<100.){
327          ytof_temp[4]=t_tof->ytofpos[2];
328          this->GetPaddleGeometry(4,(Int_t)log2(this->tof_j_flag[4]),xleft, xright, yleft, yright);
329          xtof_temp[5]=xleft+3;
330        }else if(t_tof->ytofpos[2]>=100. && t_tof->xtofpos[2]<100.){
331          xtof_temp[5]=t_tof->xtofpos[2];
332          this->GetPaddleGeometry(5,(Int_t)log2(this->tof_j_flag[5]),xleft, xright, yleft, yright);
333          ytof_temp[4]=yleft+2.5;
334        }
335    
336        if ( (xtof_temp[0])> 17.85 && fabs(xtof_temp[0])<17.85+4. ) xtof_temp[0] =17.84;
337        if ( (xtof_temp[1])> 17.85 && fabs(xtof_temp[1])<17.85+4. ) xtof_temp[1] =17.84;
338        if ( (ytof_temp[0])> 13.75 && fabs(ytof_temp[0])<13.75+4. ) ytof_temp[0] =13.74;
339        if ( (ytof_temp[1])> 13.75 && fabs(ytof_temp[1])<13.75+4. ) ytof_temp[1] =13.74;
340        if ( (xtof_temp[0])< -17.85 && fabs(xtof_temp[0])>-(17.85+4.) ) xtof_temp[0] =-17.84;
341        if ( (xtof_temp[1])< -17.85 && fabs(xtof_temp[1])>-(17.85+4.) ) xtof_temp[1] =-17.84;
342        if ( (ytof_temp[0])< -13.75 && fabs(ytof_temp[0])>-(13.75+4.) ) ytof_temp[0] =-13.74;
343        if ( (ytof_temp[1])< -13.75 && fabs(ytof_temp[1])>-(13.75+4.) ) ytof_temp[1] =-13.74;
344    
345        if ( (xtof_temp[2])> 4.5 && (xtof_temp[2])<4.5+4. ) xtof_temp[2] =4.4;
346        if ( (xtof_temp[3])> 4.45 && (xtof_temp[3])<4.5+4. ) xtof_temp[3] =4.4;
347        if ( (ytof_temp[2])> 3.75 && (ytof_temp[2])<3.75+4. ) ytof_temp[2] =3.74;
348        if ( (ytof_temp[3])> 3.75 && (ytof_temp[3])<3.75+4. ) ytof_temp[3] =3.74;
349        if ( (xtof_temp[2])< -4.5 && (xtof_temp[2])>-(4.5+4.) ) xtof_temp[2] =-4.4;
350        if ( (xtof_temp[3])< -4.45 && (xtof_temp[3])>-(4.5+4.) ) xtof_temp[3] =-4.4;
351        if ( (ytof_temp[2])< -3.75 && (ytof_temp[2])>-(3.75+4.) ) ytof_temp[2] =-3.74;
352        if ( (ytof_temp[3])< -3.75 && (ytof_temp[3])>-(3.75+4.) ) ytof_temp[3] =-3.74;
353    
354        if ( (xtof_temp[4])> 6. && (xtof_temp[4])<6.+4. ) xtof_temp[2] =5.9;
355        if ( (xtof_temp[5])> 6. && (xtof_temp[5])<6.+4. ) xtof_temp[3] =5.9;
356        if ( (ytof_temp[4])> 5. && (ytof_temp[4])<5.+4. ) ytof_temp[2] =4.9;
357        if ( (ytof_temp[5])> 5. && (ytof_temp[5])<5.+4. ) ytof_temp[3] =4.9;
358        if ( (xtof_temp[4])< -6. && (xtof_temp[4])>-(6.+4.) ) xtof_temp[2] =-5.9;
359        if ( (xtof_temp[5])< -6. && (xtof_temp[5])>-(6.+4.) ) xtof_temp[3] =-5.9;
360        if ( (ytof_temp[4])< -5. && (ytof_temp[4])>-(5.+4.) ) ytof_temp[2] =-4.9;
361        if ( (ytof_temp[5])< -5. && (ytof_temp[5])>-(5.+4.) ) ytof_temp[3] =-4.9;
362    
363    
364        for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
365          Int_t paddleid=ii;
366          pad = GetPaddleid(plane,paddleid);
367          Int_t IpaddleT=-1;
368          IpaddleT=this->GetPaddleIdOfTrack(xtof_temp[plane],ytof_temp[plane], plane,0.0);
369    //      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]);
370          //      if ( IpaddleT == paddleid || IpaddleT-1 == paddleid || IpaddleT+1 == paddleid ){
371          if ( IpaddleT == paddleid || GetTrueNHitPaddles(plane) == 1 ){
372            //IpaddleT-1 == paddleid || IpaddleT+1 == paddleid ){
373            GetdEdxPaddle(notrack, pad, adcfl, PadEdx, SatWarning);
374            dedx += PadEdx;
375          }
376        };
377      } else {
378        for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
379          Int_t paddleid=ii;
380          pad = GetPaddleid(plane,paddleid);
381          GetdEdxPaddle(notrack, pad, adcfl, PadEdx, SatWarning);
382          dedx += PadEdx;
383    //      printf("TTT %i %i %f\n",paddleid,plane,PadEdx);
384        };
385      }
386    //    //
387    return(dedx);    return(dedx);
388  };  };
# Line 381  void ToFLevel2::GetPMTIndex(Int_t ind, I Line 522  void ToFLevel2::GetPMTIndex(Int_t ind, I
522    
523    
524    
525    //  wm Nov 08 revision - saturation values included
526  /// gf Apr 07  /// gf Apr 07
   
527  /**  /**
528   * Method to get the dEdx from a given ToF paddle.   * Method to get the dEdx from a given ToF paddle.
529     * If two PMTs are good, the mean dEdx of both PMTs is taken, otherwise
530     * just the dEdx of the "good" PMT. If both PMTs are above saturation => dEdx=1000
531   * @param notrack Track Number   * @param notrack Track Number
532   * @param Paddle index (0,1,...,23).   * @param Paddle index (0,1,...,23).
533   * @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 536  void ToFLevel2::GetPMTIndex(Int_t ind, I
536   */   */
537  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){
538    
539      /*
540        Float_t  PMTsat[48] = {
541        3162.14, 3165.48, 3153.85, 3085.73, 3089.65, 3107.64, 3097.52, 3078.37,
542        3130.05, 3087.07, 3112.22, 3102.92, 3080.58, 3092.55, 3087.94, 3125.03,
543        3094.09, 3143.16, 3125.51, 3181.27, 3092.09, 3124.98, 3069.3, 3095.53,
544        3097.11, 3133.53, 3114.73, 3113.01, 3091.19, 3097.99, 3033.84, 3134.98,
545        3081.37, 3111.04, 3066.77, 3108.17, 3133, 3111.06, 3052.52, 3140.66,
546        3106.33, 3094.85, 3150.85, 3118.8, 3096.24, 3118.47,3111.36, 3117.11 } ;
547      */
548    
549      // new values from Napoli dec 2008
550      Float_t  PMTsat[48] = {
551        3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
552        3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
553        3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
554        3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
555        3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
556        3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
557    
558      for (Int_t i=0; i<48;i++) PMTsat[i] = PMTsat[i] - 5.;  // safety margin
559    
560    
561    PadEdx = 0.;    PadEdx = 0.;
562    SatWarning = 1000;    //  SatWarning = 1000;
563      SatWarning = 0;   // 0=good, increase for each bad PMT
564    
565    Float_t dEdx[48] = {0};    Float_t dEdx[48] = {0};
566    Int_t pmt_id = -1;    Int_t pmt_id = -1;
# Line 427  void ToFLevel2::GetdEdxPaddle(Int_t notr Line 592  void ToFLevel2::GetdEdxPaddle(Int_t notr
592        adcraw[pmtright] = pmt->adc;        adcraw[pmtright] = pmt->adc;
593      }      }
594    }    }
595    
596        
597    for (Int_t i=0; i<trk->npmtadc; i++){    for (Int_t i=0; i<trk->npmtadc; i++){
598    
# Line 439  void ToFLevel2::GetdEdxPaddle(Int_t notr Line 605  void ToFLevel2::GetdEdxPaddle(Int_t notr
605      }      }
606    }    }
607    
608    if( adcraw[pmtleft] >3000 || adcraw[pmtright] >3000)SatWarning=1;  
609          //  if( adcraw[pmtleft] >3000 || adcraw[pmtright] >3000)SatWarning=1;  //old version
610    if(dEdx[pmtleft]!=0 && dEdx[pmtright]!=0){  
611      PadEdx = (dEdx[pmtleft]+dEdx[pmtright])*0.5;    // Increase SatWarning Counter for each PMT>Sat
612    }    if( adcraw[pmtleft] > PMTsat[pmtleft])SatWarning++;  
613    if(dEdx[pmtleft]==0 && dEdx[pmtright]!=0){    if( adcraw[pmtright] > PMTsat[pmtright])SatWarning++;
614      PadEdx = dEdx[pmtright];  
615    }    // if ADC  > sat set dEdx=1000
616    if(dEdx[pmtleft]!=0 && dEdx[pmtright]==0){    if( adcraw[pmtleft] > PMTsat[pmtleft]) dEdx[pmtleft] = 1000.;
617      PadEdx = dEdx[pmtleft];    if( adcraw[pmtright] > PMTsat[pmtright]) dEdx[pmtright] = 1000. ;
618    }  
619      // if two PMT are good, take mean dEdx, otherwise only the good dEdx
620      if(dEdx[pmtleft]<1000 && dEdx[pmtright]<1000) PadEdx = (dEdx[pmtleft]+dEdx[pmtright])*0.5;
621      if(dEdx[pmtleft]==1000 && dEdx[pmtright]<1000) PadEdx = dEdx[pmtright];  
622      if(dEdx[pmtleft]<1000 && dEdx[pmtright]==1000) PadEdx = dEdx[pmtleft];
623        
   return;  
624  };  };
625  //  //
626    
# Line 508  TString ToFLevel2::GetPMTName(Int_t ind) Line 677  TString ToFLevel2::GetPMTName(Int_t ind)
677        
678  };  };
679    
680    // wm jun 08
 // gf Apr 07  
681  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){
682    return GetPaddleIdOfTrack(xtr ,ytr ,plane, 0.4);
683    }
684    
685    // gf Apr 07
686    Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane, Float_t margin){
687      
688    Double_t xt,yt,xl,xh,yl,yh;    Double_t xt,yt,xl,xh,yl,yh;
689        
690    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 714  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
714      yh =  33.0/2. ;      yh =  33.0/2. ;
715      if ((yt>yl)&&(yt<yh)) {      if ((yt>yl)&&(yt<yh)) {
716        for (Int_t i1=0; i1<8;i1++){        for (Int_t i1=0; i1<8;i1++){
717          xl = tof11_x[i1] - (5.1-0.4)/2. ;          xl = tof11_x[i1] - (5.1-margin)/2. ;
718          xh = tof11_x[i1] + (5.1-0.4)/2. ;          xh = tof11_x[i1] + (5.1-margin)/2. ;
719          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;
720        }        }
721      }      }
# Line 559  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 732  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
732            
733      if ((xt>xl)&&(xt<xh)) {      if ((xt>xl)&&(xt<xh)) {
734        for (Int_t i1=0; i1<6;i1++){        for (Int_t i1=0; i1<6;i1++){
735          yl = tof12_y[i1] - (5.5-0.4)/2. ;          yl = tof12_y[i1] - (5.5-margin)/2. ;
736          yh = tof12_y[i1] + (5.5-0.4)/2. ;          yh = tof12_y[i1] + (5.5-margin)/2. ;
737          if ((yt>yl)&&(yt<yh))  paddleidoftrack=i1;          if ((yt>yl)&&(yt<yh))  paddleidoftrack=i1;
738        }        }
739      }      }
# Line 577  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 750  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
750            
751      if ((xt>xl)&&(xt<xh)) {      if ((xt>xl)&&(xt<xh)) {
752        for (Int_t i1=0; i1<2;i1++){        for (Int_t i1=0; i1<2;i1++){
753          yl = tof21_y[i1] - (7.5-0.4)/2. ;          yl = tof21_y[i1] - (7.5-margin)/2. ;
754          yh = tof21_y[i1] + (7.5-0.4)/2. ;          yh = tof21_y[i1] + (7.5-margin)/2. ;
755          if ((yt>yl)&&(yt<yh))  paddleidoftrack=i1;          if ((yt>yl)&&(yt<yh))  paddleidoftrack=i1;
756        }        }
757      }      }
# Line 594  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 767  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
767            
768      if ((yt>yl)&&(yt<yh)) {      if ((yt>yl)&&(yt<yh)) {
769        for (Int_t i1=0; i1<2;i1++){        for (Int_t i1=0; i1<2;i1++){
770          xl = tof22_x[i1] - (9.0-0.4)/2. ;          xl = tof22_x[i1] - (9.0-margin)/2. ;
771          xh = tof22_x[i1] + (9.0-0.4)/2. ;          xh = tof22_x[i1] + (9.0-margin)/2. ;
772          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;
773        }        }
774      }      }
# Line 611  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 784  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
784            
785      if ((yt>yl)&&(yt<yh)) {      if ((yt>yl)&&(yt<yh)) {
786        for (Int_t i1=0; i1<3;i1++){        for (Int_t i1=0; i1<3;i1++){
787          xl = tof31_x[i1] - (6.0-0.4)/2. ;          xl = tof31_x[i1] - (6.0-margin)/2. ;
788          xh = tof31_x[i1] + (6.0-0.4)/2. ;          xh = tof31_x[i1] + (6.0-margin)/2. ;
789          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;          if ((xt>xl)&&(xt<xh))  paddleidoftrack=i1;
790        }        }
791      }      }
# Line 628  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa Line 801  Int_t ToFLevel2::GetPaddleIdOfTrack(Floa
801            
802      if ((xt>xl)&&(xt<xh)) {      if ((xt>xl)&&(xt<xh)) {
803        for (Int_t i1=0; i1<3;i1++){        for (Int_t i1=0; i1<3;i1++){
804          yl = tof32_y[i1] - (5.0-0.4)/2. ;          yl = tof32_y[i1] - (5.0-margin)/2. ;
805          yh = tof32_y[i1] + (5.0-0.4)/2. ;          yh = tof32_y[i1] + (5.0-margin)/2. ;
806          if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;          if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
807        }        }
808      }      }
# Line 696  void ToFLevel2::GetPMTPaddle(Int_t pmt_i Line 869  void ToFLevel2::GetPMTPaddle(Int_t pmt_i
869  // gf Apr 07  // gf Apr 07
870    
871  void ToFLevel2::GetPaddlePMT(Int_t paddle, Int_t &pmtleft, Int_t &pmtright){  void ToFLevel2::GetPaddlePMT(Int_t paddle, Int_t &pmtleft, Int_t &pmtright){
872      pmtleft=paddle*2;
873    if(paddle==0){    pmtright= pmtleft+1;  
     pmtleft=0;  
     pmtright=1;  
   }  
   
   if(paddle==1){  
     pmtleft=2;  
     pmtright=3;  
   }  
   
   if(paddle==2){  
     pmtleft=4;  
     pmtright=5;  
   }  
   
   if(paddle==3){  
     pmtleft=6;  
     pmtright=7;  
   }  
   
   if(paddle==4){  
     pmtleft=8;  
     pmtright=9;  
   }  
   
   if(paddle==5){  
     pmtleft=10;  
     pmtright=11;  
   }  
   
   if(paddle==6){  
     pmtleft=12;  
     pmtright=13;  
   }  
   
   if(paddle==7){  
     pmtleft=14;  
     pmtright=15;  
   }  
   
   if(paddle==8){  
     pmtleft=16;  
     pmtright=17;  
   }  
   
   if(paddle==9){  
     pmtleft=18;  
     pmtright=19;  
   }  
   
   if(paddle==10){  
     pmtleft=20;  
     pmtright=21;  
   }  
   
   if(paddle==11){  
     pmtleft=22;  
     pmtright=23;  
   }  
   
   if(paddle==12){  
     pmtleft=24;  
     pmtright=25;  
   }  
   
   if(paddle==13){  
     pmtleft=26;  
     pmtright=27;  
   }  
   
   if(paddle==14){  
     pmtleft=28;  
     pmtright=29;  
   }  
   
   if(paddle==15){  
     pmtleft=30;  
     pmtright=31;  
   }  
   
   if(paddle==16){  
     pmtleft=32;  
     pmtright=33;  
   }  
   
   if(paddle==17){  
     pmtleft=34;  
     pmtright=35;  
   }  
   
   if(paddle==18){  
     pmtleft=36;  
     pmtright=37;  
   }  
   
   if(paddle==19){  
     pmtleft=38;  
     pmtright=39;  
   }  
   
   if(paddle==20){  
     pmtleft=40;  
     pmtright=41;  
   }  
   
   if(paddle==21){  
     pmtleft=42;  
     pmtright=43;  
   }  
   
   if(paddle==22){  
     pmtleft=44;  
     pmtright=45;  
   }  
   
   if(paddle==23){  
     pmtleft=46;  
     pmtright=47;  
   }  
     
874    return;    return;
875  }  }
876    
# Line 930  void ToFLevel2::GetPaddleGeometry(Int_t Line 984  void ToFLevel2::GetPaddleGeometry(Int_t
984   */   */
985  Int_t ToFLevel2::GetPaddleid(Int_t plane, Int_t paddle)  Int_t ToFLevel2::GetPaddleid(Int_t plane, Int_t paddle)
986  {  {
   
987    Int_t padid=-1;    Int_t padid=-1;
988    Int_t pads11=8;    Int_t pads[6]={8,6,2,2,3,3};
   Int_t pads12=6;  
   Int_t pads21=2;  
   Int_t pads22=2;  
   Int_t pads31=3;  
   //  Int_t pads32=3;  
   
   
   if(plane == 0){  
     padid=paddle;  
   }  
   
   if(plane == 1){  
     padid=pads11+paddle;  
   }  
   
   if(plane == 2){  
     padid=pads11+pads12+paddle;  
   }  
   
   if(plane == 3){  
     padid=pads11+pads12+pads21+paddle;  
   }  
   
   if(plane == 4){  
     padid=pads11+pads12+pads21+pads22+paddle;  
   }  
989    
990    if(plane == 5){    int somma=0;
991      padid=pads11+pads12+pads21+pads22+pads31+paddle;    int np=plane;
992      for(Int_t j=0; j<np; j++){
993        somma+=pads[j];
994    }    }
995      padid=paddle+somma;
996    return padid;    return padid;
997    
998  }  }
# Line 994  void ToFLevel2::GetPaddlePlane(Int_t pad Line 1023  void ToFLevel2::GetPaddlePlane(Int_t pad
1023      return;      return;
1024    }    }
1025    
1026    if(7<pad<14){    if((7<pad)&&(pad<14)){
1027      plane=1;      plane=1;
1028      paddle=pad-pads11;      paddle=pad-pads11;
1029      return;      return;
1030    }    }
1031        
1032    if(13<pad<16){    if((13<pad)&&(pad<16)){
1033      plane=2;      plane=2;
1034      paddle=pad-pads11-pads12;      paddle=pad-pads11-pads12;
1035      return;      return;
1036    }    }
1037    
1038    if(15<pad<18){    if((15<pad)&&(pad<18)){
1039      plane=3;      plane=3;
1040      paddle=pad-pads11-pads12-pads21;      paddle=pad-pads11-pads12-pads21;
1041      return;      return;
1042    }    }
1043    
1044    if(17<pad<21){    if((17<pad)&&(pad<21)){
1045      plane=4;      plane=4;
1046      paddle=pad-pads11-pads12-pads21-pads22;      paddle=pad-pads11-pads12-pads21-pads22;
1047      return;      return;
1048    }    }
1049    
1050    if(20<pad<24){    if((20<pad)&&(pad<24)){
1051      plane=5;      plane=5;
1052      paddle=pad-pads11-pads12-pads21-pads22-pads31;      paddle=pad-pads11-pads12-pads21-pads22-pads31;
1053      return;      return;
# Line 1049  Int_t ToFLevel2::GetNPaddle(Int_t plane) Line 1078  Int_t ToFLevel2::GetNPaddle(Int_t plane)
1078    
1079  }  }
1080    
 ////////////////////////////////////////////////////  
1081    
1082    
1083    /// wm feb 08
1084    
1085    /**
1086     * Method to calculate Beta from the 12 single measurements
1087     * we check the individual weights for artificial TDC values, then calculate
1088     * am mean beta for the first time. In a second step we loop again through
1089     * the single measurements, checking for the residual from the mean
1090     * The cut on the residual reject measurements > "x"-sigma. A chi2 value is
1091     * calculated, furthermore a "quality" value by adding the weights which
1092     * are finally used. If all measurements are taken, "quality" will be = 22.47.
1093     * A chi2 cut around 3-4 and a quality-cut > 20 is needed for clean beta
1094     * measurements like antiprotons etc.
1095     * The Level2 output is derived in the fortran routines using: 10.,10.,20.
1096     * @param notrack Track Number
1097     * @param cut on residual: difference between single measurement and mean
1098     * @param cut on "quality"
1099     * @param cut on chi2
1100     */
1101    
1102    Float_t ToFLevel2::CalcBeta(Int_t notrack, Float_t resmax, Float_t qualitycut, Float_t chi2cut){
1103    
1104    //  cout<<" in CalcBeta "<<resmax<<" "<<chi2cut<<" "<<qualitycut<<endl;
1105    
1106      Float_t bxx = 100.;
1107      //
1108      ToFTrkVar *trk = GetToFTrkVar(notrack);
1109      if(!trk) return 0; //ELENA
1110    
1111    
1112      Float_t chi2,xhelp,beta_mean;
1113      Float_t w_i[12],quality,sw,sxw,res,betachi,beta_mean_inv;
1114      Float_t b[12],tdcfl;
1115      Int_t  pmt_id,pmt_plane;
1116    
1117      for (Int_t i=0; i<12; i++){
1118        b[i] = trk->beta[i];
1119                                  }
1120          
1121    
1122    //========================================================================
1123    //---  Find out ToF layers with artificial TDC values & fill vector    ---
1124    //========================================================================
1125    
1126    Float_t  w_il[6];
1127    
1128         for (Int_t jj=0; jj<6;jj++) {
1129             w_il[jj] = 1000.;
1130                                     }
1131    
1132    
1133      for (Int_t i=0; i<trk->npmttdc; i++){
1134        //
1135        pmt_id = (trk->pmttdc).At(i);
1136        pmt_plane = GetPlaneIndex(pmt_id);
1137        tdcfl = (trk->tdcflag).At(i);
1138        if (w_il[pmt_plane] != 1.) w_il[pmt_plane] = tdcfl; //tdcflag
1139                                         };
1140      
1141    //========================================================================
1142    //---  Set weights for the 12 measurements using information for top and bottom:
1143    //---  if no measurements: weight = set to very high value=> not used
1144    //---  top or bottom artificial: weight*sqrt(2)
1145    //---  top and bottom artificial: weight*sqrt(2)*sqrt(2)
1146    //========================================================================
1147    
1148    Int_t itop[12] = {0,0,1,1,2,2,3,3,0,0,1,1};
1149    Int_t ibot[12] = {4,5,4,5,4,5,4,5,2,3,2,3};
1150    
1151         xhelp= 1E09;
1152      
1153         for (Int_t jj=0; jj<12;jj++) {
1154         if (jj<4)           xhelp = 0.11;    // S1-S3
1155         if ((jj>3)&&(jj<8)) xhelp = 0.18;    // S2-S3
1156         if (jj>7)           xhelp = 0.28;    // S1-S2
1157         if ((w_il[itop[jj]] == 1000.) && (w_il[ibot[jj]] == 1000.)) xhelp = 1E09;
1158         if ((w_il[itop[jj]] == 1) || (w_il[ibot[jj]] == 1.)) xhelp = xhelp*1.414 ;
1159         if ((w_il[itop[jj]] == 1) && (w_il[ibot[jj]] == 1.)) xhelp = xhelp*2. ;
1160    
1161         w_i[jj] = 1./xhelp;
1162                                      }
1163    
1164    
1165    //========================================================================
1166    //--- Calculate mean beta for the first time -----------------------------
1167    //--- We are using "1/beta" since its error is gaussian ------------------
1168    //========================================================================
1169    
1170          Int_t icount=0;
1171          sw=0.;
1172          sxw=0.;
1173          beta_mean=100.;
1174    
1175              for (Int_t jj=0; jj<12;jj++){
1176            if ((fabs(1./b[jj])>0.1)&&(fabs(1./b[jj])<15.))
1177             {
1178                icount= icount+1;
1179                sxw=sxw + (1./b[jj])*w_i[jj]*w_i[jj] ;
1180                sw =sw + w_i[jj]*w_i[jj] ;
1181    
1182             }
1183             }
1184    
1185          if (icount>0) beta_mean=1./(sxw/sw);
1186          beta_mean_inv = 1./beta_mean;
1187    
1188    //========================================================================
1189    //--- Calculate beta for the second time, use residuals of the single
1190    //--- measurements to get a chi2 value
1191    //========================================================================
1192    
1193          icount=0;
1194          sw=0.;
1195          sxw=0.;
1196          betachi = 100.;
1197          chi2 = 0.;
1198          quality=0.;
1199    
1200    
1201              for (Int_t jj=0; jj<12;jj++){
1202           if ((fabs(1./b[jj])>0.1)&&(fabs(1./b[jj])<15.)&&(w_i[jj]>0.01)) {
1203                res = beta_mean_inv - (1./b[jj]) ;
1204                if (fabs(res*w_i[jj])<resmax)          {;
1205                chi2 = chi2 + pow((res*w_i[jj]),2) ;
1206                icount= icount+1;
1207                sxw=sxw + (1./b[jj])*w_i[jj]*w_i[jj] ;
1208                sw =sw + w_i[jj]*w_i[jj] ;
1209                                                   }
1210                                                                            }
1211                                          }
1212          quality = sqrt(sw) ;
1213    
1214          if (icount==0) chi2 = 1000.;
1215          if (icount>0) chi2 = chi2/(icount) ;
1216          if (icount>0) betachi=1./(sxw/sw);
1217    
1218       bxx = 100.;
1219       if ((chi2 < chi2cut)&&(quality>qualitycut)) bxx = betachi;
1220      //
1221      return(bxx);
1222    };
1223    
1224    
1225    ////////////////////////////////////////////////////
1226    ////////////////////////////////////////////////////
1227    
1228    
1229  /**  /**
1230   * 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).
# Line 1099  void ToFLevel2::GetLevel2Struct(cToFLeve Line 1272  void ToFLevel2::GetLevel2Struct(cToFLeve
1272        }        }
1273    } //ELENA    } //ELENA
1274  }  }
1275    
1276    
1277    //
1278    // Reprocessing tool // Emiliano 08/04/07
1279    //
1280    Int_t ToFLevel2::Process(TrkLevel2 *trk, TrigLevel2 *trg, GL_RUN *run, OrbitalInfo *orb, Bool_t force){
1281      //
1282      // Copiare qui qualcosa di simile a calonuclei per evitare di riprocessare sempre tutto
1283      //
1284      printf("\n\n\n ERROR: NOT IMPLEMENTED ANYMORE, write Emiliano if you need this method (Emiliano.Mocchiutti@ts.infn.it) \n\n\n");
1285      return(-1);
1286      //   //
1287      //   // structures to communicate with F77
1288      //   //
1289      //   extern struct ToFInput  tofinput_;
1290    //   extern struct ToFOutput tofoutput_;
1291    //   //
1292    //   // DB connection
1293    //   //
1294    //   TString host;
1295    //   TString user;
1296    //   TString psw;
1297    //   const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
1298    //   const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
1299    //   const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
1300    //   if ( !pamdbhost ) pamdbhost = "";
1301    //   if ( !pamdbuser ) pamdbuser = "";
1302    //   if ( !pamdbpsw ) pamdbpsw = "";
1303    //   if ( strcmp(pamdbhost,"") ) host = pamdbhost;
1304    //   if ( strcmp(pamdbuser,"") ) user = pamdbuser;
1305    //   if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
1306    //   //
1307    //   //
1308    //   TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
1309    //   if ( !dbc->IsConnected() ) return 1;
1310    //   stringstream myquery;
1311    //   myquery.str("");
1312    //   myquery << "SET time_zone='+0:00'";
1313    //   dbc->Query(myquery.str().c_str());
1314    //   GL_PARAM *glparam = new GL_PARAM();
1315    //   glparam->Query_GL_PARAM(1,1,dbc); // parameters stored in DB in GL_PRAM table
1316    //   trk->LoadField(glparam->PATH+glparam->NAME);
1317    //   //
1318    //   Bool_t defcal = true;
1319    //   Int_t error=glparam->Query_GL_PARAM(run->RUNHEADER_TIME,201,dbc); // parameters stored in DB in GL_PRAM table
1320    //   if ( error<0 ) {
1321    //     return(1);
1322    //   };
1323    //   printf(" Reading ToF parameter file: %s \n",(glparam->PATH+glparam->NAME).Data());
1324    //   if ( (UInt_t)glparam->TO_TIME != (UInt_t)4294967295UL ) defcal = false;
1325    //   //
1326    //   Int_t nlen = (Int_t)(glparam->PATH+glparam->NAME).Length();
1327    //   rdtofcal((char *)(glparam->PATH+glparam->NAME).Data(),&nlen);
1328    //   //
1329    //   Int_t adc[4][12];
1330    //   Int_t tdc[4][12];
1331    //   Float_t tdcc[4][12];
1332    //   //
1333    //   // process tof data
1334    //   //
1335    //   for (Int_t hh=0; hh<12;hh++){
1336    //     for (Int_t kk=0; kk<4;kk++){
1337    //            adc[kk][hh] = 4095;
1338    //            tdc[kk][hh] = 4095;
1339    //            tdcc[kk][hh] = 4095.;
1340    //            tofinput_.adc[hh][kk] = 4095;
1341    //            tofinput_.tdc[hh][kk] = 4095;
1342    //     };
1343    //   };
1344    //   Int_t ntrkentry = 0;
1345    //   Int_t npmtentry = 0;
1346    //   Int_t gg = 0;
1347    //   Int_t hh = 0;
1348    //   Int_t adcf[48];
1349    //   memset(adcf, 0, 48*sizeof(Int_t));
1350    //   Int_t tdcf[48];
1351    //   memset(tdcf, 0, 48*sizeof(Int_t));
1352    //   for (Int_t pm=0; pm < this->ntrk() ; pm++){
1353    //      ToFTrkVar *ttf = this->GetToFTrkVar(pm);
1354    //      for ( Int_t nc=0; nc < ttf->npmttdc; nc++){
1355    //             if ( (ttf->tdcflag).At(nc) != 0 ) tdcf[(ttf->pmttdc).At(nc)] = 1;
1356    //      };
1357    //      for ( Int_t nc=0; nc < ttf->npmtadc; nc++){
1358    //             if ( (ttf->adcflag).At(nc) != 0 ) adcf[(ttf->pmtadc).At(nc)] = 1;
1359    //      };
1360    //   };
1361    //   //
1362    //   for (Int_t pm=0; pm < this->npmt() ; pm++){
1363    //      ToFPMT *pmt = this->GetToFPMT(pm);
1364    //      this->GetPMTIndex(pmt->pmt_id, gg, hh);
1365    //      if ( adcf[pmt->pmt_id] == 0 ){
1366    //              tofinput_.adc[gg][hh] = (int)pmt->adc;
1367    //              adc[hh][gg] = (int)pmt->adc;
1368    //      };
1369    //      if ( tdcf[pmt->pmt_id] == 0 ){
1370    //              tofinput_.tdc[gg][hh] = (int)pmt->tdc;
1371    //              tdc[hh][gg] = (int)pmt->tdc;
1372    //      };
1373    //      tdcc[hh][gg] = (float)pmt->tdc_tw;
1374    //      // Int_t pppid = this->GetPMTid(hh,gg);
1375    //      //      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);
1376    //   };
1377    //   //
1378    //   Int_t unpackError = this->unpackError;
1379    //   //
1380    //   for (Int_t hh=0; hh<5;hh++){
1381    //      tofinput_.patterntrig[hh]=trg->patterntrig[hh];
1382    //   };
1383    //   //
1384    //   this->Clear();
1385    //   //
1386    //       Int_t pmt_id = 0;
1387    //       ToFPMT *t_pmt = new ToFPMT();
1388    //       if(!(this->PMT)) this->PMT = new TClonesArray("ToFPMT",12); //ELENA
1389    //       TClonesArray &tpmt = *this->PMT;
1390    //       ToFTrkVar *t_tof = new ToFTrkVar();
1391    //       if(!(this->ToFTrk)) this->ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
1392    //       TClonesArray &t = *this->ToFTrk;
1393    //       //
1394    //       //
1395    //       // Here we have calibrated data, ready to be passed to the FORTRAN routine which will extract common and track-related  variables.
1396    //       //
1397    //       npmtentry = 0;
1398    //       //
1399    //       ntrkentry = 0;
1400    //       //
1401    //       // Calculate tracks informations from ToF alone
1402    //       //
1403    //       tofl2com();
1404    //       //
1405    //       memcpy(this->tof_j_flag,tofoutput_.tof_j_flag,6*sizeof(Int_t));
1406    //       //
1407    //       t_tof->trkseqno = -1;
1408    //       //
1409    //       // and now we must copy from the output structure to the level2 class:
1410    //       //
1411    //       t_tof->npmttdc = 0;
1412    //       //
1413    //       for (Int_t hh=0; hh<12;hh++){
1414    //         for (Int_t kk=0; kk<4;kk++){
1415    //           if ( tofoutput_.tofmask[hh][kk] != 0 ){
1416    //             pmt_id = this->GetPMTid(kk,hh);
1417    //             t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc);
1418    //             t_tof->tdcflag.AddAt(tofoutput_.tdcflagtof[hh][kk],t_tof->npmttdc); // gf: Jan 09/07
1419    //             t_tof->npmttdc++;
1420    //           };
1421    //         };
1422    //       };
1423    //       for (Int_t kk=0; kk<13;kk++){
1424    //         t_tof->beta[kk] = tofoutput_.betatof_a[kk];
1425    //       }
1426    //       //
1427    //       t_tof->npmtadc = 0;
1428    //       for (Int_t hh=0; hh<12;hh++){
1429    //         for (Int_t kk=0; kk<4;kk++){
1430    //           if ( tofoutput_.adctof_c[hh][kk] < 1000 ){
1431    //             t_tof->dedx.AddAt(tofoutput_.adctof_c[hh][kk],t_tof->npmtadc);
1432    //             pmt_id = this->GetPMTid(kk,hh);
1433    //             t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc);
1434    //             t_tof->adcflag.AddAt(tofoutput_.adcflagtof[hh][kk],t_tof->npmtadc); // gf: Jan 09/07
1435    //             t_tof->npmtadc++;
1436    //           };
1437    //         };
1438    //       };
1439    //       //
1440    //       memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos));
1441    //       memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos));
1442    //       memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof));
1443    //       memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof));
1444    //       //
1445    //       new(t[ntrkentry]) ToFTrkVar(*t_tof);
1446    //       ntrkentry++;
1447    //       t_tof->Clear();
1448    //       //
1449    //       //
1450    //       //
1451    //       t_pmt->Clear();
1452    //       //
1453    //       for (Int_t hh=0; hh<12;hh++){
1454    //         for (Int_t kk=0; kk<4;kk++){
1455    //          // new WM
1456    //           if ( tofoutput_.tdc_c[hh][kk] < 4095 || adc[kk][hh] < 4095  || tdc[kk][hh] < 4095 ){
1457    // //          if ( tdcc[kk][hh] < 4095. || adc[kk][hh] < 4095  || tdc[kk][hh] < 4095 ){
1458    //             //
1459    //             t_pmt->pmt_id = this->GetPMTid(kk,hh);
1460    //             t_pmt->tdc_tw = tofoutput_.tdc_c[hh][kk];
1461    //             t_pmt->adc = (Float_t)adc[kk][hh];
1462    //             t_pmt->tdc = (Float_t)tdc[kk][hh];
1463    //             //
1464    //             new(tpmt[npmtentry]) ToFPMT(*t_pmt);
1465    //             npmtentry++;
1466    //             t_pmt->Clear();
1467    //           };
1468    //         };
1469    //       };
1470    //       //
1471    //       // Calculate track-related variables
1472    //       //
1473    //       if ( trk->ntrk() > 0 ){
1474    //         //
1475    //         // We have at least one track
1476    //         //
1477    //         //
1478    //         // Run over tracks
1479    //         //
1480    //         for(Int_t nt=0; nt < trk->ntrk(); nt++){
1481    //           //
1482    //           TrkTrack *ptt = trk->GetStoredTrack(nt);
1483    //           //
1484    //           // Copy the alpha vector in the input structure
1485    //           //
1486    //           for (Int_t e = 0; e < 5 ; e++){
1487    //             tofinput_.al_pp[e] = ptt->al[e];
1488    //           };
1489    //           //
1490    //           // Get tracker related variables for this track
1491    //           //
1492    //           toftrk();
1493    //           //
1494    //           // Copy values in the class from the structure (we need to use a temporary class to store variables).
1495    //           //
1496    //           t_tof->npmttdc = 0;
1497    //           for (Int_t hh=0; hh<12;hh++){
1498    //             for (Int_t kk=0; kk<4;kk++){
1499    //               if ( tofoutput_.tofmask[hh][kk] != 0 ){
1500    //                 pmt_id = this->GetPMTid(kk,hh);
1501    //                 t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc);
1502    //                 t_tof->tdcflag.AddAt(tofoutput_.tdcflag[hh][kk],t_tof->npmttdc); // gf: Jan 09/07
1503    //                 t_tof->npmttdc++;
1504    //               };
1505    //             };
1506    //           };
1507    //           for (Int_t kk=0; kk<13;kk++){
1508    //             t_tof->beta[kk] = tofoutput_.beta_a[kk];
1509    //           };
1510    //           //
1511    //           t_tof->npmtadc = 0;
1512    //           for (Int_t hh=0; hh<12;hh++){
1513    //             for (Int_t kk=0; kk<4;kk++){
1514    //               if ( tofoutput_.adc_c[hh][kk] < 1000 ){
1515    //                 t_tof->dedx.AddAt(tofoutput_.adc_c[hh][kk],t_tof->npmtadc);
1516    //                 pmt_id = this->GetPMTid(kk,hh);
1517    //                 t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc);
1518    //                 t_tof->adcflag.AddAt(tofoutput_.adcflag[hh][kk],t_tof->npmtadc); // gf: Jan 09/07
1519    //                 t_tof->npmtadc++;
1520    //               };
1521    //             };
1522    //           };
1523    //           //
1524    //           memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos));
1525    //           memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos));
1526    //           memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof));
1527    //           memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof));
1528    //           //
1529    //           // Store the tracker track number in order to be sure to have shyncronized data during analysis
1530    //           //
1531    //           t_tof->trkseqno = nt;
1532    //           //
1533    //           // create a new object for this event with track-related variables
1534    //           //
1535    //           new(t[ntrkentry]) ToFTrkVar(*t_tof);
1536    //           ntrkentry++;
1537    //           t_tof->Clear();
1538    //           //
1539    //         }; // loop on all the tracks
1540    //       //
1541    //       this->unpackError = unpackError;
1542    //       if ( defcal ){
1543    //         this->default_calib = 1;
1544    //       } else {
1545    //         this->default_calib = 0;
1546    //       };
1547    //};
1548    //  return(0);
1549    }
1550    
1551    bool ToFLevel2::bit(int decimal, char pos){
1552      return( (decimal>>pos)%2 );
1553    }
1554    
1555    bool ToFLevel2::checkPMT(TString givenpmt){
1556      TClonesArray* Pmt = this->PMT;
1557      //  printf(" ou %s entries %i \n",givenpmt.Data(),Pmt->GetEntries());
1558      for(int i=0; i<Pmt->GetEntries(); i++) {  
1559        ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1560        TString pmtname = this->GetPMTName(pmthit->pmt_id);
1561        //    printf(" name %s \n",pmtname.Data());
1562        if ( !strcmp(pmtname.Data(),givenpmt.Data()) )
1563          return true;
1564      }
1565      //  printf(" PMT %s missing \n",givenpmt.Data());
1566      return false;
1567    }
1568    
1569    bool ToFLevel2::checkPMTpatternPMThit(TrigLevel2 *trg, int &pmtpattern, int &pmtnosignal){
1570      UInt_t *patterntrig = trg->patterntrig;
1571      pmtpattern = 0;
1572      pmtnosignal = 0;
1573      bool good = true;
1574      //S3
1575      if ( this->bit(patterntrig[2],0) ){ pmtpattern++;  if ( !this->checkPMT("S31_1A")){ pmtnosignal++; good = false;}}
1576      if ( this->bit(patterntrig[2],1) ){ pmtpattern++;  if ( !this->checkPMT("S31_2A")){ pmtnosignal++; good = false;}}
1577      if ( this->bit(patterntrig[2],2) ){ pmtpattern++;  if ( !this->checkPMT("S31_3A")){ pmtnosignal++; good = false;}}
1578      if ( this->bit(patterntrig[2],3) ){ pmtpattern++;  if ( !this->checkPMT("S31_1B")){ pmtnosignal++; good = false;}}
1579      if ( this->bit(patterntrig[2],4) ){ pmtpattern++;  if ( !this->checkPMT("S31_2B")){ pmtnosignal++; good = false;}}
1580      if ( this->bit(patterntrig[2],5) ){ pmtpattern++;  if ( !this->checkPMT("S31_3B")){ pmtnosignal++; good = false;}}      
1581      if ( this->bit(patterntrig[2],6) ){ pmtpattern++;  if ( !this->checkPMT("S32_1A")){ pmtnosignal++; good = false;}}
1582      if ( this->bit(patterntrig[2],7) ){ pmtpattern++;  if ( !this->checkPMT("S32_2A")){ pmtnosignal++; good = false;}}
1583      if ( this->bit(patterntrig[2],8) ){ pmtpattern++;  if ( !this->checkPMT("S32_3A")){ pmtnosignal++; good = false;}}
1584      if ( this->bit(patterntrig[2],9) ){ pmtpattern++;  if ( !this->checkPMT("S32_1B")){ pmtnosignal++; good = false;}}
1585      if ( this->bit(patterntrig[2],10) ){ pmtpattern++;  if ( !this->checkPMT("S32_2B")){ pmtnosignal++; good = false;}}
1586      if ( this->bit(patterntrig[2],11) ){ pmtpattern++;  if ( !this->checkPMT("S32_3B")){ pmtnosignal++; good = false;}}      
1587      //S2
1588      if ( this->bit(patterntrig[3],0) ){ pmtpattern++;  if ( !this->checkPMT("S21_1A")){ pmtnosignal++; good = false;}}
1589      if ( this->bit(patterntrig[3],1) ){ pmtpattern++;  if ( !this->checkPMT("S21_2A")){ pmtnosignal++; good = false;}}
1590      if ( this->bit(patterntrig[3],2) ){ pmtpattern++;  if ( !this->checkPMT("S21_1B")){ pmtnosignal++; good = false;}}
1591      if ( this->bit(patterntrig[3],3) ){ pmtpattern++;  if ( !this->checkPMT("S21_2B")){ pmtnosignal++; good = false;}}      
1592      if ( this->bit(patterntrig[3],4) ){ pmtpattern++;  if ( !this->checkPMT("S22_1A")){ pmtnosignal++; good = false;}}
1593      if ( this->bit(patterntrig[3],5) ){ pmtpattern++;  if ( !this->checkPMT("S22_2A")){ pmtnosignal++; good = false;}}
1594      if ( this->bit(patterntrig[3],6) ){ pmtpattern++;  if ( !this->checkPMT("S22_1B")){ pmtnosignal++; good = false;}}
1595      if ( this->bit(patterntrig[3],7) ){ pmtpattern++;  if ( !this->checkPMT("S22_2B")){ pmtnosignal++; good = false;}}      
1596      //S12
1597      if ( this->bit(patterntrig[4],0) ){ pmtpattern++;  if ( !this->checkPMT("S12_1A")){ pmtnosignal++; good = false;}}
1598      if ( this->bit(patterntrig[4],1) ){ pmtpattern++;  if ( !this->checkPMT("S12_2A")){ pmtnosignal++; good = false;}}
1599      if ( this->bit(patterntrig[4],2) ){ pmtpattern++;  if ( !this->checkPMT("S12_3A")){ pmtnosignal++; good = false;}}
1600      if ( this->bit(patterntrig[4],3) ){ pmtpattern++;  if ( !this->checkPMT("S12_4A")){ pmtnosignal++; good = false;}}
1601      if ( this->bit(patterntrig[4],4) ){ pmtpattern++;  if ( !this->checkPMT("S12_5A")){ pmtnosignal++; good = false;}}
1602      if ( this->bit(patterntrig[4],5) ){ pmtpattern++;  if ( !this->checkPMT("S12_6A")){ pmtnosignal++; good = false;}}      
1603      if ( this->bit(patterntrig[4],6) ){ pmtpattern++;  if ( !this->checkPMT("S12_1A")){ pmtnosignal++; good = false;}}
1604      if ( this->bit(patterntrig[4],7) ){ pmtpattern++;  if ( !this->checkPMT("S12_2A")){ pmtnosignal++; good = false;}}
1605      if ( this->bit(patterntrig[4],8) ){ pmtpattern++;  if ( !this->checkPMT("S12_3A")){ pmtnosignal++; good = false;}}
1606      if ( this->bit(patterntrig[4],9) ){ pmtpattern++;  if ( !this->checkPMT("S12_4B")){ pmtnosignal++; good = false;}}
1607      if ( this->bit(patterntrig[4],10) ){ pmtpattern++; if ( !this->checkPMT("S12_5B")){ pmtnosignal++; good = false;}}
1608      if ( this->bit(patterntrig[4],11) ){ pmtpattern++; if ( !this->checkPMT("S12_6B")){ pmtnosignal++; good = false;}}      
1609      //S11
1610      if ( this->bit(patterntrig[5],0) ){ pmtpattern++;  if ( !this->checkPMT("S11_1A")){ pmtnosignal++; good = false;}}
1611      if ( this->bit(patterntrig[5],1) ){ pmtpattern++;  if ( !this->checkPMT("S11_2A")){ pmtnosignal++; good = false;}}
1612      if ( this->bit(patterntrig[5],2) ){ pmtpattern++;  if ( !this->checkPMT("S11_3A")){ pmtnosignal++; good = false;}}
1613      if ( this->bit(patterntrig[5],3) ){ pmtpattern++;  if ( !this->checkPMT("S11_4A")){ pmtnosignal++; good = false;}}
1614      if ( this->bit(patterntrig[5],4) ){ pmtpattern++;  if ( !this->checkPMT("S11_5A")){ pmtnosignal++; good = false;}}
1615      if ( this->bit(patterntrig[5],5) ){ pmtpattern++;  if ( !this->checkPMT("S11_6A")){ pmtnosignal++; good = false;}}
1616      if ( this->bit(patterntrig[5],6) ){ pmtpattern++;  if ( !this->checkPMT("S11_7A")){ pmtnosignal++; good = false;}}
1617      if ( this->bit(patterntrig[5],7) ){ pmtpattern++;  if ( !this->checkPMT("S11_8A")){ pmtnosignal++; good = false;}}      
1618      if ( this->bit(patterntrig[5],8) ){ pmtpattern++;  if ( !this->checkPMT("S11_1B")){ pmtnosignal++; good = false;}}
1619      if ( this->bit(patterntrig[5],9) ){ pmtpattern++;  if ( !this->checkPMT("S11_2B")){ pmtnosignal++; good = false;}}
1620      if ( this->bit(patterntrig[5],10) ){ pmtpattern++; if ( !this->checkPMT("S11_3B")){ pmtnosignal++; good = false;}}
1621      if ( this->bit(patterntrig[5],11) ){ pmtpattern++; if ( !this->checkPMT("S11_4B")){ pmtnosignal++; good = false;}}
1622      if ( this->bit(patterntrig[5],12) ){ pmtpattern++; if ( !this->checkPMT("S11_5B")){ pmtnosignal++; good = false;}}
1623      if ( this->bit(patterntrig[5],13) ){ pmtpattern++; if ( !this->checkPMT("S11_6B")){ pmtnosignal++; good = false;}}
1624      if ( this->bit(patterntrig[5],14) ){ pmtpattern++; if ( !this->checkPMT("S11_7B")){ pmtnosignal++; good = false;}}
1625      if ( this->bit(patterntrig[5],15) ){ pmtpattern++; if ( !this->checkPMT("S11_8B")){ pmtnosignal++; good = false;}}
1626    
1627      return good;
1628    }
1629    
1630    bool ToFLevel2::checkPMTpmttrig(TrigLevel2 *trg){
1631      //  UInt_t *patterntrig = trg->patterntrig;
1632      int rS11 = 0;
1633      int rS12 = 0;
1634      int rS21 = 0;
1635      int rS22 = 0;
1636      int rS31 = 0;
1637      int rS32 = 0;
1638    
1639      // trigger configuration for the event from saved pmts
1640      TClonesArray* Pmt = this->PMT;
1641      for(int i=0; i<Pmt->GetEntries(); i++) {  
1642        ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1643        TString pmtname = this->GetPMTName(pmthit->pmt_id);
1644        if ( pmtname.Contains("S11") ) rS11++;
1645        if ( pmtname.Contains("S12") ) rS12++;
1646        if ( pmtname.Contains("S21") ) rS21++;
1647        if ( pmtname.Contains("S22") ) rS22++;
1648        if ( pmtname.Contains("S31") ) rS31++;
1649        if ( pmtname.Contains("S32") ) rS32++;
1650      }
1651      int rTOF1 = (rS11 + rS12) * (rS21 + rS22) * (rS31 + rS32);
1652      int rTOF2 = (rS11 * rS12) * (rS21 * rS22) * (rS31 * rS32);
1653    
1654      int rTOF3 = (rS21 + rS22) * (rS31 + rS32);
1655      int rTOF4 = (rS21 * rS22) * (rS31 * rS32);
1656    
1657      int rTOF5 = rS12 * (rS21 * rS22);
1658    
1659      int rTOF6 = (rS11 + rS12) * (rS31 + rS32);
1660      int rTOF7 = (rS11 * rS12) * (rS31 * rS32);
1661    
1662    
1663      // trigger configuration of the run
1664      bool TCTOF1 = false;
1665      bool TCTOF2 = false;
1666      bool TCTOF3 = false;
1667      bool TCTOF4 = false;
1668      bool TCTOF5 = false;
1669      bool TCTOF6 = false;
1670      bool TCTOF7 = false;
1671      if ( trg->trigconf & (1<<0) ) TCTOF1 = true;
1672      if ( trg->trigconf & (1<<1) ) TCTOF2 = true;
1673      if ( trg->trigconf & (1<<2) ) TCTOF3 = true;
1674      if ( trg->trigconf & (1<<3) ) TCTOF4 = true;
1675      if ( trg->trigconf & (1<<4) ) TCTOF5 = true;
1676      if ( trg->trigconf & (1<<5) ) TCTOF6 = true;
1677      if ( trg->trigconf & (1<<6) ) TCTOF7 = true;
1678    
1679      // do patterntrig pmts match the trigger configuration?
1680      bool pmtsconf_trigconf_match = true;
1681      if ( rTOF1 == 0 && TCTOF1 ) pmtsconf_trigconf_match = false;
1682      if ( rTOF2 == 0 && TCTOF2 ) pmtsconf_trigconf_match = false;
1683      if ( rTOF3 == 0 && TCTOF3 ) pmtsconf_trigconf_match = false;
1684      if ( rTOF4 == 0 && TCTOF4 ) pmtsconf_trigconf_match = false;
1685      if ( rTOF5 == 0 && TCTOF5 ) pmtsconf_trigconf_match = false;
1686      if ( rTOF6 == 0 && TCTOF6 ) pmtsconf_trigconf_match = false;
1687      if ( rTOF7 == 0 && TCTOF7 ) pmtsconf_trigconf_match = false;
1688    
1689      return pmtsconf_trigconf_match;
1690    }
1691    
1692    void ToFLevel2::printPMT(){
1693      TClonesArray* Pmt = this->PMT;
1694      for(int i=0; i<Pmt->GetEntries(); i++) {  
1695        ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1696        TString pmtname = this->GetPMTName(pmthit->pmt_id);
1697        printf(" PMT hit: %s \n",pmtname.Data());
1698      }
1699    }
1700    
1701    
1702    ToFdEdx::ToFdEdx()
1703    {
1704      memset(conn,0,12*sizeof(Bool_t));
1705      memset(ts,0,12*sizeof(UInt_t));
1706      memset(te,0,12*sizeof(UInt_t));
1707      eDEDXpmt = new TArrayF(48);
1708      Define_PMTsat();
1709      Clear();
1710    }
1711    
1712    ToFdEdx::~ToFdEdx(){
1713      Clear();
1714      Delete();
1715    }
1716    
1717    void ToFdEdx::Delete(Option_t *option){
1718      if ( eDEDXpmt ){
1719        eDEDXpmt->Set(0);
1720        if ( eDEDXpmt) delete eDEDXpmt;
1721      }
1722    }
1723    
1724    //------------------------------------------------------------------------
1725    void ToFdEdx::CheckConnectors(UInt_t atime, GL_PARAM *glparam, TSQLServer *dbc)
1726    {
1727      for(int i=0; i<12; i++){
1728        if(atime<=ts[i] || atime>te[i]){
1729          Int_t error=glparam->Query_GL_PARAM(atime,210+i,dbc); // parameters stored in DB in GL_PRAM table
1730          if ( error<0 ) {
1731            conn[i]=false;
1732            ts[i]=0;
1733            te[i]=numeric_limits<UInt_t>::max();
1734          };
1735          if ( !error ){
1736            conn[i]=true;
1737            ts[i]=glparam->FROM_TIME;
1738            te[i]=glparam->TO_TIME;
1739          }
1740          if ( error>0 ){
1741            conn[i]=false;
1742            ts[i]=glparam->TO_TIME;
1743            TSQLResult *pResult;
1744            TSQLRow *row;
1745            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);
1746            pResult=dbc->Query(query.Data());
1747            if(!pResult->GetRowCount()){
1748              te[i]=numeric_limits<UInt_t>::max();
1749            }else{
1750              row=pResult->Next();
1751              te[i]=(UInt_t)atoll(row->GetField(0));
1752            }
1753          }
1754          //
1755          
1756        }
1757      }
1758    
1759    }
1760    //------------------------------------------------------------------------
1761    void ToFdEdx::Clear(Option_t *option)
1762    {
1763      //
1764      // Set arrays and initialize structure
1765      //  eDEDXpmt.Set(48);    eDEDXpmt.Reset(-1);   // Set array size  and reset structure
1766      eDEDXpmt->Set(48);    eDEDXpmt->Reset(-1);   // Set array size  and reset structure
1767      //
1768    };
1769    
1770    //------------------------------------------------------------------------
1771    void ToFdEdx::Print(Option_t *option)
1772    {
1773      //
1774      printf("========================================================================\n");
1775    
1776    };
1777    
1778    //------------------------------------------------------------------------
1779    void ToFdEdx::Init(pamela::tof::TofEvent *tofl0)
1780    {
1781      //
1782      ToFLevel2 tf;
1783      for (Int_t gg=0; gg<4;gg++){
1784        for (Int_t hh=0; hh<12;hh++){
1785          //          tofinput_.tdc[hh][gg]=tofEvent->tdc[gg][hh];          
1786          int mm = tf.GetPMTid(gg,hh);        
1787          adc[mm]= (0xFFF & tofl0->adc[gg][hh]); // EM, exclude warning bits
1788        };      
1789      };
1790      
1791    };
1792    
1793    //------------------------------------------------------------------------
1794    void ToFdEdx::Init(Int_t gg, Int_t hh, Float_t adce)
1795    {
1796      //
1797      ToFLevel2 tf;
1798      //  for (Int_t gg=0; gg<4;gg++){
1799      //    for (Int_t hh=0; hh<12;hh++){
1800      int mm = tf.GetPMTid(gg,hh);    
1801      adc[mm]=adce;
1802      
1803    };
1804    //------------------------------------------------------------------------
1805    void ToFdEdx::Process(UInt_t atime, Float_t betamean, Float_t *xtr_tof, Float_t *ytr_tof, Int_t exitat)
1806    {
1807      bool debug = false;
1808      if ( debug ) printf(" INSIDE TOFDEDX PROCESS \n");
1809      // the parameters should be already initialised by InitPar()
1810      //  printf(" in process \n");
1811      Clear();
1812    
1813     // define angle:  
1814      double dx   = xtr_tof[1] - xtr_tof[5];
1815      double dy   = ytr_tof[0] - ytr_tof[4];
1816      double dr   = sqrt(dx*dx+dy*dy);
1817      double theta=atan(dr/76.81);
1818      //
1819      if ( xtr_tof[1] > 99. ||  xtr_tof[5] > 99. || ytr_tof[0] > 99. ||  ytr_tof[4] > 99. ) theta = 0.;
1820      for (Int_t ii=0; ii<6; ii++){
1821        if ( xtr_tof[ii] > 99. ) xtr_tof[ii] = 0.;
1822        if ( ytr_tof[ii] > 99. ) ytr_tof[ii] = 0.;
1823      };
1824      //
1825      if ( debug ) printf(" theta %f \n",theta);
1826      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]);
1827      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]);
1828      //--------------------- TABLE OF PERIODS WITH HV PROBLEMS ----------------------------
1829      
1830      int Aconn=conn[0];    // PMT 0,20,22,24
1831      int Bconn=conn[1];    // PMT 6,12,26,34
1832      int Cconn=conn[2];    // PMT 4,14,28,32
1833      int Dconn=conn[3];    // PMT 2,8,10,30
1834      int Econn=conn[4];    // PMT 42,43,44,47
1835      int Fconn=conn[5];    // PMT 7,19,23,27
1836      int Gconn=conn[6];    // PMT 3,11,25,33
1837      int Hconn=conn[7];    // PMT 1,9,13,21
1838      int Iconn=conn[8];    // PMT 5,29,31,35
1839      int Lconn=conn[9];    // PMT 37,40,45,46
1840      int Mconn=conn[10];    // PMT 15,16,17,18
1841      int Nconn=conn[11];    // PMT 36,38,39,41
1842      if( false ) cout << Gconn << Iconn << Lconn <<endl; // to avoid compilation warnings
1843        
1844      //  printf(" size %i \n",eDEDXpmt.GetSize());
1845      for( int ii=0; ii<48; ii++ ) {
1846        //
1847        //    eDEDXpmt.SetAt(-1.,ii);
1848        //    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]);
1849        if ( debug ) printf("II %i adc %f \n",ii,adc[ii]);
1850    
1851        if( adc[ii] >= 4095. ){
1852          //      eDEDXpmt[ii] = 0.;
1853          eDEDXpmt->AddAt(0.,ii);
1854          if ( debug ) printf(" %i adc>4095 \n",ii);
1855          continue; // EMILIANO
1856        };
1857    
1858        if( adc[ii] >= (PMTsat[ii]-5.) && adc[ii] < 4095. ){
1859          eDEDXpmt->AddAt(1000.,ii);
1860          if ( debug ) printf(" %i adc> pmtsat && adc<4095 \n",ii);
1861          continue; // EMILIANO
1862        };
1863    
1864        if( adc[ii] <= 0. ) {
1865          eDEDXpmt->AddAt(1500.,ii);
1866          if ( debug ) printf(" %i adc<=0 \n",ii);
1867          continue;
1868        };
1869        //
1870        double adcpC   = f_adcPC( adc[ii] );    // - adc conversion in pC
1871        if ( exitat == 0 ){
1872          eDEDXpmt->AddAt((Float_t)adcpC,ii);
1873          continue;
1874        }
1875        //    printf(" e qua? \n");
1876    
1877        double adccorr = adcpC*fabs(cos(theta));    
1878        if ( debug ) printf(" adccorr %f \n",adccorr);
1879        if(adccorr<=0.){
1880          if ( debug ) printf(" %i adccorr<=0 \n",ii);
1881          //      eDEDXpmt->AddAt((Float_t)adcpC,ii);//?
1882          continue;
1883        }
1884        if ( exitat == 1 ){
1885          eDEDXpmt->AddAt((Float_t)adccorr,ii);
1886          continue;
1887        }
1888        //    printf(" e quo? \n");
1889    
1890        //    int standard=0;
1891        int S115B_ok=0;
1892        int S115B_break=0;
1893    
1894        if(atime<1158720000)S115B_ok=1;
1895        else S115B_break=1;
1896    
1897    
1898        //------------------------------------------------------------------------
1899        //    printf(" e qui? \n");
1900        //---------------------------------------------------- Z reconstruction
1901    
1902        double adcHe, adcnorm, adclin, dEdx, Zeta;
1903    
1904        adcHe=-2;
1905        adcnorm=-2;
1906        adclin=-2;
1907        dEdx=-2;
1908        Zeta=-2;
1909        Double_t correction = 1.;
1910    
1911        if(Aconn==1 && (ii==0 || ii==20 || ii==22 || ii==24)){
1912          correction = 1.675;
1913        }
1914        else if(Bconn==1 && (ii==6 || ii==12 || ii==26 || ii==34)){
1915          correction = 2.482;
1916        }
1917        else if(Cconn==1 && (ii==4 || ii==14 || ii==28 || ii==32)){
1918          correction = 1.464;
1919        }
1920        else if(Dconn==1 && (ii==2 || ii==8 || ii==10 || ii==30)){
1921          correction = 1.995;
1922        }
1923        else if(Econn==1 && (ii==42 || ii==43 || ii==44 || ii==47)){
1924          correction = 1.273;
1925        }
1926        else if(Fconn==1 && (ii==7 || ii==19 || ii==23 || ii==27)){
1927          correction = 1.565;
1928        }
1929        else if(Mconn==1 && (ii==15 || ii==16 || ii==17 || ii==18)){
1930          correction = 1.565;
1931        }
1932        else if(Nconn==1 && (ii==36 || ii==38 || ii==39 || ii==41)){
1933          correction = 1.018;
1934        }
1935        else if(Hconn==1 && (ii==1 || ii==13 || ii==21 || (ii==9&&S115B_ok==1))){
1936          correction = 1.84;
1937        }
1938        else if(S115B_break==1 && ii==9 && Hconn==1){
1939          correction = 1.64;
1940        }
1941        else correction = 1.;
1942        
1943        if( ii==9 && S115B_break==1 ){
1944          adcHe   = f_att5B( ytr_tof[0] )/correction;
1945        } else {
1946          adcHe   = Get_adc_he(ii, xtr_tof, ytr_tof)/correction;
1947        };
1948        if(adcHe<=0){
1949          if ( debug ) printf(" %i adcHe<=0 \n",ii);
1950          //      eDEDXpmt->AddAt((Float_t)adccorr,ii); //?
1951          continue;
1952        }
1953        if ( exitat == 2 ){
1954          if(ii==9 && S115B_break==1)  eDEDXpmt->AddAt(36.*(Float_t)adccorr/adcHe,ii);
1955          else  adclin  = 4.*(Float_t)adccorr/adcHe;
1956          continue;
1957        }
1958    
1959        if(ii==9 && S115B_break==1)  adcnorm = f_pos5B(adccorr);
1960        else adcnorm = f_pos( (parPos[ii]), adccorr);
1961        if(adcnorm<=0){
1962          if ( debug ) printf(" %i adcnorm<=0 \n",ii);
1963          //      eDEDXpmt->AddAt((Float_t)adccorr,ii);//?
1964          continue;
1965        }
1966        if ( debug ) printf(" adcnorm %f \n",adcnorm);
1967    
1968        if(ii==9 && S115B_break==1)  adclin  = 36.*adcnorm/adcHe;
1969        else  adclin  = 4.*adcnorm/adcHe;
1970        if ( debug ) printf(" adclin %f \n",adclin);
1971        if(adclin<=0){
1972          if ( debug ) printf(" %i adclin<=0 \n",ii);
1973          //      eDEDXpmt->AddAt((Float_t)adccorr,ii);//?
1974          continue;
1975        }
1976        if ( exitat == 3 ){
1977          if(ii==9 && S115B_break==1)  eDEDXpmt->AddAt((Float_t)adclin,ii);
1978          else  eDEDXpmt->AddAt((Float_t)adclin,ii);
1979          continue;
1980        }
1981        //
1982        if ( betamean > 99. ){
1983          //      eDEDXpmt.AddAt((Float_t)adclin,ii);
1984          eDEDXpmt->AddAt((Float_t)adclin,ii);
1985          //      printf(" AAPMT IS %i dedx is %f vector is %f \n",ii,adclin,eDEDXpmt[ii]);
1986          if ( debug ) printf(" %i betamean > 99 \n",ii);
1987          continue;
1988        };
1989        //
1990        double dEdxHe=-2;
1991        if(ii==9 && S115B_break==1){
1992          if( betamean <1. ) dEdxHe = f_BB5B( betamean );
1993          else                       dEdxHe = 33;
1994        } else {
1995          if( betamean <1. ) dEdxHe = f_BB( (parBBneg[ii]), betamean );
1996          else                       dEdxHe = parBBpos[ii];
1997        }
1998        
1999        if ( debug ) printf(" dEdxHe %f \n",dEdxHe);
2000        
2001        if(dEdxHe<=0){
2002          eDEDXpmt->AddAt((Float_t)adclin,ii);
2003          if ( debug ) printf(" %i dEdxHe<=0 \n",ii);
2004          continue;
2005        };
2006    
2007        if(ii==9 && S115B_break==1)  dEdx = f_desatBB5B( adclin );
2008        else  dEdx = f_desatBB((parDesatBB[ii]), adclin );
2009    
2010        if(dEdx<=0){
2011          eDEDXpmt->AddAt((Float_t)adclin,ii);
2012          if ( debug ) printf(" %i dEdx<=0 \n",ii);
2013          continue;
2014        };
2015    
2016        if ( debug ) printf(" dEdx %f \n",dEdx);
2017        eDEDXpmt->AddAt((Float_t)dEdx,ii);
2018        //    eDEDXpmt.AddAt((Float_t)dEdx,ii);
2019    
2020        //    printf(" PMT IS %i dedx is %f vector is %f \n",ii,dEdx,eDEDXpmt[ii]);
2021    
2022      }  //end loop on 48 PMT
2023    
2024    };
2025    
2026    
2027    //------------------------------------------------------------------------
2028    void ToFdEdx::Define_PMTsat()
2029    {
2030      Float_t  sat[48] = {
2031        3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
2032        3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
2033        3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
2034        3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
2035        3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
2036        3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
2037      PMTsat.Set(48,sat);
2038    }
2039    
2040    //------------------------------------------------------------------------
2041    void ToFdEdx::ReadParBBpos( const char *fname )
2042    {
2043      //  printf("read %s\n",fname);
2044      parBBpos.Set(48);
2045      FILE *fattin = fopen( fname , "r" );
2046      for (int i=0; i<48; i++) {
2047        int   tid=0;
2048        float  tp;
2049        if(fscanf(fattin,"%d %f",
2050                  &tid, &tp )!=2) break;
2051        parBBpos[i]=tp;
2052      }
2053      fclose(fattin);
2054    }
2055    
2056    //------------------------------------------------------------------------
2057    void ToFdEdx::ReadParDesatBB( const char *fname )
2058    {
2059      //  printf("read %s\n",fname);
2060      FILE *fattin = fopen( fname , "r" );
2061      for (int i=0; i<48; i++) {
2062        int   tid=0;
2063        float  tp[3];
2064        if(fscanf(fattin,"%d %f %f %f",
2065                  &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
2066        parDesatBB[i].Set(3,tp);
2067      }
2068      fclose(fattin);
2069    }
2070    
2071    
2072    //------------------------------------------------------------------------
2073    void ToFdEdx::ReadParBBneg( const char *fname )
2074    
2075    {
2076      //  printf("read %s\n",fname);
2077      FILE *fattin = fopen( fname , "r" );
2078      for (int i=0; i<48; i++) {
2079        int   tid=0;
2080        float  tp[3];
2081        if(fscanf(fattin,"%d %f %f %f",
2082                  &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
2083        parBBneg[i].Set(3,tp);
2084      }
2085      fclose(fattin);
2086    }
2087    
2088    //------------------------------------------------------------------------
2089    void ToFdEdx::ReadParPos( const char *fname )
2090    {
2091      //  printf("read %s\n",fname);
2092      FILE *fattin = fopen( fname , "r" );
2093      for (int i=0; i<48; i++) {
2094        int   tid=0;
2095        float  tp[4];
2096        if(fscanf(fattin,"%d %f %f %f %f",
2097                  &tid, &tp[0], &tp[1], &tp[2], &tp[3])!=5) break;
2098        parPos[i].Set(4,tp);
2099      }
2100      fclose(fattin);
2101    }
2102    
2103    //------------------------------------------------------------------------
2104    void ToFdEdx::ReadParAtt( const char *fname )
2105    {
2106      //  printf("read %s\n",fname);
2107      FILE *fattin = fopen( fname , "r" );
2108      for (int i=0; i<48; i++) {
2109        int   tid=0;
2110        float  tp[6];
2111        if(fscanf(fattin,"%d %f %f %f %f %f %f",
2112                  &tid, &tp[0], &tp[1], &tp[2], &tp[3], &tp[4], &tp[5] )!=7) break;
2113        parAtt[i].Set(6,tp);
2114      }
2115      fclose(fattin);
2116    }
2117    
2118    
2119    
2120    
2121    
2122    
2123    double ToFdEdx::f_att( TArrayF &p, float x )
2124    {
2125      return
2126        p[0] +
2127        p[1]*x +
2128        p[2]*x*x +
2129        p[3]*x*x*x +
2130        p[4]*x*x*x*x +
2131        p[5]*x*x*x*x*x;
2132    }
2133    //------------------------------------------------------------------------
2134    double ToFdEdx::f_att5B( float x )
2135    {
2136      return
2137        101.9409 +
2138        6.643781*x +
2139        0.2765518*x*x +
2140        0.004617647*x*x*x +
2141        0.0006195132*x*x*x*x +
2142        0.00002813734*x*x*x*x*x;
2143    }
2144    
2145    
2146    double ToFdEdx::f_pos( TArrayF &p, float x )
2147    {
2148      return
2149        p[0] +
2150        p[1]*x +
2151        p[2]*x*x +
2152        p[3]*x*x*x;
2153    }
2154    
2155    double ToFdEdx::f_pos5B( float x )
2156    {
2157      return
2158        15.45132 +
2159        0.8369721*x +
2160        0.0005*x*x;
2161    }
2162    
2163    
2164    
2165    double ToFdEdx::f_adcPC( float x )
2166    {
2167      return 28.12+0.6312*x-5.647e-05*x*x+3.064e-08*x*x*x;
2168    }
2169    
2170    
2171    float ToFdEdx::Get_adc_he( int id, float pl_x[6], float pl_y[6])
2172    {
2173    
2174      //
2175      // input: id - pmt [0:47}
2176      //             pl_x - coord x of the tof plane
2177      //             pl_y - coord y
2178    
2179      adc_he = 0;
2180      if( eGeom.GetXY(id)==1 )  adc_he = f_att( (parAtt[id]), pl_x[eGeom.GetPlane(id)] );
2181      if( eGeom.GetXY(id)==2 )  adc_he = f_att( (parAtt[id]), pl_y[eGeom.GetPlane(id)] );
2182      return adc_he;
2183    }
2184    
2185    //------------------------------------------------------------------------
2186    double ToFdEdx::f_BB( TArrayF &p, float x )
2187    {
2188      return  p[0]/(x*x)*(log(x*x/(1-x*x)) - p[1]*x*x - p[2]);
2189    }
2190    
2191    //------------------------------------------------------------------------
2192    double ToFdEdx::f_BB5B( float x )
2193    {
2194      return  0.165797/(x*x)*(log(x*x/(1-x*x)) + 140.481*x*x + 52.9258);
2195    }
2196    //------------------------------------------------------------------------
2197    double ToFdEdx::f_desatBB( TArrayF &p, float x )
2198    {
2199      return
2200        p[0] +
2201        p[1]*x +
2202        p[2]*x*x;
2203    }
2204    
2205    //------------------------------------------------------------------------
2206    double ToFdEdx::f_desatBB5B( float x )
2207    {
2208      return
2209        -2.4 +
2210        0.75*x +
2211        0.009*x*x;
2212    }
2213    

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.37

  ViewVC Help
Powered by ViewVC 1.1.23