| 1 | #if !defined(__CINT__) || defined(__MAKECINT__) | 
| 2 |  | 
| 3 |  | 
| 4 | #include <fstream> | 
| 5 | #include <sstream> | 
| 6 | #include <string> | 
| 7 | #include <math.h> | 
| 8 | #include <iostream> | 
| 9 | #include <TTree.h> | 
| 10 | #include <TClassEdit.h> | 
| 11 | #include <TObject.h> | 
| 12 | #include <TList.h> | 
| 13 | #include <TSystem.h> | 
| 14 | #include <TSystemDirectory.h> | 
| 15 | #include <TString.h> | 
| 16 | #include <TFile.h> | 
| 17 | #include <TClass.h> | 
| 18 | #include <TCanvas.h> | 
| 19 | #include <TH1.h> | 
| 20 | #include <TH1F.h> | 
| 21 | #include <TH2D.h> | 
| 22 | #include <TLatex.h> | 
| 23 | #include <TPad.h> | 
| 24 | #include <TPaveLabel.h> | 
| 25 | #include <TChain.h> | 
| 26 | #include <TGraph.h> | 
| 27 | #include <TMultiGraph.h> | 
| 28 | #include <TLine.h> | 
| 29 | #include <TStyle.h> | 
| 30 | #include <TF1.h> | 
| 31 | #include <TH1F.h> | 
| 32 | #include <TTree.h> | 
| 33 | #include <TCanvas.h> | 
| 34 | #include <PamLevel2.h> | 
| 35 | #include <iomanip> | 
| 36 | // | 
| 37 | #include <ToFCore.h> | 
| 38 | // | 
| 39 | // Declaration of the core fortran routines | 
| 40 | // | 
| 41 | #define tofl2com tofl2com_ | 
| 42 | extern "C" int tofl2com(); | 
| 43 | #define toftrk toftrk_ | 
| 44 | extern "C" int toftrk(); | 
| 45 | ///extern "C" int toftrk(float); | 
| 46 | #define rdtofcal rdtofcal_ | 
| 47 | extern "C" int rdtofcal(char [], int *); | 
| 48 |  | 
| 49 | using namespace std; | 
| 50 |  | 
| 51 | #endif | 
| 52 |  | 
| 53 | //=================================== | 
| 54 | // global variables | 
| 55 | //=================================== | 
| 56 | TString   DIR; | 
| 57 | TString   OUTF; | 
| 58 | TString   LIST; | 
| 59 | TString   OPTIONS; | 
| 60 | TString   CALIBF; | 
| 61 |  | 
| 62 | PamLevel2 *pam_event = NULL; | 
| 63 |  | 
| 64 | //========================================== | 
| 65 | //000000000000000000000000000000000000000000 | 
| 66 | //========================================== | 
| 67 | Int_t Loop(TString ddir,TString list, TString options){ | 
| 68 | // | 
| 69 | // | 
| 70 | extern struct ToFInput  tofinput_; | 
| 71 | extern struct ToFOutput tofoutput_; | 
| 72 | //  -------------------- | 
| 73 | //  read input file/list | 
| 74 | //  -------------------- | 
| 75 | pam_event = new PamLevel2(ddir,list,options); | 
| 76 | pam_event->SetSELLI(2); | 
| 77 | TTree::SetMaxTreeSize(1000*Long64_t(2000000000)); | 
| 78 | // | 
| 79 | TString outfile_t = ""; | 
| 80 | outfile_t = OUTF; | 
| 81 | outfile_t.Append(".root"); | 
| 82 | TFile *outft = (TFile*)gROOT->FindObject(outfile_t); | 
| 83 | if (outft) outft->Close(); | 
| 84 | outft = new TFile(outfile_t,"RECREATE"); | 
| 85 | if(outft->IsZombie()){ | 
| 86 | cout << "Output file could not be created\n"; | 
| 87 | return 1; | 
| 88 | }; | 
| 89 | cout << "Created output file: "<<outft->GetName()<<endl; | 
| 90 | // | 
| 91 | outft->cd(); | 
| 92 | ToFLevel2 *tof = new ToFLevel2(); | 
| 93 | ToFdEdx *tofdedx = new ToFdEdx(); | 
| 94 | TTree *toft = new TTree("ToF","PAMELA Level2 ToF data"); | 
| 95 | toft->SetAutoSave(900000000000000LL); | 
| 96 | tof->Set();//ELENA **TEMPORANEO?** | 
| 97 | toft->Branch("ToFLevel2","ToFLevel2",&tof); | 
| 98 | // | 
| 99 | pam_event->CreateCloneTrees(outft); | 
| 100 | // | 
| 101 | Int_t ntrkentry = 0; | 
| 102 | Int_t npmtentry = 0; | 
| 103 | Float_t xleft=0; | 
| 104 | Float_t xright=0; | 
| 105 | Float_t yleft=0; | 
| 106 | Float_t yright=0; | 
| 107 | // | 
| 108 | ULong64_t nevents = pam_event->GetEntries(); | 
| 109 | printf("\n\n Running on %llu events \n\n",nevents); | 
| 110 | // | 
| 111 | TFile *tfile = TFile::Open(list.Data(),"READ"); | 
| 112 | TTree *toftr = (TTree*)tfile->Get("ToF"); | 
| 113 | ToFLevel2 *tofl2 = new ToFLevel2(); | 
| 114 | toftr->SetBranchAddress("ToFLevel2", &tofl2); | 
| 115 | ULong64_t ntofev = toftr->GetEntries(); | 
| 116 | printf(" ToF events are %llu \n",ntofev); | 
| 117 | // | 
| 118 | // | 
| 119 | GL_PARAM *glparam = new GL_PARAM(); | 
| 120 | TrkLevel2 *trk = new TrkLevel2(); | 
| 121 | // | 
| 122 | TString host; | 
| 123 | TString user; | 
| 124 | TString psw; | 
| 125 | const char *pamdbhost=gSystem->Getenv("PAM_DBHOST"); | 
| 126 | const char *pamdbuser=gSystem->Getenv("PAM_DBUSER"); | 
| 127 | const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW"); | 
| 128 | if ( !pamdbhost ) pamdbhost = ""; | 
| 129 | if ( !pamdbuser ) pamdbuser = ""; | 
| 130 | if ( !pamdbpsw ) pamdbpsw = ""; | 
| 131 | if ( strcmp(pamdbhost,"") ) host = pamdbhost; | 
| 132 | if ( strcmp(pamdbuser,"") ) user = pamdbuser; | 
| 133 | if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw; | 
| 134 | // | 
| 135 | // | 
| 136 | TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data()); | 
| 137 | if ( !dbc->IsConnected() ) return 1; | 
| 138 | stringstream myquery; | 
| 139 | myquery.str(""); | 
| 140 | myquery << "SET time_zone='+0:00'"; | 
| 141 | dbc->Query(myquery.str().c_str()); | 
| 142 | glparam->Query_GL_PARAM(1,1,dbc); // parameters stored in DB in GL_PRAM table | 
| 143 | trk->LoadField(glparam->PATH+glparam->NAME); | 
| 144 | // | 
| 145 | Long64_t myrun = 0; | 
| 146 | Long64_t mysrun = -1; | 
| 147 | Int_t adc[4][12]; | 
| 148 | Int_t tdc[4][12]; | 
| 149 | Float_t tdcc[4][12]; | 
| 150 | // | 
| 151 | Bool_t defcal = true; | 
| 152 | for(ULong64_t iev=0; iev<nevents; iev++){ | 
| 153 |  | 
| 154 |  | 
| 155 | //================================================================== | 
| 156 |  | 
| 157 |  | 
| 158 | //  for(ULong64_t iev=0; iev<50; iev++){ | 
| 159 | // | 
| 160 | if ( !(iev%1000) ) printf(" %iK \n",(int)iev/1000); | 
| 161 | pam_event->Clear(); | 
| 162 | // | 
| 163 | if( pam_event->GetEntry(iev) ){ | 
| 164 | // | 
| 165 | pam_event->FillCloneTrees(); | 
| 166 | toftr->GetEntry(iev); | 
| 167 | // | 
| 168 | // variable to save information about the tof calibration used | 
| 169 | // | 
| 170 | // | 
| 171 | myrun=pam_event->GetRunInfo()->ID; | 
| 172 | if ( myrun != mysrun ){ | 
| 173 | //      printf(" rhtime %u myrun %i mysrun %i \n",pam_event->GetRunInfo()->RUNHEADER_TIME,(int)myrun,(int)mysrun); | 
| 174 | mysrun = myrun; | 
| 175 | // | 
| 176 |  | 
| 177 |  | 
| 178 |  | 
| 179 |  | 
| 180 | Int_t error=glparam->Query_GL_PARAM(pam_event->GetRunInfo()->RUNHEADER_TIME,204,dbc); // parameters stored in DB in GL_PRAM table | 
| 181 | if ( error<0 ) { | 
| 182 | return(1); | 
| 183 | }; | 
| 184 | // | 
| 185 | tofdedx->ReadParAtt((glparam->PATH+glparam->NAME).Data()); | 
| 186 |  | 
| 187 | // | 
| 188 | error=glparam->Query_GL_PARAM(pam_event->GetRunInfo()->RUNHEADER_TIME,205,dbc); // parameters stored in DB in GL_PRAM table | 
| 189 | if ( error<0 ) { | 
| 190 | return(1); | 
| 191 | }; | 
| 192 | // | 
| 193 | tofdedx->ReadParPos((glparam->PATH+glparam->NAME).Data()); | 
| 194 |  | 
| 195 | // | 
| 196 | error=glparam->Query_GL_PARAM(pam_event->GetRunInfo()->RUNHEADER_TIME,206,dbc); // parameters stored in DB in GL_PRAM table | 
| 197 | if ( error<0 ) { | 
| 198 | return(1); | 
| 199 | }; | 
| 200 | // | 
| 201 | tofdedx->ReadParBBneg((glparam->PATH+glparam->NAME).Data()); | 
| 202 |  | 
| 203 | // | 
| 204 | error=glparam->Query_GL_PARAM(pam_event->GetRunInfo()->RUNHEADER_TIME,207,dbc); // parameters stored in DB in GL_PRAM table | 
| 205 | if ( error<0 ) { | 
| 206 | return(1); | 
| 207 | }; | 
| 208 | // | 
| 209 | tofdedx->ReadParBBpos((glparam->PATH+glparam->NAME).Data()); | 
| 210 |  | 
| 211 | // | 
| 212 | error=glparam->Query_GL_PARAM(pam_event->GetRunInfo()->RUNHEADER_TIME,208,dbc); // parameters stored in DB in GL_PRAM table | 
| 213 | if ( error<0 ) { | 
| 214 | return(1); | 
| 215 | }; | 
| 216 | // | 
| 217 | tofdedx->ReadParDesatBB((glparam->PATH+glparam->NAME).Data()); | 
| 218 |  | 
| 219 |  | 
| 220 | tofdedx->CheckConnectors(pam_event->GetRunInfo()->RUNHEADER_TIME,glparam,dbc); | 
| 221 |  | 
| 222 |  | 
| 223 |  | 
| 224 | error=glparam->Query_GL_PARAM(pam_event->GetRunInfo()->RUNHEADER_TIME,201,dbc); // parameters stored in DB in GL_PRAM table | 
| 225 | if ( error<0 ) { | 
| 226 | return(1); | 
| 227 | }; | 
| 228 | // | 
| 229 | printf(" Reading ToF parameter file: %s \n",(glparam->PATH+glparam->NAME).Data()); | 
| 230 | // | 
| 231 | if ( (UInt_t)glparam->TO_TIME != (UInt_t)4294967295UL ) defcal = false; | 
| 232 | // | 
| 233 | Int_t nlen = (Int_t)(glparam->PATH+glparam->NAME).Length(); | 
| 234 | rdtofcal((char *)(glparam->PATH+glparam->NAME).Data(),&nlen); | 
| 235 | // | 
| 236 | }; | 
| 237 | // | 
| 238 |  | 
| 239 |  | 
| 240 | //================================================================ | 
| 241 | //================================================================== | 
| 242 | //---  Define absolute time | 
| 243 | UInt_t tabs=pam_event->GetOrbitalInfo()->absTime; | 
| 244 |  | 
| 245 | if ( !(iev%1000) ) printf(" ATIME %u re %u \n",(Int_t)tabs,(UInt_t)iev); | 
| 246 |  | 
| 247 | //================================================================== | 
| 248 | Float_t dedx_corr_m[2000][48],dedx_corr[48]; | 
| 249 | Double_t mtime[2000],t1,t2,tm; | 
| 250 | Float_t yhelp1,yhelp2,slope,inter,thelp1,thelp2; | 
| 251 | Float_t xmean1,xwidth1; | 
| 252 |  | 
| 253 | Int_t ical,ii,j,jj; | 
| 254 |  | 
| 255 | if (iev==0) { | 
| 256 |  | 
| 257 | ical=0;  // counter set to zero if first-time reading | 
| 258 |  | 
| 259 | //----------------------------------------------------------- | 
| 260 | // Here I  read the dEdx_korr parameters | 
| 261 | //----------------------------------------------------------- | 
| 262 |  | 
| 263 | jj=0; | 
| 264 | printf(" READING NEW CALIBRATION FILE: %s \n",CALIBF.Data()); | 
| 265 |  | 
| 266 | ifstream fin(CALIBF.Data()); | 
| 267 |  | 
| 268 | while (! fin.eof()) { | 
| 269 | fin>>t1>>tm>>t2; | 
| 270 | //      cout<<jj<<" "<<tm<<endl; | 
| 271 | cout << setiosflags(ios::fixed)  << setw(10) << setprecision(3) << tm << endl; | 
| 272 | mtime[jj]=tm; | 
| 273 | for (ii=0; ii<48;ii++) { | 
| 274 | fin>>j>>xmean1>>xwidth1; | 
| 275 | dedx_corr_m[jj][ii]=xmean1; | 
| 276 | } | 
| 277 | jj=jj+1; | 
| 278 | //      printf(" kk %i \n",jj); | 
| 279 | } | 
| 280 | //      printf(" 1ical %i \n",ical); | 
| 281 |  | 
| 282 | fin.close(); | 
| 283 |  | 
| 284 |  | 
| 285 | while (tabs<mtime[ical] || tabs > mtime[ical+1]) { | 
| 286 | //      printf(" ical %i \n",ical); | 
| 287 | ical = ical+1; | 
| 288 | } | 
| 289 | //      ical = ical-1; | 
| 290 | cout<<"abs time "<<tabs<<" limit low "<<mtime[ical]<<" limit up "<<mtime[ical+1]<<" ical "<<ical<<endl; | 
| 291 | } // if iev==0... | 
| 292 |  | 
| 293 | //================================================================== | 
| 294 | //==  End of first time reading & filling the array | 
| 295 | //================================================================== | 
| 296 |  | 
| 297 | //================================================================== | 
| 298 | //==  if time is outside time limits: | 
| 299 | //================================================================== | 
| 300 |  | 
| 301 | if (tabs<mtime[ical] || tabs>mtime[ical+1]) { | 
| 302 | cout<<"Checking Time Limits!"<<endl; | 
| 303 | ical=0; | 
| 304 | while (tabs > mtime[ical+1] || tabs<mtime[ical]) { | 
| 305 | ical = ical+1; | 
| 306 | } | 
| 307 | //      ical = ical-1; | 
| 308 | cout<<"abs time "<<tabs<<" limit low "<<mtime[ical]<<" limit up "<<mtime[ical+1]<<" ical "<<ical<<endl; | 
| 309 | }; | 
| 310 |  | 
| 311 | //      printf(" 2ical %i \n",ical); | 
| 312 | //================================================================== | 
| 313 | //== interpolate betwen time limits | 
| 314 | //================================================================== | 
| 315 |  | 
| 316 | thelp1 = mtime[ical]; | 
| 317 | thelp2 = mtime[ical+1]; | 
| 318 |  | 
| 319 | for (ii=0; ii<48;ii++) { | 
| 320 | yhelp1 = fabs(dedx_corr_m[ical][ii]); | 
| 321 | //      yhelp1 = 6.; | 
| 322 | if ( yhelp1 < 0.1 ) yhelp1 = 4.; | 
| 323 | yhelp2 = fabs(dedx_corr_m[ical+1][ii]); | 
| 324 | //      yhelp2 = 6.; | 
| 325 | if ( yhelp2 < 0.1 ) yhelp2 = 4.; | 
| 326 | slope  = (yhelp2-yhelp1)/(thelp2-thelp1); | 
| 327 | inter  = yhelp1 - slope*thelp1; | 
| 328 | dedx_corr[ii] = slope*tabs + inter; | 
| 329 | //       if (ii==0) cout<<thelp1<<" "<<thelp2<<" "<<tabs<<" "<<yhelp1<<" "<<yhelp2<<" "<<dedx_corr[0]<<endl; | 
| 330 | } | 
| 331 |  | 
| 332 | //================================================================ | 
| 333 | //================================================================ | 
| 334 | //      printf("cpippo \n"); | 
| 335 |  | 
| 336 | // process tof data | 
| 337 | // | 
| 338 | for (Int_t hh=0; hh<12;hh++){ | 
| 339 | for (Int_t kk=0; kk<4;kk++){ | 
| 340 | adc[kk][hh] = 4095; | 
| 341 | tdc[kk][hh] = 4095; | 
| 342 | tdcc[kk][hh] = 4095.; | 
| 343 | tofinput_.adc[hh][kk] = 4095; | 
| 344 | tofinput_.tdc[hh][kk] = 4095; | 
| 345 | }; | 
| 346 | }; | 
| 347 | //      memset(adc, 0, 12*4*sizeof(Int_t)); | 
| 348 | //      memset(tdc, 0, 12*4*sizeof(Int_t)); | 
| 349 | Int_t gg = 0; | 
| 350 | Int_t hh = 0; | 
| 351 | Int_t adcf[48]; | 
| 352 | memset(adcf, 0, 48*sizeof(Int_t)); | 
| 353 | Int_t tdcf[48]; | 
| 354 | memset(tdcf, 0, 48*sizeof(Int_t)); | 
| 355 | for (Int_t pm=0; pm < tofl2->ntrk() ; pm++){ | 
| 356 | ToFTrkVar *ttf = tofl2->GetToFTrkVar(pm); | 
| 357 | for ( Int_t nc=0; nc < ttf->npmttdc; nc++){ | 
| 358 | if ( (ttf->tdcflag).At(nc) != 0 ) tdcf[(ttf->pmttdc).At(nc)] = 1; | 
| 359 | }; | 
| 360 | for ( Int_t nc=0; nc < ttf->npmtadc; nc++){ | 
| 361 | if ( (ttf->adcflag).At(nc) != 0 ) adcf[(ttf->pmtadc).At(nc)] = 1; | 
| 362 | }; | 
| 363 | }; | 
| 364 | // | 
| 365 | for (Int_t pm=0; pm < tofl2->npmt() ; pm++){ | 
| 366 | ToFPMT *pmt = tofl2->GetToFPMT(pm); | 
| 367 | tofl2->GetPMTIndex(pmt->pmt_id, gg, hh); | 
| 368 | if ( adcf[pmt->pmt_id] == 0 ){ | 
| 369 | tofinput_.adc[gg][hh] = (int)pmt->adc; | 
| 370 | adc[hh][gg] = (int)pmt->adc; | 
| 371 | }; | 
| 372 | if ( tdcf[pmt->pmt_id] == 0 ){ | 
| 373 | tofinput_.tdc[gg][hh] = (int)pmt->tdc; | 
| 374 | tdc[hh][gg] = (int)pmt->tdc; | 
| 375 | }; | 
| 376 | tdcc[hh][gg] = (float)pmt->tdc_tw; | 
| 377 | //        Int_t pppid = tof->GetPMTid(hh,gg); | 
| 378 | //      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); | 
| 379 | }; | 
| 380 | for (Int_t hh=0; hh<12;hh++){ | 
| 381 | for (Int_t kk=0; kk<4;kk++){ | 
| 382 | tofdedx->Init(kk,hh,adc[kk][hh]); | 
| 383 | }; | 
| 384 | }; | 
| 385 | //      for (Int_t pm=0; pm <48 ; pm++){ | 
| 386 | //        tof->GetPMTIndex(pm, gg, hh); | 
| 387 | //        tofinput_.tdc[hh][gg] = (int)500.; | 
| 388 | //        tofinput_.adc[hh][gg] = (int)500.; | 
| 389 | //        tdc[hh][gg] = (int)500.; | 
| 390 | //        adc[hh][gg] = (int)500.; | 
| 391 | //        //      printf(" hh %i gg %i tdc %f adc %f \n",hh,gg,pmt->tdc,pmt->adc); | 
| 392 | //    }; | 
| 393 | // | 
| 394 | for (Int_t hh=0; hh<5;hh++){ | 
| 395 | tofinput_.patterntrig[hh]=pam_event->GetTrigLevel2()->patterntrig[hh]; | 
| 396 | }; | 
| 397 | // | 
| 398 | tof->Clear(); | 
| 399 | Int_t pmt_id = 0; | 
| 400 | ToFPMT *t_pmt = new ToFPMT(); | 
| 401 | if(!(tof->PMT))tof->PMT = new TClonesArray("ToFPMT",12); //ELENA | 
| 402 | TClonesArray &tpmt = *tof->PMT; | 
| 403 | ToFTrkVar *t_tof = new ToFTrkVar(); | 
| 404 | if(!(tof->ToFTrk))tof->ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA | 
| 405 | TClonesArray &t = *tof->ToFTrk; | 
| 406 | // | 
| 407 | // | 
| 408 | // Here we have calibrated data, ready to be passed to the FORTRAN routine which will extract common and track-related  variables. | 
| 409 | // | 
| 410 | npmtentry = 0; | 
| 411 | // | 
| 412 | ntrkentry = 0; | 
| 413 | // | 
| 414 | // Calculate tracks informations from ToF alone | 
| 415 | // | 
| 416 | tofl2com(); | 
| 417 | // | 
| 418 | memcpy(tof->tof_j_flag,tofoutput_.tof_j_flag,6*sizeof(Int_t)); | 
| 419 | // | 
| 420 | t_tof->trkseqno = -1; | 
| 421 | // | 
| 422 | // and now we must copy from the output structure to the level2 class: | 
| 423 | // | 
| 424 | t_tof->npmttdc = 0; | 
| 425 | // | 
| 426 | for (Int_t hh=0; hh<12;hh++){ | 
| 427 | for (Int_t kk=0; kk<4;kk++){ | 
| 428 | if ( tofoutput_.tofmask[hh][kk] != 0 ){ | 
| 429 | pmt_id = tof->GetPMTid(kk,hh); | 
| 430 | t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc); | 
| 431 | t_tof->tdcflag.AddAt(tofoutput_.tdcflagtof[hh][kk],t_tof->npmttdc); // gf: Jan 09/07 | 
| 432 | t_tof->npmttdc++; | 
| 433 | }; | 
| 434 | }; | 
| 435 | }; | 
| 436 | for (Int_t kk=0; kk<13;kk++){ | 
| 437 | t_tof->beta[kk] = tofoutput_.betatof_a[kk]; | 
| 438 | } | 
| 439 | // | 
| 440 | memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos)); | 
| 441 | memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos)); | 
| 442 | memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof)); | 
| 443 | memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof)); | 
| 444 | //      { | 
| 445 | //      Float_t xtof_temp[6]={0.,t_tof->xtofpos[0],t_tof->xtofpos[1],0.,0.,t_tof->xtofpos[2]}; | 
| 446 | //      Float_t ytof_temp[6]={t_tof->ytofpos[0],0.,0.,t_tof->ytofpos[1],t_tof->ytofpos[2],0.}; | 
| 447 | //      tofdedx->Process(pam_event->GetOrbitalInfo()->absTime,t_tof->beta[12], (Float_t *)xtof_temp,(Float_t *)ytof_temp); | 
| 448 | //       } | 
| 449 | //       t_tof->npmtadc = 0; | 
| 450 |  | 
| 451 |  | 
| 452 | //       for (Int_t hh=0; hh<12;hh++){ | 
| 453 | //      for (Int_t kk=0; kk<4;kk++){ | 
| 454 | //        pmt_id = tof->GetPMTid(kk,hh); | 
| 455 | //        if ( tofdedx->GetdEdx_pmt(pmt_id)>-1. ){ | 
| 456 | //          t_tof->dedx.AddAt((tofdedx->GetdEdx_pmt(pmt_id)*36./pow(dedx_corr[pmt_id],2)),t_tof->npmtadc); | 
| 457 | //          t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc); | 
| 458 | //          t_tof->adcflag.AddAt(0,t_tof->npmtadc); // gf: Jan 09/07 | 
| 459 | //          t_tof->npmtadc++; | 
| 460 | //        }; | 
| 461 | //      }; | 
| 462 | //       }; | 
| 463 | { | 
| 464 |  | 
| 465 | Float_t xtof_temp[6]={100.,100.,100.,100.,100.,100.}; | 
| 466 | Float_t ytof_temp[6]={100.,100.,100.,100.,100.,100.}; | 
| 467 |  | 
| 468 | if(t_tof->xtofpos[0]<100. && t_tof->ytofpos[0]<100.){ | 
| 469 | xtof_temp[1]=t_tof->xtofpos[0]; | 
| 470 | ytof_temp[0]=t_tof->ytofpos[0]; | 
| 471 | }else if(t_tof->xtofpos[0]>=100. && t_tof->ytofpos[0]<100.){ | 
| 472 | ytof_temp[0]=t_tof->ytofpos[0]; | 
| 473 | tof->GetPaddleGeometry(0,(Int_t)log2(tof->tof_j_flag[0]),xleft, xright, yleft, yright); | 
| 474 | xtof_temp[1]=xleft+2.55; | 
| 475 | }else if(t_tof->ytofpos[0]>=100. && t_tof->xtofpos[0]<100.){ | 
| 476 | xtof_temp[1]=t_tof->xtofpos[0]; | 
| 477 | tof->GetPaddleGeometry(1,(Int_t)log2(tof->tof_j_flag[1]),xleft, xright, yleft, yright); | 
| 478 | ytof_temp[0]=yleft+2.75; | 
| 479 | } | 
| 480 |  | 
| 481 | if(t_tof->xtofpos[1]<100. && t_tof->ytofpos[1]<100.){ | 
| 482 | xtof_temp[2]=t_tof->xtofpos[1]; | 
| 483 | ytof_temp[3]=t_tof->ytofpos[1]; | 
| 484 | }else if(t_tof->xtofpos[1]>=100. && t_tof->ytofpos[1]<100.){ | 
| 485 | ytof_temp[3]=t_tof->ytofpos[1]; | 
| 486 | tof->GetPaddleGeometry(3,(Int_t)log2(tof->tof_j_flag[3]),xleft, xright, yleft, yright); | 
| 487 | xtof_temp[2]=xleft+4.5; | 
| 488 | }else if(t_tof->ytofpos[1]>=100. && t_tof->xtofpos[1]<100.){ | 
| 489 | xtof_temp[2]=t_tof->xtofpos[1]; | 
| 490 | tof->GetPaddleGeometry(2,(Int_t)log2(tof->tof_j_flag[2]),xleft, xright, yleft, yright); | 
| 491 | ytof_temp[3]=yleft+3.75; | 
| 492 | } | 
| 493 |  | 
| 494 | if(t_tof->xtofpos[2]<100. && t_tof->ytofpos[2]<100.){ | 
| 495 | xtof_temp[5]=t_tof->xtofpos[2]; | 
| 496 | ytof_temp[4]=t_tof->ytofpos[2]; | 
| 497 | }else if(t_tof->xtofpos[2]>=100. && t_tof->ytofpos[2]<100.){ | 
| 498 | ytof_temp[4]=t_tof->ytofpos[2]; | 
| 499 | tof->GetPaddleGeometry(4,(Int_t)log2(tof->tof_j_flag[4]),xleft, xright, yleft, yright); | 
| 500 | xtof_temp[5]=xleft+3; | 
| 501 | }else if(t_tof->ytofpos[2]>=100. && t_tof->xtofpos[2]<100.){ | 
| 502 | xtof_temp[5]=t_tof->xtofpos[2]; | 
| 503 | tof->GetPaddleGeometry(5,(Int_t)log2(tof->tof_j_flag[5]),xleft, xright, yleft, yright); | 
| 504 | ytof_temp[4]=yleft+2.5; | 
| 505 | } | 
| 506 | //       Float_t xtof_temp[6]={0.,t_tof->xtofpos[0],t_tof->xtofpos[1],0.,0.,t_tof->xtofpos[2]}; | 
| 507 | //       Float_t ytof_temp[6]={t_tof->ytofpos[0],0.,0.,t_tof->ytofpos[1],t_tof->ytofpos[2],0.}; | 
| 508 | //      tofdedx->Process(atime,t_tof->beta[12], (Float_t *)xtof_temp,(Float_t *)ytof_temp); | 
| 509 | tofdedx->Process(pam_event->GetOrbitalInfo()->absTime,t_tof->beta[12], (Float_t *)xtof_temp,(Float_t *)ytof_temp); | 
| 510 | t_tof->npmtadc = 0; | 
| 511 | for (Int_t hh=0; hh<12;hh++){ | 
| 512 | for (Int_t kk=0; kk<4;kk++){ | 
| 513 | pmt_id = tof->GetPMTid(kk,hh); | 
| 514 | Int_t Iplane=-1; | 
| 515 | Int_t Ipaddle=-1; | 
| 516 | //      Int_t IpaddleT=-1; | 
| 517 | tof->GetPMTPaddle(pmt_id, Iplane, Ipaddle); | 
| 518 | tof->GetPaddleGeometry(Iplane,Ipaddle,xleft,xright,yleft,yright); | 
| 519 | if ( tofdedx->GetdEdx_pmt(pmt_id)>-1. &&((xtof_temp[Iplane]>=xleft&&xtof_temp[Iplane]<=xright) || (ytof_temp[Iplane]>=yleft&&ytof_temp[Iplane]<=yright)) ){  //attenzione:qui va inserito un controllo sulla traccia tof o sulle variabili di posizione !!!! | 
| 520 | t_tof->dedx.AddAt((tofdedx->GetdEdx_pmt(pmt_id)*4./dedx_corr[pmt_id]),t_tof->npmtadc); | 
| 521 | t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc); | 
| 522 | t_tof->adcflag.AddAt(0,t_tof->npmtadc); // gf: Jan 09/07 | 
| 523 | t_tof->npmtadc++; | 
| 524 | }; | 
| 525 | }; | 
| 526 | }; | 
| 527 | }; | 
| 528 |  | 
| 529 |  | 
| 530 |  | 
| 531 |  | 
| 532 |  | 
| 533 |  | 
| 534 |  | 
| 535 |  | 
| 536 |  | 
| 537 |  | 
| 538 | //       for (Int_t hh=0; hh<12;hh++){ | 
| 539 | //         for (Int_t kk=0; kk<4;kk++){ | 
| 540 | //           if ( tofoutput_.adctof_c[hh][kk] < 1000 ){ | 
| 541 | //             //      t_tof->dedx.AddAt(tofoutput_.adctof_c[hh][kk],t_tof->npmtadc); // EMILIANO | 
| 542 | //             pmt_id = tof->GetPMTid(kk,hh); | 
| 543 | //             t_tof->dedx.AddAt((tofoutput_.adctof_c[hh][kk]*4./dedx_corr[pmt_id]),t_tof->npmtadc); // EMILIANO | 
| 544 | //             t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc); | 
| 545 | //             t_tof->adcflag.AddAt(tofoutput_.adcflagtof[hh][kk],t_tof->npmtadc); // gf: Jan 09/07 | 
| 546 | //             t_tof->npmtadc++; | 
| 547 | //           }; | 
| 548 | //         }; | 
| 549 | //       }; | 
| 550 | // | 
| 551 |  | 
| 552 | // | 
| 553 | new(t[ntrkentry]) ToFTrkVar(*t_tof); | 
| 554 | ntrkentry++; | 
| 555 | t_tof->Clear(); | 
| 556 | // | 
| 557 | // | 
| 558 | // | 
| 559 | t_pmt->Clear(); | 
| 560 | // | 
| 561 | for (Int_t hh=0; hh<12;hh++){ | 
| 562 | for (Int_t kk=0; kk<4;kk++){ | 
| 563 | // new WM | 
| 564 | //      if ( tofoutput_.tdc_c[hh][kk] < 4095 || adc[kk][hh] < 4095  || tdc[kk][hh] < 4095 ){ | 
| 565 | if ( tdcc[kk][hh] < 4095. || adc[kk][hh] < 4095  || tdc[kk][hh] < 4095 ){ | 
| 566 | // | 
| 567 | t_pmt->pmt_id = tof->GetPMTid(kk,hh); | 
| 568 | t_pmt->tdc_tw = tofoutput_.tdc_c[hh][kk]; | 
| 569 | t_pmt->adc = (Float_t)adc[kk][hh]; | 
| 570 | t_pmt->tdc = (Float_t)tdc[kk][hh]; | 
| 571 | // | 
| 572 | new(tpmt[npmtentry]) ToFPMT(*t_pmt); | 
| 573 | npmtentry++; | 
| 574 | t_pmt->Clear(); | 
| 575 | }; | 
| 576 | }; | 
| 577 | }; | 
| 578 | // | 
| 579 | // Calculate track-related variables | 
| 580 | // | 
| 581 | if ( pam_event->GetTrkLevel2()->ntrk() > 0 ){ | 
| 582 | // | 
| 583 | // We have at least one track | 
| 584 | // | 
| 585 | // | 
| 586 | // Run over tracks | 
| 587 | // | 
| 588 | for(Int_t nt=0; nt < pam_event->GetTrkLevel2()->ntrk(); nt++){ | 
| 589 | // | 
| 590 | TrkTrack *ptt = pam_event->GetTrkLevel2()->GetStoredTrack(nt); | 
| 591 | // | 
| 592 | // Copy the alpha vector in the input structure | 
| 593 | // | 
| 594 | for (Int_t e = 0; e < 5 ; e++){ | 
| 595 | tofinput_.al_pp[e] = ptt->al[e]; | 
| 596 | }; | 
| 597 |  | 
| 598 | // new input for 9th reduction: tracker dEdx | 
| 599 | tofinput_.trkmip = ptt->GetDEDX(); | 
| 600 |  | 
| 601 | // | 
| 602 | // Get tracker related variables for this track | 
| 603 | // | 
| 604 | toftrk(); | 
| 605 | //      toftrk(thelp); | 
| 606 | // | 
| 607 | // Copy values in the class from the structure (we need to use a temporary class to store variables). | 
| 608 | // | 
| 609 | t_tof->npmttdc = 0; | 
| 610 | for (Int_t hh=0; hh<12;hh++){ | 
| 611 | for (Int_t kk=0; kk<4;kk++){ | 
| 612 | if ( tofoutput_.tofmask[hh][kk] != 0 ){ | 
| 613 | pmt_id = tof->GetPMTid(kk,hh); | 
| 614 | t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc); | 
| 615 | t_tof->tdcflag.AddAt(tofoutput_.tdcflag[hh][kk],t_tof->npmttdc); // gf: Jan 09/07 | 
| 616 | t_tof->npmttdc++; | 
| 617 | }; | 
| 618 | }; | 
| 619 | }; | 
| 620 | for (Int_t kk=0; kk<13;kk++){ | 
| 621 | t_tof->beta[kk] = tofoutput_.beta_a[kk]; | 
| 622 | }; | 
| 623 | // | 
| 624 | memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos)); | 
| 625 | memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos)); | 
| 626 | memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof)); | 
| 627 | memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof)); | 
| 628 | // | 
| 629 | tofdedx->Process(pam_event->GetOrbitalInfo()->absTime,t_tof->beta[12], (Float_t *)t_tof->xtr_tof,(Float_t *)t_tof->ytr_tof); | 
| 630 | t_tof->npmtadc = 0; | 
| 631 |  | 
| 632 | for (Int_t hh=0; hh<12;hh++){ | 
| 633 | for (Int_t kk=0; kk<4;kk++){ | 
| 634 | pmt_id = tof->GetPMTid(kk,hh); | 
| 635 | Int_t Iplane=-1; | 
| 636 | Int_t Ipaddle=-1; | 
| 637 | Int_t IpaddleT=-1; | 
| 638 | tof->GetPMTPaddle(pmt_id, Iplane, Ipaddle); | 
| 639 | IpaddleT=tof->GetPaddleIdOfTrack(t_tof->xtr_tof[Iplane],t_tof->ytr_tof[Iplane], Iplane,0.0); | 
| 640 | if ( tofdedx->GetdEdx_pmt(pmt_id) > -1. && Ipaddle==IpaddleT ){ | 
| 641 | t_tof->dedx.AddAt((tofdedx->GetdEdx_pmt(pmt_id)*4./dedx_corr[pmt_id]),t_tof->npmtadc); | 
| 642 | t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc); | 
| 643 | t_tof->adcflag.AddAt(0,t_tof->npmtadc); // gf: Jan 09/07 | 
| 644 | t_tof->npmtadc++; | 
| 645 | }; | 
| 646 |  | 
| 647 | }; | 
| 648 | }; | 
| 649 |  | 
| 650 |  | 
| 651 | //        for (Int_t hh=0; hh<12;hh++){ | 
| 652 | //          for (Int_t kk=0; kk<4;kk++){ | 
| 653 | //            pmt_id = tof->GetPMTid(kk,hh); | 
| 654 | //            if ( tofdedx->GetdEdx_pmt(pmt_id) > -1. ){ | 
| 655 | //              t_tof->dedx.AddAt((tofdedx->GetdEdx_pmt(pmt_id)*36./pow(dedx_corr[pmt_id],2)),t_tof->npmtadc); | 
| 656 | //              t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc); | 
| 657 | //              t_tof->adcflag.AddAt(0,t_tof->npmtadc); // gf: Jan 09/07 | 
| 658 | //              printf(" nt %i npmtadc %i dedx %f dedx corr %f\n",nt,t_tof->npmtadc,(tofdedx->GetdEdx_pmt(pmt_id)*36./pow(dedx_corr[pmt_id],2)),dedx_corr[pmt_id]); | 
| 659 | //              t_tof->npmtadc++; | 
| 660 | //            }; | 
| 661 |  | 
| 662 | //          }; | 
| 663 | //        }; | 
| 664 | //        t_tof->npmtadc = 0; | 
| 665 | //        for (Int_t hh=0; hh<12;hh++){ | 
| 666 | //          for (Int_t kk=0; kk<4;kk++){ | 
| 667 | //            if ( tofoutput_.adc_c[hh][kk] < 1000 ){ | 
| 668 | //              //          t_tof->dedx.AddAt(tofoutput_.adc_c[hh][kk],t_tof->npmtadc); // EMILIANO | 
| 669 | //              pmt_id = tof->GetPMTid(kk,hh); | 
| 670 | //              t_tof->dedx.AddAt((tofoutput_.adc_c[hh][kk]*4./dedx_corr[pmt_id]),t_tof->npmtadc); // EMILIANO | 
| 671 | //              t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc); | 
| 672 | //              t_tof->adcflag.AddAt(tofoutput_.adcflag[hh][kk],t_tof->npmtadc); // gf: Jan 09/07 | 
| 673 | //              t_tof->npmtadc++; | 
| 674 | //            }; | 
| 675 | //          }; | 
| 676 | //        }; | 
| 677 | // | 
| 678 |  | 
| 679 | // | 
| 680 | // Store the tracker track number in order to be sure to have shyncronized data during analysis | 
| 681 | // | 
| 682 | t_tof->trkseqno = nt; | 
| 683 | // | 
| 684 | // create a new object for this event with track-related variables | 
| 685 | // | 
| 686 | new(t[ntrkentry]) ToFTrkVar(*t_tof); | 
| 687 | ntrkentry++; | 
| 688 | t_tof->Clear(); | 
| 689 | // | 
| 690 | }; // loop on all the tracks | 
| 691 | }; | 
| 692 | // | 
| 693 | tof->unpackError = tofl2->unpackError; | 
| 694 | if ( defcal ){ | 
| 695 | tof->default_calib = 1; | 
| 696 | } else { | 
| 697 | tof->default_calib = 0; | 
| 698 | }; | 
| 699 | // | 
| 700 | // Fill the rootple | 
| 701 | // | 
| 702 | toft->Fill(); | 
| 703 | // | 
| 704 | //        toft->Show(); | 
| 705 | //        toftr->Show(); | 
| 706 | // | 
| 707 | delete t_tof; | 
| 708 | // | 
| 709 | // | 
| 710 | }; | 
| 711 | // | 
| 712 | }; | 
| 713 | // | 
| 714 | pam_event->Clear(); | 
| 715 | // | 
| 716 | outft->cd(); | 
| 717 | pam_event->WriteCloneTrees(); | 
| 718 | toftr->Delete(); | 
| 719 |  | 
| 720 | toft->Write(); | 
| 721 | outft->Close(); | 
| 722 | // | 
| 723 | return 0; | 
| 724 | // | 
| 725 | } | 
| 726 |  | 
| 727 | ///////////////////////////////////////////////////////////////// | 
| 728 |  | 
| 729 | #if !defined(__CINT__) | 
| 730 |  | 
| 731 | void usage(){ | 
| 732 |  | 
| 733 | cout << "------------------------------------------------------------"<<endl; | 
| 734 | cout << "Loop over events (on one or more Level2-files), applying some selection cuts (defined in My-Selection.cpp), \n"; | 
| 735 | cout << "creating output histograms (defined in My-Histos.cpp) and/or trees with selected events. \n \n "; | 
| 736 | cout << "USAGE:"<<endl; | 
| 737 | cout << "-processDir  DIR     -  Level2 data directory \n"; | 
| 738 | cout << "-processList LIST    -  list  of files (.txt) or single file (.root) to be analysed \n"; | 
| 739 | cout << "-outputFile  PATH    -  name of the output file \n"; | 
| 740 | cout << "-calibFile PATH+NAME -  name of the calibration file \n"; | 
| 741 | cout << "-NumEvents   XXX     -  number of events to be analysed \n"; | 
| 742 | cout << "--debug, -g          -  debug mode \n"; | 
| 743 | cout << "--help, -h           -  print this help \n"; | 
| 744 | cout << "-options [ options ] -  options: \n"; | 
| 745 | cout << "                        fillHistos --> create an output file with histograms  \n"; | 
| 746 | cout << "                        fillTree   --> create an output file with trees storing the selected events \n "; | 
| 747 | cout << "                        +(-)ALL    --> inlcude(exclude) all trees and branches \n "   ; | 
| 748 | cout << "                        +(-)TRK1 +(-)TRK2 +(-)CAL1 +(-)CAL2 +(-)TOF +(-)TRG +(-)ND +(-)S4 +(-)ORB --> inlcude(exclude) trees and branches  \n"  ; | 
| 749 | cout << "------------------------------------------------------------"<<endl; | 
| 750 | } | 
| 751 | // | 
| 752 | int HandleInputPar(int argc, char **argv){ | 
| 753 |  | 
| 754 | if(argc>1){ | 
| 755 |  | 
| 756 | if(!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help") ){ | 
| 757 | usage(); | 
| 758 | return(1); | 
| 759 | }; | 
| 760 | // ----------------------- | 
| 761 | // Read input parameters | 
| 762 | // ----------------------- | 
| 763 | DIR     = gSystem->WorkingDirectory(); | 
| 764 | LIST    = ""; | 
| 765 | OUTF    = "myfile"; | 
| 766 | OPTIONS = "+AUTO -TOF"; | 
| 767 |  | 
| 768 | for (int i = 1; i < argc; i++){ | 
| 769 | // -----------------------------------------------------// | 
| 770 | if (!strcmp(argv[i], "-processDir")){ | 
| 771 | if (++i >= argc) throw -1; | 
| 772 | DIR = argv[i]; | 
| 773 | cout << "processDir "<<DIR<<endl; | 
| 774 | continue; | 
| 775 | } | 
| 776 | // -----------------------------------------------------// | 
| 777 | else if (!strcmp(argv[i], "-processList")){ | 
| 778 | if (++i >= argc) throw -1; | 
| 779 | LIST = argv[i]; | 
| 780 | cout << "processList "<<LIST<<endl; | 
| 781 | continue; | 
| 782 | } | 
| 783 | // -----------------------------------------------------// | 
| 784 | else if (!strcmp(argv[i], "-outputFile")){ | 
| 785 | if (++i >= argc) throw -1; | 
| 786 | OUTF = argv[i]; | 
| 787 | cout << "outputFile "<<OUTF<<endl; | 
| 788 | continue; | 
| 789 | } | 
| 790 | // -----------------------------------------------------// | 
| 791 | // -----------------------------------------------------// | 
| 792 | else if (!strcmp(argv[i], "-calibFile")){ | 
| 793 | if (++i >= argc) throw -1; | 
| 794 | CALIBF = argv[i]; | 
| 795 | cout << "calibFile "<<CALIBF<<endl; | 
| 796 | continue; | 
| 797 | } | 
| 798 | // -----------------------------------------------------// | 
| 799 | else if (!strcmp(argv[i], "-options")){ | 
| 800 | if (++i >= argc) throw -1; | 
| 801 | OPTIONS = argv[i]; | 
| 802 | if( OPTIONS.Contains("[") ){ | 
| 803 | do{ | 
| 804 | if (++i >= argc) throw -1; | 
| 805 | OPTIONS.Append(argv[i]); | 
| 806 | }while(!OPTIONS.Contains("]")); | 
| 807 | }else cout << "wrong option format --> ignoring " << endl; | 
| 808 | } | 
| 809 | else{ | 
| 810 | cout << "Unidentified input parameter. Ignored."<< endl; | 
| 811 | }; | 
| 812 | }; | 
| 813 | }else{ | 
| 814 | usage(); | 
| 815 | return(1); | 
| 816 | }; | 
| 817 | // ----------------------- | 
| 818 | // Check input parameters | 
| 819 | // ----------------------- | 
| 820 |  | 
| 821 |  | 
| 822 | return(0); | 
| 823 |  | 
| 824 | }; | 
| 825 | // | 
| 826 |  | 
| 827 | int main(int argc, char **argv) | 
| 828 | { | 
| 829 |  | 
| 830 | if( HandleInputPar(argc,argv) )return(1); | 
| 831 |  | 
| 832 | cout << "OPTIONS "<<OPTIONS<<endl; | 
| 833 | Loop(DIR,LIST,OPTIONS); | 
| 834 |  | 
| 835 | cout << "Back to main - end"<<endl; | 
| 836 |  | 
| 837 | return 0; | 
| 838 |  | 
| 839 | }; | 
| 840 |  | 
| 841 | #endif |