| 1 | #include <ToFPatch.h> | 
| 2 | #include <TGraph.h> | 
| 3 | #include <TSpline.h> | 
| 4 | #include <TMVA/TSpline1.h> | 
| 5 |  | 
| 6 | //------------------------------------------------------------------------ | 
| 7 | void ToFPatch::Clear(Option_t *option) | 
| 8 | { | 
| 9 | // | 
| 10 | L2    = 0; | 
| 11 | OBT   = 0; | 
| 12 | PKT   = 0; | 
| 13 | atime = 0; | 
| 14 | tr    = 0; | 
| 15 | //sntr  = 0; | 
| 16 | // Set arrays and initialize structure | 
| 17 |  | 
| 18 | eDEDXpmt.Set(48);    eDEDXpmt.Reset(-1);   // Set array size  and reset structure | 
| 19 | eDEDXpmtraw.Set(48); eDEDXpmtraw.Reset(-1); // Set array size and reset structure | 
| 20 | eDEDXpad.Set(24);    eDEDXpad.Reset(-1); | 
| 21 | eDEDXlayer.Set(6);   eDEDXlayer.Reset(-1); | 
| 22 | INFOpmt.Set(48);     INFOpmt.Reset(0); | 
| 23 | INFOlayer.Set(6);    INFOlayer.Reset(0); | 
| 24 |  | 
| 25 | eDEDXpmtstd.Set(48);    eDEDXpmtstd.Reset(-1);   // Set array size  and reset structure | 
| 26 | eDEDXpmtrawstd.Set(48); eDEDXpmtrawstd.Reset(-1); // Set array size and reset structure | 
| 27 | eDEDXpadstd.Set(24);    eDEDXpadstd.Reset(-1); | 
| 28 | eDEDXlayerstd.Set(6);   eDEDXlayerstd.Reset(-1); | 
| 29 | INFOpmtstd.Set(48);     INFOpmtstd.Reset(0); | 
| 30 | INFOlayerstd.Set(6);    INFOlayerstd.Reset(0); | 
| 31 |  | 
| 32 |  | 
| 33 | // | 
| 34 | }; | 
| 35 |  | 
| 36 | //------------------------------------------------------------------------ | 
| 37 | void ToFPatch::Print(Option_t *option) | 
| 38 | { | 
| 39 | // | 
| 40 | printf("========================================================================\n"); | 
| 41 | printf(" OBT: %u PKT: %u ATIME: %u \n",OBT,PKT,atime); | 
| 42 | }; | 
| 43 |  | 
| 44 |  | 
| 45 | //------------------------------------------------------------------------ | 
| 46 | void ToFPatch::InitPar(const char *pardir, const char *param) | 
| 47 | { | 
| 48 | // expensive function - call it once/run | 
| 49 | Define_PMTsat(); | 
| 50 | ReadParAtt(pardir, param); | 
| 51 | }; | 
| 52 |  | 
| 53 |  | 
| 54 | //------------------------------------------------------------------------ | 
| 55 | void ToFPatch::Process( PamLevel2 *l2p, const char* alg) | 
| 56 | { | 
| 57 | // the parameters should be already initialised by InitPar() | 
| 58 |  | 
| 59 | Float_t thelp1,thelp2; | 
| 60 | Float_t dedx_corr[48]; | 
| 61 | Float_t xv[6],yv[6],zin[6]; | 
| 62 |  | 
| 63 | Clear(); | 
| 64 | L2 = l2p; | 
| 65 | if(!L2)                                   return; | 
| 66 | if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n"); | 
| 67 | TrkLevel2 *trkL2 = L2->GetTrkLevel2(); | 
| 68 | if(!trkL2)                                return; | 
| 69 | ToFLevel2 *tofL2 = L2->GetToFLevel2(); | 
| 70 | if(!tofL2)                                return; | 
| 71 | eNtr = trkL2->GetNTracks(); | 
| 72 | if(eNtr<1)                                return; | 
| 73 |  | 
| 74 |  | 
| 75 | trkAlg = alg; | 
| 76 |  | 
| 77 | OBT   = L2->GetOrbitalInfo()->OBT; | 
| 78 | PKT   = L2->GetOrbitalInfo()->pkt_num; | 
| 79 | atime = L2->GetOrbitalInfo()->absTime; | 
| 80 |  | 
| 81 | //---------------------------------------------------------------------- | 
| 82 | //cout<<atime<<" "<<tmin_atten<<" "<<tmax_atten<<endl; | 
| 83 |  | 
| 84 | // tmin_atten  & tmax_atten  time interval limits for attenuation parameters | 
| 85 | if ((atime < tmin_atten) || (atime > tmax_atten))  { | 
| 86 | ical_atten = 0; | 
| 87 | for (Int_t ii=0; ii<100; ii++) { | 
| 88 | //cout<<ii<<"  tmin "<<T_int_min[ii]<<"  tmax "<<T_int_max[ii]<<endl; | 
| 89 | if ((atime>T_int_min[ii]) && (atime<=T_int_max[ii]))  {  // time interval found | 
| 90 | ical_atten = ii; | 
| 91 | tmin_atten = T_int_min[ii]; | 
| 92 | tmax_atten = T_int_max[ii]; | 
| 93 | cout<<"Time Interval found: "<<ii<<"  tmin "<<T_int_min[ii]<<"  tmax "<<T_int_max[ii]<<endl; | 
| 94 | break; | 
| 95 | } | 
| 96 | } // ii | 
| 97 |  | 
| 98 | TArrayF &Apar0 =  A0_array[ical_atten]; | 
| 99 | TArrayF &Apar1 =  A1_array[ical_atten]; | 
| 100 | TArrayF &Apar2 =  A2_array[ical_atten]; | 
| 101 | TArrayF &Apar3 =  A3_array[ical_atten]; | 
| 102 |  | 
| 103 | for (Int_t ii=0; ii<48;ii++) { | 
| 104 | A0[ii]=Apar0[ii]; | 
| 105 | A1[ii]=Apar1[ii]; | 
| 106 | A2[ii]=Apar2[ii]; | 
| 107 | A3[ii]=Apar3[ii]; | 
| 108 | //     cout<<A0[ii]<<" "<<A1[ii]<<" "<<A2[ii]<<" "<<A3[ii]<<endl; | 
| 109 | } | 
| 110 |  | 
| 111 |  | 
| 112 | cout<<"attenuation corr: abs time "<<atime<<" interval "<<ical_atten<<" tmin "<<T_int_min[ical_atten]<<" tmax "<<T_int_max[ical_atten]<<endl; | 
| 113 | } | 
| 114 |  | 
| 115 | //---------------------------------------------------------------------- | 
| 116 | // tmin_2nd  & tmax_2nd  time interval limits for 2nd order correction | 
| 117 |  | 
| 118 | //cout<<atime<<" "<<tmin_2nd<<" "<<tmax_2nd<<endl; | 
| 119 |  | 
| 120 | if ((atime < tmin_2nd) || (atime > tmax_2nd))  { | 
| 121 |  | 
| 122 | ical_2nd=0; | 
| 123 | for (Int_t ii=0; ii<1500; ii++) { | 
| 124 | //cout<<ii<<" "<<atime<<"  tmin "<<mtime[ii]<<"  tmax "<<mtime[ii+1]<<endl; | 
| 125 | if ((atime>mtime[ii]) && (atime<=mtime[ii+1]))  {  // time interval found | 
| 126 | ical_2nd = ii; | 
| 127 | tmin_2nd = mtime[ii]; | 
| 128 | tmax_2nd = mtime[ii+1]; | 
| 129 | //cout<<"Time Interval 2nd order corr  "<<ii<<"  tmin "<<mtime[ii]<<"  tmax "<<mtime[ii+1]<<endl; | 
| 130 | break; | 
| 131 | } | 
| 132 | }; | 
| 133 | cout<<"2nd order corr: abs time "<<atime<<" interval "<<ical_2nd<<" tmin "<<mtime[ical_2nd]<<" tmax "<<mtime[ical_2nd+1]<<endl; | 
| 134 | } | 
| 135 | //----------------------------------------------------------------------- | 
| 136 |  | 
| 137 | //== interpolate betwen time limits | 
| 138 |  | 
| 139 | thelp1 = mtime[ical_2nd]; | 
| 140 | thelp2 = mtime[ical_2nd+1]; | 
| 141 |  | 
| 142 | TArrayF &corr1 =  dedx_corr_m[ical_2nd]; | 
| 143 | TArrayF &corr2 =  dedx_corr_m[ical_2nd+1]; | 
| 144 |  | 
| 145 | for (Int_t ii=0; ii<48;ii++) { | 
| 146 | Float_t yhelp1 = corr1[ii]; | 
| 147 | Float_t yhelp2 = corr2[ii]; | 
| 148 | Float_t slope  = (yhelp2-yhelp1)/(thelp2-thelp1); | 
| 149 | Float_t inter  = yhelp1 - slope*thelp1; | 
| 150 | dedx_corr[ii] = slope*atime + inter; | 
| 151 | //       if (ii==0) cout<<thelp1<<" "<<thelp2<<" "<<tabs<<" "<<yhelp1<<" "<<yhelp2<<" "<<dedx_corr[0]<<endl; | 
| 152 | //       cout<<ii<<" "<<yhelp1<<" "<<yhelp2<<" => "<<dedx_corr[ii]<<endl; | 
| 153 | } | 
| 154 |  | 
| 155 |  | 
| 156 | //================================================================ | 
| 157 |  | 
| 158 | if( L2->GetNTracks(trkAlg)>=1 ){ | 
| 159 |  | 
| 160 |  | 
| 161 | //  PamTrack *trackTRK = L2->GetTrack(itr);     // 9th | 
| 162 | PamTrack *trackTRK = L2->GetTrack(0,trkAlg);  // 10th | 
| 163 |  | 
| 164 |  | 
| 165 | Float_t betamean = fabs(trackTRK->GetToFTrack()->beta[12]); | 
| 166 |  | 
| 167 | if(betamean<0.05 || betamean>2){ | 
| 168 | for(int i=0;i<48;i++)INFOpmt[i]=1; | 
| 169 | for(int i=0;i<6;i++)INFOlayer[i]=1; | 
| 170 | } | 
| 171 |  | 
| 172 | // define angle: | 
| 173 |  | 
| 174 | for (Int_t jj=0; jj<6; jj++){ | 
| 175 | xv[jj]=trackTRK->GetToFTrack()->xtr_tof[jj]; | 
| 176 | yv[jj]=trackTRK->GetToFTrack()->ytr_tof[jj]; | 
| 177 | zin[jj] = L2->GetToFLevel2()->GetZTOF(L2->GetToFLevel2()->GetToFPlaneID(jj)); | 
| 178 | } | 
| 179 |  | 
| 180 | Float_t theta[6]; | 
| 181 |  | 
| 182 | for (Int_t jj=0; jj<3; jj++){ | 
| 183 | Float_t dx=0.; | 
| 184 | Float_t dy=0.; | 
| 185 | Float_t dr=0.; | 
| 186 | Int_t kk=2*jj; | 
| 187 |  | 
| 188 | theta[kk]  =0; | 
| 189 | theta[kk+1]=0; | 
| 190 | Float_t dist = zin[kk] - zin[kk+1]; | 
| 191 |  | 
| 192 | if ((xv[kk])<100.) { | 
| 193 | dx   = xv[kk]  - xv[kk+1]; | 
| 194 | dy   = yv[kk]  - yv[kk+1]; | 
| 195 | dr   = sqrt(dx*dx+dy*dy); | 
| 196 | theta[kk]   = atan(dr/dist); | 
| 197 | theta[kk+1] = atan(dr/dist); | 
| 198 | } | 
| 199 |  | 
| 200 | }  // jj | 
| 201 |  | 
| 202 | //  Clear ADC; | 
| 203 | Float_t adc[48]; | 
| 204 | for(int i=0;i<48;i++){ | 
| 205 | //    adc[i]=0; | 
| 206 | adc[i]=4095; | 
| 207 | } | 
| 208 |  | 
| 209 |  | 
| 210 | for (Int_t ipmt=0; ipmt<tofL2->npmt() ; ipmt++){ | 
| 211 | ToFPMT *tofpmt = tofL2->GetToFPMT(ipmt); | 
| 212 | Int_t pmt_id   = tofpmt->pmt_id; | 
| 213 | adc[pmt_id]    = tofpmt->adc ;  // raw ADC | 
| 214 | } //loop on 48 pmts | 
| 215 |  | 
| 216 |  | 
| 217 |  | 
| 218 | Int_t paddleidoftrack[6]= {0} ; | 
| 219 |  | 
| 220 | for (Int_t  ilay=0; ilay<6; ilay++) { | 
| 221 | paddleidoftrack[ilay] = L2->GetToFLevel2()->GetPaddleIdOfTrack(xv[ilay], yv[ilay], ilay, 0.2) ; | 
| 222 | } | 
| 223 |  | 
| 224 | /* | 
| 225 | cout<<"paddleidoftrack  trk "; | 
| 226 | for (Int_t  ilay=0; ilay<6; ilay++) { | 
| 227 | cout<<" "<<paddleidoftrack[ilay]; | 
| 228 | } | 
| 229 | cout<<endl; | 
| 230 |  | 
| 231 |  | 
| 232 | for (Int_t  ilay=0; ilay<6; ilay++) { | 
| 233 | cout<<" "<<theta[ilay]; | 
| 234 | } | 
| 235 | cout<<endl; | 
| 236 | */ | 
| 237 |  | 
| 238 | //================================================================== | 
| 239 | //================================================================== | 
| 240 | //================================================================== | 
| 241 |  | 
| 242 | // Clear the dEdx arrays | 
| 243 | for(int i=0;i<48;i++){ | 
| 244 | eDEDXpmtraw[i] = 1000; | 
| 245 | eDEDXpmt[i] = 1000; | 
| 246 | } | 
| 247 |  | 
| 248 | for(int i=0;i<24;i++) eDEDXpad[i]   = 1000.; | 
| 249 | for(int i=0;i<6;i++)  eDEDXlayer[i] = 1000.; | 
| 250 |  | 
| 251 |  | 
| 252 | //  ratio helium to proton ca. 4 | 
| 253 | Float_t  hepratio = 4.; | 
| 254 |  | 
| 255 | Int_t ipad,ihelp; | 
| 256 | Float_t adclraw,adcrraw; | 
| 257 | Float_t adcl,adcr; | 
| 258 | Float_t dedxl,dedxr; | 
| 259 | Float_t xkorr; | 
| 260 |  | 
| 261 | Int_t ipad_a[6] = {0,8,14,16,18,21}; | 
| 262 | Int_t ipmt_a[6] = {0,16,28,32,36,42}; | 
| 263 |  | 
| 264 |  | 
| 265 | for (Int_t ilay=0; ilay<6; ilay++) { | 
| 266 |  | 
| 267 | Int_t i1 = paddleidoftrack[ilay]; | 
| 268 | if (i1 != -1) { | 
| 269 |  | 
| 270 | ipad  = ipad_a[ilay]+i1; | 
| 271 | ihelp = ipmt_a[ilay]+(i1*2); | 
| 272 |  | 
| 273 | /* | 
| 274 | if(adc[ihelp]==4095)INFOpmt[ihelp]=2; | 
| 275 | else if(adc[iihelp]>=PMTsat[iihelp]-5)INFOpmt[iihelp]=3; | 
| 276 |  | 
| 277 | if( adc[ihelp] >= PMTsat[iihelp]-5 )  continue; | 
| 278 | if( adc[ihelp] <= 0. )            continue; | 
| 279 |  | 
| 280 | double adcpC   = f_adcPC( adc[iihelp] );    // - adc conversion in pC | 
| 281 | double adccorr = adcpC*fabs(cos(theta[ilay])); | 
| 282 |  | 
| 283 | if(adccorr<=0)INFOpmt[ihelp]=4; | 
| 284 | if(adccorr<=0.)           continue; | 
| 285 | */ | 
| 286 |  | 
| 287 | adcl= adc[ihelp]; | 
| 288 | adcr= adc[ihelp+1]; | 
| 289 | adclraw = adcl; | 
| 290 | adcrraw = adcr; | 
| 291 | adcl   = f_adcPC( adcl );    // - adc conversion in pC | 
| 292 | adcr   = f_adcPC( adcr );    // - adc conversion in pC | 
| 293 |  | 
| 294 | Float_t x; | 
| 295 | if (ilay==0) x=yv[0]; | 
| 296 | if (ilay==1) x=xv[1]; | 
| 297 | if (ilay==2) x=xv[2]; | 
| 298 | if (ilay==3) x=yv[3]; | 
| 299 | if (ilay==4) x=yv[4]; | 
| 300 | if (ilay==5) x=xv[5]; | 
| 301 |  | 
| 302 |  | 
| 303 | if (adclraw<4095) { | 
| 304 | adcl  = adcl*cos(theta[ilay]); | 
| 305 | xkorr = atten(A0[ihelp],A1[ihelp],A2[ihelp],A3[ihelp],x); | 
| 306 | xkorr = xkorr/hepratio; | 
| 307 | dedxl  = adcl/xkorr; | 
| 308 | eDEDXpmtraw[ihelp] = dedxl; | 
| 309 | Float_t dedxl1  = dedxl*4./dedx_corr[ihelp];  // 2nd order corr | 
| 310 | // cout<<A0[ihelp]<<" "<<A1[ihelp]<<" "<<A2[ihelp]<<" "<<A3[ihelp]<<" => "<<xkorr<<endl; | 
| 311 | // cout<<"Layer "<<ilay<<" PMT "<<ihelp+1<<" ADClraw "<<adclraw<<" adcl "<<adcl<<" x "<<x<<" theta "<<theta[ilay]<<" xkorr "<<xkorr<<" dedx "<<dedxl<<" dedx_2nd "<<dedxl1<<endl; | 
| 312 | eDEDXpmt[ihelp]    = dedxl1; | 
| 313 | // cout<<eDEDXpmt[ihelp]<<endl; | 
| 314 | } | 
| 315 |  | 
| 316 | if (adcrraw<4095)  { | 
| 317 | adcr = adcr*cos(theta[ilay]); | 
| 318 | xkorr = atten(A0[ihelp+1],A1[ihelp+1],A2[ihelp+1],A3[ihelp+1],x); | 
| 319 | // cout<<A0[ihelp+1]<<" "<<A1[ihelp+1]<<" "<<A2[ihelp+1]<<" "<<A3[ihelp+1]<<" => "<<xkorr<<endl; | 
| 320 | xkorr = xkorr/hepratio; | 
| 321 | //cout<<adcrraw<<" "<<adcr<<" x "<<x<<" theta "<<theta[ilay]<<" xkorr"<<xkorr<<endl; | 
| 322 | dedxr  = adcr/xkorr; | 
| 323 | eDEDXpmtraw[ihelp+1] = dedxr; | 
| 324 | Float_t dedxr1  = dedxr*4./dedx_corr[ihelp+1];  // 2nd order corr | 
| 325 | // cout<<"Layer "<<ilay<<" PMT "<<ihelp+1+1<<" ADCrraw "<<adcrraw<<" adcr "<<adcr<<" x "<<x<<" theta "<<theta[ilay]<<" xkorr "<<xkorr<<" dedx "<<dedxr<<" dedx_2nd "<<dedxr1<<endl; | 
| 326 | eDEDXpmt[ihelp+1]  = dedxr1; | 
| 327 | // cout<<eDEDXpmt[ihelp+1]<<endl; | 
| 328 | } | 
| 329 |  | 
| 330 |  | 
| 331 | } // i1>-1 | 
| 332 | } // ilay | 
| 333 |  | 
| 334 | //----------------------------------------------------------------- | 
| 335 | // The GetdEdx method "handmade" | 
| 336 | //----------------------------------------------------------------- | 
| 337 |  | 
| 338 |  | 
| 339 | for (Int_t ilay=0; ilay<6; ilay++) { | 
| 340 | Float_t  xhelp=1000.; | 
| 341 | Int_t i1 = paddleidoftrack[ilay]; | 
| 342 | if (i1 != -1) { | 
| 343 | ipad  = ipad_a[ilay]+i1; | 
| 344 | ihelp = ipmt_a[ilay]+(i1*2); | 
| 345 | if ((eDEDXpmt[ihelp]<1000.) && (eDEDXpmt[ihelp+1]==1000.)) xhelp = eDEDXpmt[ihelp]; | 
| 346 | if ((eDEDXpmt[ihelp+1]<1000.) && (eDEDXpmt[ihelp]==1000.)) xhelp = eDEDXpmt[ihelp+1]; | 
| 347 | if ((eDEDXpmt[ihelp]<1000.) && (eDEDXpmt[ihelp+1]<1000.)) xhelp = 0.5*(eDEDXpmt[ihelp]+eDEDXpmt[ihelp+1]); | 
| 348 | eDEDXpad[ipad] = xhelp; | 
| 349 | eDEDXlayer[ilay] = xhelp; | 
| 350 | } | 
| 351 | } // ilay | 
| 352 |  | 
| 353 | } // if( L2->GetNTracks(trkAlg)>=1 )... | 
| 354 |  | 
| 355 |  | 
| 356 | //================================================================ | 
| 357 | //================================================================ | 
| 358 | //==============        standalone dEdx and beta     ============= | 
| 359 | //================================================================ | 
| 360 | //================================================================ | 
| 361 |  | 
| 362 | if (L2->GetToFStoredTrack(-1)  ) { | 
| 363 |  | 
| 364 | // ToF track | 
| 365 |  | 
| 366 | ToFTrkVar  *tof = L2->GetToFStoredTrack(-1); | 
| 367 |  | 
| 368 | Float_t betamean = tof->CalcBeta(10., 10., 20.); | 
| 369 |  | 
| 370 | if(betamean<0.05 || betamean>2){ | 
| 371 | for(int i=0;i<48;i++)INFOpmt[i]=1; | 
| 372 | for(int i=0;i<6;i++)INFOlayer[i]=1; | 
| 373 | } | 
| 374 |  | 
| 375 |  | 
| 376 |  | 
| 377 | // define angle (simple way...  all theta[i] are the same...) | 
| 378 |  | 
| 379 | Float_t theta[6] = {0., 0., 0., 0., 0., 0. }; | 
| 380 |  | 
| 381 | if (fabs((tof->xtofpos[0])<100) && (fabs(tof->xtofpos[2])<100) && (fabs(tof->ytofpos[0])<100) && (fabs(tof->ytofpos[2])<100)) { | 
| 382 | Float_t dx   = tof->xtofpos[0] - tof->xtofpos[2]; | 
| 383 | Float_t dy   = tof->ytofpos[0] - tof->ytofpos[2]; | 
| 384 | Float_t dr   = sqrt(dx*dx+dy*dy); | 
| 385 | for (Int_t jj=0; jj<6; jj++) theta[jj]=atan(dr/77.31); | 
| 386 | // cout<<tof->xtofpos[0]<<" "<<tof->xtofpos[2]<<" => "<<dx<<endl; | 
| 387 | // cout<<tof->ytofpos[0]<<" "<<tof->ytofpos[2]<<" => "<<dy<<endl; | 
| 388 | } // if... | 
| 389 |  | 
| 390 | /* | 
| 391 | for (Int_t  ilay=0; ilay<6; ilay++) { | 
| 392 | cout<<" "<<theta[ilay]; | 
| 393 | } | 
| 394 | cout<<endl; | 
| 395 | */ | 
| 396 |  | 
| 397 | //  Clear ADC; | 
| 398 | Float_t adc[48]; | 
| 399 | for(int i=0;i<48;i++){ | 
| 400 | //    adc[i]=0; | 
| 401 | adc[i]=4095; | 
| 402 | } | 
| 403 |  | 
| 404 |  | 
| 405 | for (Int_t ipmt=0; ipmt<tofL2->npmt() ; ipmt++){ | 
| 406 | ToFPMT *tofpmt = tofL2->GetToFPMT(ipmt); | 
| 407 | Int_t pmt_id   = tofpmt->pmt_id; | 
| 408 | adc[pmt_id]    = tofpmt->adc ;  // raw ADC | 
| 409 | } //loop on 48 pmts | 
| 410 |  | 
| 411 |  | 
| 412 | //==================================================================== | 
| 413 | //===========  Check ToF standalone using HitPaddle ================== | 
| 414 | //==================================================================== | 
| 415 |  | 
| 416 | Int_t paddleidoftrack[6] = {-1, -1, -1, -1, -1, -1};; | 
| 417 |  | 
| 418 | for(Int_t jj=0; jj<8; jj++){ | 
| 419 | Int_t HitPad = L2->GetToFLevel2()->HitPaddle(0,jj); | 
| 420 | if (HitPad==1)  paddleidoftrack[0] = jj; | 
| 421 | } | 
| 422 | for(Int_t jj=0; jj<6; jj++){ | 
| 423 | Int_t HitPad = L2->GetToFLevel2()->HitPaddle(1,jj); | 
| 424 | if (HitPad==1)  paddleidoftrack[1] = jj; | 
| 425 | } | 
| 426 |  | 
| 427 | for(Int_t jj=0; jj<2; jj++){ | 
| 428 | Int_t HitPad = L2->GetToFLevel2()->HitPaddle(2,jj); | 
| 429 | if (HitPad==1)   paddleidoftrack[2] = jj; | 
| 430 | } | 
| 431 | for(Int_t jj=0; jj<2; jj++){ | 
| 432 | Int_t HitPad = L2->GetToFLevel2()->HitPaddle(3,jj); | 
| 433 | if (HitPad==1)   paddleidoftrack[3] = jj; | 
| 434 | } | 
| 435 |  | 
| 436 | for(Int_t jj=0; jj<3; jj++){ | 
| 437 | Int_t HitPad = L2->GetToFLevel2()->HitPaddle(4,jj); | 
| 438 | if (HitPad==1)   paddleidoftrack[4] = jj; | 
| 439 | } | 
| 440 | for(Int_t jj=0; jj<3; jj++){ | 
| 441 | Int_t HitPad = L2->GetToFLevel2()->HitPaddle(5,jj); | 
| 442 | if (HitPad==1)   paddleidoftrack[5] = jj; | 
| 443 | } | 
| 444 |  | 
| 445 | /* | 
| 446 | cout<<"paddleidoftrack  std "; | 
| 447 | for (Int_t  ilay=0; ilay<6; ilay++) { | 
| 448 | cout<<" "<<paddleidoftrack[ilay]; | 
| 449 | } | 
| 450 | cout<<endl; | 
| 451 | */ | 
| 452 | //================================================================== | 
| 453 | //================================================================== | 
| 454 | //================================================================== | 
| 455 |  | 
| 456 | // Clear the dEdx arrays | 
| 457 | for(int i=0;i<48;i++){ | 
| 458 | eDEDXpmtrawstd[i] = 1000; | 
| 459 | eDEDXpmtstd[i] = 1000; | 
| 460 | } | 
| 461 |  | 
| 462 | for(int i=0;i<24;i++) eDEDXpadstd[i]   = 1000.; | 
| 463 | for(int i=0;i<6;i++)  eDEDXlayerstd[i] = 1000.; | 
| 464 |  | 
| 465 |  | 
| 466 | //  ratio helium to proton ca. 4 | 
| 467 | Float_t  hepratio = 4.; | 
| 468 |  | 
| 469 | Int_t ipad,ihelp; | 
| 470 | Float_t adclraw,adcrraw; | 
| 471 | Float_t adcl,adcr; | 
| 472 | Float_t dedxl,dedxr; | 
| 473 | Float_t xkorr; | 
| 474 |  | 
| 475 | Int_t ipad_a[6] = {0,8,14,16,18,21}; | 
| 476 | Int_t ipmt_a[6] = {0,16,28,32,36,42}; | 
| 477 |  | 
| 478 |  | 
| 479 | for (Int_t ilay=0; ilay<6; ilay++) { | 
| 480 |  | 
| 481 | Int_t i1 = paddleidoftrack[ilay]; | 
| 482 | if (i1 != -1) { | 
| 483 |  | 
| 484 | ipad  = ipad_a[ilay]+i1; | 
| 485 | ihelp = ipmt_a[ilay]+(i1*2); | 
| 486 |  | 
| 487 | /* | 
| 488 | if(adc[ihelp]==4095)INFOpmt[ihelp]=2; | 
| 489 | else if(adc[iihelp]>=PMTsat[iihelp]-5)INFOpmt[iihelp]=3; | 
| 490 |  | 
| 491 | if( adc[ihelp] >= PMTsat[iihelp]-5 )  continue; | 
| 492 | if( adc[ihelp] <= 0. )            continue; | 
| 493 |  | 
| 494 | double adcpC   = f_adcPC( adc[iihelp] );    // - adc conversion in pC | 
| 495 | double adccorr = adcpC*fabs(cos(theta[ilay])); | 
| 496 |  | 
| 497 | if(adccorr<=0)INFOpmt[ihelp]=4; | 
| 498 | if(adccorr<=0.)           continue; | 
| 499 | */ | 
| 500 |  | 
| 501 | adcl= adc[ihelp]; | 
| 502 | adcr= adc[ihelp+1]; | 
| 503 | adclraw = adcl; | 
| 504 | adcrraw = adcr; | 
| 505 | adcl   = f_adcPC( adcl );    // - adc conversion in pC | 
| 506 | adcr   = f_adcPC( adcr );    // - adc conversion in pC | 
| 507 |  | 
| 508 | Float_t x; | 
| 509 | if (ilay==0) x = tof->ytofpos[0]; | 
| 510 | if (ilay==1) x = tof->xtofpos[0]; | 
| 511 | if (ilay==2) x = tof->xtofpos[1]; | 
| 512 | if (ilay==3) x = tof->ytofpos[1]; | 
| 513 | if (ilay==4) x = tof->ytofpos[2]; | 
| 514 | if (ilay==5) x = tof->xtofpos[2]; | 
| 515 |  | 
| 516 | /* | 
| 517 | Float_t xx; | 
| 518 | if (ilay==0) xx=yv[0]; | 
| 519 | if (ilay==1) xx=xv[1]; | 
| 520 | if (ilay==2) xx=xv[2]; | 
| 521 | if (ilay==3) xx=yv[3]; | 
| 522 | if (ilay==4) xx=yv[4]; | 
| 523 | if (ilay==5) xx=xv[5]; | 
| 524 |  | 
| 525 | cout<<ilay<<" xv "<<xx<<" tof std "<<x<<endl; | 
| 526 | */ | 
| 527 |  | 
| 528 | if  (fabs(x) < 100.) { | 
| 529 |  | 
| 530 | if (adclraw<4095) { | 
| 531 | adcl  = adcl*cos(theta[ilay]); | 
| 532 | xkorr = atten(A0[ihelp],A1[ihelp],A2[ihelp],A3[ihelp],x); | 
| 533 | xkorr = xkorr/hepratio; | 
| 534 | dedxl  = adcl/xkorr; | 
| 535 | eDEDXpmtrawstd[ihelp] = dedxl; | 
| 536 | Float_t dedxl1  = dedxl*4./dedx_corr[ihelp];  // 2nd order corr | 
| 537 | // cout<<A0[ihelp]<<" "<<A1[ihelp]<<" "<<A2[ihelp]<<" "<<A3[ihelp]<<" => "<<xkorr<<endl; | 
| 538 | // cout<<"Layer "<<ilay<<" PMT "<<ihelp+1<<" ADClraw "<<adclraw<<" adcl "<<adcl<<" x "<<x<<" theta "<<theta[ilay]<<" xkorr "<<xkorr<<" dedx "<<dedxl<<" dedx_2nd "<<dedxl1<<endl; | 
| 539 | eDEDXpmtstd[ihelp]    = dedxl1; | 
| 540 | // cout<<"trk "<<eDEDXpmt[ihelp]<<" std "<<eDEDXpmtstd[ihelp]<<endl; | 
| 541 | } | 
| 542 |  | 
| 543 | if (adcrraw<4095)  { | 
| 544 | adcr = adcr*cos(theta[ilay]); | 
| 545 | xkorr = atten(A0[ihelp+1],A1[ihelp+1],A2[ihelp+1],A3[ihelp+1],x); | 
| 546 | // cout<<A0[ihelp+1]<<" "<<A1[ihelp+1]<<" "<<A2[ihelp+1]<<" "<<A3[ihelp+1]<<" => "<<xkorr<<endl; | 
| 547 | xkorr = xkorr/hepratio; | 
| 548 | //cout<<adcrraw<<" "<<adcr<<" x "<<x<<" theta "<<theta[ilay]<<" xkorr"<<xkorr<<endl; | 
| 549 | dedxr  = adcr/xkorr; | 
| 550 | eDEDXpmtrawstd[ihelp+1] = dedxr; | 
| 551 | Float_t dedxr1  = dedxr*4./dedx_corr[ihelp+1];  // 2nd order corr | 
| 552 | // cout<<"Layer "<<ilay<<" PMT "<<ihelp+1+1<<" ADCrraw "<<adcrraw<<" adcr "<<adcr<<" x "<<x<<" theta "<<theta[ilay]<<" xkorr "<<xkorr<<" dedx "<<dedxr<<" dedx_2nd "<<dedxr1<<endl; | 
| 553 | eDEDXpmtstd[ihelp+1]  = dedxr1; | 
| 554 | // cout<<eDEDXpmt[ihelp+1]<<endl; | 
| 555 | // cout<<"trk "<<eDEDXpmt[ihelp+1]<<" std "<<eDEDXpmtstd[ihelp+1]<<endl; | 
| 556 | } | 
| 557 | }  // tofpos < 100 | 
| 558 |  | 
| 559 | } // i1>-1 | 
| 560 | } // ilay | 
| 561 |  | 
| 562 | //----------------------------------------------------------------- | 
| 563 | // The GetdEdx method "handmade" | 
| 564 | //----------------------------------------------------------------- | 
| 565 |  | 
| 566 |  | 
| 567 | for (Int_t ilay=0; ilay<6; ilay++) { | 
| 568 | Float_t  xhelp=1000.; | 
| 569 | Int_t i1 = paddleidoftrack[ilay]; | 
| 570 | if (i1 != -1) { | 
| 571 | ipad  = ipad_a[ilay]+i1; | 
| 572 | ihelp = ipmt_a[ilay]+(i1*2); | 
| 573 | if ((eDEDXpmtstd[ihelp]<1000.) && (eDEDXpmtstd[ihelp+1]==1000.)) xhelp = eDEDXpmtstd[ihelp]; | 
| 574 | if ((eDEDXpmtstd[ihelp+1]<1000.) && (eDEDXpmtstd[ihelp]==1000.)) xhelp = eDEDXpmtstd[ihelp+1]; | 
| 575 | if ((eDEDXpmtstd[ihelp]<1000.) && (eDEDXpmtstd[ihelp+1]<1000.)) xhelp = 0.5*(eDEDXpmtstd[ihelp]+eDEDXpmtstd[ihelp+1]); | 
| 576 | eDEDXpadstd[ipad] = xhelp; | 
| 577 | eDEDXlayerstd[ilay] = xhelp; | 
| 578 | } | 
| 579 | } // ilay | 
| 580 |  | 
| 581 | } // if (pam_event->GetToFStoredTrack(-1)  )... | 
| 582 |  | 
| 583 |  | 
| 584 | }; | 
| 585 |  | 
| 586 | //------------------------------------------------------------------------ | 
| 587 | void ToFPatch::Define_PMTsat() | 
| 588 | { | 
| 589 | Float_t  sat[48] = { | 
| 590 | 3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27, | 
| 591 | 3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14, | 
| 592 | 3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62, | 
| 593 | 3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26, | 
| 594 | 3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18, | 
| 595 | 3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 }; | 
| 596 | PMTsat.Set(48,sat); | 
| 597 | } | 
| 598 |  | 
| 599 |  | 
| 600 | //------------------------------------------------------------------------ | 
| 601 | void ToFPatch::ReadParAtt(const char *pardir, const char *param) | 
| 602 | { | 
| 603 | char filename[100],filename1[100],filename2[100],name[50]; | 
| 604 | char str1[10]; | 
| 605 |  | 
| 606 |  | 
| 607 |  | 
| 608 | //---------------------  flight --------------------------- | 
| 609 |  | 
| 610 | if (strcmp(param,"simu") != 0){ | 
| 611 | //cout<<"Flight calibrations "<<endl; | 
| 612 |  | 
| 613 | sprintf(filename,"%stime_intervals_10th_red.txt",pardir); | 
| 614 |  | 
| 615 | //cout<<"read Time Interval File "<<filename<<endl; | 
| 616 |  | 
| 617 | FILE *ftimein = fopen( filename , "r" ); | 
| 618 |  | 
| 619 | for (int ii=0; ii<100; ii++) { | 
| 620 | UInt_t tp[2]; | 
| 621 | if(fscanf(ftimein,"%s %u %u", | 
| 622 | &str1[0], &tp[0], &tp[1])!=3) break; | 
| 623 | //cout<<str1<<" "<<tp[0]<<" "<<tp[1]<<endl; | 
| 624 | T_int_min[ii] = tp[0]; | 
| 625 | T_int_max[ii] = tp[1]; | 
| 626 |  | 
| 627 |  | 
| 628 | sprintf(name,"tofcalib_%s_atten.dat",str1); | 
| 629 | //  cout<<"test name  "<<name<<endl; | 
| 630 | sprintf(filename1,"%s%s",pardir,name); | 
| 631 |  | 
| 632 | //cout<<"read Attenuation file "<<filename1<<endl; | 
| 633 | FILE *fattin = fopen( filename1, "r" ); | 
| 634 |  | 
| 635 | Float_t A0help[48]; | 
| 636 | Float_t A1help[48]; | 
| 637 | Float_t A2help[48]; | 
| 638 | Float_t A3help[48]; | 
| 639 |  | 
| 640 |  | 
| 641 | for (int i=0; i<48; i++) { | 
| 642 | int   id=0; | 
| 643 | float par[4]; | 
| 644 | if(fscanf(fattin,"%d %f %f %f %f", | 
| 645 | &id, &par[0], &par[1], &par[2], &par[3] )!=5) break; | 
| 646 | A0help[i] = par[0]; | 
| 647 | A1help[i] = par[1]; | 
| 648 | A2help[i] = par[2]; | 
| 649 | A3help[i] = par[3]; | 
| 650 | } | 
| 651 |  | 
| 652 | A0_array[ii].Set(48,A0help); | 
| 653 | A1_array[ii].Set(48,A1help); | 
| 654 | A2_array[ii].Set(48,A2help); | 
| 655 | A3_array[ii].Set(48,A3help); | 
| 656 |  | 
| 657 |  | 
| 658 | fclose(fattin); | 
| 659 |  | 
| 660 |  | 
| 661 | if (T_int_max[ii] == 2000000000)  break;  // end of file | 
| 662 |  | 
| 663 | } | 
| 664 | fclose(ftimein); | 
| 665 |  | 
| 666 | } // flight | 
| 667 |  | 
| 668 | //---------------------  simu --------------------------- | 
| 669 |  | 
| 670 | if ( strcmp(param,"simu") == 0){ | 
| 671 |  | 
| 672 | //cout<<"Simulation calibrations "<<endl; | 
| 673 | sprintf(name,"tofcalib_gp_atten.dat"); | 
| 674 | sprintf(filename1,"%s%s",pardir,name); | 
| 675 |  | 
| 676 | cout<<"read Attenuation file "<<filename1<<endl; | 
| 677 | FILE *fattin = fopen( filename1, "r" ); | 
| 678 |  | 
| 679 | Float_t A0help[48]; | 
| 680 | Float_t A1help[48]; | 
| 681 | Float_t A2help[48]; | 
| 682 | Float_t A3help[48]; | 
| 683 |  | 
| 684 |  | 
| 685 | for (int i=0; i<48; i++) { | 
| 686 | int   id=0; | 
| 687 | float par[4]; | 
| 688 | if(fscanf(fattin,"%d %f %f %f %f", | 
| 689 | &id, &par[0], &par[1], &par[2], &par[3] )!=5) break; | 
| 690 | A0help[i] = par[0]; | 
| 691 | A1help[i] = par[1]; | 
| 692 | A2help[i] = par[2]; | 
| 693 | A3help[i] = par[3]; | 
| 694 | } | 
| 695 |  | 
| 696 | A0_array[0].Set(48,A0help); | 
| 697 | A1_array[0].Set(48,A1help); | 
| 698 | A2_array[0].Set(48,A2help); | 
| 699 | A3_array[0].Set(48,A3help); | 
| 700 |  | 
| 701 |  | 
| 702 | fclose(fattin); | 
| 703 |  | 
| 704 | T_int_min[0] = 1000000000; | 
| 705 | T_int_max[0] = 2000000000; | 
| 706 |  | 
| 707 |  | 
| 708 | } // simu | 
| 709 |  | 
| 710 |  | 
| 711 |  | 
| 712 |  | 
| 713 | // set first time interval | 
| 714 | ical_atten = 0; | 
| 715 | tmin_atten = T_int_min[0]; | 
| 716 | tmax_atten = T_int_max[0]; | 
| 717 |  | 
| 718 | // set first time interval attenuation | 
| 719 |  | 
| 720 | TArrayF &Apar0 =  A0_array[0]; | 
| 721 | TArrayF &Apar1 =  A1_array[0]; | 
| 722 | TArrayF &Apar2 =  A2_array[0]; | 
| 723 | TArrayF &Apar3 =  A3_array[0]; | 
| 724 |  | 
| 725 | for (Int_t ii=0; ii<48;ii++) { | 
| 726 | A0[ii]=Apar0[ii]; | 
| 727 | A1[ii]=Apar1[ii]; | 
| 728 | A2[ii]=Apar2[ii]; | 
| 729 | A3[ii]=Apar3[ii]; | 
| 730 | } | 
| 731 |  | 
| 732 | cout<<"First time interval attenuation: "<<tmin_atten<<" - "<<tmax_atten<<endl; | 
| 733 |  | 
| 734 |  | 
| 735 | //----------------------------------------------------------- | 
| 736 | // Here I  read the dEdx_korr parameters 2nd order | 
| 737 | //----------------------------------------------------------- | 
| 738 |  | 
| 739 | //Double_t t1,t2,tm; | 
| 740 | UInt_t t1,t2,tm; | 
| 741 | Float_t xmean1,xwidth1; | 
| 742 | Float_t pmthelp[48]; | 
| 743 |  | 
| 744 | //---------------------  flight --------------------------- | 
| 745 | if ( strcmp(param,"simu") != 0){ | 
| 746 |  | 
| 747 | sprintf(filename2,"%sdedx_2nd_corr_paddlehit.dat",pardir); | 
| 748 |  | 
| 749 | //cout<<"Filename 2nd order "<<filename2<<endl; | 
| 750 | ifstream fin(filename2); | 
| 751 |  | 
| 752 | Int_t jj=0; | 
| 753 | Int_t idummy; | 
| 754 | while (! fin.eof()) { | 
| 755 | fin>>t1>>tm>>t2; | 
| 756 | //cout<<jj<<" "<<tm<<endl; | 
| 757 | //cout << setiosflags(ios::fixed)  << setw(10) << setprecision(3) << tm << endl; | 
| 758 | //cout <<t1<<" "<<tm<<" "<<t2<<endl; | 
| 759 | mtime[jj]=tm; | 
| 760 | for (Int_t ii=0; ii<48;ii++) { | 
| 761 | fin>>idummy>>xmean1>>xwidth1; | 
| 762 | pmthelp[ii] = xmean1; | 
| 763 | } | 
| 764 | dedx_corr_m[jj].Set(48,pmthelp); | 
| 765 | jj=jj+1; | 
| 766 | } | 
| 767 |  | 
| 768 | /* | 
| 769 | Int_t idummy; | 
| 770 | for (Int_t jj=0; jj<2000; jj++) { | 
| 771 | fin>>t1>>tm>>t2; | 
| 772 | cout<<jj<<" "<<t1<<" "<<tm<<" "<<t2<<endl; | 
| 773 | if (t2==2000000000) break; | 
| 774 | cout << setiosflags(ios::fixed)  << setw(10) << setprecision(3) << tm << endl; | 
| 775 | mtime[jj]=tm; | 
| 776 | for (Int_t ii=0; ii<48;ii++) { | 
| 777 | fin>>idummy>>xmean1>>xwidth1; | 
| 778 | dedx_corr_m[jj][ii]=xmean1; | 
| 779 | } | 
| 780 | } | 
| 781 | */ | 
| 782 |  | 
| 783 | fin.close(); | 
| 784 |  | 
| 785 | }  // flight | 
| 786 |  | 
| 787 | //---------------------  simu --------------------------- | 
| 788 |  | 
| 789 | if ( strcmp(param,"simu") == 0){ | 
| 790 |  | 
| 791 | sprintf(filename2,"%sdedx_2nd_corr_simu.dat",pardir); | 
| 792 |  | 
| 793 | cout<<"Filename 2nd order "<<filename2<<endl; | 
| 794 | ifstream fin(filename2); | 
| 795 |  | 
| 796 | Int_t jj=0; | 
| 797 | Int_t idummy; | 
| 798 | while (! fin.eof()) { | 
| 799 | fin>>t1>>tm>>t2; | 
| 800 | //cout<<jj<<" "<<tm<<endl; | 
| 801 | //cout << setiosflags(ios::fixed)  << setw(10) << setprecision(3) << tm << endl; | 
| 802 | cout <<t1<<" "<<tm<<" "<<t2<<endl; | 
| 803 | mtime[jj]=tm; | 
| 804 | for (Int_t ii=0; ii<48;ii++) { | 
| 805 | fin>>idummy>>xmean1>>xwidth1; | 
| 806 | pmthelp[ii] = xmean1; | 
| 807 | } | 
| 808 | dedx_corr_m[jj].Set(48,pmthelp); | 
| 809 | jj=jj+1; | 
| 810 | } | 
| 811 |  | 
| 812 | fin.close(); | 
| 813 |  | 
| 814 | }  // simu | 
| 815 |  | 
| 816 |  | 
| 817 | // set first time interval | 
| 818 | ical_2nd=0; | 
| 819 | tmin_2nd = mtime[0]; | 
| 820 | tmax_2nd = mtime[1]; | 
| 821 |  | 
| 822 | cout<<"First time interval 2nd order corr.: "<<tmin_2nd<<" - "<<tmax_2nd<<endl; | 
| 823 |  | 
| 824 |  | 
| 825 | } | 
| 826 |  | 
| 827 |  | 
| 828 | //---------------------------------------------------------------------------- | 
| 829 |  | 
| 830 | double ToFPatch::atten(float C0, float C1, float C2, float C3,  float x){ | 
| 831 | // | 
| 832 | Float_t yval = C0*exp(x*C1)+C2*exp(x*C3) ; | 
| 833 | //   cout<<" in fl "<<C0<<" " <<C1<<" "<<C2<<" "<<C3<<" "<<C4<<" "<<x<<" "<<yval<<endl; | 
| 834 | return yval ; | 
| 835 | } | 
| 836 |  | 
| 837 |  | 
| 838 | //------------------------------------------------------------------------ | 
| 839 |  | 
| 840 | double ToFPatch::f_adcPC( float x ) | 
| 841 | { | 
| 842 | //  return 28.12+0.6312*x-5.647e-05*x*x+3.064e-08*x*x*x; | 
| 843 | return 28.0407 + 0.628929*x  - 5.80901e-05*x*x + 3.14092e-08*x*x*x;  // standard calibration curve since jan-07 | 
| 844 |  | 
| 845 | } | 
| 846 |  | 
| 847 | //------------------------------------------------------------------------ | 
| 848 |  | 
| 849 |  | 
| 850 |  | 
| 851 |  |