X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PWGLF%2FSTRANGENESS%2FCorrelations%2FAliAnalysisTaskV0ChCorrelations.cxx;fp=PWGLF%2FSTRANGENESS%2FCorrelations%2FAliAnalysisTaskV0ChCorrelations.cxx;h=0000000000000000000000000000000000000000;hb=c627660e3ea095ed462f5ce4ad36a184f40e0dd7;hp=8e606ee592e9f4e2b4c2aabe2aaf65e5f3420ab3;hpb=d85f6819269447083582dbf4349395fe419ff1f5;p=u%2Fmrichter%2FAliRoot.git diff --git a/PWGLF/STRANGENESS/Correlations/AliAnalysisTaskV0ChCorrelations.cxx b/PWGLF/STRANGENESS/Correlations/AliAnalysisTaskV0ChCorrelations.cxx deleted file mode 100644 index 8e606ee592e..00000000000 --- a/PWGLF/STRANGENESS/Correlations/AliAnalysisTaskV0ChCorrelations.cxx +++ /dev/null @@ -1,1142 +0,0 @@ -/************************************************************************** - * Copyright(c) 1998-2013, ALICE Experiment at CERN, All rights reserved. * - * * - * Author: Marek Bombara * - * Contributors are mentioned in the code where appropriate. * - * * - * Permission to use, copy, modify and distribute this software and its * - * documentation strictly for non-commercial purposes is hereby granted * - * without fee, provided that the above copyright notice appears in all * - * copies and that both the copyright notice and this permission notice * - * appear in the supporting documentation. The authors make no claims * - * about the suitability of this software for any purpose. It is * - * provided "as is" without express or implied warranty. * - **************************************************************************/ - -/* The task selects candidates for K0s, Lambdas and AntiLambdas (trigger particles) - * and calculates correlations with charged unidentified particles (associated particles) in phi and eta. - * The task works with AOD (with or without MC info) events only and containes also mixing for acceptance corrections. - * Last update edited by Marek Bombara, August 2013, Marek.Bombara@cern.ch - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "AliLog.h" -#include "AliAnalysisManager.h" -#include "AliAODTrack.h" -#include "AliAODEvent.h" -#include "AliAODv0.h" -#include "AliAODcascade.h" -#include "AliAODVertex.h" - -#include "AliMCEvent.h" -#include "AliMCVertex.h" -#include "AliGenEventHeader.h" -#include "AliAODMCHeader.h" -#include "AliAODMCParticle.h" -#include "AliAnalyseLeadingTrackUE.h" - -#include "AliAODPid.h" -#include "AliPIDResponse.h" -#include "AliEventPoolManager.h" -#include "AliCentrality.h" - -#include "AliAnalysisTaskV0ChCorrelations.h" -#include "AliPhysicsSelectionTask.h" - -#include -#include - -ClassImp(AliAnalysisTaskV0ChCorrelations) -ClassImp(AliV0ChBasicParticle) - -//________________________________________________________________________ -AliAnalysisTaskV0ChCorrelations::AliAnalysisTaskV0ChCorrelations(const char *name) // All data members should be initialised here - : AliAnalysisTaskSE(name), - fAnalysisMC(kFALSE), - fFillMixed(kTRUE), - fMixingTracks(50000), - fPoolMgr(0x0), - - fDcaDToPV(0.5), - fDcaV0D(0.1), - fWithChCh(kFALSE), - fOStatus(1), - - fOutput(0), - fPIDResponse(0), - fHistCentVtx(0), - fHistMultiMain(0), - fHistMassK0(0), - fHistMassLambda(0), - fHistMassAntiLambda(0), - - fHistdPhidEtaSib(0), - fHistdPhidEtaMix(0), - fHistNTrigSib(0), - - fHistMCPtCentTrig(0), - fHistRCPtCentTrig(0), - fHistMCPtCentAs(0), - fHistRCPtCentAs(0), - fHistRCPtCentAll(0), - - fHistTemp(0), - fHistTemp2(0)// The last in the above list should not have a comma after it -{ - // Constructor - // Define input and output slots here (never in the dummy constructor) - // Input slot #0 works with a TChain - it is connected to the default input container - // Output slot #1 writes into a TH1 container - DefineOutput(1, TList::Class()); // for output list -} - -//________________________________________________________________________ -AliAnalysisTaskV0ChCorrelations::~AliAnalysisTaskV0ChCorrelations() -{ - // Destructor. Clean-up the output list, but not the histograms that are put inside - // (the list is owner and will clean-up these histograms). Protect in PROOF case. - if (fOutput && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) { - delete fOutput; - } -} - -//________________________________________________________________________ -void AliAnalysisTaskV0ChCorrelations::UserCreateOutputObjects() -{ - // Create histograms - - fOutput = new TList(); - fOutput->SetOwner(); // IMPORTANT! - // defining bins for centrality - Int_t nCentralityBins = 9; - Double_t centBins[] = {0.,10.,20.,30.,40.,50.,60.,70.,80.,90.}; - const Double_t* centralityBins = centBins; - // defining bins for Z vertex - Int_t nZvtxBins = 7; - //Double_t vertexBins[] = {-10.,-8.,-6.,-4.,-2.,0.,2.,4.,6.,8.,10.}; - Double_t vertexBins[] = {-7.,-5.,-3.,-1.,1.,3.,5.,7.}; - const Double_t* zvtxBins = vertexBins; - // pt bins of associated particles for the analysis - Int_t nPtBins = 7; - const Double_t PtBins[8] = {2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0}; - //Int_t nPtBins = 1; - //const Double_t PtBins[2] = {3.0,15.0}; - // pt bins of trigger particles for the analysis - Int_t nPtBinsV0 = 11; - //const Double_t PtBinsV0[2] = {6.0,15.0}; - const Double_t PtBinsV0[12] = {4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0}; - // V0 candidate: 1 - K0sig, 2 - Lamsig, 3 - Alamsig, 4 - K0bg, 5 - Lambg, 6 - Alambg - Int_t nTrigC = 7; - const Double_t TrigC[8] = {0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5}; - - // Create general histograms - fHistCentVtx = new TH2F("fHistCentVtx", "Centrality vs. Z vertex", nCentralityBins, centralityBins, nZvtxBins, zvtxBins); - fHistMultiMain = new TH1F("fHistMultiMain", "Multiplicity of main events", 2000, 0, 2000); - - const Int_t mrBins[3] = {nPtBinsV0, nCentralityBins, nTrigC}; - const Double_t mrMin[3] = {PtBinsV0[0], centralityBins[0], TrigC[0]}; - const Double_t mrMax[3] = {PtBinsV0[11], centralityBins[9], TrigC[6]}; - - // Create histograms for reconstruction track and V0 efficiency - fHistMCPtCentTrig = new THnSparseF("fHistMCPtCentTrig", "MC Pt vs. Cent. Trig", 3, mrBins, mrMin, mrMax); - fHistRCPtCentTrig = new THnSparseF("fHistRCPtCentTrig", "Rec Pt vs. Cent. Trig", 3, mrBins, mrMin, mrMax); - - // pt bins of associated particles for the efficiency - Int_t nPtBinsAs = 13; - const Double_t PtBinsAs[14] = {2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0}; - - fHistMCPtCentAs = new TH2D("fHistMCPtCentAs", "MC Pt vs. Cent. Assoc", nPtBinsAs, PtBinsAs[0], PtBinsAs[13], nCentralityBins, centBins[0], centBins[9]); - fHistRCPtCentAs = new TH2D("fHistRCPtCentAs", "Rec Pt vs. Cent. Assoc", nPtBinsAs, PtBinsAs[0], PtBinsAs[13], nCentralityBins, centBins[0], centBins[9]); - fHistRCPtCentAll = new TH2D("fHistRCPtCentAll", "Rec Pt vs. Cent. All Prim+Sec", nPtBinsAs, PtBinsAs[0], PtBinsAs[13], nCentralityBins, centBins[0], centBins[9]); - - // defining bins for mass distributions - Int_t nBins = 200; - Double_t mk0Min = 0.40; - Double_t mk0Max = 0.60; - Double_t mlaMin = 1.07; - Double_t mlaMax = 1.17; - Double_t malMin = 1.07; - Double_t malMax = 1.17; - - const Int_t spBins[3] = {nBins, nPtBinsV0, nCentralityBins}; - const Double_t spMinK0[3] = {mk0Min, PtBinsV0[0], centralityBins[0]}; - const Double_t spMaxK0[3] = {mk0Max, PtBinsV0[11], centralityBins[9]}; - const Double_t spMinLa[3] = {mlaMin, PtBinsV0[0], centralityBins[0]}; - const Double_t spMaxLa[3] = {mlaMax, PtBinsV0[11], centralityBins[9]}; - const Double_t spMinAl[3] = {malMin, PtBinsV0[0], centralityBins[0]}; - const Double_t spMaxAl[3] = {malMax, PtBinsV0[11], centralityBins[9]}; - // Create mass histograms - fHistMassK0 = new THnSparseF("fHistMassK0","V0 mass for K0 hypothesis", 3, spBins, spMinK0, spMaxK0); - fHistMassLambda = new THnSparseF("fHistMassLambda","V0 mass for Lambda hypothesis", 3, spBins, spMinLa, spMaxLa); - fHistMassAntiLambda = new THnSparseF("fHistMassAntiLambda","V0 mass for AntiLambda hypothesis", 3, spBins, spMinAl, spMaxAl); - - // defining bins for dPhi distributions - const Int_t nbPhiBins = 72; - //const Double_t kPi = TMath::Pi(); - //Double_t PhiMin = -kPi/2.; - //Double_t PhiMax = -kPi/2. + 2*kPi; - Double_t PhiMin = -1.57; - Double_t PhiMax = 4.71; - Double_t PhiBins[nbPhiBins+1] = {0.}; - PhiBins[0] = PhiMin; - for (Int_t i=0; iAdd(fHistCentVtx); - - fOutput->Add(fHistMultiMain); - fOutput->Add(fHistMassK0); - fOutput->Add(fHistMassLambda); - fOutput->Add(fHistMassAntiLambda); - - fOutput->Add(fHistdPhidEtaSib); - fOutput->Add(fHistdPhidEtaMix); - fOutput->Add(fHistNTrigSib); - - fOutput->Add(fHistMCPtCentTrig); - fOutput->Add(fHistRCPtCentTrig); - fOutput->Add(fHistMCPtCentAs); - fOutput->Add(fHistRCPtCentAs); - fOutput->Add(fHistRCPtCentAll); - - fOutput->Add(fHistTemp); - fOutput->Add(fHistTemp2); - - PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram - - // Settings for event mixing ------------------------------------- - Int_t trackDepth = fMixingTracks; - Int_t poolSize = 200; // Maximum number of events, ignored in the present implemented of AliEventPoolManager - - fPoolMgr = new AliEventPoolManager(poolSize, trackDepth, nCentralityBins, centBins, nZvtxBins, vertexBins); - //---------------------------------------------- -} - -//________________________________________________________________________ -void AliAnalysisTaskV0ChCorrelations::Terminate(Option_t *) -{ - // Draw result to screen, or perform fitting, normalizations - // Called once at the end of the query - - fOutput = dynamic_cast(GetOutputData(1)); - if (!fOutput) { AliError("Could not retrieve TList fOutput"); return; } - - // NEW HISTO should be retrieved from the TList container in the above way, - // so it is available to draw on a canvas such as below -} - -//_________________________________________________________________________ -void AliAnalysisTaskV0ChCorrelations::UserExec(Option_t *) -{ - AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); - AliInputEventHandler *inEvMain = (AliInputEventHandler*)mgr->GetInputEventHandler(); - - // physics selection - UInt_t maskIsSelected = inEvMain->IsEventSelected(); - // 2010 data trigger selection - //Bool_t isSelected = (maskIsSelected & AliVEvent::kMB); - // 2011 data trigger selection - Bool_t isSelected = ((maskIsSelected & AliVEvent::kMB) || (maskIsSelected & AliVEvent::kCentral) || (maskIsSelected & AliVEvent::kSemiCentral)); - if (!isSelected) return; - // calculating the event types - if (maskIsSelected & AliVEvent::kMB) fHistTemp->Fill(2); - if (maskIsSelected & AliVEvent::kCentral) fHistTemp->Fill(4); - if (maskIsSelected & AliVEvent::kSemiCentral) fHistTemp->Fill(6); - - AliAODEvent* aod = (AliAODEvent*)inEvMain->GetEvent(); - fPIDResponse = inEvMain->GetPIDResponse(); - - // pt intervals for trigger particles - const Double_t kPi = TMath::Pi(); - Double_t PtTrigMin = 4.0; - Double_t PtTrigMax = 15.0; - // pt interval for associated particles - Double_t PtAssocMin = 2.0; - fHistMultiMain->Fill(aod->GetNumberOfTracks()); - - // Vertex cut - Double_t cutPrimVertex = 7.0; - AliAODVertex *myPrimVertex = aod->GetPrimaryVertex(); - if (!myPrimVertex) return; - if ( ( TMath::Abs(myPrimVertex->GetZ()) ) >= cutPrimVertex) return ; - Double_t lPVx = myPrimVertex->GetX(); - Double_t lPVy = myPrimVertex->GetY(); - Double_t lPVz = myPrimVertex->GetZ(); - - if (TMath::Abs(lPVx)<10e-5 && TMath::Abs(lPVy)<10e-5 && TMath::Abs(lPVz)<10e-5) return; - - // Centrality definition - Double_t lCent = 0.0; - AliCentrality *centralityObj = 0; - centralityObj = ((AliVAODHeader*)aod->GetHeader())->GetCentralityP(); - lCent = centralityObj->GetCentralityPercentile("V0M"); - if ((lCent < 0.)||(lCent > 90.)) return; - fHistCentVtx->Fill(lCent,lPVz); - -//=========== MC loop =============================== - if (fAnalysisMC) - { - AliAODMCHeader *aodMCheader = (AliAODMCHeader*)aod->FindListObject(AliAODMCHeader::StdBranchName()); - Float_t vzMC = aodMCheader->GetVtxZ(); - if (TMath::Abs(vzMC) >= 7.) return; - //retrieve MC particles from event - TClonesArray *mcArray = (TClonesArray*)aod->FindListObject(AliAODMCParticle::StdBranchName()); - if(!mcArray){ - Printf("No MC particle branch found"); - return; - } - - Int_t nMCAllTracks = mcArray->GetEntriesFast(); - // new tracks array - without injected signal - TObjArray * mcTracks = new TObjArray; - //selectedMCTracks->SetOwner(kTRUE); - - for (Int_t i = 0; i < nMCAllTracks; i++) - { - AliAODMCParticle *mcTrack = (AliAODMCParticle*)mcArray->At(i); - if (!mcTrack) { - Error("ReadEventAODMC", "Could not receive particle %d", i); - continue; - } - mcTracks->Add(mcTrack); - } - - // get labels for injected particles ------- - TObject* mc = mcArray; - //TObjArray * mcTracks = mcArray; - Int_t skipParticlesAbove = 0; - //AliGenEventHeader* eventHeader = 0; - //Int_t headers = 0; - //headers = aodMCheader->GetNCocktailHeaders(); - //eventHeader = aodMCheader->GetCocktailHeader(0); - AliGenEventHeader* eventHeader = aodMCheader->GetCocktailHeader(0); - Int_t headers = aodMCheader->GetNCocktailHeaders(); - if (!eventHeader) - { - // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing - // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events - AliError("First event header not found. Skipping this event."); - return; - } - skipParticlesAbove = eventHeader->NProduced(); - //cout << "ski label = " << skipParticlesAbove << endl; - AliInfo(Form("Injected signals in this event (%d headers). Keeping events of %s.Will skip particles/tracks above %d.", headers, eventHeader->ClassName(), skipParticlesAbove)); - //cout << "before MC compressing = " << mcTracks->GetEntriesFast() << endl; - RemovingInjectedSignal(mcTracks,mc,skipParticlesAbove); - //cout << "after MC compressing = " << mcTracks->GetEntriesFast() << endl; - // ------------- - - Int_t nMCTracks = mcTracks->GetEntriesFast(); - //cout << "number of MC tracks = " << nMCTracks << endl; - for (Int_t iMC = 0; iMCAt(iMC); - if (!mcTrack) { - Error("ReadEventAODMC", "Could not receive particle %d", iMC); - continue; - } - // track part - Double_t mcTrackEta = mcTrack->Eta(); - Double_t mcTrackPt = mcTrack->Pt(); - Bool_t TrIsPrim = mcTrack->IsPhysicalPrimary(); - Bool_t TrEtaMax = TMath::Abs(mcTrackEta)<0.9; - Bool_t TrPtMin = mcTrackPt>PtAssocMin; - Bool_t TrCharge = (mcTrack->Charge())!=0; - if (TrIsPrim && TrEtaMax && TrPtMin && TrCharge) fHistMCPtCentAs->Fill(mcTrackPt,lCent); - // V0 part - Int_t mcMotherPdg = 0; - Int_t mcPartPdg = mcTrack->GetPdgCode(); - - // Keep only K0s, Lambda and AntiLambda - if ((mcPartPdg != 310) && (mcPartPdg != 3122) && (mcPartPdg != (-3122))) continue; - - //cout << " mc pdg is " << mcPartPdg << endl; - - Bool_t IsK0 = mcPartPdg==310; - Bool_t IsLambda = mcPartPdg==3122; - Bool_t IsAntiLambda = mcPartPdg==-3122; - Bool_t IsSigma = kFALSE; - Int_t mcMotherLabel = mcTrack->GetMother(); - AliAODMCParticle *mcMother = (AliAODMCParticle*)mcArray->At(mcMotherLabel); - if (mcMotherLabel < 0) {mcMotherPdg = 0;} else {mcMotherPdg = mcMother->GetPdgCode();} - //if ((mcMotherLabel >= 0) && mcMother) - //if ((mcMotherLabel >= 0) && mcMother) - //{ - // Bool_t IsFromCascade = ((mcMotherPdg==3312)||(mcMotherPdg==-3312)||(mcMotherPdg==3334)||(mcMotherPdg==-3334)); - Bool_t IsFromSigma = ((mcMotherPdg==3212)||(mcMotherPdg==-3212)); - IsFromSigma = IsFromSigma || ((mcMotherPdg==3224)||(mcMotherPdg==-3224)); - IsFromSigma = IsFromSigma || ((mcMotherPdg==3214)||(mcMotherPdg==-3214)); - IsFromSigma = IsFromSigma || ((mcMotherPdg==3114)||(mcMotherPdg==-3114)); - if ((IsFromSigma) && (mcMother->IsPhysicalPrimary()) && (IsLambda || IsAntiLambda)) IsSigma = kTRUE; - Double_t mcRapidity = mcTrack->Y(); - Bool_t V0RapMax = TMath::Abs(mcRapidity)<0.75; - Bool_t PtInterval = ((mcTrackPt>PtTrigMin)&&(mcTrackPtIsPhysicalPrimary()); - IsLambda = IsLambda && (mcTrack->IsPhysicalPrimary() || IsSigma); - IsAntiLambda = IsAntiLambda && (mcTrack->IsPhysicalPrimary() || IsSigma); - Double_t mcK0[3] = {mcTrackPt, lCent, 1}; - Double_t mcLa[3] = {mcTrackPt, lCent, 2}; - Double_t mcAl[3] = {mcTrackPt, lCent, 3}; - if (IsK0 && V0RapMax && PtInterval) fHistMCPtCentTrig->Fill(mcK0); - if (IsLambda && V0RapMax && PtInterval) fHistMCPtCentTrig->Fill(mcLa); - if (IsAntiLambda && V0RapMax && PtInterval) fHistMCPtCentTrig->Fill(mcAl); - //} - } - // ------- access the real data ----------- - Int_t nTracks = aod->GetNumberOfTracks(); - // new tracks array - without injected signal - TObjArray * selectedMCTracks = new TObjArray; - //selectedMCTracks->SetOwner(kTRUE); - - for (Int_t i = 0; i < nTracks; i++) - { - AliAODTrack* tr = dynamic_cast(aod->GetTrack(i)); - if(!tr) AliFatal("Not a standard AOD"); - selectedMCTracks->Add(tr); - } - // cout << "before compressing = " << selectedMCTracks->GetEntriesFast() << endl; - RemovingInjectedSignal(selectedMCTracks,mc,skipParticlesAbove); - //AliAnalyseLeadingTrackUE::RemoveInjectedSignals(selectedMCTracks,mc,skipParticlesAbove); - //RemoveInjectedSignals(selectedMCTracks,mc,skipParticlesAbove); - // cout << "after compressing = " << selectedMCTracks->GetEntriesFast() << endl; - //----------------------- - //cout << "before getting label -4" << endl; - Int_t nRecTracks = selectedMCTracks->GetEntriesFast(); - //cout << "before getting label -3" << endl; - for (Int_t i = 0; i < nRecTracks; i++) - { - //AliAODTrack* tras = dynamic_cast(aod->GetTrack(i)); - AliAODTrack* tras = (AliAODTrack*)selectedMCTracks->At(i); - //cout << "before getting label -2" << endl; - //cout << " and i = " << i << endl; - //cout << "pt = " << tras->Pt() << " and i = " << i << endl; - if ((tras->Pt())GetLabel(); - if (AssocLabel<=0) continue; - //cout << "before getting label 1" << endl; - Bool_t isPhyPrim = static_cast(mcArray->At(tras->GetLabel()))->IsPhysicalPrimary(); - //Bool_t isPhyPrim = static_cast(mcArray->At(tras->GetLabel()))->IsPhysicalPrimary(); - //if(!(static_cast(mcArray->At(tras->GetLabel()))->IsPhysicalPrimary())) continue; - //cout << "before getting label 2" << endl; - Double_t mcPt = static_cast(mcArray->At(tras->GetLabel()))->Pt(); - //cout << "before getting label 3" << endl; - //Double_t mcEta = static_cast(mcArray->At(tras->GetLabel()))->Eta(); - //if (mcPt0.8) continue; - //Double_t trPt = tras->Pt(); - fHistRCPtCentAll->Fill(mcPt,lCent); - if (isPhyPrim) fHistRCPtCentAs->Fill(mcPt,lCent); - } - // ------- end of real data access, for V0s see the main V0 loop -------- - } -//============= End of MC loop ====================== - - // Track selection loop - //-------------------------------- - Int_t nTracks = aod->GetNumberOfTracks(); - // new tracks array - TObjArray * selectedTracks = new TObjArray; - selectedTracks->SetOwner(kTRUE); - - Bool_t ChChWith = GetWithChCh(); - TObjArray * selectedChargedTriggers = new TObjArray; - selectedChargedTriggers->SetOwner(kTRUE); - for (Int_t i = 0; i < nTracks; i++) - { - AliAODTrack* tr = dynamic_cast(aod->GetTrack(i)); - if(!tr) AliFatal("Not a standard AOD"); - if ((tr->Pt())Add(tr); - // saving the Charged trigger particles - if ((tr->Pt()>4.)&&(tr->Pt()<15.)) - { - selectedChargedTriggers->Add(new AliV0ChBasicParticle(tr->Eta(), tr->Phi(), tr->Pt(), 7)); - } - } - - //--------------------------------- - - // V0 loop for reconstructed event - TObjArray * selectedV0s = new TObjArray; - selectedV0s->SetOwner(kTRUE); - - Int_t nV0s = aod->GetNumberOfV0s(); - - for (Int_t i = 0; i < nV0s; i++) - { // start of V0 slection loop - AliAODv0* aodV0 = dynamic_cast(aod->GetV0(i)); - if (!aodV0) { - AliError(Form("ERROR: Could not retrieve aodv0 %d", i)); - continue; - } - if (aodV0->GetOnFlyStatus()) fHistTemp->Fill(6.); - if (!aodV0->GetOnFlyStatus()) fHistTemp->Fill(8.); - //cout << "pt of v0: " << aodV0->Pt() << endl; - if (((aodV0->Pt())Pt())>PtTrigMax)) continue; - // get daughters - const AliAODTrack *myTrackPos; - const AliAODTrack *myTrackNeg; - AliAODTrack *myTrackNegTest=dynamic_cast(aodV0->GetDaughter(1)); - AliAODTrack *myTrackPosTest=dynamic_cast(aodV0->GetDaughter(0)); - - if (!myTrackPosTest || !myTrackNegTest) { - Printf("strange analysis::UserExec:: Error:Could not retreive one of the daughter track\n"); - continue; - } - - if( myTrackPosTest->Charge() ==1){ - myTrackPos = myTrackPosTest; - myTrackNeg = myTrackNegTest; - } - - if( myTrackPosTest->Charge() ==-1){ - myTrackPos = myTrackNegTest; - myTrackNeg = myTrackPosTest; - } - - // effective mass calculations for each hypothesis - Double_t lInvMassK0 = aodV0->MassK0Short(); - Double_t lInvMassAntiLambda = aodV0->MassAntiLambda(); - Double_t lInvMassLambda = aodV0->MassLambda(); - - // calculations for c*tau cut-------------------------------------- - // Double_t lDVx = aodV0->GetSecVtxX(); - // Double_t lDVy = aodV0->GetSecVtxY(); - // Double_t lDVz = aodV0->GetSecVtxZ(); - // const Double_t kLambdaMass = 1.115683; - // const Double_t kK0Mass = 0.497648; - // Double_t cutcTauLam = 3*7.89; - // Double_t cutcTauK0 = 3*2.68; - // Double_t lV0DecayLength = TMath::Sqrt(TMath::Power(lDVx - lPVx,2) + TMath::Power(lDVy- lPVy,2) + TMath::Power(lDVz - lPVz,2 )); - // Double_t lPV0 = TMath::Sqrt((aodV0->Pt())*(aodV0->Pt())+(aodV0->Pz())*(aodV0->Pz())); - // Double_t lcTauLam = (lV0DecayLength*kLambdaMass)/lPV0; - // Double_t lcTauK0 = (lV0DecayLength*kK0Mass)/lPV0; - // sc - standard cuts - //Bool_t cutK0sc = (lcTauK0GetDetPid(); - const AliAODPid *nPid = myTrackNeg->GetDetPid(); - - if (pPid) - { - Double_t pdMom = pPid->GetTPCmomentum(); - if (pdMom<1.) - { - nSigmaPosPion = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion); - nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton); - } - } - - if (nPid) - { - Double_t ndMom = nPid->GetTPCmomentum(); - if (ndMom<1.) - { - nSigmaNegPion = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion); - nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton); - } - } - Bool_t bpPion = TMath::Abs(nSigmaPosPion) <= 3.; - Bool_t bpProton = TMath::Abs(nSigmaPosProton) <= 3.; - Bool_t bnPion = TMath::Abs(nSigmaNegPion) <= 3.; - Bool_t bnProton = TMath::Abs(nSigmaNegProton) <= 3.; - - Bool_t cutK0Pid = (bpPion && bnPion); - Bool_t cutLambdaPid = (bpProton && bnPion); - Bool_t cutAntiLambdaPid = (bpPion && bnProton); - //-------------------------------------------------- - // mass cuts - Bool_t cutMassLambda = ((lInvMassLambda>1.10) && (lInvMassLambda<1.13)); - Bool_t cutMassAntiLambda = ((lInvMassAntiLambda>1.10) && (lInvMassAntiLambda<1.13)); - Bool_t cutMassK0 = (lInvMassK0>0.47) && (lInvMassK0<0.53); - - cutK0sc = cutK0Pid && (!cutMassLambda) && (!cutMassAntiLambda); - cutLambdasc = cutLambdaPid && (!cutMassK0); - cutAntiLambdasc = cutAntiLambdaPid && (!cutMassK0); - // special cut related to AP diagram for K0s - Bool_t k0APcut = (aodV0->PtArmV0()>(TMath::Abs(0.2*aodV0->AlphaV0()))); - cutK0sc = cutK0sc && k0APcut; - // fill the mass histograms - - Int_t oStatus = GetOStatus(); - - if (!IsMyGoodV0(aod,aodV0,myTrackPos,myTrackNeg,oStatus)) continue; - Double_t spK0[3] = {lInvMassK0, aodV0->Pt(), lCent}; - Double_t spLa[3] = {lInvMassLambda, aodV0->Pt(), lCent}; - Double_t spAl[3] = {lInvMassAntiLambda, aodV0->Pt(), lCent}; - if (cutK0sc) fHistMassK0->Fill(spK0); - if (cutLambdasc) fHistMassLambda->Fill(spLa); - if (cutAntiLambdasc) fHistMassAntiLambda->Fill(spAl); - // select final V0s for correlation, selected background to study its contribution to correlation function - // the values for signal might change in the future ... - Bool_t K0Signal = (lInvMassK0>0.48)&&(lInvMassK0<0.52); - Bool_t K0Bckg = ((lInvMassK0>0.40)&&(lInvMassK0<0.44)) || ((lInvMassK0>0.56)&&(lInvMassK0<0.60)); - - Bool_t LamSignal = (lInvMassLambda>1.108)&&(lInvMassLambda<1.125); - Bool_t LamBckg = ((lInvMassLambda>1.090)&&(lInvMassLambda<1.100)) || ((lInvMassLambda>1.135)&&(lInvMassLambda<1.145)); - - Bool_t ALamSignal = (lInvMassAntiLambda>1.108)&&(lInvMassAntiLambda<1.125); - Bool_t ALamBckg = ((lInvMassAntiLambda>1.090)&&(lInvMassAntiLambda<1.100)) || ((lInvMassAntiLambda>1.135)&&(lInvMassAntiLambda<1.145)); - - // Fill selected V0 particle array - if ((cutK0sc)&&(K0Signal)) - { - selectedV0s->Add(new AliV0ChBasicParticle(aodV0->Eta(), aodV0->Phi(), aodV0->Pt(), 1.)); - Double_t nTrigK0Sig[4] = {aodV0->Pt(), lCent, lPVz, 1.}; - fHistNTrigSib->Fill(nTrigK0Sig); - } - if ((cutK0sc)&&(K0Bckg)) - { - selectedV0s->Add(new AliV0ChBasicParticle(aodV0->Eta(), aodV0->Phi(), aodV0->Pt(), 4.)); - Double_t nTrigK0Bkg[4] = {aodV0->Pt(), lCent, lPVz, 4.}; - fHistNTrigSib->Fill(nTrigK0Bkg); - } - if ((cutLambdasc)&&(LamSignal)) - { - selectedV0s->Add(new AliV0ChBasicParticle(aodV0->Eta(), aodV0->Phi(), aodV0->Pt(), 2.)); - Double_t nTrigLaSig[4] = {aodV0->Pt(), lCent, lPVz, 2.}; - fHistNTrigSib->Fill(nTrigLaSig); - } - if ((cutLambdasc)&&(LamBckg)) - { - selectedV0s->Add(new AliV0ChBasicParticle(aodV0->Eta(), aodV0->Phi(), aodV0->Pt(), 5.)); - Double_t nTrigLaBkg[4] = {aodV0->Pt(), lCent, lPVz, 5.}; - fHistNTrigSib->Fill(nTrigLaBkg); - } - if ((cutAntiLambdasc)&&(ALamSignal)) - { - selectedV0s->Add(new AliV0ChBasicParticle(aodV0->Eta(), aodV0->Phi(), aodV0->Pt(), 3.)); - Double_t nTrigAlSig[4] = {aodV0->Pt(), lCent, lPVz, 3.}; - fHistNTrigSib->Fill(nTrigAlSig); - } - if ((cutAntiLambdasc)&&(ALamBckg)) - { - selectedV0s->Add(new AliV0ChBasicParticle(aodV0->Eta(), aodV0->Phi(), aodV0->Pt(), 6.)); - Double_t nTrigAlBkg[4] = {aodV0->Pt(), lCent, lPVz, 6.}; - fHistNTrigSib->Fill(nTrigAlBkg); - } - - - //===== MC part for V0 reconstruction efficiency ============== - if (fAnalysisMC) - { - TClonesArray *mcArray = (TClonesArray*)aod->FindListObject(AliAODMCParticle::StdBranchName()); - if(!mcArray){ - Printf("No MC particle branch found"); - return; - } - - Int_t MotherOfMotherPdg = 0; - - Int_t myTrackPosLabel = TMath::Abs(myTrackPos->GetLabel()); - Int_t myTrackNegLabel = TMath::Abs(myTrackNeg->GetLabel()); - AliAODMCParticle *mcPosTrack = (AliAODMCParticle*)mcArray->At(myTrackPosLabel); - if (!mcPosTrack) continue; - AliAODMCParticle *mcNegTrack = (AliAODMCParticle*)mcArray->At(myTrackNegLabel); - if (!mcNegTrack) continue; - - Int_t PosTrackPdg = mcPosTrack->GetPdgCode(); - Int_t NegTrackPdg = mcNegTrack->GetPdgCode(); - //if (!mcPosTrack->IsPrimary()) continue; - //if (!mcNegTrack->IsPrimary()) continue; - - Int_t myTrackPosMotherLabel = mcPosTrack->GetMother(); - Int_t myTrackNegMotherLabel = mcNegTrack->GetMother(); - - if ((myTrackPosMotherLabel==-1)||(myTrackNegMotherLabel==-1)) continue; - - AliAODMCParticle *mcPosMother = (AliAODMCParticle*)mcArray->At(myTrackPosMotherLabel); - if (!mcPosMother) continue; - Int_t MotherPdg = mcPosMother->GetPdgCode(); - Int_t MotherOfMother = mcPosMother->GetMother(); - //if (MotherOfMother == -1) MotherOfMotherPdg = 0; - - if (myTrackPosMotherLabel!=myTrackNegMotherLabel) continue; - //if (!mcPosMother->IsPrimary()) continue; - Bool_t IsK0FromMC = (mcPosMother->IsPhysicalPrimary())&&(MotherPdg==310)&&(PosTrackPdg==211)&&(NegTrackPdg==-211); - Bool_t IsLambdaFromMC = (mcPosMother->IsPhysicalPrimary())&&(MotherPdg==3122)&&(PosTrackPdg==2212)&&(NegTrackPdg==-211); - Bool_t IsAntiLambdaFromMC = (mcPosMother->IsPhysicalPrimary())&&(MotherPdg==-3122)&&(PosTrackPdg==211)&&(NegTrackPdg==-2212); - - Bool_t ComeFromSigma = kFALSE; - Bool_t ComeFromSigmaLa = kFALSE; - Bool_t ComeFromSigmaAl = kFALSE; - - if (MotherOfMother != -1) - { - AliAODMCParticle *mcPosMotherOfMother = (AliAODMCParticle*)mcArray->At(MotherOfMother); - MotherOfMotherPdg = mcPosMotherOfMother->GetPdgCode(); - Int_t MoMPdg = TMath::Abs(MotherOfMotherPdg); - ComeFromSigma = (mcPosMotherOfMother->IsPhysicalPrimary())&&((MoMPdg==3212)||(MoMPdg==3224)||(MoMPdg==3214)||(MoMPdg==3114)); - ComeFromSigmaLa = ComeFromSigma && (MotherPdg==3122)&&(PosTrackPdg==2212)&&(NegTrackPdg==-211); - ComeFromSigmaAl = ComeFromSigma && (MotherPdg==-3122)&&(PosTrackPdg==211)&&(NegTrackPdg==-2212); - } - - IsLambdaFromMC = IsLambdaFromMC || ComeFromSigmaLa; - IsAntiLambdaFromMC = IsAntiLambdaFromMC || ComeFromSigmaAl; - - Double_t RecMotherPt = aodV0->Pt(); - //cout << "Pt of rec v0 = " << RecMotherPt << " nMC = " << mcArray->GetEntries() << endl; - //cout << "Pos Label = " << myTrackPosLabel << " Neg Label = " << myTrackNegLabel << endl; - Double_t rcK0[3] = {RecMotherPt, lCent, 1}; - Double_t rcLa[3] = {RecMotherPt, lCent, 2}; - Double_t rcAl[3] = {RecMotherPt, lCent, 3}; - if ((cutK0sc)&&(K0Signal)&&(IsK0FromMC)) fHistRCPtCentTrig->Fill(rcK0); - if ((cutLambdasc)&&(LamSignal)&&(IsLambdaFromMC)) fHistRCPtCentTrig->Fill(rcLa); - if ((cutAntiLambdasc)&&(ALamSignal)&&(IsAntiLambdaFromMC)) fHistRCPtCentTrig->Fill(rcAl); - - } - - //===== End of the MC part for V0 reconstruction efficiency === - - Int_t nSelectedTracks = selectedTracks->GetEntries(); - // Correlation part - //=================================== - for (Int_t j = 0; j < nSelectedTracks; j++) - { - AliAODTrack* atr = (AliAODTrack*) selectedTracks->At(j); - if ((atr->Pt())>=(aodV0->Pt())) continue; - Double_t dEta = atr->Eta() - aodV0->Eta(); - Double_t dPhi = atr->Phi() - aodV0->Phi(); - if (dPhi > (1.5*kPi)) dPhi -= 2.0*kPi; - if (dPhi < (-0.5*kPi)) dPhi += 2.0*kPi; - // removing autocorrelations - //---------------------------------- - Int_t negID = myTrackNeg->GetID(); - Int_t posID = myTrackPos->GetID(); - Int_t atrID = atr->GetID(); - - if ((TMath::Abs(negID)+1)==(TMath::Abs(atrID))) continue; - if ((TMath::Abs(posID)+1)==(TMath::Abs(atrID))) continue; - //---------------------------------- - - fHistNTrigSib->Sumw2(); - fHistdPhidEtaSib->Sumw2(); - // Filling correlation histograms and histograms for triggers counting - //----------------- K0 --------------------- - if ((cutK0sc)&&(K0Signal)) - { - Double_t spK0Sig[7] = {dPhi, dEta, aodV0->Pt(), atr->Pt(), lCent, lPVz, 1.}; - fHistdPhidEtaSib->Fill(spK0Sig); - } - - if ((cutK0sc)&&(K0Bckg)) - { - Double_t spK0Bkg[7] = {dPhi, dEta, aodV0->Pt(), atr->Pt(), lCent, lPVz, 4.}; - fHistdPhidEtaSib->Fill(spK0Bkg); - } - //---------------- Lambda ------------------- - if ((cutLambdasc)&&(LamSignal)) - { - Double_t spLaSig[7] = {dPhi, dEta, aodV0->Pt(), atr->Pt(), lCent, lPVz, 2.}; - fHistdPhidEtaSib->Fill(spLaSig); - } - - if ((cutLambdasc)&&(LamBckg)) - { - Double_t spLaBkg[7] = {dPhi, dEta, aodV0->Pt(), atr->Pt(), lCent, lPVz, 5.}; - fHistdPhidEtaSib->Fill(spLaBkg); - } - //------------- AntiLambda ------------------- - if ((cutAntiLambdasc)&&(ALamSignal)) - { - Double_t spAlSig[7] = {dPhi, dEta, aodV0->Pt(), atr->Pt(), lCent, lPVz, 3.}; - fHistdPhidEtaSib->Fill(spAlSig); - } - - if ((cutAntiLambdasc)&&(ALamBckg)) - { - Double_t spAlBkg[7] = {dPhi, dEta, aodV0->Pt(), atr->Pt(), lCent, lPVz, 6.}; - fHistdPhidEtaSib->Fill(spAlBkg); - } - - } // end of correlation loop - //=================================== - - - } // end of V0 selection loop - - // =========================================== - // Ch-Ch correlation part - - if (ChChWith) - { - Int_t nSelectedChargedTriggers = selectedChargedTriggers->GetEntries(); - for (Int_t i = 0; i < nSelectedChargedTriggers; i++) - { - AliV0ChBasicParticle* chTrig = (AliV0ChBasicParticle*) selectedChargedTriggers->At(i); - Double_t chTrigPhi = chTrig->Phi(); - Double_t chTrigEta = chTrig->Eta(); - Double_t chTrigPt = chTrig->Pt(); - - Double_t nTrigChSig[4] = {chTrigPt, lCent, lPVz, 7.}; - fHistNTrigSib->Fill(nTrigChSig); - - Int_t nSelectedTracks = selectedTracks->GetEntries(); - for (Int_t j = 0; j < nSelectedTracks; j++) - { - AliAODTrack* atr = (AliAODTrack*) selectedTracks->At(j); - if ((atr->Pt())>=chTrigPt) continue; - Double_t dEta = atr->Eta() - chTrigEta; - Double_t dPhi = atr->Phi() - chTrigPhi; - if (dPhi > (1.5*kPi)) dPhi -= 2.0*kPi; - if (dPhi < (-0.5*kPi)) dPhi += 2.0*kPi; - - Double_t spCh[7] = {dPhi, dEta, chTrigPt, atr->Pt(), lCent, lPVz, 7.}; - fHistdPhidEtaSib->Fill(spCh); - } - } - } - // end of Ch-Ch correlation part - - // Mixing ============================================== - - fHistdPhidEtaMix->Sumw2(); - AliEventPool* pool = fPoolMgr->GetEventPool(lCent, lPVz); - if (!pool) AliFatal(Form("No pool found for centrality = %f, zVtx = %f", lCent, lPVz)); - //pool->SetDebug(1); - if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5) - { - Int_t nMix = pool->GetCurrentNEvents(); - for (Int_t jMix=0; jMixGetEvent(jMix); - for (Int_t i=0; iGetEntriesFast(); i++) - {// loop through selected V0 particles - AliV0ChBasicParticle* trig = (AliV0ChBasicParticle*) selectedV0s->At(i); - Double_t trigPhi = trig->Phi(); - Double_t trigEta = trig->Eta(); - Double_t trigPt = trig->Pt(); - Short_t trigC = trig->WhichCandidate(); - for (Int_t j=0; jGetEntriesFast(); j++) - { // mixing tracks loop - AliVParticle* assoc = (AliVParticle*) bgTracks->At(j); - // be careful tracks may have bigger pt than v0s. - if ( ( (assoc->Pt())>=trigPt )||( (assoc->Pt())Eta() - trigEta; - Double_t dPhiMix = assoc->Phi() - trigPhi; - if (dPhiMix > (1.5*kPi)) dPhiMix -= 2.0*kPi; - if (dPhiMix < (-0.5*kPi)) dPhiMix += 2.0*kPi; - - Double_t spMix[7] = {dPhiMix, dEtaMix, trigPt, assoc->Pt(), lCent, lPVz, static_cast(trigC)}; - fHistdPhidEtaMix->Fill(spMix); - - } // end of mixing track loop - }// end of loop through selected V0 particles - if (ChChWith) - { - for (Int_t i=0; iGetEntriesFast(); i++) - {// loop through selected charged trigger particles - AliV0ChBasicParticle* trig = (AliV0ChBasicParticle*) selectedChargedTriggers->At(i); - Double_t trigPhi = trig->Phi(); - Double_t trigEta = trig->Eta(); - Double_t trigPt = trig->Pt(); - Short_t trigC = trig->WhichCandidate(); - for (Int_t j=0; jGetEntriesFast(); j++) - { // mixing tracks loop - AliVParticle* assoc = (AliVParticle*) bgTracks->At(j); - // be careful tracks may have bigger pt than v0s. - if ( ( (assoc->Pt())>=trigPt )||( (assoc->Pt())Eta() - trigEta; - Double_t dPhiMix = assoc->Phi() - trigPhi; - if (dPhiMix > (1.5*kPi)) dPhiMix -= 2.0*kPi; - if (dPhiMix < (-0.5*kPi)) dPhiMix += 2.0*kPi; - - Double_t spMix[7] = {dPhiMix, dEtaMix, trigPt, assoc->Pt(), lCent, lPVz, static_cast(trigC)}; - fHistdPhidEtaMix->Fill(spMix); - - } // end of mixing track loop - }// end of loop through selected Ch particles - } // end of ChCh mixing - - }// end of loop of mixing events - } - - TObjArray* tracksClone = (TObjArray*) selectedTracks->Clone(); - tracksClone->SetOwner(kTRUE); - pool->UpdatePool(tracksClone); - //delete selectedtracks; - - PostData(1, fOutput); - -} -//___________________________________________ -Bool_t AliAnalysisTaskV0ChCorrelations::IsMyGoodPrimaryTrack(const AliAODTrack *t) -{ - // Pseudorapidity cut - if (TMath::Abs(t->Eta())>0.9) return kFALSE; - // Should correspond to set of cuts suitable for correlation analysis, 768 - hybrid tracks for 2011 data - if (!t->TestFilterBit(768)) return kFALSE; - - return kTRUE; -} -//_____________________________________________ -Bool_t AliAnalysisTaskV0ChCorrelations::IsMyGoodDaughterTrack(const AliAODTrack *t) -{ - // TPC refit - if (!t->IsOn(AliAODTrack::kTPCrefit)) return kFALSE; - // Minimum number of clusters - Float_t nCrossedRowsTPC = t->GetTPCClusterInfo(2,1); - if (nCrossedRowsTPC < 70) return kFALSE; - Int_t findable=t->GetTPCNclsF(); - if (findable <= 0) return kFALSE; - if (nCrossedRowsTPC/findable < 0.8) return kFALSE; - - return kTRUE; -} -//______________________________________________ -Bool_t AliAnalysisTaskV0ChCorrelations::IsMyGoodV0(const AliAODEvent* aod, const AliAODv0* aodV0, const AliAODTrack* myTrackPos, const AliAODTrack* myTrackNeg, Int_t oSta) -{ - if (!aodV0) { - AliError(Form("ERROR: Could not retrieve aodV0")); - return kFALSE; - } - - // Offline reconstructed V0 only - if (oSta==1) {if (aodV0->GetOnFlyStatus()) return kFALSE;} - if (oSta==3) {if (!aodV0->GetOnFlyStatus()) return kFALSE;} - - if (oSta==2) - { - if (aodV0->GetOnFlyStatus()) - { - return kTRUE; - } else { - return kFALSE; - } - } - if (oSta==4) - { - if (!aodV0->GetOnFlyStatus()) - { - return kTRUE; - } else { - return kFALSE; - } - } - - // Get daughters and check them - AliAODTrack *myTrackNegTest=dynamic_cast(aodV0->GetDaughter(1)); - AliAODTrack *myTrackPosTest=dynamic_cast(aodV0->GetDaughter(0)); - - if (!myTrackPosTest || !myTrackNegTest) { - Printf("strange analysis::UserExec:: Error:Could not retreive one of the daughter track\n"); - return kFALSE; - } - - if( myTrackPosTest->Charge() ==1){ - myTrackPos = myTrackPosTest; - myTrackNeg = myTrackNegTest; - } - - if( myTrackPosTest->Charge() ==-1){ - myTrackPos = myTrackNegTest; - myTrackNeg = myTrackPosTest; - } - - // Track cuts for daughter tracks - if ( !(IsMyGoodDaughterTrack(myTrackPos)) || !(IsMyGoodDaughterTrack(myTrackNeg)) ) return kFALSE; - - // Unlike signs of daughters - if (myTrackNegTest->Charge() == myTrackPosTest->Charge()) return kFALSE; - - // Rapidity cut - //Double_t lCutRap = 0.75; - //Double_t lRapK0s = aodV0->Y(310); - //Double_t lRapLambda = aodV0->Y(3122); - //Double_t lRapAntiLambda = aodV0->Y(-3122); - - // Pseudorapidity cut - there are high pt V0 - Double_t lCutEta = 0.75; - Double_t lEtaV0 = aodV0->Eta(); - if (TMath::Abs(lEtaV0)>=lCutEta) return kFALSE; - //if (TMath::Abs(lRapK0s)>=lCutRap) return kFALSE; - //if (TMath::Abs(lRapLambda)>=lCutRap) return kFALSE; - //if (TMath::Abs(lRapAntiLambda)>=lCutRap) return kFALSE; - - // getting global variables - Float_t dcaDaughtersToPrimVtx = GetDcaDToPV(); - Float_t dcaBetweenDaughters = GetDcaV0D(); - - // DCA of daughter track to Primary Vertex - Float_t xyn=aodV0->DcaNegToPrimVertex(); - if (TMath::Abs(xyn)DcaPosToPrimVertex(); - if (TMath::Abs(xyp)DcaV0Daughters(); - if (dca>dcaBetweenDaughters) return kFALSE; - - // Cosinus of pointing angle - Double_t cpa=aodV0->CosPointingAngle(aod->GetPrimaryVertex()); - if (cpa<0.998) return kFALSE; - - // Fiducial volume cut - Double_t xyz[3]; aodV0->GetSecondaryVtx(xyz); - Double_t r2=xyz[0]*xyz[0] + xyz[1]*xyz[1]; - if (r2<0.9*0.9) return kFALSE; - if (r2>100*100) return kFALSE; - - // c*tau cut - in main V0 loop - depends on particle hypothesis - - // Minimum pt of daughters - Double_t lMomPos[3] = {999,999,999}; - Double_t lMomNeg[3] = {999,999,999}; - - lMomPos[0] = aodV0->MomPosX(); - lMomPos[1] = aodV0->MomPosY(); - lMomPos[2] = aodV0->MomPosZ(); - - lMomNeg[0] = aodV0->MomNegX(); - lMomNeg[1] = aodV0->MomNegY(); - lMomNeg[2] = aodV0->MomNegZ(); - - Double_t lPtPos = TMath::Sqrt(lMomPos[0]*lMomPos[0] + lMomPos[1]*lMomPos[1]); - Double_t lPtNeg = TMath::Sqrt(lMomNeg[0]*lMomNeg[0] + lMomNeg[1]*lMomNeg[1]); - - Double_t cutMinPtDaughter = 0.160; - if (lPtPos) - // can be the following cases: - // a. tracks: in this case the label is taken and then case b. - // b. particles: the first stable mother is searched and checked if it is <= - // can be AOD (TClonesArray) or ESD (AliMCEvent) - - TClonesArray* arrayMC = 0; - AliMCEvent* mcEvent = 0; - if (mcObj->InheritsFrom("AliMCEvent")) - mcEvent = static_cast(mcObj); - else if (mcObj->InheritsFrom("TClonesArray")) - arrayMC = static_cast(mcObj); - else - { - mcObj->Dump(); - AliFatal("Invalid object passed"); - } - - Int_t before = tracks->GetEntriesFast(); - - for (Int_t i=0; iAt(i); - - if (part->InheritsFrom("AliESDtrack")) part = mcEvent->GetTrack(TMath::Abs(part->GetLabel())); - if (part->InheritsFrom("AliAODTrack")) - { - part =(AliVParticle*)arrayMC->At(TMath::Abs(part->GetLabel())); - //cout << "toto musi byt len pri reco trackoch" << endl; - } - - AliVParticle* mother = part; - if (mcEvent) - { - while (!mcEvent->IsPhysicalPrimary(mother->GetLabel())) - { - if (((AliMCParticle*)mother)->GetMother() < 0) - { - mother = 0; - break; - } - - mother = (AliMCParticle*) mcEvent->GetTrack(((AliMCParticle*)mother)->GetMother()); - if (!mother) - break; - } - } - else - { - // find the primary mother - while (!((AliAODMCParticle*)mother)->IsPhysicalPrimary()) - { - if (((AliAODMCParticle*)mother)->GetMother() < 0) - { - mother = 0; - break; - } - - mother = (AliVParticle*) arrayMC->At(((AliAODMCParticle*)mother)->GetMother()); - if (!mother) - break; - } - } - - if (!mother) - { - //Printf("WARNING: No mother found for particle %d:", part->GetLabel()); - continue; - } - - if (mother->GetLabel() > maxLabel) - { -// Printf("Removing %d with label %d", i, part->GetLabel()); part->Dump(); - TObject* object = tracks->RemoveAt(i); - if (tracks->IsOwner()) - delete object; - } - } - - tracks->Compress(); - - AliInfo(Form("Reduced from %d to %d", before, tracks->GetEntriesFast())); - -} -