1 /**************************************************************************
2 * Authors : Massimo Venaruzzo (massimo.venaruzzo@ts.infn.it) *
3 * Enrico Fragiacomo (enrico.fragiacomo@ts.infn.it) *
4 * Contributors are mentioned in the code where appropriate. *
6 * Permission to use, copy, modify and distribute this software and its *
7 * documentation strictly for non-commercial purposes is hereby granted *
8 * without fee, provided that the above copyright notice appears in all *
9 * copies and that both the copyright notice and this permission notice *
10 * appear in the supporting documentation. The authors make no claims *
11 * about the suitability of this software for any purpose. It is *
12 * provided "as is" without express or implied warranty. *
13 **************************************************************************/
15 //-----------------------------------------------------------------
16 // AliAnalysisTaskSigma1385 class
17 //-----------------------------------------------------------------
23 #include "AliAnalysisManager.h"
24 #include <AliMCEventHandler.h>
25 #include <AliMCEvent.h>
42 #include "AliESDEvent.h"
43 #include "AliAODEvent.h"
44 #include "AliCascadeVertexer.h"
45 #include "AliESDcascade.h"
46 #include "AliAODcascade.h"
47 #include "AliAnalysisTaskSigma1385.h"
48 #include "AliESDtrackCuts.h"
49 #include "AliESDpid.h"
50 #include "AliTOFT0maker.h"
51 #include "AliTOFcalib.h"
52 #include "AliCDBManager.h"
53 #include "AliESDtrackCuts.h"
55 ClassImp(AliAnalysisTaskSigma1385)
57 //________________________________________________________________________
58 AliAnalysisTaskSigma1385::AliAnalysisTaskSigma1385()
59 : AliAnalysisTaskSE(),
61 //-------------------------------- For PID
78 fTOFcalibrateESD(!fisMC),
79 fTOFcorrectTExp(kTRUE),
82 fTOFresolution(100.0),
87 fAnalysisType("ESD"), fCollidingSystems(0), fDataType("REAL"), fListHistCascade(0),
88 fHistEventMultiplicity(0), fHistEventMultiplicityRAVS(0),
89 fNtuple1(0), fNtuple2(0), fNtuple3(0), fNtuple4(0)
93 //--------------------------------
98 for (i = 0; i < 5; i++) fOkTrack[i] = kFALSE;
101 //________________________________________________________________________
102 AliAnalysisTaskSigma1385::AliAnalysisTaskSigma1385(const char *name)
103 : AliAnalysisTaskSE(name),
106 //-------------------------------- For PID
123 fTOFcalibrateESD(!fisMC),
124 fTOFcorrectTExp(kTRUE),
127 fTOFresolution(100.0),
132 fAnalysisType("ESD"), fCollidingSystems(0), fDataType("REAL"), fListHistCascade(0),
133 fHistEventMultiplicity(0), fHistEventMultiplicityRAVS(0),
134 fNtuple1(0), fNtuple2(0), fNtuple3(0), fNtuple4(0)
136 //--------------------------------
139 // Output slot #0 writes into a TList container (Cascade)
140 DefineOutput(1, TList::Class());
143 for (i = 0; i < 5; i++) fOkTrack[i] = kFALSE;
146 //________________________________________________________________________
147 void AliAnalysisTaskSigma1385::UserCreateOutputObjects()
149 fListHistCascade = new TList();
151 if (! fHistEventMultiplicity) {
152 fHistEventMultiplicity = new TH1F("fHistEventMultiplicity" , "Nb of Events" , 4, -1.0, 3.0);
153 fListHistCascade->Add(fHistEventMultiplicity);
156 if (! fHistEventMultiplicityRAVS) {
157 fHistEventMultiplicityRAVS = new TH1F("fHistEventMultiplicityRAVS" , "Nb of Events Rejected After Vertex selection" , 4, -1.0, 3.0);
158 fListHistCascade->Add(fHistEventMultiplicityRAVS);
162 fNtuple1 = new TNtuple("fNtuple1", "Ntuple1", "TrkNmb");
163 fNtuple1->SetDirectory(0);
164 fListHistCascade->Add(fNtuple1);
168 fNtuple2 = new TNtuple("fNtuple2", "Ntuple2", "s:dcal:lCosPoinAn:lDaugDCA:lambdap:lambdapt:lambdamass");
169 fNtuple2->SetDirectory(0);
170 fListHistCascade->Add(fNtuple2);
174 fNtuple3 = new TNtuple("fNtuple3", "Ntuple3", "c:dcapi:ppi:ptpi:bachphi:bachtheta:okPiTPC:okPiTOF");
175 fNtuple3->SetDirectory(0);
176 fListHistCascade->Add(fNtuple3);
180 fNtuple4 = new TNtuple("fNtuple4", "Ntuple4", "dca:mc:phi:theta:eta:y:pt:p:opang:invmass");
181 fListHistCascade->Add(fNtuple4);
185 }// end UserCreateOutputObjects
188 //________________________________________________________________________
189 void AliAnalysisTaskSigma1385::UserExec(Option_t *)
193 // Called for each event
196 Info("AliAnalysisTaskSigma1385", "Starting UserExec");
198 AliMCEventHandler* eventHandler;
199 AliMCEvent* mcEvent = 0;
201 if (fDataType == "SIM") {
203 eventHandler = dynamic_cast<AliMCEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
205 Printf("ERROR: Could not retrieve MC event handler");
209 mcEvent = eventHandler->MCEvent();
211 Printf("ERROR: Could not retrieve MC event");
218 if (fDataType == "SIM") {stack = mcEvent->Stack(); fIsMC = 1; fisMC = 1;}
220 AliESDEvent *lESDevent = 0x0;
221 AliAODEvent *lAODevent = 0x0;
224 // Connect to the InputEvent
225 Int_t ncascades = -1;
226 if (fAnalysisType == "ESD") {
227 lESDevent = dynamic_cast<AliESDEvent*>(InputEvent());
229 ncascades = lESDevent->GetNumberOfCascades();
231 Printf("ERROR: lESDevent not available \n");
234 } else if (fAnalysisType == "AOD") {
235 lAODevent = dynamic_cast<AliAODEvent*>(InputEvent());
237 ncascades = lAODevent->GetNumberOfCascades();
239 Printf("ERROR: lAODevent not available \n");
243 Printf("Input type undefined \n");
248 //------------------------------for PID
254 // ----> set TPC range for PID and calibration
255 SetTPCrange(5.0, 3.0);
258 // ----> set ITS range for PID
261 // ----> set TPC calibration
262 if (fDataType == "SIM") SetTPCpar(2.15898 / 50.0, 1.75295E1, 3.40030E-9, 1.96178, 3.91720);
263 else SetTPCpar(1.41543 / 50.0, 2.63394E1, 5.0411E-11, 2.12543, 4.88663);
265 // ----> set the TOF calibration depending on type of input (sim/data)
266 SetTOFcorrectTExp(kTRUE);
268 SetTOFresolution(100.0);
269 if (fDataType == "SIM") {
270 SetTOFcalibrateESD(kFALSE);
274 SetTOFcalibrateESD(kTRUE);
275 SetTOFtuneMC(kFALSE);
280 fESDpid = new AliESDpid;
281 fESDpid->GetTPCResponse().SetBetheBlochParameters(fTPCpar[0], fTPCpar[1], fTPCpar[2], fTPCpar[3], fTPCpar[4]);
284 // initialize DB to current run
286 Printf("ERROR: lESDevent not available \n");
289 Int_t run = lESDevent->GetRunNumber();
290 if (run != fLastRun) {
291 //cout << "Run = " << run << " -- LAST = " << fLastRun << endl;
294 // setup TOF maker & calibration
295 if (!fTOFcalib) fTOFcalib = new AliTOFcalib;
296 fTOFcalib->SetCorrectTExp(fTOFcorrectTExp);
297 if (!fTOFmaker) fTOFmaker = new AliTOFT0maker(fESDpid, fTOFcalib);
298 fTOFmaker->SetTimeResolution(fTOFresolution);
300 AliCDBManager *cdb = AliCDBManager::Instance();
301 cdb->ClearCache(); // suggestion by Annalisa
302 cdb->Clear(); // suggestion by Annalisa
303 cdb->SetDefaultStorage("raw://");
305 fTOFcalib->SetCorrectTExp(fTOFcorrectTExp);
309 // if required, calibrate the TOF t0 maker with current event
310 if (fTOFcalibrateESD) fTOFcalib->CalibrateESD(lESDevent);
311 if (fTOFtuneMC) fTOFmaker->TuneForMC(lESDevent);
313 fTOFmaker->ComputeT0TOF(lESDevent);
314 fTOFmaker->ApplyT0TOF(lESDevent);
315 fESDpid->MakePID(lESDevent, kFALSE, 0.);
319 //--------------------------------------------------------
322 fHistEventMultiplicity->Fill(1);
324 //Some Quantities to characterize the event
326 Double_t b = lESDevent->GetMagneticField();
327 Int_t trackNumber = lESDevent->GetNumberOfTracks();
330 //---------------------------
331 // new part from AliCascadeVertexer (use vertexer for reconstructing Sigma(1385)
333 //const AliESDVertex *vtxT3D=lESDevent->GetPrimaryVertex();
334 const AliESDVertex *vtxT3D = lESDevent->GetPrimaryVertexTracks();
335 if (vtxT3D->GetNContributors() < 1) {
337 vtxT3D = lESDevent->GetPrimaryVertexSPD();
338 if (vtxT3D->GetNContributors() < 1) {
341 fHistEventMultiplicityRAVS->Fill(1);
348 Double_t xPrimaryVertex = vtxT3D->GetX();
349 Double_t yPrimaryVertex = vtxT3D->GetY();
350 Double_t zPrimaryVertex = vtxT3D->GetZ();
352 if (zPrimaryVertex > 10 || zPrimaryVertex < -10) return;
354 //-------------------------------------------------------
355 // New Part about tracks global selection criteria
356 //-------------------------------------------------------
358 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
360 esdTrackCuts->SetAcceptKinkDaughters(0); // 0 = kFalse
361 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
362 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
363 esdTrackCuts->SetMinNClustersTPC(70);
366 //-------------------------------------------------------
368 //stores relevant V0s in an array
369 Int_t nV0 = (Int_t)lESDevent->GetNumberOfV0s();
372 for (Int_t i = 0; i < nV0; i++) {
373 AliESDv0 *v = lESDevent->GetV0(i);
374 if (v->GetOnFlyStatus()) continue; // if kTRUE, then this V0 is recontructed
378 nV0 = vtcs.GetEntriesFast();
380 //-------------------------------------------------------
381 // loops over bachelor tracks
382 // stores relevant tracks in another array
384 Int_t nentr = (Int_t)lESDevent->GetNumberOfTracks();
385 TArrayI trk(nentr); Int_t ntr = 0;
387 for (Int_t i = 0; i < nentr; i++) {
388 AliESDtrack *esdtr = lESDevent->GetTrack(i);
390 if (!(esdtr->GetStatus() & AliESDtrack::kITSrefit)) continue;
391 if (!(esdtr->GetStatus() & AliESDtrack::kTPCrefit)) continue;
394 if (!(esdTrackCuts->AcceptTrack(esdtr))) continue;
401 //-----------------------------------------------------
402 // nested loops over V0s and bachelors
403 Float_t massLambda = 1.11568;
405 AliCascadeVertexer *cascvert = new AliCascadeVertexer();
406 for (Int_t i = 0; i < nV0; i++) { //loop on V0s
409 AliESDv0 *v = (AliESDv0*)vtcs.UncheckedAt(i);
411 Double_t lambdaMass = 0;
413 Float_t lambdaPt = 0;
414 Float_t lambdaDCA = 0; // DCA between Lambda and Primary Vertex
415 Double_t v0cospointangle = 0;
416 Float_t v0daughtersDCA = 0;
419 // Lambda quality cuts
420 UInt_t lIdxPosXi = (UInt_t) TMath::Abs(v->GetPindex());
421 UInt_t lIdxNegXi = (UInt_t) TMath::Abs(v->GetNindex());
423 AliESDtrack *pTrackXi = lESDevent->GetTrack(lIdxPosXi);
424 AliESDtrack *nTrackXi = lESDevent->GetTrack(lIdxNegXi);
426 // Filter like-sign V0
427 if ( (TMath::Abs(pTrackXi->GetSign()) - TMath::Abs(nTrackXi->GetSign()) ) < 0.1) continue;
429 // WARNING: the following selections cannot be done for AOD yet...
432 v->ChangeMassHypothesis(kLambda0); // the v0 must be Lambda
435 if ((TMath::Abs(v->GetEffMass() - massLambda)) < 0.2) {
437 if (!(pTrackXi->GetStatus() & AliESDtrack::kTPCrefit)) continue;
438 if (!(nTrackXi->GetStatus() & AliESDtrack::kTPCrefit)) continue;
441 if ((pTrackXi->GetTPCNcls()) < 70) continue;
442 if ((nTrackXi->GetTPCNcls()) < 70) continue;
444 strness = 1; lambdaMass = v->GetEffMass(); lambdaP = v->P(); lambdaPt = v->Pt(); lambdaDCA = v->GetD(xPrimaryVertex, yPrimaryVertex, zPrimaryVertex); v0cospointangle = v->GetV0CosineOfPointingAngle(); v0daughtersDCA = v->GetDcaV0Daughters();
451 v->ChangeMassHypothesis(kLambda0Bar); // the v0 must be Anti Lambda
455 if ((TMath::Abs(v->GetEffMass() - massLambda)) < 0.2) {
457 if (!(pTrackXi->GetStatus() & AliESDtrack::kTPCrefit)) continue;
458 if (!(nTrackXi->GetStatus() & AliESDtrack::kTPCrefit)) continue;
461 if ((pTrackXi->GetTPCNcls()) < 70) continue;
462 if ((nTrackXi->GetTPCNcls()) < 70) continue;
464 Int_t temp = strness + 1; strness = -1 * temp; lambdaMass = v->GetEffMass(); lambdaP = v->P(); lambdaPt = v->Pt(); lambdaDCA = v->GetD(xPrimaryVertex, yPrimaryVertex, zPrimaryVertex); v0cospointangle = v->GetV0CosineOfPointingAngle(); v0daughtersDCA = v->GetDcaV0Daughters();
469 if (strness == 0) continue;
472 for (Int_t j = 0; j < ntr; j++) { //loop on tracks
476 Int_t bachTPCcls = 0;
479 if ((bidx == v->GetIndex(0)) || (bidx == v->GetIndex(1))) continue; // bach and V0's daughter's must be different!
481 AliESDtrack *btrk = lESDevent->GetTrack(bidx);
483 if (!(btrk->GetStatus() & AliESDtrack::kTPCrefit)) continue;
485 if ((bachTPCcls = btrk->GetTPCNcls()) < 70) continue;
487 //Bool_t *IsOkTrack = IsSelected(btrk); //for Alberto's PID
489 //Bool_t *okTrack = new Bool_t[5];
491 //for (Int_t k = 0; k < 5; k++) okTrack[k] = IsOkTrack[k];
496 Int_t bachCharge = btrk->Charge();
497 Float_t pionDCA = TMath::Abs(btrk->GetD(xPrimaryVertex, yPrimaryVertex, b)); // DCA between Bachelor and Primary Vertex
499 Double_t bachphi = btrk->Phi();
500 Double_t bachtheta = btrk->Theta();
501 Double_t bachmass = 0.13957;
502 Double_t bachp = btrk->GetP();
503 Double_t bachpt = btrk->Pt();
506 // Distance between Lambda and Pion bachelor
507 AliESDv0 v0(*v), *pv0 = &v0;
508 AliExternalTrackParam bt(*btrk), *pbt = &bt;
509 Double_t dca = cascvert->PropagateToDCA(pv0, pbt, b); // distance bwn V0 and bach (in cm)
510 if (dca > 10.0) continue; // Note: was 0.1! Enlarged->further filter in second pass analysis
513 AliESDcascade cascade(*pv0, *pbt, bidx); //constucts a sigma1385 candidate
514 AliESDcascade *xi = &cascade;
517 UInt_t lBachIdx = (UInt_t) TMath::Abs(xi->GetBindex());
518 AliESDtrack *bachTrackXi = lESDevent->GetTrack(lBachIdx);
523 if (fDataType == "SIM") {
525 Int_t pLabel = TMath::Abs(pTrackXi->GetLabel());
526 Int_t nLabel = TMath::Abs(nTrackXi->GetLabel());
527 Int_t bachLabel = TMath::Abs(bachTrackXi->GetLabel());
529 Int_t motherpLabel = stack->Particle(pLabel)->GetFirstMother();
530 Int_t mothernLabel = stack->Particle(nLabel)->GetFirstMother();
531 Int_t motherbachLabel = stack->Particle(bachLabel)->GetFirstMother();
534 //cout<< "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
535 //cout<< "plabel " << pLabel << " nlabel " << nLabel << " mother p " << motherpLabel << " mother n " << mothernLabel << " bachlabel " << bachLabel << " mother bach " << motherbachLabel << endl;
536 //cout<< "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
538 if (motherpLabel > -1 && mothernLabel > -1) {
539 TParticle *plambda = stack->Particle(motherpLabel);
540 Int_t grandmother = plambda->GetFirstMother();
542 motherpLabel = TMath::Abs(motherpLabel);
543 mothernLabel = TMath::Abs(mothernLabel);
544 //motherbachLabel = TMath::Abs(motherbachLabel);
546 //cout<< "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
547 //cout<< "plabel " << pLabel << " nlabel " << nLabel << " mother p " << motherpLabel << " mother n " << mothernLabel << " mother lambda " << grandmother << " bachlabel " << bachLabel << " mother bach " << motherbachLabel << endl;
548 //cout<< "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
550 if (motherbachLabel > -1) {
553 //cout<< "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
554 //cout<< "mother lambda " << grandmother << " mother bach " << motherbachLabel << " PDG Code "<< stack->Particle(grandmother)->GetPdgCode() << endl;
555 //cout<< "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
557 if ((motherpLabel == mothernLabel) && (grandmother == motherbachLabel) &&
558 ((TMath::Abs(stack->Particle(grandmother)->GetPdgCode()) == 3114) ||
559 (TMath::Abs(stack->Particle(grandmother)->GetPdgCode()) == 3224))) mcTrue = 1;
561 if( (motherpLabel == mothernLabel) && (grandmother == motherbachLabel) &&
562 (TMath::Abs(stack->Particle(grandmother)->GetPdgCode())==3312) ) mcTrue = 2;
570 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
571 Double_t lPMom[3] = {0., 0., 0.,};
572 Double_t lNMom[3] = {0., 0., 0.,};
573 Float_t lLambdaMomX = 0., lLambdaMomY = 0., lLambdaMomZ = 0.;
574 xi->GetBPxPyPz(lBachMomX, lBachMomY, lBachMomZ);
575 xi->GetPPxPyPz(lPMom[0], lPMom[1], lPMom[2]);
576 xi->GetNPxPyPz(lNMom[0], lNMom[1], lNMom[2]);
577 lLambdaMomX = lPMom[0] + lNMom[0];
578 lLambdaMomY = lPMom[1] + lNMom[1];
579 lLambdaMomZ = lPMom[2] + lNMom[2];
581 Float_t lRapXi = xi->RapXi();
582 Float_t lEta = xi->Eta();
583 Float_t lTheta = xi->Theta();
584 Float_t lPhi = xi->Phi();
585 Float_t lPt = xi->Pt();
586 Float_t lP = xi->P();
588 // Support variables for invariant mass calculation
589 TLorentzVector lambda, pion, sigma;
590 Double_t eLambda = TMath::Sqrt(lLambdaMomX * lLambdaMomX + lLambdaMomY * lLambdaMomY + lLambdaMomZ * lLambdaMomZ + lambdaMass * lambdaMass);
591 Double_t ePion = TMath::Sqrt(lBachMomX * lBachMomX + lBachMomY * lBachMomY + lBachMomZ * lBachMomZ + bachmass * bachmass) ;
593 lambda.SetPxPyPzE(lLambdaMomX, lLambdaMomY, lLambdaMomZ, eLambda);
594 pion.SetPxPyPzE(lBachMomX, lBachMomY, lBachMomZ, ePion);
596 sigma = lambda + pion;
598 Double_t openingangle, invmass = 0;
600 openingangle = TMath::ACos((lBachMomX * lLambdaMomX + lBachMomY * lLambdaMomY + lBachMomZ * lLambdaMomZ) / ((TMath::Sqrt(lBachMomX * lBachMomX + lBachMomY * lBachMomY + lBachMomZ * lBachMomZ)) * (TMath::Sqrt(lLambdaMomX * lLambdaMomX + lLambdaMomY * lLambdaMomY +
601 lLambdaMomZ * lLambdaMomZ))));
606 fNtuple1->Fill(trackNumber);
607 fNtuple2->Fill((1.*strness), lambdaDCA, v0cospointangle, v0daughtersDCA , lambdaP, lambdaPt, lambdaMass);
608 //fNtuple3->Fill((1.*bachCharge), pionDCA, bachp, bachpt, bachphi, bachtheta, okTrack[1], okTrack[2]);
609 fNtuple3->Fill((1.*bachCharge), pionDCA, bachp, bachpt, bachphi, bachtheta, fOkTrack[1], fOkTrack[2]);
610 fNtuple4->Fill(dca, (1.*mcTrue), lPhi, lTheta, lEta, lRapXi, lPt, lP, openingangle, invmass);
621 Info("AliAnalysisTaskSigma1385", "Number of reconstructed Sigma(1385): %d", ncasc);
625 PostData(1, fListHistCascade);
629 //________________________________________________________________________
631 //Bool_t *AliAnalysisTaskSigma1385::IsSelected(AliESDtrack *track)
632 void AliAnalysisTaskSigma1385::IsSelected(AliESDtrack *track)
638 //for (Int_t i = 0; i < 5; i++) okTrack[i] = kFALSE;
639 for (Int_t i = 0; i < 5; i++) fOkTrack[i] = kFALSE;
642 AliITSPIDResponse itsrsp(fIsMC);
647 Double_t times[10], tpcNSigma, tpcMaxNSigma, itsSignal, itsNSigma, mom, tofTime, tofSigma, tofRef, tofRel;
648 Bool_t okTOF = kFALSE;
649 Bool_t okTPC = kFALSE;
650 Bool_t okITS = kFALSE;
651 Bool_t isTPC = kFALSE;
652 Bool_t isITSSA = kFALSE;
653 Bool_t isTOF = kFALSE;
656 // get commonly used variables
657 status = (ULong_t)track->GetStatus();
659 isTPC = ((status & AliESDtrack::kTPCin) != 0);
660 isITSSA = ((!isTPC) && (track->IsOn(AliESDtrack::kITSrefit)) && (!track->IsOn(AliESDtrack::kITSpureSA))); //(!isTPC && (status & AliESDtrack::kITSrefit) != 0 && (status & AliESDtrack::kITSpureSA) == 0 && (status & AliESDtrack::kITSpid) != 0);
661 isTOF = (((status & AliESDtrack::kTOFout) != 0) && ((status & AliESDtrack::kTIME) != 0) /* && mom > TMath::Max(b1, b2)*/);
664 // check if the track type matches what is required
665 if (!isTPC && !isITSSA) {
666 AliDebug(AliLog::kDebug + 2, "Track is not either a TPC track or a ITS standalone. Rejected");
670 } else if (isTPC && !fUseGlobal) {
671 AliDebug(AliLog::kDebug + 2, "Global tracks not used. Rejected");
675 } else if (isITSSA && !fUseITSSA) {
676 AliDebug(AliLog::kDebug + 2, "ITS standalone not used. Rejected");
681 // does a preliminary check on TOF values, if necessary
682 // then, if the reference time or TOF signal are meaningless
683 // even if the 'isTOF' flag is true, switch it to false
685 track->GetIntegratedTimes(times);
686 tofTime = (Double_t)track->GetTOFsignal();
687 tofSigma = fTOFmaker->GetExpectedSigma(mom, times[AliPID::kPion], AliPID::ParticleMass(AliPID::kPion));
688 tofRef = times[AliPID::kPion];
689 if (tofRef <= 0.0 && tofSigma <= 0.0) isTOF = kFALSE;
695 if (isTPC) { // this branch is entered by all global tracks
698 tpcNSigma = TMath::Abs(fESDpid->NumberOfSigmasTPC(track, AliPID::kPion));
699 if (track->GetInnerParam()->P() > fTPCpLimit) tpcMaxNSigma = fMinTPCband; else tpcMaxNSigma = fMaxTPCband;
700 okTPC = (tpcNSigma <= tpcMaxNSigma);
701 AliDebug(AliLog::kDebug + 2, Form("TPC nsigma = %f -- max = %f -- cut %s", tpcNSigma, tpcMaxNSigma, (okTPC ? "passed" : "failed")));
703 // if TPC is not checked, it is as if all tracks do pass the cut
705 AliDebug(AliLog::kDebug + 2, "TPC not checked, track accepted");
708 // check TOF (only if flags are OK)
711 // TOF can be checked only when track is matched there
712 track->GetIntegratedTimes(times);
713 tofTime = (Double_t)track->GetTOFsignal();
714 tofSigma = fTOFmaker->GetExpectedSigma(mom, times[AliPID::kPion], AliPID::ParticleMass(AliPID::kPion));
715 tofRef = times[AliPID::kPion];
717 tofRel = (tofTime - tofRef) / tofSigma;
718 okTOF = ((tofRel >= fMinTOF) && (tofRel <= fMaxTOF));
719 AliDebug(AliLog::kDebug + 2, Form("TOF nsigma = %f -- range = %f %f -- cut %s", tofRel, fMinTOF, fMaxTOF, (okTOF ? "passed" : "failed")));
721 // if TOF is not matched, the answer depends on TPC:
722 // - if TPC is required, track is checked only there and TOF simply ignored
723 // - if TPC is not required, track is rejected when TOF does not match it, if TOF check is required
724 if (fCheckTPC) okTOF = kTRUE; else okTOF = kFALSE;
730 } else if (isITSSA) { // this branch is entered by all ITS standalone tracks
731 // check dE/dx only if this is required, otherwise ITS standalone are just added but not checked for PID
733 itsSignal = track->GetITSsignal();
734 itsCluMap = track->GetITSClusterMap();
736 for (k = 2; k < 6; k++) if (itsCluMap & (1 << k)) ++nITS;
737 //if (nITS < 3) return kFALSE;
738 //itsNSigma = itsrsp.GetNumberOfSigmas(mom, itsSignal, AliPID::kPion, nITS, kTRUE);
739 //okITS = ((TMath::Abs(itsNSigma)) <= fMaxITSband);
743 itsNSigma = itsrsp.GetNumberOfSigmas(mom, itsSignal, AliPID::kPion, nITS, kTRUE);
744 okITS = ((TMath::Abs(itsNSigma)) <= fMaxITSband);
745 AliDebug(AliLog::kDebug + 2, Form("ITS nsigma = %f -- max = %f -- cut %s", itsNSigma, fMaxITSband, (okITS ? "passed" : "failed")));
751 // if we are here, the track is surely bad
758 //okTrack[0] = okITS;
759 //okTrack[1] = okTPC;
760 //okTrack[2] = okTOF;
761 //okTrack[3] = isTPC;
762 //okTrack[4] = isITSSA;
768 fOkTrack[4] = isITSSA;
770 //cout<<"##########################################"<<endl;
771 //cout<<"isITSSA "<<isITSSA<< " isTPC "<<isTPC<<endl;
772 //cout<<"##########################################"<<endl;
788 //________________________________________________________________________
789 void AliAnalysisTaskSigma1385::Terminate(Option_t *)
791 // Draw result to the screen
792 // Called once at the end of the query