1 #define AliAnalysisTaskV0QA_cxx
10 #include "TLorentzVector.h"
12 #include "AliAnalysisTask.h"
13 #include "AliTrackReference.h"
14 #include "AliKFParticle.h"
15 #include "AliKFVertex.h"
16 #include "AliVertexerTracks.h"
17 #include "AliESDEvent.h"
18 #include "AliESDInputHandler.h"
19 #include "AliMCEvent.h"
20 #include "AliMCEventHandler.h"
25 #include "AliAnalysisTaskV0QA.h"
27 ClassImp(AliAnalysisTaskV0QA)
29 //________________________________________________________________________
30 AliAnalysisTaskV0QA::AliAnalysisTaskV0QA(const char *name) :AliAnalysisTask(name,""),
42 gConvGamGeantIndex(0),
43 eNegConvGamGeantIndex(0),
44 ePosConvGamGeantIndex(0),
45 eNegConvGamGeantLength(0),
46 ePosConvGamGeantLength(0),
47 eNegConvGamSingleRecIndex(0),
48 ePosConvGamSingleRecIndex(0),
49 eNegConvGamV0RecIndex(0),
50 ePosConvGamV0RecIndex(0),
51 ConvGamV0RecIndexPos(0),
52 ConvGamV0RecIndexNeg(0),
56 piNegDecayLGeantIndex(0),
57 pPosDecayLGeantIndex(0),
58 piNegDecayLGeantLength(0),
59 pPosDecayLGeantLength(0),
60 piNegDecayLSingleRecIndex(0),
61 pPosDecayLSingleRecIndex(0),
62 piNegDecayLV0RecIndex(0),
63 pPosDecayLV0RecIndex(0),
64 DecayLV0RecIndexPos(0),
65 DecayLV0RecIndexNeg(0),
67 alDecayALGeantIndex(0),
68 piPosDecayALGeantIndex(0),
69 apNegDecayALGeantIndex(0),
70 piPosDecayALGeantLength(0),
71 apNegDecayALGeantLength(0),
72 piPosDecayALSingleRecIndex(0),
73 apNegDecayALSingleRecIndex(0),
74 piPosDecayALV0RecIndex(0),
75 apNegDecayALV0RecIndex(0),
76 DecayALV0RecIndexPos(0),
77 DecayALV0RecIndexNeg(0),
79 K0DecayK0GeantIndex(0),
80 piNegDecayK0GeantIndex(0),
81 piPosDecayK0GeantIndex(0),
82 piNegDecayK0GeantLength(0),
83 piPosDecayK0GeantLength(0),
84 piNegDecayK0SingleRecIndex(0),
85 piPosDecayK0SingleRecIndex(0),
86 piNegDecayK0V0RecIndex(0),
87 piPosDecayK0V0RecIndex(0),
88 DecayK0V0RecIndexPos(0),
89 DecayK0V0RecIndexNeg(0),
111 // Input slot #0 works with an Ntuple
112 DefineInput(0, TChain::Class());
113 // Output slot #0 writes into a TH1 container
114 // DefineOutput(0,TObjArray::Class());
115 DefineOutput(0,TList::Class());
117 // Reconstructed arrays
121 fValueK0 = new Double_t[fDim];
122 fValueL = new Double_t[fDim];
123 fValueAL = new Double_t[fDim];
124 fValueV0 = new Double_t[fDim];
125 xminV0 = new Double_t[fDim];
126 xmaxV0 = new Double_t[fDim];
127 binsV0 = new Int_t[fDim];
131 gConvGamGeantIndex = new Int_t[gDim];
132 eNegConvGamGeantIndex = new Int_t[gDim];
133 ePosConvGamGeantIndex = new Int_t[gDim];
134 eNegConvGamGeantLength = new Float_t[gDim];
135 ePosConvGamGeantLength = new Float_t[gDim];
137 eNegConvGamSingleRecIndex = new Int_t[gDim];
138 ePosConvGamSingleRecIndex = new Int_t[gDim];
140 eNegConvGamV0RecIndex = new Int_t[gDim];
141 ePosConvGamV0RecIndex = new Int_t[gDim];
143 ConvGamV0RecIndexPos = new Int_t[gDim];
144 ConvGamV0RecIndexNeg = new Int_t[gDim];
146 // Lambda to proton pi-
147 lDecayLGeantIndex = new Int_t[gDim];
148 piNegDecayLGeantIndex = new Int_t[gDim];
149 pPosDecayLGeantIndex = new Int_t[gDim];
150 piNegDecayLGeantLength = new Float_t[gDim];
151 pPosDecayLGeantLength = new Float_t[gDim];
153 piNegDecayLSingleRecIndex = new Int_t[gDim];
154 pPosDecayLSingleRecIndex = new Int_t[gDim];
156 piNegDecayLV0RecIndex = new Int_t[gDim];
157 pPosDecayLV0RecIndex = new Int_t[gDim];
159 DecayLV0RecIndexPos = new Int_t[gDim];
160 DecayLV0RecIndexNeg = new Int_t[gDim];
163 K0DecayK0GeantIndex = new Int_t[gDim];
164 piNegDecayK0GeantIndex = new Int_t[gDim];
165 piPosDecayK0GeantIndex = new Int_t[gDim];
166 piNegDecayK0GeantLength = new Float_t[gDim];
167 piPosDecayK0GeantLength = new Float_t[gDim];
169 piNegDecayK0SingleRecIndex = new Int_t[gDim];
170 piPosDecayK0SingleRecIndex = new Int_t[gDim];
172 piNegDecayK0V0RecIndex = new Int_t[gDim];
173 piPosDecayK0V0RecIndex = new Int_t[gDim];
175 DecayK0V0RecIndexPos = new Int_t[gDim];
176 DecayK0V0RecIndexNeg = new Int_t[gDim];
178 //Antilambda to antiproton piplus
179 alDecayALGeantIndex = new Int_t[gDim];
180 piPosDecayALGeantIndex = new Int_t[gDim];
181 apNegDecayALGeantIndex = new Int_t[gDim];
182 piPosDecayALGeantLength = new Float_t[gDim];
183 apNegDecayALGeantLength = new Float_t[gDim];
185 piPosDecayALSingleRecIndex = new Int_t[gDim];
186 apNegDecayALSingleRecIndex = new Int_t[gDim];
188 piPosDecayALV0RecIndex = new Int_t[gDim];
189 apNegDecayALV0RecIndex = new Int_t[gDim];
191 DecayALV0RecIndexPos = new Int_t[gDim];
192 DecayALV0RecIndexNeg = new Int_t[gDim];
195 //////////////////////////////////////////////
196 clRefsP = new TClonesArray("AliTrackReference");
197 clRefsN = new TClonesArray("AliTrackReference");
199 // SetESDtrackCuts();
202 AliLog::SetGlobalLogLevel(AliLog::kError);
206 //________________________________________________________________________
207 void AliAnalysisTaskV0QA::ConnectInputData(Option_t *) {
208 printf(" ConnectInputData %s\n", GetName());
212 AliESDInputHandler* esdH = (AliESDInputHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
213 fESD = esdH->GetEvent();
215 fChain = (TChain*)GetInputData(0);
219 //_____________________________________________________
220 AliAnalysisTaskV0QA::~AliAnalysisTaskV0QA()
222 // Remove all pointers
237 delete [] gConvGamGeantIndex;
238 delete [] eNegConvGamGeantIndex;
239 delete [] ePosConvGamGeantIndex;
241 delete [] eNegConvGamSingleRecIndex;
242 delete [] ePosConvGamSingleRecIndex;
244 delete [] eNegConvGamV0RecIndex;
245 delete [] ePosConvGamV0RecIndex;
246 delete [] ConvGamV0RecIndexPos;
247 delete [] ConvGamV0RecIndexNeg;
249 delete [] lDecayLGeantIndex;
250 delete [] piNegDecayLGeantIndex;
251 delete [] pPosDecayLGeantIndex;
253 delete [] piNegDecayLGeantLength;
254 delete [] pPosDecayLGeantLength;
255 delete [] piNegDecayLSingleRecIndex;
256 delete [] pPosDecayLSingleRecIndex;
258 delete [] piNegDecayLV0RecIndex;
259 delete [] pPosDecayLV0RecIndex;
260 delete [] DecayLV0RecIndexPos;
261 delete [] DecayLV0RecIndexNeg;
263 delete [] alDecayALGeantIndex;
264 delete [] piPosDecayALGeantIndex;
265 delete [] apNegDecayALGeantIndex;
267 delete [] piPosDecayALGeantLength;
268 delete [] apNegDecayALGeantLength;
269 delete [] piPosDecayALSingleRecIndex;
270 delete [] apNegDecayALSingleRecIndex;
272 delete [] piPosDecayALV0RecIndex;
273 delete [] apNegDecayALV0RecIndex;
274 delete [] DecayALV0RecIndexPos;
275 delete [] DecayALV0RecIndexNeg;
278 delete [] piNegDecayK0GeantIndex;
279 delete [] piPosDecayK0GeantIndex;
281 delete [] piNegDecayK0GeantLength;
282 delete [] piPosDecayK0GeantLength;
283 delete [] piNegDecayK0SingleRecIndex;
284 delete [] piPosDecayK0SingleRecIndex;
286 delete [] piNegDecayK0V0RecIndex;
287 delete [] piPosDecayK0V0RecIndex;
289 delete [] DecayK0V0RecIndexPos;
290 delete [] DecayK0V0RecIndexNeg;
295 //________________________________________________________________________
296 void AliAnalysisTaskV0QA::CreateOutputObjects() {
298 for(Int_t d=0;d<fDim;d++){
301 xminV0[0]= 0; // 1/sqrt(pt) Gamma geant
305 xminV0[1]=-2.5; // eta Gamma Geant
309 xminV0[2]=-2*TMath::Pi(); // phi Gamma geant
310 xmaxV0[2]= TMath::Pi();
313 xminV0[3]= 0; // r geant
317 xminV0[4]=-250; // z geant
321 xminV0[5]= 0; // 1/sqrt(pt) Geant Pos
325 xminV0[6]=-2.5; // eta geant Pos
329 xminV0[7]=-2*TMath::Pi(); // phi Geant Pos
330 xmaxV0[7]= TMath::Pi();
333 xminV0[8]=0; // Track Length TPC Geant Pos
337 xminV0[9]= 0; // 1/sqrt(pt) Geant Neg
341 xminV0[10]=-2.5; // eta Geant Neg
345 xminV0[11]=-2*TMath::Pi(); // phi Geant Neg
346 xmaxV0[11]= TMath::Pi();
349 xminV0[12]=0; // Track Length TPC Geant Neg
354 //-----------Rec single variables
356 xminV0[13]= -0.5; // (pt-ptGeant)/ptGeant rec Pos
360 xminV0[14]=-2.5; // eta rec Pos
364 xminV0[15]=-2*TMath::Pi(); // phi rec Pos
365 xmaxV0[15]= TMath::Pi();
368 xminV0[16]= 0; // Impact parameter rec Pos
372 xminV0[17]= 0; // nsigmas Impact parameter rec Pos
377 xminV0[18]= -1; // Ncls ITS rec Pos
381 xminV0[19]= -1; // Ncls TPC rec Pos
385 xminV0[20]= -2; // Status Single TPC rec Pos
389 xminV0[21]= -0.5; // (pt-ptGeant)/ptGeant rec Neg
393 xminV0[22]=-2.5; // eta rec Neg
397 xminV0[23]=-2*TMath::Pi(); // phi rec Neg
398 xmaxV0[23]= TMath::Pi();
401 xminV0[24]= 0; // Impact parameter rec Neg
405 xminV0[25]= 0; // Sigmas Impact parameter rec Neg
410 xminV0[26]= -1; // Ncls ITS rec Neg
414 xminV0[27]= -1; // Ncls TPC rec Neg
418 xminV0[28]= -2; // Status Single TPC rec Neg
421 // ------------------Rec V0 variables
425 xminV0[29]= -0.5; // (pt-ptGeant)/ptGeant rec V0 Pos
429 xminV0[30]=-2.5; // eta rec V0 Pos
433 xminV0[31]=-2*TMath::Pi(); // phi rec V0 Pos
434 xmaxV0[31]= TMath::Pi();
437 xminV0[32]= -2; // Status V0 TPC rec Pos
443 xminV0[33]= -0.5; // 1/sqrt(pt) rec V0 Neg
447 xminV0[34]=-2.5; // eta rec V0 Neg
451 xminV0[35]=-2*TMath::Pi(); // phi rec V0 Neg
452 xmaxV0[35]= TMath::Pi();
456 xminV0[36]= -2; // Status V0 TPC rec Neg
461 TString axisName[37]={"ptGammaGeant",
469 "TPCTrackLengthEPlusGeant",
473 "TPCTrackLengthEMinusGeant",
474 "ptResEPlusRecSingle",
477 "bXYZEPlusRecSingle",
478 "sigbXYZEPlusRecSingle",
479 "NclsITSEPlusRecSingle",
480 "NclsTPCEPlusRecSingle",
481 "statusRecSinglePos",
482 "ptResEMinusRecSingle",
483 "etaEMinusRecSingle",
484 "phiEMinusRecSingle",
485 "bXYZEMinusRecSingle",
486 "sigbXYZEMinusRecSingle",
487 "NclsITSEMinusRecSingle",
488 "NclsTPCEMinusRecSingle",
489 "statusRecSingleNeg",
497 "statusV0SingleNeg"};
500 fSparseV0= new THnSparseF("sparseV0","sparseV0",fDim,binsV0,xminV0,xmaxV0);
502 for (Int_t iaxis=0; iaxis<fDim; iaxis++){
503 fSparseV0->GetAxis(iaxis)->SetName(axisName[iaxis]);
504 fSparseV0->GetAxis(iaxis)->SetTitle(axisName[iaxis]);
507 TString axisNameK0[37]={"ptK0Geant",
515 "TPCTrackLengthPiPlusGeant",
519 "TPCTrackLengthPiMinusGeant",
520 "ptResPiPlusRecSingle",
521 "etaPiPlusRecSingle",
522 "phiPiPlusRecSingle",
523 "bXYZPiPlusRecSingle",
524 "sigbXYZPiPlusRecSingle",
525 "NclsITSPiPlusRecSingle",
526 "NclsTPCPiPlusRecSingle",
527 "statusRecSinglePos",
528 "ptResPiMinusRecSingle",
529 "etaPiMinusRecSingle",
530 "phiPiMinusRecSingle",
531 "bXYZPiMinusRecSingle",
532 "sigbXYZPiMinusRecSingle",
533 "NclsITSPiMinusRecSingle",
534 "NclsTPCPiMinusRecSingle",
535 "statusRecSingleNeg",
547 fSparseK0= new THnSparseF("sparseK0","sparseK0",fDim,binsV0,xminV0,xmaxV0);
548 for (Int_t iaxis=0; iaxis<fDim; iaxis++){
549 fSparseK0->GetAxis(iaxis)->SetName(axisNameK0[iaxis]);
550 fSparseK0->GetAxis(iaxis)->SetTitle(axisNameK0[iaxis]);
553 TString axisNameL[37]={"ptLGeant",
561 "TPCTrackLengthPPlusGeant",
565 "TPCTrackLengthPiMinusGeant",
566 "ptResPPlusRecSingle",
569 "bXYZPPlusRecSingle",
570 "sigbXYZPPlusRecSingle",
571 "NclsITSPPlusRecSingle",
572 "NclsTPCPPlusRecSingle",
573 "statusRecSinglePos",
574 "ptResPiMinusRecSingle",
575 "etaPiMinusRecSingle",
576 "phiPiMinusRecSingle",
577 "bXYZPiMinusRecSingle",
578 "sigbXYZPiMinusRecSingle",
579 "NclsITSPiMinusRecSingle",
580 "NclsTPCPiMinusRecSingle",
581 "statusRecSingleNeg",
592 fSparseL= new THnSparseF("sparseL","sparseL",fDim,binsV0,xminV0,xmaxV0);
593 for (Int_t iaxis=0; iaxis<fDim; iaxis++){
594 fSparseL->GetAxis(iaxis)->SetName(axisNameL[iaxis]);
595 fSparseL->GetAxis(iaxis)->SetTitle(axisNameL[iaxis]);
598 TString axisNameAL[37]={"ptALGeant",
606 "TPCTrackLengthPiPlusGeant",
610 "TPCTrackLengthAPMinusGeant",
611 "ptResPiPlusRecSingle",
612 "etaPiPlusRecSingle",
613 "phiPiPlusRecSingle",
614 "bXYZPiPlusRecSingle",
615 "sigbXYZPiPlusRecSingle",
616 "NclsITSPiPlusRecSingle",
617 "NclsTPCPiPlusRecSingle",
618 "statusRecSinglePos",
619 "ptResAPMinusRecSingle",
620 "etaAPMinusRecSingle",
621 "phiAPMinusRecSingle",
622 "bXYZAPMinusRecSingle",
623 "sigbXYZAPMinusRecSingle",
624 "NclsITSAPMinusRecSingle",
625 "NclsTPCAPMinusRecSingle",
626 "statusRecSingleNeg",
637 fSparseAL= new THnSparseF("sparseAL","sparseAL",fDim,binsV0,xminV0,xmaxV0);
638 for (Int_t iaxis=0; iaxis<fDim; iaxis++){
639 fSparseAL->GetAxis(iaxis)->SetName(axisNameAL[iaxis]);
640 fSparseAL->GetAxis(iaxis)->SetTitle(axisNameAL[iaxis]);
643 // create output container
645 fOutputContainer = new TList() ;
646 fOutputContainer->SetName(GetName()) ;
649 fOutputContainer->Add(fSparseV0);
650 fOutputContainer->Add(fSparseK0);
651 fOutputContainer->Add(fSparseL);
652 fOutputContainer->Add(fSparseAL);
656 //________________________________________________________________________
657 void AliAnalysisTaskV0QA::Exec(Option_t *) {
660 cout<< "not a tree"<< endl;
668 mctruth = (AliMCEventHandler*)((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
670 // Double_t vertex[3];
671 Double_t MaxVertex=150.;
673 Double_t LineCutZRSlope=0.662486;
674 Double_t LineCutZValue=7.;
678 Int_t piNegLIndex=-1;
680 Int_t apNegALIndex=-1;
681 Int_t piPosALIndex=-1;
688 for(Int_t i=0; i<gDim;i++){
689 gConvGamGeantIndex[i] = -1;
690 eNegConvGamGeantIndex[i] = -1;
691 ePosConvGamGeantIndex[i] = -1;
693 eNegConvGamSingleRecIndex[i] = -1;
694 ePosConvGamSingleRecIndex[i] = -1;
696 eNegConvGamV0RecIndex[i] = -1;
697 ePosConvGamV0RecIndex[i] = -1;
698 ConvGamV0RecIndexPos[i] = -1;
699 ConvGamV0RecIndexNeg[i] = -1;
702 K0DecayK0GeantIndex[i] = -1;
703 piNegDecayK0GeantIndex[i] = -1;
704 piPosDecayK0GeantIndex[i] = -1;
706 piNegDecayK0SingleRecIndex[i] = -1;
707 piPosDecayK0SingleRecIndex[i] = -1;
709 piNegDecayK0V0RecIndex[i] = -1;
710 piPosDecayK0V0RecIndex[i] = -1;
711 DecayK0V0RecIndexPos[i] = -1;
712 DecayK0V0RecIndexNeg[i] = -1;
715 lDecayLGeantIndex[i] = -1;
716 piNegDecayLGeantIndex[i] = -1;
717 pPosDecayLGeantIndex[i] = -1;
719 piNegDecayLSingleRecIndex[i] = -1;
720 pPosDecayLSingleRecIndex[i] = -1;
722 piNegDecayLV0RecIndex[i] = -1;
723 pPosDecayLV0RecIndex[i] = -1;
724 DecayLV0RecIndexPos[i] = -1;
725 DecayLV0RecIndexNeg[i] = -1;
728 alDecayALGeantIndex[i] = -1;
729 piPosDecayALGeantIndex[i] = -1;
730 apNegDecayALGeantIndex[i] = -1;
732 piPosDecayALSingleRecIndex[i] = -1;
733 apNegDecayALSingleRecIndex[i] = -1;
735 piPosDecayALV0RecIndex[i] = -1;
736 apNegDecayALV0RecIndex[i] = -1;
737 DecayALV0RecIndexPos[i] = -1;
738 DecayALV0RecIndexNeg[i] = -1;
745 AliKFVertex primVtx(*(fESD->GetPrimaryVertex()));
746 nTracksPrim=primVtx.GetNContributors();
749 if(mctruth && nTracksPrim>0){
751 stack = mctruth->MCEvent()->Stack();
756 for (Int_t iTracks = 0; iTracks < mctruth->MCEvent()->GetNumberOfTracks(); iTracks++) {
759 TParticle* particle = stack->Particle(iTracks);
764 Printf("ERROR: Could not receive particle %d (mc loop)", iTracks);
768 if(particle->Pt()<0.050) continue;
769 if(TMath::Abs(particle->Eta())> 1.2) continue;
772 if (particle->GetPdgCode()== 22){
775 if(particle->GetMother(0) >-1 && stack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
776 continue; // no photon as mothers!
779 if(particle->GetMother(0) >= stack->GetNprimary()){
780 continue; // the gamma has a mother, and it is not a primary particle
783 TParticle* ePos = NULL;
784 TParticle* eNeg = NULL;
788 if(particle->GetNDaughters() >= 2){
789 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
790 TParticle *tmpDaughter = stack->Particle(daughterIndex);
791 if(tmpDaughter->GetUniqueID() == 5){
792 if(tmpDaughter->GetPdgCode() == 11){
794 elecGIndex=daughterIndex;
796 else if(tmpDaughter->GetPdgCode() == -11){
798 posiGIndex=daughterIndex;
805 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
809 if(TMath::Abs(ePos->Eta())> MaxEta || TMath::Abs(eNeg->Eta())> MaxEta){
813 if(ePos->R()> MaxVertex ){
814 continue; // cuts on distance from collision point
818 if( (TMath::Abs(ePos->Vz()) * LineCutZRSlope - LineCutZValue) > ePos->R() ){
819 continue; // line cut to exclude regions where we do not reconstruct
823 // Looking at the existance of TPC references
826 mctruth->MCEvent()->GetParticleAndTR(posiGIndex,ePosTPC,clRefsP);
828 AliMCParticle *mcParticlePos = (AliMCParticle*) (mctruth->MCEvent()->GetTrack(posiGIndex));
829 if(!mcParticlePos) continue;
832 Float_t tpcTrackLengthePos = mcParticlePos->GetTPCTrackLength(fESD->GetMagneticField(),0.05,counter,3.0);
836 int nPointsP = clRefsP->GetEntries();
838 if (fRefTPC) delete fRefTPC;
839 fRefTPC = new TObjArray();
841 for(int iPoint=0; iPoint<nPointsP; iPoint++) {
842 AliTrackReference *ref = (AliTrackReference*)clRefsP->At(iPoint);
843 if (ref->DetectorId() == AliTrackReference::kTPC) fRefTPC->Add(new AliTrackReference(*ref));
848 for(int i=0; i<fRefTPC->GetEntries(); i++) {
849 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[i];
850 fLabelsTPC[i] = ref->GetTrack();
853 for(int iPoint=GetTPCReference(iTracks);iPoint<fRefTPC->GetEntries();iPoint++){
854 AliTrackReference* aRef = (AliTrackReference*)(*fRefTPC)[iPoint];
855 if (aRef->GetTrack() != posiGIndex ) break;
863 mctruth->MCEvent()->GetParticleAndTR(elecGIndex,eNegTPC,clRefsN);
865 AliMCParticle *mcParticleNeg = (AliMCParticle*) (mctruth->MCEvent()->GetTrack(elecGIndex));
866 if(!mcParticleNeg) continue;
869 Float_t tpcTrackLengtheNeg = mcParticleNeg->GetTPCTrackLength(fESD->GetMagneticField(),0.05,counterN,3.0);
870 int nPointsN = clRefsN->GetEntries();
872 if (fRefTPC) delete fRefTPC;
873 fRefTPC = new TObjArray();
875 for(int iPoint=0; iPoint<nPointsN; iPoint++) {
876 AliTrackReference *ref = (AliTrackReference*)clRefsN->At(iPoint);
877 if (ref->DetectorId() == AliTrackReference::kTPC) fRefTPC->Add(new AliTrackReference(*ref));
882 for(int i=0; i<fRefTPC->GetEntries(); i++) {
883 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[i];
884 fLabelsTPC[i] = ref->GetTrack();
887 for(int iPoint=GetTPCReference(iTracks);iPoint<fRefTPC->GetEntries();iPoint++){
888 AliTrackReference* aRef = (AliTrackReference*)(*fRefTPC)[iPoint];
889 if (aRef->GetTrack() != elecGIndex ) break;
895 if ( labelNegRefs==0 || labelPosRefs==0) continue; // if e+/e- do not have a TPC ref continue;
896 ////////////////////////////////////////////////////////////////////
900 gConvGamGeantIndex[nConvGamGeant]=iTracks;
901 eNegConvGamGeantIndex[nConvGamGeant] = elecGIndex;
902 ePosConvGamGeantIndex[nConvGamGeant] = posiGIndex;
904 eNegConvGamGeantLength[nConvGamGeant] = tpcTrackLengtheNeg;
905 ePosConvGamGeantLength[nConvGamGeant] = tpcTrackLengthePos;
910 TParticle* piPos = NULL;
911 TParticle* piNeg = NULL;
915 if (particle->GetPdgCode()== 310){ // k0short
916 if(particle->GetNDaughters() == 2){
917 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
918 TParticle *tmpDaughter = stack->Particle(daughterIndex);
919 if(tmpDaughter->GetPdgCode() == 211){
921 piPosK0Index=daughterIndex;
923 else if(tmpDaughter->GetPdgCode() == -211){
925 piNegK0Index=daughterIndex;
930 if(piPos == NULL || piNeg == NULL){ // means we do not have two daughters from K0short decay
934 if(TMath::Abs(piPos->Eta())> MaxEta || TMath::Abs(piNeg->Eta())> MaxEta){
938 if(piPos->R()> MaxVertex ){
939 continue; // cuts on distance from collision point
943 if( (TMath::Abs(piPos->Vz()) * LineCutZRSlope - LineCutZValue) > piPos->R() ){
944 continue; // line cut to exclude regions where we do not reconstruct
947 // Looking at the existance of TPC references
950 mctruth->MCEvent()->GetParticleAndTR(piPosK0Index,ePosTPC,clRefsP);
952 AliMCParticle *mcParticlePos = (AliMCParticle*) (mctruth->MCEvent()->GetTrack(piPosK0Index));
953 if(!mcParticlePos) continue;
956 Float_t tpcTrackLengthePos = mcParticlePos->GetTPCTrackLength(fESD->GetMagneticField(),0.05,counter,3.0);
959 int nPointsP = clRefsP->GetEntries();
960 if (fRefTPC) delete fRefTPC;
961 fRefTPC = new TObjArray();
963 for(int iPoint=0; iPoint<nPointsP; iPoint++) {
964 AliTrackReference *ref = (AliTrackReference*)clRefsP->At(iPoint);
965 if (ref->DetectorId() == AliTrackReference::kTPC) fRefTPC->Add(new AliTrackReference(*ref));
970 for(int i=0; i<fRefTPC->GetEntries(); i++) {
971 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[i];
972 fLabelsTPC[i] = ref->GetTrack();
975 for(int iPoint=GetTPCReference(iTracks);iPoint<fRefTPC->GetEntries();iPoint++){
976 AliTrackReference* aRef = (AliTrackReference*)(*fRefTPC)[iPoint];
977 if (aRef->GetTrack() != piPosK0Index ) break;
985 mctruth->MCEvent()->GetParticleAndTR(piNegK0Index,eNegTPC,clRefsN);
987 AliMCParticle *mcParticleNeg = (AliMCParticle*) (mctruth->MCEvent()->GetTrack(piNegK0Index));
988 if(!mcParticleNeg) continue;
991 Float_t tpcTrackLengtheNeg = mcParticleNeg->GetTPCTrackLength(fESD->GetMagneticField(),0.05,counterN,3.0);
993 int nPointsN = clRefsN->GetEntries();
994 if (fRefTPC) delete fRefTPC;
995 fRefTPC = new TObjArray();
997 for(int iPoint=0; iPoint<nPointsN; iPoint++) {
998 AliTrackReference *ref = (AliTrackReference*)clRefsN->At(iPoint);
999 if (ref->DetectorId() == AliTrackReference::kTPC) fRefTPC->Add(new AliTrackReference(*ref));
1004 for(int i=0; i<fRefTPC->GetEntries(); i++) {
1005 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[i];
1006 fLabelsTPC[i] = ref->GetTrack();
1009 for(int iPoint=GetTPCReference(iTracks);iPoint<fRefTPC->GetEntries();iPoint++){
1010 AliTrackReference* aRef = (AliTrackReference*)(*fRefTPC)[iPoint];
1011 if (aRef->GetTrack() != piNegK0Index ) break;
1015 if ( labelNegRefs==0 || labelPosRefs==0) continue; // if pi+/pi- do not have a TPC ref continue;
1016 ////////////////////////////////////////////////////////////////////
1020 K0DecayK0GeantIndex[nDecayK0Geant]=iTracks;
1021 piNegDecayK0GeantIndex[nDecayK0Geant]=piNegK0Index;
1022 piPosDecayK0GeantIndex[nDecayK0Geant]=piPosK0Index;
1023 piNegDecayK0GeantLength[nDecayK0Geant]=tpcTrackLengtheNeg;
1024 piPosDecayK0GeantLength[nDecayK0Geant]=tpcTrackLengthePos;
1029 TParticle* pPos = NULL;
1030 TParticle* piNegL = NULL;
1035 if (particle->GetPdgCode()== 3122){ //lambda
1037 if(particle->GetNDaughters() == 2){
1038 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
1039 TParticle *tmpDaughter = stack->Particle(daughterIndex);
1040 if(tmpDaughter->GetPdgCode() == 2212){
1042 pPosLIndex=daughterIndex;
1044 else if(tmpDaughter->GetPdgCode() == -211){
1045 piNegL = tmpDaughter;
1046 piNegLIndex=daughterIndex;
1051 if(pPos == NULL || piNegL == NULL){ // means we do not have two daughters from lambda decay
1055 if(TMath::Abs(pPos->Eta())> MaxEta || TMath::Abs(piNegL->Eta())> MaxEta){
1059 if(pPos->R()> MaxVertex ){
1060 continue; // cuts on distance from collision point
1064 if( (TMath::Abs(pPos->Vz()) * LineCutZRSlope - LineCutZValue) > pPos->R() ){
1065 continue; // line cut to exclude regions where we do not reconstruct
1069 // Looking at the existance of TPC references
1072 mctruth->MCEvent()->GetParticleAndTR(pPosLIndex,ePosTPC,clRefsP);
1074 AliMCParticle *mcParticlePos = (AliMCParticle*) (mctruth->MCEvent()->GetTrack(pPosLIndex));
1075 if(!mcParticlePos) continue;
1078 Float_t tpcTrackLengthePos = mcParticlePos->GetTPCTrackLength(fESD->GetMagneticField(),0.05,counter,3.0);
1081 int nPointsP = clRefsP->GetEntries();
1082 if (fRefTPC) delete fRefTPC;
1083 fRefTPC = new TObjArray();
1085 for(int iPoint=0; iPoint<nPointsP; iPoint++) {
1086 AliTrackReference *ref = (AliTrackReference*)clRefsP->At(iPoint);
1087 if (ref->DetectorId() == AliTrackReference::kTPC) fRefTPC->Add(new AliTrackReference(*ref));
1092 for(int i=0; i<fRefTPC->GetEntries(); i++) {
1093 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[i];
1094 fLabelsTPC[i] = ref->GetTrack();
1097 for(int iPoint=GetTPCReference(iTracks);iPoint<fRefTPC->GetEntries();iPoint++){
1098 AliTrackReference* aRef = (AliTrackReference*)(*fRefTPC)[iPoint];
1099 if (aRef->GetTrack() != pPosLIndex ) break;
1107 mctruth->MCEvent()->GetParticleAndTR(piNegLIndex,eNegTPC,clRefsN);
1109 AliMCParticle *mcParticleNeg = (AliMCParticle*) (mctruth->MCEvent()->GetTrack(piNegLIndex));
1110 if(!mcParticleNeg) continue;
1113 Float_t tpcTrackLengtheNeg = mcParticleNeg->GetTPCTrackLength(fESD->GetMagneticField(),0.05,counterN,3.0);
1115 int nPointsN = clRefsN->GetEntries();
1116 if (fRefTPC) delete fRefTPC;
1117 fRefTPC = new TObjArray();
1119 for(int iPoint=0; iPoint<nPointsN; iPoint++) {
1120 AliTrackReference *ref = (AliTrackReference*)clRefsN->At(iPoint);
1121 if (ref->DetectorId() == AliTrackReference::kTPC) fRefTPC->Add(new AliTrackReference(*ref));
1126 for(int i=0; i<fRefTPC->GetEntries(); i++) {
1127 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[i];
1128 fLabelsTPC[i] = ref->GetTrack();
1131 for(int iPoint=GetTPCReference(iTracks);iPoint<fRefTPC->GetEntries();iPoint++){
1132 AliTrackReference* aRef = (AliTrackReference*)(*fRefTPC)[iPoint];
1133 if (aRef->GetTrack() != piNegLIndex ) break;
1137 if ( labelNegRefs==0 || labelPosRefs==0) continue; // if proton/pi- do not have a TPC ref continue;
1138 ////////////////////////////////////////////////////////////////////
1142 lDecayLGeantIndex[nDecayLGeant]=iTracks;
1144 piNegDecayLGeantIndex[nDecayLGeant]=piNegLIndex;
1145 pPosDecayLGeantIndex[nDecayLGeant]=pPosLIndex;
1147 piNegDecayLGeantLength[nDecayLGeant]=tpcTrackLengtheNeg;
1148 pPosDecayLGeantLength[nDecayLGeant]=tpcTrackLengthePos;
1153 /////////////////////////////////////////////////////
1156 TParticle* apNeg = NULL;
1157 TParticle* piPosAL = NULL;
1162 if (particle->GetPdgCode()== -3122){ //antilambda
1164 if(particle->GetNDaughters() == 2){
1165 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
1166 TParticle *tmpDaughter = stack->Particle(daughterIndex);
1167 if(tmpDaughter->GetPdgCode() == -2212){
1169 apNegALIndex=daughterIndex;
1171 else if(tmpDaughter->GetPdgCode() == 211){
1172 piPosAL = tmpDaughter;
1173 piPosALIndex=daughterIndex;
1178 if(apNeg == NULL || piPosAL == NULL){ // means we do not have two daughters from antilambda decay
1182 if(TMath::Abs(apNeg->Eta())> MaxEta || TMath::Abs(piPosAL->Eta())> MaxEta){
1186 if(apNeg->R()> MaxVertex ){
1187 continue; // cuts on distance from collision point
1191 if( (TMath::Abs(apNeg->Vz()) * LineCutZRSlope - LineCutZValue) > apNeg->R() ){
1192 continue; // line cut to exclude regions where we do not reconstruct
1196 // Looking at the existance of TPC references
1199 mctruth->MCEvent()->GetParticleAndTR(piPosALIndex,ePosTPC,clRefsP);
1201 AliMCParticle *mcParticlePos = (AliMCParticle*) (mctruth->MCEvent()->GetTrack(piPosALIndex));
1202 if(!mcParticlePos) continue;
1205 Float_t tpcTrackLengthePos = mcParticlePos->GetTPCTrackLength(fESD->GetMagneticField(),0.05,counter,3.0);
1207 int nPointsP = clRefsP->GetEntries();
1208 if (fRefTPC) delete fRefTPC;
1209 fRefTPC = new TObjArray();
1211 for(int iPoint=0; iPoint<nPointsP; iPoint++) {
1212 AliTrackReference *ref = (AliTrackReference*)clRefsP->At(iPoint);
1213 if (ref->DetectorId() == AliTrackReference::kTPC) fRefTPC->Add(new AliTrackReference(*ref));
1218 for(int i=0; i<fRefTPC->GetEntries(); i++) {
1219 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[i];
1220 fLabelsTPC[i] = ref->GetTrack();
1223 for(int iPoint=GetTPCReference(iTracks);iPoint<fRefTPC->GetEntries();iPoint++){
1224 AliTrackReference* aRef = (AliTrackReference*)(*fRefTPC)[iPoint];
1225 if (aRef->GetTrack() != piPosALIndex ) break;
1231 mctruth->MCEvent()->GetParticleAndTR(apNegALIndex,eNegTPC,clRefsN);
1233 AliMCParticle *mcParticleNeg = (AliMCParticle*) (mctruth->MCEvent()->GetTrack(apNegALIndex));
1234 if(!mcParticleNeg) continue;
1237 Float_t tpcTrackLengtheNeg = mcParticleNeg->GetTPCTrackLength(fESD->GetMagneticField(),0.05,counterN,3.0);
1239 int nPointsN = clRefsN->GetEntries();
1240 if (fRefTPC) delete fRefTPC;
1241 fRefTPC = new TObjArray();
1243 for(int iPoint=0; iPoint<nPointsN; iPoint++) {
1244 AliTrackReference *ref = (AliTrackReference*)clRefsN->At(iPoint);
1245 if (ref->DetectorId() == AliTrackReference::kTPC) fRefTPC->Add(new AliTrackReference(*ref));
1250 for(int i=0; i<fRefTPC->GetEntries(); i++) {
1251 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[i];
1252 fLabelsTPC[i] = ref->GetTrack();
1255 for(int iPoint=GetTPCReference(iTracks);iPoint<fRefTPC->GetEntries();iPoint++){
1256 AliTrackReference* aRef = (AliTrackReference*)(*fRefTPC)[iPoint];
1257 if (aRef->GetTrack() != apNegALIndex ) break;
1263 if ( labelNegRefs==0 || labelPosRefs==0) continue; // if proton/pi- do not have a TPC ref continue;
1264 ////////////////////////////////////////////////////////////////////
1267 alDecayALGeantIndex[nDecayALGeant]=iTracks;
1269 piPosDecayALGeantIndex[nDecayALGeant]=piPosALIndex;
1270 apNegDecayALGeantIndex[nDecayALGeant]=apNegALIndex;
1272 piPosDecayALGeantLength[nDecayALGeant]=tpcTrackLengthePos;
1273 apNegDecayALGeantLength[nDecayALGeant]=tpcTrackLengtheNeg;
1284 AliKFParticle::SetField(fESD->GetMagneticField());
1286 const AliESDVertex *pvertex = fESD->GetPrimaryVertex();
1288 pvertex->GetXYZ(xyzVtx);
1292 InspectListOfChargedParticles();
1296 if(nConvGamGeant>-1){
1297 FillHnSparseGamma();
1300 if(nDecayK0Geant>-1){
1304 if(nDecayLGeant>-1){
1308 if(nDecayALGeant>-1){
1315 PostData(0,fOutputContainer );
1320 void AliAnalysisTaskV0QA::Terminate(Option_t *) {
1321 // Draw some histogram at the end.
1326 Int_t AliAnalysisTaskV0QA::GetTPCReference(Int_t label) {
1328 int start = TMath::BinarySearch(fRefTPC->GetEntries(), fLabelsTPC, label);
1330 while (start >= 0) {
1331 AliTrackReference *ref = (AliTrackReference*)(*fRefTPC)[start];
1332 if (ref->GetTrack() != label) return start+1;
1343 void AliAnalysisTaskV0QA::InspectListOfChargedParticles(){
1346 for(Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++){
1348 AliESDtrack* curTrack = fESD->GetTrack(iTracks);
1355 // if( !(curTrack->GetStatus() & AliESDtrack::kTPCrefit)){
1360 Int_t labelMC = TMath::Abs(curTrack->GetLabel());
1362 if ( labelMC > stack->GetNtrack() ) continue;
1365 TParticle* curParticle = stack->Particle(labelMC);
1366 if(curParticle->GetMother(0)==-1){
1371 if(TMath::Abs(curParticle->GetPdgCode()) == 11){ // e+/e-
1373 if( stack->Particle(curParticle->GetMother(0))->GetPdgCode()==22 ){ // e+/e- from gamma
1374 if( curParticle->GetUniqueID()!=5 ){ // e+/e- from gamma conversion
1378 for(Int_t iGamConv=0;iGamConv<nConvGamGeant+1;iGamConv++ ){
1379 if(curTrack->GetSign()>0){
1380 if (labelMC== ePosConvGamGeantIndex[iGamConv]){
1381 ePosConvGamSingleRecIndex[iGamConv]=iTracks;
1384 if (labelMC== eNegConvGamGeantIndex[iGamConv]){
1385 eNegConvGamSingleRecIndex[iGamConv]=iTracks;
1388 } // loop over geant converted gammas
1391 } // condition to select reconstructed electrons
1395 if(TMath::Abs(curParticle->GetPdgCode()) == 211 || TMath::Abs(curParticle->GetPdgCode())==2212 ){ // pi+/pi-
1397 if( stack->Particle(curParticle->GetMother(0))->GetPdgCode()==310 ||
1398 stack->Particle(curParticle->GetMother(0))->GetPdgCode()==3122 ||
1399 stack->Particle(curParticle->GetMother(0))->GetPdgCode()==-3122 ){ // pi+/proton/pi- from K0/Lambda
1401 for(Int_t iK0Dec=0;iK0Dec<nDecayK0Geant+1;iK0Dec++ ){
1402 if(curTrack->GetSign()>0){
1403 if (labelMC== piPosDecayK0GeantIndex[iK0Dec]){
1404 piPosDecayK0SingleRecIndex[iK0Dec]=iTracks;
1407 if (labelMC== piNegDecayK0GeantIndex[iK0Dec]){
1408 piNegDecayK0SingleRecIndex[iK0Dec]=iTracks;
1411 } // loop over geant decay K0
1413 for(Int_t iLDec=0;iLDec<nDecayLGeant+1;iLDec++ ){
1414 if(curTrack->GetSign()>0){
1415 if (labelMC== pPosDecayLGeantIndex[iLDec]){
1416 pPosDecayLSingleRecIndex[iLDec]=iTracks;
1419 if (labelMC== piNegDecayLGeantIndex[iLDec]){
1420 piNegDecayLSingleRecIndex[iLDec]=iTracks;
1423 } // loop over geant decay Lambda
1425 for(Int_t iALDec=0;iALDec<nDecayALGeant+1;iALDec++ ){
1426 if(curTrack->GetSign()<0){
1427 if (labelMC== apNegDecayALGeantIndex[iALDec]){
1428 apNegDecayALSingleRecIndex[iALDec]=iTracks;
1431 if (labelMC== piPosDecayALGeantIndex[iALDec]){
1432 piPosDecayALSingleRecIndex[iALDec]=iTracks;
1435 } // loop over geant decay antiLambda
1437 } // condition to select reconstructed electrons
1438 } // all reconstructed track
1443 void AliAnalysisTaskV0QA::InspectListOfV0s(){
1445 AliESDtrack* trackPos= NULL;
1446 AliESDtrack* trackNeg= NULL;
1447 Int_t grandMotherPos=-1;
1448 Int_t grandMotherNeg=-1;
1454 for(Int_t iV0MI = 0; iV0MI < fESD->GetNumberOfV0s(); iV0MI++) {
1456 AliESDv0 * fV0MIs = fESD->GetV0(iV0MI);
1459 if ( !fV0MIs->GetOnFlyStatus() ){
1462 if(nTracksPrim<=0) {
1467 AliESDtrack* trackPosTest = fESD->GetTrack(fV0MIs->GetPindex());
1468 AliESDtrack* trackNegTest = fESD->GetTrack(fV0MIs->GetNindex());
1471 if ( trackPosTest->GetSign() == trackNegTest->GetSign()){
1477 // if( !(trackPosTest->GetStatus() & AliESDtrack::kTPCrefit)){
1481 // if( !(trackNegTest->GetStatus() & AliESDtrack::kTPCrefit)){
1485 if( trackPosTest->GetSign() ==1){
1486 trackPos =fESD->GetTrack(fV0MIs->GetPindex());
1487 trackNeg =fESD->GetTrack(fV0MIs->GetNindex());
1488 pIndex=fV0MIs->GetPindex();
1489 nIndex=fV0MIs->GetNindex();
1492 if( trackPosTest->GetSign() ==-1){
1493 trackPos =fESD->GetTrack(fV0MIs->GetNindex());
1494 trackNeg =fESD->GetTrack(fV0MIs->GetPindex());
1495 pIndex=fV0MIs->GetNindex();
1496 nIndex=fV0MIs->GetPindex();
1500 Int_t labelNeg=TMath::Abs(trackNeg->GetLabel());
1501 if(labelNeg > stack->GetNtrack() ) continue;
1502 TParticle * particleNeg= stack->Particle(labelNeg);
1504 Int_t labelPos=TMath::Abs(trackPos->GetLabel());
1505 if(labelPos > stack->GetNtrack() ) continue;
1506 TParticle * particlePos= stack->Particle(labelPos);
1509 if(particlePos->GetMother(0)>-1){
1510 grandMotherPos=stack->Particle(particlePos->GetMother(0))->GetMother(0);
1511 motherPos=particlePos->GetMother(0);
1514 if(particleNeg->GetMother(0)>-1){
1515 grandMotherNeg=stack->Particle(particleNeg->GetMother(0))->GetMother(0);
1516 motherNeg=particleNeg->GetMother(0);
1519 if(motherPos == motherNeg && motherPos!=-1 ){
1520 if( particlePos->GetPdgCode() ==-11 && particleNeg->GetPdgCode()==11 ){
1521 for(Int_t iGamConv=0;iGamConv<nConvGamGeant+1;iGamConv++ ){
1522 if (labelPos== ePosConvGamGeantIndex[iGamConv]){
1523 ePosConvGamV0RecIndex[iGamConv]=pIndex;
1524 ConvGamV0RecIndexPos[iGamConv]=iV0MI;
1526 if (labelNeg== eNegConvGamGeantIndex[iGamConv]){
1527 eNegConvGamV0RecIndex[iGamConv]=nIndex;
1528 ConvGamV0RecIndexNeg[iGamConv]=iV0MI;
1531 } // loop over geant converted gammas
1534 if( particlePos->GetPdgCode()==211 && particleNeg->GetPdgCode()==-211 ){
1535 for(Int_t iK0Dec=0;iK0Dec<nDecayK0Geant+1;iK0Dec++ ){
1536 if (labelPos== piPosDecayK0GeantIndex[iK0Dec]){
1537 piPosDecayK0V0RecIndex[iK0Dec]=pIndex;
1538 DecayK0V0RecIndexPos[iK0Dec]=iV0MI;
1540 if (labelNeg== piNegDecayK0GeantIndex[iK0Dec]){
1541 piNegDecayK0V0RecIndex[iK0Dec]=nIndex;
1542 DecayK0V0RecIndexNeg[iK0Dec]=iV0MI;
1545 } // loop over geant K0
1548 if( particlePos->GetPdgCode()==2212 && particleNeg->GetPdgCode()==-211 ){
1549 for(Int_t iLDec=0;iLDec<nDecayLGeant+1;iLDec++ ){
1550 if (labelPos== pPosDecayLGeantIndex[iLDec]){
1551 pPosDecayLV0RecIndex[iLDec]=pIndex;
1552 DecayLV0RecIndexPos[iLDec]=iV0MI;
1554 if (labelNeg== piNegDecayLGeantIndex[iLDec]){
1555 piNegDecayLV0RecIndex[iLDec]=nIndex;
1556 DecayLV0RecIndexNeg[iLDec]=iV0MI;
1559 } // loop over geant Lambda
1562 if( particleNeg->GetPdgCode()==-2212 && particlePos->GetPdgCode()==211 ){
1563 for(Int_t iALDec=0;iALDec<nDecayALGeant+1;iALDec++ ){
1564 if (labelNeg== apNegDecayALGeantIndex[iALDec]){
1565 apNegDecayALV0RecIndex[iALDec]=nIndex;
1566 DecayALV0RecIndexNeg[iALDec]=iV0MI;
1568 if (labelPos== piPosDecayALGeantIndex[iALDec]){
1569 piPosDecayALV0RecIndex[iALDec]=pIndex;
1570 DecayALV0RecIndexPos[iALDec]=iV0MI;
1573 } // loop over geant antiLambda
1580 for(Int_t iGamConv=0;iGamConv<nConvGamGeant+1;iGamConv++ ){
1581 if ( ConvGamV0RecIndexNeg[iGamConv]!= ConvGamV0RecIndexPos[iGamConv]){
1582 ePosConvGamV0RecIndex[iGamConv]=-1;
1583 eNegConvGamV0RecIndex[iGamConv]=-1;
1584 ConvGamV0RecIndexNeg[iGamConv]=-1;
1585 ConvGamV0RecIndexPos[iGamConv]=-1;
1590 for(Int_t iLDec=0;iLDec<nDecayLGeant+1;iLDec++ ){
1591 if(DecayLV0RecIndexPos[iLDec] != DecayLV0RecIndexNeg[iLDec]){
1592 piNegDecayLV0RecIndex[iLDec]=-1;
1593 pPosDecayLV0RecIndex[iLDec]=-1;
1594 DecayLV0RecIndexNeg[iLDec]=-1;
1595 DecayLV0RecIndexPos[iLDec]=-1;
1599 for(Int_t iALDec=0;iALDec<nDecayALGeant+1;iALDec++ ){
1600 if(DecayALV0RecIndexPos[iALDec] != DecayALV0RecIndexNeg[iALDec]){
1601 piPosDecayALV0RecIndex[iALDec]=-1;
1602 apNegDecayALV0RecIndex[iALDec]=-1;
1603 DecayALV0RecIndexNeg[iALDec]=-1;
1604 DecayALV0RecIndexPos[iALDec]=-1;
1608 for(Int_t iK0Dec=0;iK0Dec<nDecayK0Geant+1;iK0Dec++ ){
1609 if(DecayK0V0RecIndexPos[iK0Dec] != DecayK0V0RecIndexNeg[iK0Dec]){
1610 piNegDecayK0V0RecIndex[iK0Dec]=-1;
1611 piPosDecayK0V0RecIndex[iK0Dec]=-1;
1612 DecayK0V0RecIndexNeg[iK0Dec]=-1;
1613 DecayK0V0RecIndexPos[iK0Dec]=-1;
1619 void AliAnalysisTaskV0QA::FillHnSparseGamma()
1621 Double_t massE=0.00051099892;
1633 TLorentzVector posSglTrack;
1634 TLorentzVector negSglTrack;
1635 Double_t posPt,posEta,posPhi;
1636 Double_t negPt,negEta,negPhi;
1638 TLorentzVector posV0Track;
1639 TLorentzVector negV0Track;
1640 Double_t posV0Pt,posV0Eta,posV0Phi;
1641 Double_t negV0Pt,negV0Eta,negV0Phi;
1643 Float_t nClsITSPos=-1;
1644 Float_t nClsITSNeg=-1;
1646 Float_t nClsTPCPos=-1;
1647 Float_t nClsTPCNeg=-1;
1649 Int_t statusSingPos=-1;
1650 Int_t statusSingNeg=-1;
1652 Int_t statusV0Pos=-1;
1653 Int_t statusV0Neg=-1;
1656 for(Int_t i=0;i<nConvGamGeant+1;i++){
1657 TParticle* gamPart = stack->Particle(gConvGamGeantIndex[i]);
1658 TParticle* ePosPart = stack->Particle(ePosConvGamGeantIndex[i]);
1659 TParticle* eNegPart = stack->Particle(eNegConvGamGeantIndex[i]);
1660 if (ePosConvGamSingleRecIndex[i]!=-1){
1661 AliESDtrack * ePosSglTrack = fESD->GetTrack(ePosConvGamSingleRecIndex[i]);
1662 ePosSglTrack->GetPxPyPz(ppSgl);
1663 posSglTrack.SetXYZM(ppSgl[0],ppSgl[1],ppSgl[2],massE);
1664 posPt = posSglTrack.Pt();
1665 posEta = posSglTrack.Eta();
1666 posPhi = posSglTrack.Phi();
1667 ePosSglTrack->GetImpactParameters(bPosSgl,bPosCov);
1668 nClsITSPos=ePosSglTrack->GetNcls(0);
1669 nClsTPCPos=ePosSglTrack->GetNcls(1);
1674 posPhi = -2*TMath::Pi();
1684 if (eNegConvGamSingleRecIndex[i]!=-1){
1685 AliESDtrack * eNegSglTrack = fESD->GetTrack(eNegConvGamSingleRecIndex[i]);
1686 eNegSglTrack->GetPxPyPz(pmSgl);
1687 negSglTrack.SetXYZM(pmSgl[0],pmSgl[1],pmSgl[2],massE);
1688 negPt = negSglTrack.Pt();
1689 negEta = negSglTrack.Eta();
1690 negPhi = negSglTrack.Phi();
1691 eNegSglTrack->GetImpactParameters(bNegSgl,bNegCov);
1692 nClsITSNeg=eNegSglTrack->GetNcls(0);
1693 nClsTPCNeg=eNegSglTrack->GetNcls(1);
1698 negPhi = -2*TMath::Pi();
1710 posV0Phi = -2*TMath::Pi();
1713 negV0Phi = -2*TMath::Pi();
1715 if(ConvGamV0RecIndexPos[i]!=-1){
1716 AliESDv0 * fV0MIs = fESD->GetV0(ConvGamV0RecIndexPos[i]);
1717 AliESDtrack* trackPosTest = fESD->GetTrack(fV0MIs->GetPindex());
1718 AliESDtrack* trackNegTest = fESD->GetTrack(fV0MIs->GetNindex());
1720 if (ePosConvGamV0RecIndex[i]!=-1 ){
1721 // AliESDtrack * ePosV0Track = fESD->GetTrack(ePosConvGamV0RecIndex[i]);
1722 if ( trackPosTest->GetSign()==1 ) {
1723 fV0MIs->GetPPxPyPz(ppV0[0],ppV0[1],ppV0[2]);
1725 fV0MIs->GetNPxPyPz(ppV0[0],ppV0[1],ppV0[2]);
1727 posV0Track.SetXYZM(ppV0[0],ppV0[1],ppV0[2],massE);
1729 posV0Pt = posV0Track.Pt();
1730 posV0Eta = posV0Track.Eta();
1731 posV0Phi = posV0Track.Phi();
1736 posV0Phi = -2*TMath::Pi();
1740 if (eNegConvGamV0RecIndex[i]!=-1 ){
1741 // AliESDtrack * eNegV0Track = fESD->GetTrack(eNegConvGamV0RecIndex[i]);
1742 if ( trackNegTest->GetSign()==-1 ) {
1743 fV0MIs->GetNPxPyPz(pmV0[0],pmV0[1],pmV0[2]);
1745 fV0MIs->GetPPxPyPz(pmV0[0],pmV0[1],pmV0[2]);
1747 negV0Track.SetXYZM(pmV0[0],pmV0[1],pmV0[2],massE);
1749 negV0Pt = negV0Track.Pt();
1750 negV0Eta = negV0Track.Eta();
1751 negV0Phi = negV0Track.Phi();
1756 negV0Phi = -2*TMath::Pi();
1761 xrG[0] = ePosPart->Vx();
1762 xrG[1] = ePosPart->Vy();
1763 xrG[2] = ePosPart->Vz();
1765 //--------- Geant variables ----------------------
1766 fValueV0[0] = 1./TMath::Sqrt(gamPart->Pt());
1767 fValueV0[1] = gamPart->Eta();
1769 Double_t tmpGPhi=gamPart->Phi();
1770 if( gamPart->Phi()>TMath::Pi()){
1771 tmpGPhi=gamPart->Phi()-2*TMath::Pi();
1773 fValueV0[2] = tmpGPhi;
1775 fValueV0[3] = TMath::Sqrt(xrG[0]*xrG[0]+xrG[1]*xrG[1]);
1776 fValueV0[4] = xrG[2];
1779 fValueV0[5] = 1./TMath::Sqrt(ePosPart->Pt());
1780 fValueV0[6] = ePosPart->Eta();
1782 Double_t tmpPPhi=ePosPart->Phi();
1783 if( ePosPart->Phi()>TMath::Pi()){
1784 tmpPPhi = ePosPart->Phi()-2*TMath::Pi();
1786 fValueV0[7] = tmpPPhi;
1787 fValueV0[8] = ePosConvGamGeantLength[i];
1789 fValueV0[9] = 1./TMath::Sqrt(eNegPart->Pt());
1790 fValueV0[10] = eNegPart->Eta();
1792 Double_t tmpNPhi=eNegPart->Phi();
1793 if( eNegPart->Phi()>TMath::Pi()){
1794 tmpNPhi = eNegPart->Phi()-2*TMath::Pi();
1796 fValueV0[11] = tmpNPhi;
1797 fValueV0[12] = eNegConvGamGeantLength[i];
1799 //---- Single track variables----------------------
1801 fValueV0[13] = (posPt-ePosPart->Pt())/ePosPart->Pt();
1802 fValueV0[14] = posEta;
1803 fValueV0[15] = posPhi;
1804 fValueV0[16] = TMath::Sqrt( bPosSgl[0]* bPosSgl[0] + bPosSgl[1]* bPosSgl[1] );
1805 fValueV0[17] = TMath::Sqrt( bPosSgl[0]* bPosSgl[0] + bPosSgl[1]* bPosSgl[1] )/TMath::Sqrt(bPosCov[0]*bPosCov[0]+bPosCov[2]*bPosCov[2]);
1806 fValueV0[18] = nClsITSPos;
1807 fValueV0[19] = nClsTPCPos;
1808 fValueV0[20] = statusSingPos;
1811 fValueV0[21] = (negPt-eNegPart->Pt())/eNegPart->Pt();
1812 fValueV0[22] = negEta;
1813 fValueV0[23] = negPhi;
1814 fValueV0[24] = TMath::Sqrt( bNegSgl[0]* bNegSgl[0] + bNegSgl[1]* bNegSgl[1] );
1815 fValueV0[25] = TMath::Sqrt( bNegSgl[0]* bNegSgl[0] + bNegSgl[1]* bNegSgl[1] )/TMath::Sqrt(bNegCov[0]*bNegCov[0]+bNegCov[2]*bNegCov[2]);
1817 fValueV0[26] = nClsITSNeg;
1818 fValueV0[27] = nClsTPCNeg;
1819 fValueV0[28] = statusSingNeg;
1822 //---- V0 track variables----------------------
1824 fValueV0[29] = (posV0Pt-ePosPart->Pt())/ePosPart->Pt();
1825 fValueV0[30] = posV0Eta;
1826 fValueV0[31] = posV0Phi;
1827 fValueV0[32] = statusV0Pos;
1829 fValueV0[33] = (negV0Pt-eNegPart->Pt())/eNegPart->Pt();
1830 fValueV0[34] = negV0Eta;
1831 fValueV0[35] = negV0Phi;
1832 fValueV0[36] = statusV0Neg;
1834 fSparseV0->Fill(fValueV0);
1840 void AliAnalysisTaskV0QA::FillHnSparseK0()
1843 Double_t massPi=0.13957018;
1855 TLorentzVector posSglTrack;
1856 TLorentzVector negSglTrack;
1857 Double_t posPt,posEta,posPhi;
1858 Double_t negPt,negEta,negPhi;
1860 TLorentzVector posV0Track;
1861 TLorentzVector negV0Track;
1862 Double_t posV0Pt,posV0Eta,posV0Phi;
1863 Double_t negV0Pt,negV0Eta,negV0Phi;
1865 Float_t nClsITSPos=-1;
1866 Float_t nClsITSNeg=-1;
1868 Float_t nClsTPCPos=-1;
1869 Float_t nClsTPCNeg=-1;
1871 Int_t statusSingPos=-1;
1872 Int_t statusSingNeg=-1;
1874 Int_t statusV0Pos=-1;
1875 Int_t statusV0Neg=-1;
1877 for(Int_t i=0;i<nDecayK0Geant+1;i++){
1878 TParticle* K0Part = stack->Particle(K0DecayK0GeantIndex[i]);
1879 TParticle* ePosPart = stack->Particle(piPosDecayK0GeantIndex[i]);
1880 TParticle* eNegPart = stack->Particle(piNegDecayK0GeantIndex[i]);
1881 if (piPosDecayK0SingleRecIndex[i]!=-1){
1882 AliESDtrack * ePosSglTrack = fESD->GetTrack(piPosDecayK0SingleRecIndex[i]);
1883 ePosSglTrack->GetPxPyPz(ppSgl);
1884 posSglTrack.SetXYZM(ppSgl[0],ppSgl[1],ppSgl[2],massPi);
1885 posPt = posSglTrack.Pt();
1886 posEta = posSglTrack.Eta();
1887 posPhi = posSglTrack.Phi();
1888 ePosSglTrack->GetImpactParameters(bPosSgl,bPosCov);
1889 nClsITSPos=ePosSglTrack->GetNcls(0);
1890 nClsTPCPos=ePosSglTrack->GetNcls(1);
1895 posPhi = -2*TMath::Pi();
1906 if (piNegDecayK0SingleRecIndex[i]!=-1){
1907 AliESDtrack * eNegSglTrack = fESD->GetTrack(piNegDecayK0SingleRecIndex[i]);
1908 eNegSglTrack->GetPxPyPz(pmSgl);
1909 negSglTrack.SetXYZM(pmSgl[0],pmSgl[1],pmSgl[2],massPi);
1910 negPt = negSglTrack.Pt();
1911 negEta = negSglTrack.Eta();
1912 negPhi = negSglTrack.Phi();
1913 eNegSglTrack->GetImpactParameters(bNegSgl,bNegCov);
1914 nClsITSNeg=eNegSglTrack->GetNcls(0);
1915 nClsTPCNeg=eNegSglTrack->GetNcls(1);
1920 negPhi = -2*TMath::Pi();
1932 posV0Phi = -2*TMath::Pi();
1935 negV0Phi = -2*TMath::Pi();
1937 if(DecayK0V0RecIndexPos[i]!=-1){
1938 AliESDv0 * fV0MIs = fESD->GetV0(DecayK0V0RecIndexPos[i]);
1939 AliESDtrack* trackPosTest = fESD->GetTrack(fV0MIs->GetPindex());
1940 AliESDtrack* trackNegTest = fESD->GetTrack(fV0MIs->GetNindex());
1942 if (piPosDecayK0V0RecIndex[i]!=-1 ){
1943 // AliESDtrack * ePosV0Track = fESD->GetTrack(piPosDecayK0V0RecIndex[i]);
1944 if ( trackPosTest->GetSign()==1 ) {
1945 fV0MIs->GetPPxPyPz(ppV0[0],ppV0[1],ppV0[2]);
1947 fV0MIs->GetNPxPyPz(ppV0[0],ppV0[1],ppV0[2]);
1949 posV0Track.SetXYZM(ppV0[0],ppV0[1],ppV0[2],massPi);
1951 posV0Pt = posV0Track.Pt();
1952 posV0Eta = posV0Track.Eta();
1953 posV0Phi = posV0Track.Phi();
1958 posV0Phi = -2*TMath::Pi();
1962 if (piNegDecayK0V0RecIndex[i]!=-1 ){
1963 // AliESDtrack * eNegV0Track = fESD->GetTrack(piNegDecayK0V0RecIndex[i]);
1964 if ( trackNegTest->GetSign()==-1 ) {
1965 fV0MIs->GetNPxPyPz(pmV0[0],pmV0[1],pmV0[2]);
1967 fV0MIs->GetPPxPyPz(pmV0[0],pmV0[1],pmV0[2]);
1969 negV0Track.SetXYZM(pmV0[0],pmV0[1],pmV0[2],massPi);
1971 negV0Pt = negV0Track.Pt();
1972 negV0Eta = negV0Track.Eta();
1973 negV0Phi = negV0Track.Phi();
1978 negV0Phi = -2*TMath::Pi();
1983 xrG[0] = ePosPart->Vx();
1984 xrG[1] = ePosPart->Vy();
1985 xrG[2] = ePosPart->Vz();
1988 //--------- Geant variables ----------------------
1989 fValueK0[0] = 1./TMath::Sqrt(K0Part->Pt());
1990 fValueK0[1] = K0Part->Eta();
1992 Double_t tmpGPhi=K0Part->Phi();
1993 if( K0Part->Phi()>TMath::Pi()){
1994 tmpGPhi=K0Part->Phi()-2*TMath::Pi();
1996 fValueK0[2] = tmpGPhi;
1998 fValueK0[3] = TMath::Sqrt(xrG[0]*xrG[0]+xrG[1]*xrG[1]);
1999 fValueK0[4] = xrG[2];
2002 fValueK0[5] = 1./TMath::Sqrt(ePosPart->Pt());
2003 fValueK0[6] = ePosPart->Eta();
2005 Double_t tmpPPhi=ePosPart->Phi();
2006 if( ePosPart->Phi()>TMath::Pi()){
2007 tmpPPhi = ePosPart->Phi()-2*TMath::Pi();
2009 fValueK0[7] = tmpPPhi;
2010 fValueK0[8] = piPosDecayK0GeantLength[i];
2012 fValueK0[9] = 1./TMath::Sqrt(eNegPart->Pt());
2013 fValueK0[10] = eNegPart->Eta();
2015 Double_t tmpNPhi=eNegPart->Phi();
2016 if( eNegPart->Phi()>TMath::Pi()){
2017 tmpNPhi = eNegPart->Phi()-2*TMath::Pi();
2019 fValueK0[11] = tmpNPhi;
2020 fValueK0[12] = piNegDecayK0GeantLength[i];
2021 //---- Single track variables----------------------
2023 fValueK0[13] = (posPt-ePosPart->Pt())/ePosPart->Pt() ;
2024 fValueK0[14] = posEta;
2025 fValueK0[15] = posPhi;
2026 fValueK0[16] = TMath::Sqrt( bPosSgl[0]* bPosSgl[0] + bPosSgl[1]* bPosSgl[1] );
2027 fValueK0[17] = TMath::Sqrt( bPosSgl[0]* bPosSgl[0] + bPosSgl[1]* bPosSgl[1] )/TMath::Sqrt(bPosCov[0]*bPosCov[0]+bPosCov[2]*bPosCov[2]);
2029 fValueK0[18] = nClsITSPos;
2030 fValueK0[19] = nClsTPCPos;
2031 fValueK0[20] = statusSingPos;
2033 fValueK0[21] = (negPt-eNegPart->Pt())/eNegPart->Pt();
2034 fValueK0[22] = negEta;
2035 fValueK0[23] = negPhi;
2036 fValueK0[24] = TMath::Sqrt( bNegSgl[0]* bNegSgl[0]+ bNegSgl[1]* bNegSgl[1] );
2037 fValueK0[25] = TMath::Sqrt( bNegSgl[0]* bNegSgl[0]+ bNegSgl[1]* bNegSgl[1] )/TMath::Sqrt(bNegCov[0]*bNegCov[0]+bNegCov[2]*bNegCov[2]);
2038 fValueK0[26] = nClsITSNeg;
2039 fValueK0[27] = nClsTPCNeg;
2040 fValueK0[28] = statusSingNeg;
2043 //---- V0 track variables----------------------
2045 fValueK0[29] = (posV0Pt-ePosPart->Pt())/ePosPart->Pt();
2046 fValueK0[30] = posV0Eta;
2047 fValueK0[31] = posV0Phi;
2048 fValueK0[32] = statusV0Pos;
2050 fValueK0[33] = (negV0Pt-eNegPart->Pt())/eNegPart->Pt();
2051 fValueK0[34] = negV0Eta;
2052 fValueK0[35] = negV0Phi;
2053 fValueK0[36] = statusV0Neg;
2055 fSparseK0->Fill(fValueK0);
2060 void AliAnalysisTaskV0QA::FillHnSparseL()
2063 Double_t massPi=0.13957018;
2064 Double_t massP=0.93827203;
2078 TLorentzVector posSglTrack;
2079 TLorentzVector negSglTrack;
2080 Double_t posPt,posEta,posPhi;
2081 Double_t negPt,negEta,negPhi;
2083 TLorentzVector posV0Track;
2084 TLorentzVector negV0Track;
2085 Double_t posV0Pt,posV0Eta,posV0Phi;
2086 Double_t negV0Pt,negV0Eta,negV0Phi;
2088 Float_t nClsITSPos=-1;
2089 Float_t nClsITSNeg=-1;
2091 Float_t nClsTPCPos=-1;
2092 Float_t nClsTPCNeg=-1;
2094 Int_t statusSingPos=-1;
2095 Int_t statusSingNeg=-1;
2097 Int_t statusV0Pos=-1;
2098 Int_t statusV0Neg=-1;
2100 for(Int_t i=0;i<nDecayLGeant+1;i++){
2101 TParticle* lPart = stack->Particle(lDecayLGeantIndex[i]);
2102 TParticle* ePosPart = stack->Particle(pPosDecayLGeantIndex[i]);
2103 TParticle* eNegPart = stack->Particle(piNegDecayLGeantIndex[i]);
2104 if (pPosDecayLSingleRecIndex[i]!=-1){
2105 AliESDtrack * ePosSglTrack = fESD->GetTrack(pPosDecayLSingleRecIndex[i]);
2106 ePosSglTrack->GetPxPyPz(ppSgl);
2107 posSglTrack.SetXYZM(ppSgl[0],ppSgl[1],ppSgl[2],massP);
2108 posPt = posSglTrack.Pt();
2109 posEta = posSglTrack.Eta();
2110 posPhi = posSglTrack.Phi();
2111 ePosSglTrack->GetImpactParameters(bPosSgl,bPosCov);
2112 nClsITSPos=ePosSglTrack->GetNcls(0);
2113 nClsTPCPos=ePosSglTrack->GetNcls(1);
2118 posPhi = -2*TMath::Pi();
2128 if (piNegDecayLSingleRecIndex[i]!=-1){
2129 AliESDtrack * eNegSglTrack = fESD->GetTrack(piNegDecayLSingleRecIndex[i]);
2130 eNegSglTrack->GetPxPyPz(pmSgl);
2131 negSglTrack.SetXYZM(pmSgl[0],pmSgl[1],pmSgl[2],massPi);
2132 negPt = negSglTrack.Pt();
2133 negEta = negSglTrack.Eta();
2134 negPhi = negSglTrack.Phi();
2135 eNegSglTrack->GetImpactParameters(bNegSgl,bNegCov);
2136 nClsITSNeg=eNegSglTrack->GetNcls(0);
2137 nClsTPCNeg=eNegSglTrack->GetNcls(1);
2142 negPhi = -2*TMath::Pi();
2154 posV0Phi = -2*TMath::Pi();
2157 negV0Phi = -2*TMath::Pi();
2159 if(DecayLV0RecIndexPos[i]!=-1){
2160 AliESDv0 * fV0MIs = fESD->GetV0(DecayLV0RecIndexPos[i]);
2161 AliESDtrack* trackPosTest = fESD->GetTrack(fV0MIs->GetPindex());
2162 AliESDtrack* trackNegTest = fESD->GetTrack(fV0MIs->GetNindex());
2164 if (pPosDecayLV0RecIndex[i]!=-1 ){
2165 // AliESDtrack * ePosV0Track = fESD->GetTrack(pPosDecayLV0RecIndex[i]);
2166 if ( trackPosTest->GetSign()==1 ) {
2167 fV0MIs->GetPPxPyPz(ppV0[0],ppV0[1],ppV0[2]);
2169 fV0MIs->GetNPxPyPz(ppV0[0],ppV0[1],ppV0[2]);
2171 posV0Track.SetXYZM(ppV0[0],ppV0[1],ppV0[2],massP);
2173 posV0Pt = posV0Track.Pt();
2174 posV0Eta = posV0Track.Eta();
2175 posV0Phi = posV0Track.Phi();
2180 posV0Phi = -2*TMath::Pi();
2184 if (piNegDecayLV0RecIndex[i]!=-1 ){
2185 // AliESDtrack * eNegV0Track = fESD->GetTrack(piNegDecayLV0RecIndex[i]);
2186 if ( trackNegTest->GetSign()==-1 ) {
2187 fV0MIs->GetNPxPyPz(pmV0[0],pmV0[1],pmV0[2]);
2189 fV0MIs->GetPPxPyPz(pmV0[0],pmV0[1],pmV0[2]);
2191 negV0Track.SetXYZM(pmV0[0],pmV0[1],pmV0[2],massPi);
2193 negV0Pt = negV0Track.Pt();
2194 negV0Eta = negV0Track.Eta();
2195 negV0Phi = negV0Track.Phi();
2200 negV0Phi = -2*TMath::Pi();
2205 xrG[0] = ePosPart->Vx();
2206 xrG[1] = ePosPart->Vy();
2207 xrG[2] = ePosPart->Vz();
2209 //--------- Geant variables ----------------------
2210 fValueL[0] = 1./TMath::Sqrt(lPart->Pt());
2211 fValueL[1] = lPart->Eta();
2213 Double_t tmpGPhi=lPart->Phi();
2214 if( lPart->Phi()>TMath::Pi()){
2215 tmpGPhi=lPart->Phi()-2*TMath::Pi();
2217 fValueL[2] = tmpGPhi;
2219 fValueL[3] = TMath::Sqrt(xrG[0]*xrG[0]+xrG[1]*xrG[1]);
2220 fValueL[4] = xrG[2];
2223 fValueL[5] = 1./TMath::Sqrt(ePosPart->Pt());
2224 fValueL[6] = ePosPart->Eta();
2226 Double_t tmpPPhi=ePosPart->Phi();
2227 if( ePosPart->Phi()>TMath::Pi()){
2228 tmpPPhi = ePosPart->Phi()-2*TMath::Pi();
2230 fValueL[7] = tmpPPhi;
2231 fValueL[8] = pPosDecayLGeantLength[i];
2233 fValueL[9] = 1./TMath::Sqrt(eNegPart->Pt());
2234 fValueL[10] = eNegPart->Eta();
2236 Double_t tmpNPhi=eNegPart->Phi();
2237 if( eNegPart->Phi()>TMath::Pi()){
2238 tmpNPhi = eNegPart->Phi()-2*TMath::Pi();
2240 fValueL[11] = tmpNPhi;
2241 fValueL[12] = piNegDecayLGeantLength[i];
2242 //---- Single track variables----------------------
2244 fValueL[13] = (posPt-ePosPart->Pt())/ePosPart->Pt();
2245 fValueL[14] = posEta;
2246 fValueL[15] = posPhi;
2247 fValueL[16] = TMath::Sqrt( bPosSgl[0]* bPosSgl[0] + bPosSgl[1]* bPosSgl[1]);
2248 fValueL[17] = TMath::Sqrt( bPosSgl[0]* bPosSgl[0] + bPosSgl[1]* bPosSgl[1] )/TMath::Sqrt(bPosCov[0]*bPosCov[0]+bPosCov[2]*bPosCov[2]);
2249 fValueL[18] = nClsITSPos;
2250 fValueL[19] = nClsTPCPos;
2251 fValueL[20] = statusSingPos;
2253 fValueL[21] = (negPt-eNegPart->Pt())/eNegPart->Pt() ;
2254 fValueL[22] = negEta;
2255 fValueL[23] = negPhi;
2256 fValueL[24] = TMath::Sqrt( bNegSgl[0]* bNegSgl[0] + bNegSgl[1]* bNegSgl[1] );
2257 fValueL[25] = TMath::Sqrt( bNegSgl[0]* bNegSgl[0] + bNegSgl[1]* bNegSgl[1] )/TMath::Sqrt(bNegCov[0]*bNegCov[0]+bNegCov[2]*bNegCov[2]);
2258 fValueL[26] = nClsITSNeg;
2259 fValueL[27] = nClsTPCNeg;
2260 fValueL[28] = statusSingNeg;
2264 //---- V0 track variables----------------------
2266 fValueL[29] = (posV0Pt-ePosPart->Pt())/ePosPart->Pt();
2267 fValueL[30] = posV0Eta;
2268 fValueL[31] = posV0Phi;
2269 fValueL[32] = statusV0Pos;
2272 fValueL[33] = (negV0Pt-eNegPart->Pt())/eNegPart->Pt();
2273 fValueL[34] = negV0Eta;
2274 fValueL[35] = negV0Phi;
2275 fValueL[36] = statusV0Neg;
2277 fSparseL->Fill(fValueL);
2283 void AliAnalysisTaskV0QA::FillHnSparseAL()
2286 Double_t massPi=0.13957018;
2287 Double_t massP=0.93827203;
2301 TLorentzVector posSglTrack;
2302 TLorentzVector negSglTrack;
2303 Double_t posPt,posEta,posPhi;
2304 Double_t negPt,negEta,negPhi;
2306 TLorentzVector posV0Track;
2307 TLorentzVector negV0Track;
2308 Double_t posV0Pt,posV0Eta,posV0Phi;
2309 Double_t negV0Pt,negV0Eta,negV0Phi;
2311 Float_t nClsITSPos=-1;
2312 Float_t nClsITSNeg=-1;
2314 Float_t nClsTPCPos=-1;
2315 Float_t nClsTPCNeg=-1;
2317 Int_t statusSingPos=-1;
2318 Int_t statusSingNeg=-1;
2320 Int_t statusV0Pos=-1;
2321 Int_t statusV0Neg=-1;
2324 for(Int_t i=0;i<nDecayALGeant+1;i++){
2325 TParticle* alPart = stack->Particle(alDecayALGeantIndex[i]);
2326 TParticle* eNegPart = stack->Particle(apNegDecayALGeantIndex[i]);
2327 TParticle* ePosPart = stack->Particle(piPosDecayALGeantIndex[i]);
2328 if (piPosDecayALSingleRecIndex[i]!=-1){
2329 AliESDtrack * ePosSglTrack = fESD->GetTrack(piPosDecayALSingleRecIndex[i]);
2330 ePosSglTrack->GetPxPyPz(ppSgl);
2331 posSglTrack.SetXYZM(ppSgl[0],ppSgl[1],ppSgl[2],massPi);
2332 posPt = posSglTrack.Pt();
2333 posEta = posSglTrack.Eta();
2334 posPhi = posSglTrack.Phi();
2335 ePosSglTrack->GetImpactParameters(bPosSgl,bPosCov);
2336 nClsITSPos=ePosSglTrack->GetNcls(0);
2337 nClsTPCPos=ePosSglTrack->GetNcls(1);
2342 posPhi = -2*TMath::Pi();
2352 if (apNegDecayALSingleRecIndex[i]!=-1){
2353 AliESDtrack * eNegSglTrack = fESD->GetTrack(apNegDecayALSingleRecIndex[i]);
2354 eNegSglTrack->GetPxPyPz(pmSgl);
2355 negSglTrack.SetXYZM(pmSgl[0],pmSgl[1],pmSgl[2],massP);
2356 negPt = negSglTrack.Pt();
2357 negEta = negSglTrack.Eta();
2358 negPhi = negSglTrack.Phi();
2359 eNegSglTrack->GetImpactParameters(bNegSgl,bNegCov);
2360 nClsITSNeg=eNegSglTrack->GetNcls(0);
2361 nClsTPCNeg=eNegSglTrack->GetNcls(1);
2366 negPhi = -2*TMath::Pi();
2378 posV0Phi = -2*TMath::Pi();
2381 negV0Phi = -2*TMath::Pi();
2383 if(DecayALV0RecIndexPos[i]!=-1){
2384 AliESDv0 * fV0MIs = fESD->GetV0(DecayALV0RecIndexPos[i]);
2385 AliESDtrack* trackPosTest = fESD->GetTrack(fV0MIs->GetPindex());
2386 AliESDtrack* trackNegTest = fESD->GetTrack(fV0MIs->GetNindex());
2388 if (piPosDecayALV0RecIndex[i]!=-1 ){
2389 // AliESDtrack * ePosV0Track = fESD->GetTrack(piPosDecayALV0RecIndex[i]);
2390 if ( trackPosTest->GetSign()==1 ) {
2391 fV0MIs->GetPPxPyPz(ppV0[0],ppV0[1],ppV0[2]);
2393 fV0MIs->GetNPxPyPz(ppV0[0],ppV0[1],ppV0[2]);
2395 posV0Track.SetXYZM(ppV0[0],ppV0[1],ppV0[2],massPi);
2397 posV0Pt = posV0Track.Pt();
2398 posV0Eta = posV0Track.Eta();
2399 posV0Phi = posV0Track.Phi();
2404 posV0Phi = -2*TMath::Pi();
2408 if (apNegDecayALV0RecIndex[i]!=-1 ){
2409 // AliESDtrack * eNegV0Track = fESD->GetTrack(apNegDecayALV0RecIndex[i]);
2410 if ( trackNegTest->GetSign()==-1 ) {
2411 fV0MIs->GetNPxPyPz(pmV0[0],pmV0[1],pmV0[2]);
2413 fV0MIs->GetPPxPyPz(pmV0[0],pmV0[1],pmV0[2]);
2415 negV0Track.SetXYZM(pmV0[0],pmV0[1],pmV0[2],massP);
2417 negV0Pt = negV0Track.Pt();
2418 negV0Eta = negV0Track.Eta();
2419 negV0Phi = negV0Track.Phi();
2424 negV0Phi = -2*TMath::Pi();
2429 xrG[0] = ePosPart->Vx();
2430 xrG[1] = ePosPart->Vy();
2431 xrG[2] = ePosPart->Vz();
2433 //--------- Geant variables ----------------------
2434 fValueAL[0] = 1./TMath::Sqrt(alPart->Pt());
2435 fValueAL[1] = alPart->Eta();
2437 Double_t tmpGPhi=alPart->Phi();
2438 if( alPart->Phi()>TMath::Pi()){
2439 tmpGPhi=alPart->Phi()-2*TMath::Pi();
2441 fValueAL[2] = tmpGPhi;
2443 fValueAL[3] = TMath::Sqrt(xrG[0]*xrG[0]+xrG[1]*xrG[1]);
2444 fValueAL[4] = xrG[2];
2447 fValueAL[5] = 1./TMath::Sqrt(ePosPart->Pt());
2448 fValueAL[6] = ePosPart->Eta();
2450 Double_t tmpPPhi=ePosPart->Phi();
2451 if( ePosPart->Phi()>TMath::Pi()){
2452 tmpPPhi = ePosPart->Phi()-2*TMath::Pi();
2454 fValueAL[7] = tmpPPhi;
2455 fValueAL[8] = piPosDecayALGeantLength[i];
2457 fValueAL[9] = 1./TMath::Sqrt(eNegPart->Pt());
2458 fValueAL[10] = eNegPart->Eta();
2460 Double_t tmpNPhi=eNegPart->Phi();
2461 if( eNegPart->Phi()>TMath::Pi()){
2462 tmpNPhi = eNegPart->Phi()-2*TMath::Pi();
2464 fValueAL[11] = tmpNPhi;
2465 fValueAL[12] = apNegDecayALGeantLength[i];
2466 //---- Single track variables----------------------
2468 fValueAL[13] = (posPt-ePosPart->Pt())/ePosPart->Pt();
2469 fValueAL[14] = posEta;
2470 fValueAL[15] = posPhi;
2471 fValueAL[16] = TMath::Sqrt( bPosSgl[0]* bPosSgl[0] + bPosSgl[1]* bPosSgl[1]);
2472 fValueAL[17] = TMath::Sqrt( bPosSgl[0]* bPosSgl[0] + bPosSgl[1]* bPosSgl[1] )/TMath::Sqrt(bPosCov[0]*bPosCov[0]+bPosCov[2]*bPosCov[2]);
2473 fValueAL[18] = nClsITSPos;
2474 fValueAL[19] = nClsTPCPos;
2475 fValueAL[20] = statusSingPos;
2477 fValueAL[21] = (negPt-eNegPart->Pt())/eNegPart->Pt() ;
2478 fValueAL[22] = negEta;
2479 fValueAL[23] = negPhi;
2480 fValueAL[24] = TMath::Sqrt( bNegSgl[0]* bNegSgl[0] + bNegSgl[1]* bNegSgl[1] );
2481 fValueAL[25] = TMath::Sqrt( bNegSgl[0]* bNegSgl[0] + bNegSgl[1]* bNegSgl[1] )/TMath::Sqrt(bNegCov[0]*bNegCov[0]+bNegCov[2]*bNegCov[2]);
2482 fValueAL[26] = nClsITSNeg;
2483 fValueAL[27] = nClsTPCNeg;
2484 fValueAL[28] = statusSingNeg;
2488 //---- V0 track variables----------------------
2490 fValueAL[29] = (posV0Pt-ePosPart->Pt())/ePosPart->Pt();
2491 fValueAL[30] = posV0Eta;
2492 fValueAL[31] = posV0Phi;
2493 fValueAL[32] = statusV0Pos;
2496 fValueAL[33] = (negV0Pt-eNegPart->Pt())/eNegPart->Pt();
2497 fValueAL[34] = negV0Eta;
2498 fValueAL[35] = negV0Phi;
2499 fValueAL[36] = statusV0Neg;
2501 fSparseAL->Fill(fValueAL);
2506 // void AliAnalysisTaskV0QA::SetESDtrackCuts()
2509 // fEsdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
2511 // fEsdTrackCuts->SetRequireTPCRefit(kTRUE);
2512 // fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);