1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 Revision 1.4 2007/10/04 15:36:44 zampolli
18 Updates to new TOF offline calibration schema
20 Revision 1.3 2007/07/31 07:26:16 zampolli
21 Bug fixed in the $ field
25 // task to perform TOF calibration
26 // optimized for pp runs
27 // expect a maximum of 100 entries per channel
28 // different ways to calibrate are implemented
44 #include <TDirectory.h>
47 #include "AliTOFCalibTask.h"
48 #include "AliESDEvent.h"
49 #include "AliESDtrack.h"
51 #include "AliCDBManager.h"
52 #include "AliCDBMetaData.h"
54 #include "AliCDBStorage.h"
56 //______________________________________________________________________________
57 AliTOFCalibTask::AliTOFCalibTask(const char *name) :
58 AliAnalysisTask(name,""),
88 // Input slot #0 works with an Ntuple
90 DefineInput(0, TChain::Class());
91 // Output slot #0 writes into a TH1 container
92 DefineOutput(0, TObjArray::Class()) ;
93 fdir = gDirectory->GetPath();
94 fbigarray = new Float_t*[TOFCHANNELS];
95 findexarray = new Int_t[TOFCHANNELS];
97 for (Int_t i=0;i<11;i++){
101 for (Int_t i =0;i<TOFCHANNELS;i++){
102 fbigarray[i] = new Float_t[CHENTRIES];
104 for (Int_t j =0;j<CHENTRIES;j++){
110 //______________________________________________________________________________
111 AliTOFCalibTask::AliTOFCalibTask(const AliTOFCalibTask &calibtask) :
112 AliAnalysisTask("AliTOFCalibTask",""),
143 fChain=calibtask.fChain;
146 fTime=calibtask.fTime;
147 fExpTimePi=calibtask.fExpTimePi;
148 fExpTimeKa=calibtask.fExpTimeKa;
149 fExpTimePr=calibtask.fExpTimePr;
150 fMinTime=calibtask.fMinTime;
151 fnESD=calibtask.fnESD;
152 fnESDselected=calibtask.fnESDselected;
153 fnESDkTOFout=calibtask.fnESDkTOFout;
154 fnESDkTIME=calibtask.fnESDkTIME;
155 fnESDassTOFcl=calibtask.fnESDassTOFcl;
156 fnESDTIMEcut=calibtask.fnESDTIMEcut;
157 fnESDTRDcut=calibtask.fnESDTRDcut;
158 fhToT=calibtask.fhToT;
159 fhTime=calibtask.fhTime;
160 fhExpTimePi=calibtask.fhExpTimePi;
161 fhExpTimeKa=calibtask.fhExpTimeKa;
162 fhExpTimePr=calibtask.fhExpTimePr;
163 fhPID=calibtask.fhPID;
166 fOutputContainer=calibtask.fOutputContainer;
168 fbigarray = new Float_t*[TOFCHANNELS];
169 findexarray = new Int_t[TOFCHANNELS];
171 for (Int_t i=0;i<11;i++){
172 fassparticle[i]=calibtask.fassparticle[i];
175 for (Int_t i =0;i<TOFCHANNELS;i++){
176 fbigarray[i] = new Float_t[CHENTRIES];
177 findexarray[i]=calibtask.findexarray[i];
178 for (Int_t j =0;j<CHENTRIES;j++){
179 fbigarray[i][j]=calibtask.fbigarray[i][j];
184 //______________________________________________________________________________
185 AliTOFCalibTask:: ~AliTOFCalibTask()
189 AliInfo("TOF Calib Task: Deleting");
192 delete fOutputContainer;
201 //______________________________________________________________________________
202 AliTOFCalibTask& AliTOFCalibTask::operator=(const AliTOFCalibTask &calibtask)
204 //assignment operator
205 this->fdir=calibtask.fdir;
206 this->fChain=calibtask.fChain;
207 this->fESD=calibtask.fESD;
208 this->fToT=calibtask.fToT;
209 this->fTime=calibtask.fTime;
210 this->fExpTimePi=calibtask.fExpTimePi;
211 this->fExpTimeKa=calibtask.fExpTimeKa;
212 this->fExpTimePr=calibtask.fExpTimePr;
213 this->fMinTime=calibtask.fMinTime;
214 this->fnESD=calibtask.fnESD;
215 this->fnESDselected=calibtask.fnESDselected;
216 this->fnESDkTOFout=calibtask.fnESDkTOFout;
217 this->fnESDkTIME=calibtask.fnESDkTIME;
218 this->fnESDassTOFcl=calibtask.fnESDassTOFcl;
219 this->fnESDTIMEcut=calibtask.fnESDTIMEcut;
220 this->fnESDTRDcut=calibtask.fnESDTRDcut;
221 this->fhToT=calibtask.fhToT;
222 this->fhTime=calibtask.fhTime;
223 this->fhExpTimePi=calibtask.fhExpTimePi;
224 this->fhExpTimeKa=calibtask.fhExpTimeKa;
225 this->fhExpTimePr=calibtask.fhExpTimePr;
226 this->fOutputContainer=calibtask.fOutputContainer;
227 this->fhPID=calibtask.fhPID;
228 this->fhch=calibtask.fhch;
230 this->fbigarray = new Float_t*[TOFCHANNELS];
231 this->findexarray = new Int_t[TOFCHANNELS];
233 for (Int_t i=0;i<11;i++){
234 this->fassparticle[i]=calibtask.fassparticle[i];
236 for (Int_t i =0;i<TOFCHANNELS;i++){
237 this->fbigarray[i] = new Float_t[CHENTRIES];
238 this->findexarray[i]=calibtask.findexarray[i];
239 for (Int_t j =0;j<CHENTRIES;j++){
240 this->fbigarray[i][j]=calibtask.fbigarray[i][j];
245 //--------------------------------------------------------------------------
246 void AliTOFCalibTask::BookHistos(){
250 AliInfo(Form("*** Booking Histograms %s", GetName())) ;
253 new TH1F("hToT", " ToT distribution (ns) ", 400, 0, 40);
255 new TH1F("hTime", " Time distribution (ns) ", 400, 0, 40);
257 new TH1F("hExpTimePi", " Exp Time distribution, Pi (ns) ", 400, 0, 40);
259 new TH1F("hExpTimeKa", " Exp Time distribution, Ka (ns) ", 400, 0, 40);
261 new TH1F("hExpTimePr", " Exp Time distribution, Pr (ns) ", 400, 0, 40);
263 new TH1I("hPID", " Combinatorial PID identity ", 3, 0, 3);
265 new TH1D("hch", " TOF channel ", TOFCHANNELS, 0, TOFCHANNELS);
267 //create the putput container
268 fOutputContainer = new TObjArray(7) ;
269 fOutputContainer->SetName(GetName()) ;
271 fOutputContainer->AddAt(fhToT, 0) ;
272 fOutputContainer->AddAt(fhTime, 1) ;
273 fOutputContainer->AddAt(fhExpTimePi, 2) ;
274 fOutputContainer->AddAt(fhExpTimeKa, 3) ;
275 fOutputContainer->AddAt(fhExpTimePr, 4) ;
276 fOutputContainer->AddAt(fhPID, 5) ;
277 fOutputContainer->AddAt(fhch, 6) ;
280 //----------------------------------------------------------------------------
281 void AliTOFCalibTask::DrawHistos(){
283 // drawing output histos
285 AliInfo(Form("*** Drawing Histograms %s", GetName())) ;
287 TCanvas * canvasToTTime = new TCanvas("canvasToTTime", " ToT and Time ",400, 30, 550, 630) ;
288 canvasToTTime->Divide(1,2);
289 canvasToTTime->cd(1);
290 fhToT->SetLineColor(4);
291 fhToT->GetXaxis()->SetTitle("ToT (ns)");
293 canvasToTTime->cd(2);
294 fhTime->SetLineColor(4);
295 fhTime->GetXaxis()->SetTitle("Time (ns)");
296 fhTime->Draw("hist");
297 canvasToTTime->Update();
298 canvasToTTime->Print("ToTTime.gif");
300 TCanvas * canvasExpTime = new TCanvas("canvasExpTime", " Expected Times ",400, 30, 550, 630) ;
301 canvasExpTime->Divide(1,3);
302 canvasExpTime->cd(1);
303 fhExpTimePi->SetLineColor(4);
304 fhExpTimePi->GetXaxis()->SetTitle("Exp Time (ns), #pi");
305 fhExpTimePi->Draw("hist");
306 canvasExpTime->cd(2);
307 fhExpTimeKa->SetLineColor(4);
308 fhExpTimeKa->GetXaxis()->SetTitle("Exp Time (ns), K");
309 fhExpTimeKa->Draw("hist");
310 canvasExpTime->cd(3);
311 fhExpTimePr->SetLineColor(4);
312 fhExpTimePr->GetXaxis()->SetTitle("Exp Time (ns), p");
313 fhExpTimePr->Draw("hist");
315 canvasExpTime->Print("ExpTime.gif");
317 TCanvas * canvasPID = new TCanvas("canvasPID", " Combinatorial PID ",400, 30, 550, 400);
318 fhPID->GetXaxis()->SetTitle("Comb PID");
319 fhPID->GetXaxis()->SetBinLabel(1,"#pi");
320 fhPID->GetXaxis()->SetBinLabel(2,"K");
321 fhPID->GetXaxis()->SetBinLabel(3,"p");
324 canvasPID->Print("PID.gif");
326 TCanvas * canvasrndch = new TCanvas("canvasrndch", " TOF channel ",400, 30, 550, 400);
327 fhch->GetXaxis()->SetTitle("TOF ch");
329 Float_t meanTOFch = 0;
330 for (Int_t ibin=0;ibin<TOFCHANNELS;ibin++){
331 meanTOFch+=(Float_t)fhch->GetBinContent(ibin+1);
334 meanTOFch/=TOFCHANNELS;
335 AliDebug(1,Form(" Mean number of tracks/channel = %f ",meanTOFch));
337 canvasrndch->Print("rndch.gif");
340 sprintf(line, ".!tar -zcvf %s.tar.gz *.gif", GetName()) ;
341 gROOT->ProcessLine(line);
342 sprintf(line, ".!rm -fR *.gif");
343 gROOT->ProcessLine(line);
344 AliInfo(Form("*** TOF Calib Task: plots saved in %s.tar.gz...\n", GetName())) ;
347 //______________________________________________________________________________
348 void AliTOFCalibTask::ConnectInputData(const Option_t*)
350 // Initialization of branch container and histograms
352 // AliLog::SetClassDebugLevel("AliTOFCalibTask",1);
353 AliInfo(Form("*** Initialization of %s", GetName())) ;
356 fChain = dynamic_cast<TChain *>(GetInputData(0)) ;
358 AliError(Form("Input 0 for %s not found\n", GetName()));
362 // One should first check if the branch address was taken by some other task
363 char ** address = (char **)GetBranchAddress(0, "ESD");
365 fESD = (AliESDEvent*)(*address);
367 fESD = new AliESDEvent();
369 fESD->ReadFromTree(fChain) ;
374 //-----------------------------------------------------------------------
375 Bool_t AliTOFCalibTask::Notify()
377 // Initialisation of branch container and histograms
379 AliInfo(Form("*** We are in %s::Notify()", GetName())) ;
382 fChain = dynamic_cast<TChain *>(GetInputData(0)) ;
384 AliError(Form("Input 0 for %s not found\n", GetName()));
388 char ** address = (char **)GetBranchAddress(0, "ESD");
390 fESD = (AliESDEvent*)(*address);
392 fESD = new AliESDEvent();
394 fESD->ReadFromTree(fChain) ;
399 //________________________________________________________________________
400 void AliTOFCalibTask::CreateOutputObjects()
405 //______________________________________________________________________________
406 void AliTOFCalibTask::Exec(Option_t * opt)
411 AliInfo(Form("*** Executing %s", GetName())) ;
413 //******* The loop over events -----------------------------------------------
415 // Processing of one event
416 Long64_t entry = fChain->GetReadEntry() ;
418 AliError("fESD is not connected to the input!") ;
422 if ( !((entry-1)%100) )
423 AliDebug(1,Form("%s ----> Processing event # %lld", (dynamic_cast<TChain *>(fChain))->GetFile()->GetName(), entry)) ;
425 // ************************ TOF *************************************
427 fMinTime=22E3; //ns; not used
428 Int_t ntrk = fESD->GetNumberOfTracks() ;
434 AliESDtrack * t = fESD->GetTrack(ntrk) ;
435 //selecting only good quality tracks
436 if (!Select(t)) continue;
438 Int_t ich = Int_t(t->GetTOFCalChannel());
441 AliDebug(2,Form(" ESD in channel %i, filling array %i",t->GetTOFCalChannel(),ich));
442 Float_t tot = t->GetTOFsignalToT();
443 Float_t time = t->GetTOFsignalRaw();
444 AliDebug(2,Form(" track # %i in channel %i, time = %f \n",ntrk,ich,time));
445 Double_t expTime[10];
446 t->GetIntegratedTimes(expTime);
447 Float_t expTimePi = expTime[2]*1.E-3;
448 Float_t expTimeKa = expTime[3]*1.E-3;
449 Float_t expTimePr = expTime[4]*1.E-3;
450 if (findexarray[ich]==(Int_t)(CHENTRIES/NIDX)) {
451 AliInfo(Form("too many tracks in channel %i, not storing any more...",ich));
455 AliDebug(2,Form("tracks in channel %i = %i, storing... ",ich, findexarray[ich] ));
456 Int_t ientry=(findexarray[ich]-1)*NIDX;
457 fbigarray[ich][ientry+DELTAIDXTOT]=tot; //in ns
458 fbigarray[ich][ientry+DELTAIDXTIME]=time*1E-3; // in ns
459 fbigarray[ich][ientry+DELTAIDXEXTIMEPI]=expTimePi;
460 fbigarray[ich][ientry+DELTAIDXEXTIMEKA]=expTimeKa;
461 fbigarray[ich][ientry+DELTAIDXEXTIMEPR]=expTimePr;
462 fhToT->Fill(fbigarray[ich][ientry+DELTAIDXTOT]);
463 fhTime->Fill(fbigarray[ich][ientry+DELTAIDXTIME]);
464 fhExpTimePi->Fill(fbigarray[ich][ientry+DELTAIDXEXTIMEPI]);
465 fhExpTimeKa->Fill(fbigarray[ich][ientry+DELTAIDXEXTIMEKA]);
466 fhExpTimePr->Fill(fbigarray[ich][ientry+DELTAIDXEXTIMEPR]);
467 AliDebug(2, Form("track = %i, tot = %f, time = %f, and Exp time in TOF: pi = %f, K = %f, p = %f",itr, fbigarray[ich][ientry+DELTAIDXTOT], fbigarray[ich][ientry+DELTAIDXTIME], expTimePi,expTimeKa,expTimePr));
469 fnESDselected+=nselected;
471 PostData(0, fOutputContainer);
474 //_____________________________________________________________________________
475 void AliTOFCalibTask::Terminate(Option_t *)
477 // Processing when the event loop is ended
481 TH1::AddDirectory(0);
482 TDirectory *dir = gDirectory;
483 AliInfo("TOF Calib Task: End of events loop");
484 for (Int_t ich = 0;ich<TOFCHANNELS;ich++){
485 if (findexarray[ich]>0){
486 Int_t ncuttime = SelectOnTime(&fbigarray[ich][0],findexarray[ich],ich);
487 fnESDselected-=ncuttime;
491 AliInfo(Form(" Number of analyzed ESD tracks: %i\n",fnESD));
492 AliInfo(Form(" Number of selected ESD tracks: %i\n",fnESDselected));
493 AliInfo(Form(" Number of ESD tracks with kTOFout: %i\n",fnESDkTOFout));
494 AliInfo(Form(" Number of ESD tracks with kTIME: %i\n",fnESDkTIME));
495 AliInfo(Form(" Number of ESD tracks with TRDcut: %i\n",fnESDTRDcut));
496 AliInfo(Form(" Number of ESD tracks with TIMEcut: %i\n",fnESDTIMEcut));
497 AliInfo(Form(" Number of ESD tracks with assTOFcl: %i\n",fnESDassTOFcl));
499 for (Int_t i = 0;i<TOFCHANNELS;i++){
500 Int_t size=findexarray[i]*NIDX;
501 if (i==3) AliInfo(Form(" entries %i in channel %i ",findexarray[i],i));
502 AliDebug(2, Form(" entries %i in channel %i ",findexarray[i],i));
503 if (findexarray[i]<=2) {
504 AliDebug(1, Form(" not enough statistics for combined PID for channel %i, putting all the tracks as if they were pions",i));
507 if (!CombPID(&fbigarray[i][0], size)) AliError("ERROR!!!!ERROR!!!");
513 // saving data in a tree
515 AliInfo("Building tree for Calibration");
516 TTree * tree = new TTree("T", "Tree for TOF calibration");
517 Float_t p[CHENTRIESSMALL];
519 tree->Branch("nentries",&nentries,"nentries/I");
520 tree->Branch("TOFentries",p,"TOFentries[nentries]/F");
521 for (Int_t i=0;i<TOFCHANNELS;i++){
522 nentries=findexarray[i]*(NIDXSMALL); // when filling small array,
523 // only first 3 floats taken
525 for (Int_t j=0; j<findexarray[i];j++){
526 for (Int_t k=0; k<NIDXSMALL;k++){
527 Int_t index1= j*NIDXSMALL+k; // index in small array
528 Int_t index2=j*NIDX+k; // index in big array
529 p[index1]=fbigarray[i][index2];
535 AliInfo("Putting tree for calibration in Reference data");
538 Char_t filename[100];
539 sprintf(filename,"alien:///alice/cern.ch/user/c/czampolli/TOFCalibReference_%i.root",frun);
540 TGrid::Connect("alien://");
541 TFile *filegrid = TFile::Open(filename,"CREATE");
546 //_____________________________________________________________________________
548 Bool_t AliTOFCalibTask::Select(AliESDtrack *t){
550 // selecting good quality tracks
551 //track selection: reconstrution to TOF:
552 if ((t->GetStatus()&AliESDtrack::kTOFout)==0) {
556 //IsStartedTimeIntegral
557 if ((t->GetStatus()&AliESDtrack::kTIME)==0) {
561 if (t->GetStatus() & AliESDtrack::kTRDbackup) {
562 Float_t xout= t->GetOuterParam()->GetX();
563 if (xout<364.25 && xout > 300.) return 0;
566 Double_t time=t->GetTOFsignal();
567 time*=1.E-3; // tof given in nanoseconds
568 if(time >= fMinTime){
573 Double_t mom=t->GetP();
574 if (!(mom<=UPPERMOMBOUND && mom>=LOWERMOMBOUND)){
575 // return 0; // skipping momentum cut
578 UInt_t assignedTOFcluster=t->GetTOFcluster();//index of the assigned TOF cluster, >0 ?
579 if(assignedTOFcluster==0){ // not matched
585 //_____________________________________________________________________________
587 Int_t AliTOFCalibTask::SelectOnTime(Float_t *charray, Int_t ntracks, Int_t ich){
589 // discarding tracks with time-mintime < MINTIME
592 Float_t mintime = 1E6;
593 for (Int_t itr = 0;itr<ntracks;itr++){
594 Int_t ientry=itr*NIDX;
595 Float_t time = charray[ientry+DELTAIDXTIME];// in ns
596 if (time<mintime) mintime = time;
598 AliDebug(1,Form("Mintime for channel %i = %f",ich, mintime));
599 for (Int_t itr = 0;itr<ntracks;itr++){
600 Int_t ientry=itr*NIDX;
601 Float_t time = charray[ientry+DELTAIDXTIME];// in ns
602 if ((time-mintime)>MINTIME) {
604 AliDebug(1,Form("Deleting %i track from channel %i, time = %f",ndeleted, ich, time));
606 for (Int_t j=itr+1;j<ntracks;j++){
608 Int_t idxtot = ientry+DELTAIDXTOT;
609 Int_t idxtime = ientry+DELTAIDXTIME;
610 Int_t idxextimePi = ientry+DELTAIDXEXTIMEPI;
611 Int_t idxextimeKa = ientry+DELTAIDXEXTIMEKA;
612 Int_t idxextimePr = ientry+DELTAIDXEXTIMEPR;
613 Int_t ientrydel=(j-1)*NIDX;
614 Int_t idxtotdel = ientrydel+DELTAIDXTOT;
615 Int_t idxtimedel = ientrydel+DELTAIDXTIME;
616 Int_t idxextimePidel = ientrydel+DELTAIDXEXTIMEPI;
617 Int_t idxextimeKadel = ientrydel+DELTAIDXEXTIMEKA;
618 Int_t idxextimePrdel = ientrydel+DELTAIDXEXTIMEPR;
619 charray[idxtotdel]=charray[idxtot];
620 charray[idxtimedel]=charray[idxtime];
621 charray[idxextimePidel]=charray[idxextimePi];
622 charray[idxextimeKadel]=charray[idxextimeKa];
623 charray[idxextimePrdel]=charray[idxextimePr];
629 //_____________________________________________________________________________
631 Bool_t AliTOFCalibTask::CombPID(Float_t *smallarray, Int_t size){
633 // track Combinatorial PID for calibration, only when more than 2 particles
639 AliDebug(1,"Number of tracks in channel smaller than 2, identifying every particle as if it was a pion!");
643 Int_t ntracksinchannel = size/NIDX;
645 Int_t nset = ntracksinchannel/6;
649 if (ntracksinchannel < 6) {
650 AliDebug(2,"Number of tracks in set smaller than 6, Combinatorial PID still applied to this set.");
654 AliInfo(Form("number of sets = %i", nset));
656 for (Int_t i=0; i< nset; i++) {
657 if (i<nset-1)ntrkinset=6;
659 if (ntracksinchannel<6){
660 ntrkinset=ntracksinchannel;
663 ntrkinset=6+Int_t((ntracksinchannel)%6);
666 AliInfo(Form("set = %i, number of tracks in set = %i", i,ntrkinset));
668 for (Int_t ii=0;ii<ntrkinset;ii++){
672 Float_t* timeofflight;
676 exptof = new Float_t*[ntrkinset];
677 timeofflight = new Float_t[ntrkinset];
678 texp = new Float_t[ntrkinset];
679 index = new Int_t[ntrkinset];
680 for (Int_t ii=0;ii<ntrkinset;ii++){
681 exptof[ii] = new Float_t[3];
687 for (Int_t j=0; j<ntrkinset; j++) {
688 Int_t idxtime = ((6*i+j)*NIDX)+DELTAIDXTIME;
689 Int_t idxextimePi = ((6*i+j)*NIDX)+DELTAIDXEXTIMEPI;
690 Int_t idxextimeKa = ((6*i+j)*NIDX)+DELTAIDXEXTIMEKA;
691 Int_t idxextimePr = ((6*i+j)*NIDX)+DELTAIDXEXTIMEPR;
692 AliDebug(2,Form("idxtime = %i, idxextimePi = %i, idxextimeKa = %i, idxextimePr = %i", idxtime, idxextimePi, idxextimeKa, idxextimePr));
693 Double_t time=smallarray[idxtime]; // TOF time in ns
694 timeofflight[j]=time+t0offset;
695 exptof[j][0]=smallarray[idxextimePi];
696 exptof[j][1]=smallarray[idxextimeKa];
697 exptof[j][2]=smallarray[idxextimePr];
698 AliDebug(2,Form("j = %i, Time = %f, and Exp time in PID: pi = %f, K = %f, p = %f",j,timeofflight[j],exptof[j][0],exptof[j][1],exptof[j][2]));
702 Float_t chisquarebest=999.;
703 AliInfo(Form(" Set = %i with %i tracks ", i,ntrkinset));
704 chisquarebest = LoopCombPID(ntrkinset, ntrkinset,exptof,&texp[0],&timeofflight[0], &index[0],chisquarebest);
706 Float_t confLevel=999;
707 if(chisquarebest<999.){
708 Double_t dblechisquare=(Double_t)chisquarebest;
709 confLevel=(Float_t)TMath::Prob(dblechisquare,ntrkinset-1);
712 // assume they are all pions for fake sets
713 if(confLevel<0.01 || confLevel==999. ){
714 for (Int_t itrk=0; itrk<ntrkinset; itrk++)fassparticle[itrk]=0;
717 AliDebug(2,Form(" Best Assignment, selection %i %i %i %i %i %i %i %i %i %i",fassparticle[0],fassparticle[1],fassparticle[2],fassparticle[3],fassparticle[4],fassparticle[5],fassparticle[6],fassparticle[7],fassparticle[8],fassparticle[9]));
719 for (Int_t kk=0;kk<ntrkinset;kk++){
720 Int_t idxextimePi = ((6*i+kk)*NIDX)+DELTAIDXEXTIMEPI;
721 Int_t idxextimeKa = ((6*i+kk)*NIDX)+DELTAIDXEXTIMEKA;
722 Int_t idxextimePr = ((6*i+kk)*NIDX)+DELTAIDXEXTIMEPR;
723 // storing in third slot of smallarray the assigned expected time
724 fhPID->Fill(fassparticle[kk]);
725 // fassparticle[kk]=0; //assuming all particles are pions
726 if (fassparticle[kk]==0){ //assigned to be a Pi
727 smallarray[idxextimeKa]=-1;
728 smallarray[idxextimePr]=-1;
730 else if (fassparticle[kk]==1){ //assigned to be a Ka
731 smallarray[idxextimePi]=smallarray[idxextimeKa];
732 smallarray[idxextimeKa]=-1;
733 smallarray[idxextimePr]=-1;
735 else if (fassparticle[kk]==2){ //assigned to be a Pr
736 smallarray[idxextimePi]=smallarray[idxextimePr];
737 smallarray[idxextimeKa]=-1;
738 smallarray[idxextimePr]=-1;
745 //---------------------------------------------------------------------
746 Float_t AliTOFCalibTask::LoopCombPID(Int_t itrkinset, Int_t ntrkinset, Float_t **exptof, Float_t *texp, Float_t *timeofflight, Int_t *index, Float_t chisquarebest){
748 Int_t indextr = ntrkinset-itrkinset;
750 for (index[indextr]=0;index[indextr]<3;index[indextr]++){
751 Int_t ii = index[indextr];
752 texp[indextr]=exptof[indextr][ii];
753 if (indextr<ntrkinset-1){
754 chisquarebest = LoopCombPID(ntrkinset-indextr-1,ntrkinset,exptof,&texp[0],&timeofflight[0],&index[0], chisquarebest);
758 Float_t *besttimezero = new Float_t[ntrkinset];
759 Float_t *bestchisquare = new Float_t[ntrkinset];
760 Float_t *bestweightedtimezero = new Float_t[ntrkinset];
761 Float_t sumAllweights=0.;
762 Float_t meantzero=0.;
763 Float_t *weightedtimezero = new Float_t[ntrkinset];
764 Float_t *timezero = new Float_t[ntrkinset];
766 AliDebug(2,Form("Configuration = %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, so far chisquarebest = %f ",index[0],index[1],index[2],index[3],index[4],index[5],index[6],index[7],index[8],index[9],chisquarebest));
767 for (Int_t itz=0; itz<ntrkinset;itz++) {
768 timezero[itz]=texp[itz]-timeofflight[itz];
769 weightedtimezero[itz]=timezero[itz]/TRACKERROR;
770 sumAllweights+=1./TRACKERROR;
771 meantzero+=weightedtimezero[itz];
772 } // end loop for (Int_t itz=0; itz<ntrkinset;itz++)
774 meantzero=meantzero/sumAllweights; // it is given in [ns]
776 // calculate chisquare
778 Float_t chisquare=0.;
779 for (Int_t icsq=0; icsq<ntrkinset;icsq++) {
780 chisquare+=(timezero[icsq]-meantzero)*(timezero[icsq]-meantzero)/TRACKERROR;
781 } // end loop for (Int_t icsq=0; icsq<ntrkinset;icsq++)
784 for (Int_t j=0;j<ntrkinset;j++){
785 if(index[j]==0)npion++;
788 if(chisquare<=chisquarebest && ((Float_t) npion/ ((Float_t) ntrkinset)>0.3)){
789 for(Int_t iqsq = 0; iqsq<ntrkinset; iqsq++) {
790 besttimezero[iqsq]=timezero[iqsq];
791 bestweightedtimezero[iqsq]=weightedtimezero[iqsq];
792 bestchisquare[iqsq]=(timezero[iqsq]-meantzero)*(timezero[iqsq]-meantzero)/TRACKERROR;
795 for (Int_t j=0;j<ntrkinset;j++){
796 fassparticle[j]=index[j];
799 chisquarebest=chisquare;
803 return chisquarebest;