]>
Commit | Line | Data |
---|---|---|
a65a7e70 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | //----------------------------------------------------------------- | |
17 | // AliAnalysisTaskContMC class | |
18 | //----------------------------------------------------------------- | |
19 | ||
20 | #include "TChain.h" | |
21 | #include "TTree.h" | |
22 | #include "TLegend.h" | |
23 | #include "TH1F.h" | |
24 | #include "TH2F.h" | |
25 | #include "TH3F.h" | |
26 | #include "TCanvas.h" | |
27 | #include "AliAnalysisTask.h" | |
28 | #include "AliAnalysisManager.h" | |
29 | #include "AliVTrack.h" | |
30 | #include "AliAODMCParticle.h" | |
31 | #include "AliVParticle.h" | |
32 | #include "AliAODEvent.h" | |
33 | #include "AliAODInputHandler.h" | |
34 | #include "AliAnalysisTaskContMC.h" | |
35 | #include "AliAnalysisTaskESDfilter.h" | |
36 | #include "AliAnalysisDataContainer.h" | |
37 | #include "AliHelperPID.h" | |
38 | #include "AliCentrality.h" | |
39 | #include "TProof.h" | |
40 | #include "AliPID.h" | |
41 | #include "AliVEvent.h" | |
42 | #include "AliPIDResponse.h" | |
43 | #include "AliStack.h" | |
44 | #include <TMCProcess.h> | |
45 | ||
46 | #include <iostream> | |
47 | ||
48 | using namespace std; | |
49 | ||
50 | ClassImp(AliAnalysisTaskContMC) | |
51 | ||
52 | //________________________________________________________________________ | |
53 | AliAnalysisTaskContMC::AliAnalysisTaskContMC(const char *name) : AliAnalysisTaskSE(name), fAOD(0), fNSigmaPID(0), fIsMC(0), fOutput(0), fHistID(0) | |
54 | { | |
55 | // Default constructor | |
56 | ||
57 | ||
58 | DefineInput(0, TChain::Class()); | |
59 | //DefineOutput(1, AliHelperPID::Class()); | |
60 | DefineOutput(1, TList::Class()); | |
61 | ||
62 | } | |
63 | //________________________________________________________________________ | |
64 | //________________________________________________________________________ | |
65 | void AliAnalysisTaskContMC::UserCreateOutputObjects() | |
66 | { | |
67 | Printf("\n\n\n\n\n\n In CreateOutput Object:"); | |
68 | ||
69 | //create output objects | |
70 | Printf("NSigma: %.1f",fNSigmaPID->GetNSigmaCut()); | |
71 | Printf("IsMC: %d",fNSigmaPID->GetisMC()); | |
72 | fOutput = new TList(); | |
73 | fOutput->SetOwner(); | |
74 | fOutput->SetName("list"); | |
75 | ||
76 | fHistID = new TH3F("fHistID","fHistID",6,-1.5,4.5,4,-1.5,2.5,38,0.2,4); | |
77 | fOutput->Add(fHistID); | |
78 | ||
79 | if(!fNSigmaPID)AliFatal("PID object should be set in the steering macro"); | |
80 | fOutput->Add(fNSigmaPID); | |
81 | ||
82 | //PostData(1, fNSigmaPID ); | |
83 | PostData(1, fOutput ); | |
84 | ||
85 | } | |
86 | ||
87 | //________________________________________________________________________ | |
88 | void AliAnalysisTaskContMC::UserExec(Option_t *) | |
89 | { | |
90 | const Int_t npart=4; | |
91 | const Int_t pdgcode[npart+2]={-1,211,321,2212,11,13}; | |
92 | const Int_t partid[npart+2]={-1,0,1,2,3,4}; | |
93 | // main event loop | |
94 | fAOD = dynamic_cast<AliAODEvent*>(fInputEvent); | |
95 | if (!fAOD) { | |
96 | AliWarning("ERROR: AliAODEvent not available \n"); | |
97 | return; | |
98 | } | |
99 | ||
100 | if (strcmp(fAOD->ClassName(), "AliAODEvent")) | |
101 | { | |
102 | AliFatal("Not processing AODs"); | |
103 | } | |
104 | //MC Loop | |
105 | TClonesArray *arrayMC = 0; | |
106 | Printf("fIsMC: %d",fIsMC); | |
107 | if (fIsMC) | |
108 | { | |
109 | arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName()); | |
110 | if (!arrayMC) { | |
111 | AliFatal("Error: MC particles branch not found!\n"); | |
112 | } | |
113 | } | |
114 | Double_t centrality = 0; | |
115 | ||
116 | AliCentrality *centralityObj = fAOD->GetHeader()->GetCentralityP(); | |
117 | if (centralityObj) | |
118 | { | |
119 | centrality = centralityObj->GetCentralityPercentileUnchecked("V0M"); | |
120 | AliInfo(Form("Centrality is %f", centrality)); | |
121 | } | |
122 | else | |
123 | { | |
124 | Printf("WARNING: Centrality object is 0"); | |
125 | centrality = -1; | |
126 | } | |
127 | if (centrality < 0) | |
128 | return; | |
129 | ||
130 | ||
131 | //vertex selection | |
132 | Int_t nVertex = ((AliAODEvent*)fAOD)->GetNumberOfVertices(); | |
133 | if( nVertex > 0 ) { | |
134 | AliAODVertex* vertex = (AliAODVertex*)((AliAODEvent*)fAOD)->GetPrimaryVertex(); | |
135 | //Int_t nTracksPrim = vertex->GetNContributors(); | |
136 | Double_t zVertex = vertex->GetZ(); | |
137 | //10 cm cut | |
138 | if(TMath::Abs(zVertex)>10) return; | |
139 | //AliInfo(Form(" Vertex in = %f with %d particles by %s data ...",zVertex,nTracksPrim,vertex->GetName())); | |
140 | // Reject TPC only vertex | |
141 | TString name(vertex->GetName()); | |
142 | if (name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex"))return; | |
143 | } | |
144 | ||
145 | //Int_t count=0; | |
146 | //track loop | |
147 | for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) { | |
148 | AliAODTrack* track = fAOD->GetTrack(iTracks); | |
149 | if(!(track->TestFilterBit(32)))continue; | |
150 | if (TMath::Abs(track->Eta()) > .8 || track->Pt() < .2) continue; | |
151 | ||
152 | Int_t pdg=-999; | |
153 | Int_t isph=-999; | |
154 | if (fIsMC && arrayMC) { | |
155 | AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel())); | |
156 | if (!partMC) { | |
157 | AliError("Cannot get MC particle"); | |
158 | continue; | |
159 | } | |
160 | pdg=TMath::Abs(partMC->GetPdgCode()); | |
161 | isph=partMC->IsPhysicalPrimary(); | |
162 | } | |
163 | if(!isph)continue; | |
164 | //step 1, TOF Matching | |
165 | UInt_t status; | |
166 | status=track->GetStatus(); | |
167 | if((status&AliVTrack::kTOFout)==0 || (status&AliVTrack::kTIME)==0)continue; | |
168 | ||
169 | //step 2, combined PID | |
170 | Int_t IDTPCTOF=fNSigmaPID->GetParticleSpecies(track,1); | |
171 | if(IDTPCTOF==999)IDTPCTOF=-1; | |
172 | Int_t IDMC=-1; | |
173 | for(Int_t ipart=0;ipart<npart+2;ipart++)if(TMath::Abs(pdg)==pdgcode[ipart])IDMC=partid[ipart]; | |
174 | fHistID->Fill(IDMC,IDTPCTOF,track->Pt()); | |
175 | } // end loop on tracks | |
176 | ||
177 | PostData(1,fOutput); | |
178 | ||
179 | } | |
180 | ||
181 | //_________________________________________________________________ | |
182 | void AliAnalysisTaskContMC::Terminate(Option_t *) | |
183 | { | |
184 | // Terminate analysis | |
185 | // | |
186 | fOutput = dynamic_cast<TList*>(GetOutputData(1)); | |
187 | if (!fOutput) { | |
188 | printf("ERROR: fOutput not available\n"); | |
189 | return; | |
190 | } | |
191 | fHistID = dynamic_cast<TH3F*>(fOutput->FindObject("fHistID")); | |
192 | fNSigmaPID = dynamic_cast<AliHelperPID*>(fOutput->FindObject("fNSigmaPID")); | |
193 | } |