]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG0/multPbPb/AliAnalysisTaskMultPbTracks.cxx
Disambiguate run resolution
[u/mrichter/AliRoot.git] / PWG0 / multPbPb / AliAnalysisTaskMultPbTracks.cxx
CommitLineData
a23f7c97 1// AliAnalysisTaskMultPbTracks
2
3// Author: Michele Floris, CERN
4// TODO:
5// - Add chi2/cluster plot for primary, secondaries and fakes
a23f7c97 6
7#include "AliAnalysisTaskMultPbTracks.h"
8#include "AliESDInputHandler.h"
9#include "AliAnalysisMultPbTrackHistoManager.h"
10#include "AliAnalysisManager.h"
11#include "AliESDtrackCuts.h"
a23f7c97 12#include "AliMCEvent.h"
13#include "AliStack.h"
14#include "TH1I.h"
15#include "TH3D.h"
16#include "AliMCParticle.h"
17#include "AliGenEventHeader.h"
54b31d6a 18#include "AliESDCentrality.h"
7f5f2e0c 19#include "AliMultiplicity.h"
a23f7c97 20#include <iostream>
2bbfd8c6 21#include "AliAnalysisMultPbCentralitySelector.h"
a23f7c97 22
23using namespace std;
24
25ClassImp(AliAnalysisTaskMultPbTracks)
26
27AliAnalysisTaskMultPbTracks::AliAnalysisTaskMultPbTracks()
54b31d6a 28: AliAnalysisTaskSE("TaskMultPbTracks"),
2bbfd8c6 29 fESD(0),fHistoManager(0),fCentrSelector(0),fTrackCuts(0),fTrackCutsNoDCA(0),fIsMC(0)
a23f7c97 30{
31 // constructor
32
33 DefineOutput(1, AliAnalysisMultPbTrackHistoManager::Class());
54b31d6a 34 DefineOutput(2, AliESDtrackCuts::Class());
2bbfd8c6 35 DefineOutput(3, AliAnalysisMultPbCentralitySelector::Class());
a23f7c97 36
37 fHistoManager = new AliAnalysisMultPbTrackHistoManager("histoManager","Hitograms, Multiplicity, Track analysis");
38 if(fIsMC) fHistoManager->SetSuffix("MC");
39
40}
41AliAnalysisTaskMultPbTracks::AliAnalysisTaskMultPbTracks(const char * name)
54b31d6a 42 : AliAnalysisTaskSE(name),
2bbfd8c6 43 fESD(0),fHistoManager(0),fCentrSelector(0),fTrackCuts(0),fTrackCutsNoDCA(0),fIsMC(0)
a23f7c97 44{
45 //
46 // Standard constructur which should be used
47 //
48
49 DefineOutput(1, AliAnalysisMultPbTrackHistoManager::Class());
54b31d6a 50 DefineOutput(2, AliESDtrackCuts::Class());
2bbfd8c6 51 DefineOutput(3, AliAnalysisMultPbCentralitySelector::Class());
a23f7c97 52
53 fHistoManager = new AliAnalysisMultPbTrackHistoManager("histoManager","Hitograms, Multiplicity, Track analysis");
54 if(fIsMC) fHistoManager->SetSuffix("MC");
55
56}
57
58AliAnalysisTaskMultPbTracks::AliAnalysisTaskMultPbTracks(const AliAnalysisTaskMultPbTracks& obj) :
2bbfd8c6 59 AliAnalysisTaskSE(obj) ,fESD (0), fHistoManager(0), fCentrSelector(0), fTrackCuts(0),fTrackCutsNoDCA(0),fIsMC(0)
a23f7c97 60{
61 //copy ctor
62 fESD = obj.fESD ;
63 fHistoManager= obj.fHistoManager;
a23f7c97 64 fTrackCuts = obj.fTrackCuts;
65 fTrackCutsNoDCA = obj.fTrackCutsNoDCA;
2bbfd8c6 66 fCentrSelector = obj.fCentrSelector;
a23f7c97 67
68}
69
70AliAnalysisTaskMultPbTracks::~AliAnalysisTaskMultPbTracks(){
71 // destructor
72
73 if(!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
74 if(fHistoManager) {
75 delete fHistoManager;
76 fHistoManager = 0;
77 }
78 }
79 // Histo list should not be destroyed: fListWrapper is owner!
80
81}
82void AliAnalysisTaskMultPbTracks::UserCreateOutputObjects()
83{
84 // Called once
85
86 // For the DCA distributions, we want to use exactly the same cuts
87 // as for the other distributions, with the exception of the DCA cut
88 fTrackCutsNoDCA = new AliESDtrackCuts(*fTrackCuts); // clone cuts
89 // Reset all DCA cuts; FIXME: is this all?
90 fTrackCutsNoDCA->SetMaxDCAToVertexXY();
91 fTrackCutsNoDCA->SetMaxDCAToVertexZ ();
92 fTrackCutsNoDCA->SetMaxDCAToVertexXYPtDep();
93 fTrackCutsNoDCA->SetMaxDCAToVertexZPtDep();
94
95}
96
97
98void AliAnalysisTaskMultPbTracks::UserExec(Option_t *)
99{
100 // User code
101
102 /* PostData(0) is taken care of by AliAnalysisTaskSE */
103 PostData(1,fHistoManager);
54b31d6a 104 PostData(2,fTrackCuts);
2bbfd8c6 105 PostData(3,fCentrSelector);
a23f7c97 106
54b31d6a 107 // Cache histogram pointers
e0376287 108 static TH3D * hTracks [AliAnalysisMultPbTrackHistoManager::kNHistos];
109 static TH1D * hDCA [AliAnalysisMultPbTrackHistoManager::kNHistos];
110 static TH1D * hNTracks [AliAnalysisMultPbTrackHistoManager::kNHistos];
a23f7c97 111 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen );
112 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec );
113 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim );
114 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecFake] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake );
115 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat );
116 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak);
117
118 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoGen] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen );
119 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRec] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec );
120 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim );
121 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecFake] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake );
122 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat );
123 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak);
124
2bbfd8c6 125 hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen] = fHistoManager->GetHistoMult(AliAnalysisMultPbTrackHistoManager::kHistoGen );
126 hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec] = fHistoManager->GetHistoMult(AliAnalysisMultPbTrackHistoManager::kHistoRec );
a23f7c97 127
128 fESD = dynamic_cast<AliESDEvent*>(fInputEvent);
129 if (strcmp(fESD->ClassName(),"AliESDEvent")) {
130 AliFatal("Not processing ESDs");
131 }
132
133 // FIXME: use physics selection here to keep track of events lost?
134 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatAll);
135
8b628a20 136 Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fOfflineTrigger);
137
138 if(!isSelected) return;
139 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatPhysSel);
140
141
54b31d6a 142 // Centrality selection
2bbfd8c6 143 Bool_t isCentralitySelected = fCentrSelector->IsCentralityBinSelected(fESD,fTrackCuts);
144 if(!isCentralitySelected) return;
145
146 // AliESDCentrality *centrality = fESD->GetCentrality();
147 // if(!centrality) {
148 // AliFatal("Centrality object not available");
149 // }
150 // else {
151 // Int_t centrBin = centrality->GetCentralityClass5(fCentralityEstimator.Data()) ;
54b31d6a 152
2bbfd8c6 153 // if (centrBin != fCentrBin && fCentrBin != -1) return;
154 // }
a23f7c97 155
156 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatCentr);
157
4d0aa70f 158
159
a23f7c97 160 if (fIsMC) {
4d0aa70f 161 // Get MC vertex
162 //FIXME: which vertex do I take for MC?
163 TArrayF vertex;
164 fMCEvent->GenEventHeader()->PrimaryVertex(vertex);
165 Float_t zvGen = vertex[2];
a23f7c97 166
167 if (!fMCEvent) {
168 AliError("No MC info found");
169 } else {
170
e0376287 171 //loop on the MC event, only over primaries, which are always
172 // the first in stack.
173 Int_t nMCTracks = fMCEvent->GetNumberOfPrimaries();
174 Int_t nPhysicalPrimaries = 0;
175 for (Int_t ipart=0; ipart<nMCTracks; ipart++) {
a23f7c97 176
177 AliMCParticle *mcPart = (AliMCParticle*)fMCEvent->GetTrack(ipart);
178
179 // We don't care about neutrals and non-physical primaries
180 if(mcPart->Charge() == 0) continue;
181
54b31d6a 182 //check if current particle is a physical primary
e0376287 183 if(!IsPhysicalPrimaryAndTransportBit(ipart)) continue;
54b31d6a 184
e0376287 185 nPhysicalPrimaries++;
3b8cbf2d 186 // Fill species histo and particle species
187 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Fill(mcPart->Particle()->GetUniqueID());
188 fHistoManager->FillParticleID(AliAnalysisMultPbTrackHistoManager::kHistoGen, mcPart);
e0376287 189
a23f7c97 190 // Float_t zv = vtxESD->GetZ();
191 // Fill generated histo
4d0aa70f 192 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen]->Fill(mcPart->Pt(),mcPart->Eta(),zvGen);
193 Int_t partCode = fHistoManager->GetLocalParticleID(mcPart);
194 if (partCode == AliAnalysisMultPbTrackHistoManager::kPartPiPlus ||
195 partCode == AliAnalysisMultPbTrackHistoManager::kPartPiMinus)
196 fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen, partCode);
a23f7c97 197
198 }
e0376287 199 hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen]->Fill(nPhysicalPrimaries);
4d0aa70f 200 fHistoManager->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Fill(zvGen);
201
202
a23f7c97 203 }
204 }
205
e0376287 206
a23f7c97 207 // FIXME: shall I take the primary vertex?
208 const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();
209 if(!vtxESD) return;
4d0aa70f 210 // FIXME: leave the cuts here or find a better place?)
211 // Quality cut on vertexer Z, as suggested by Francesco Prino
212 if(vtxESD->IsFromVertexerZ()) {
213 if (vtxESD->GetNContributors() <= 0) return;
214 if (vtxESD->GetDispersion() >= 0.04) return;
215 if (vtxESD->GetZRes() >= 0.25) return;
216 }
a23f7c97 217 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatVtx);
4d0aa70f 218 fHistoManager->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->Fill(vtxESD->GetZ());
a23f7c97 219
220 // loop on tracks
221 Int_t ntracks = fESD->GetNumberOfTracks();
2bbfd8c6 222 Int_t acceptedTracks = 0;
a23f7c97 223
224 for (Int_t itrack = 0; itrack<ntracks; itrack++) {
225 AliESDtrack * esdTrack = fESD->GetTrack(itrack);
226
227 // Fill DCA distibutions, without the DCA cut, Fill the other stuff, with all cuts!
228 Bool_t accepted = fTrackCuts->AcceptTrack(esdTrack);
229 Bool_t acceptedNoDCA = fTrackCutsNoDCA->AcceptTrack(esdTrack);
230
2bbfd8c6 231 if(accepted) acceptedTracks++;
232
a23f7c97 233 // Compute weighted offset
234 // TODO: other choiches for the DCA?
235 Double_t b = fESD->GetMagneticField();
236 Double_t dca[2];
237 Double_t cov[3];
238 Double_t weightedDCA = 10;
239
240
241
242 if (esdTrack->PropagateToDCA(vtxESD, b,3., dca, cov)) {
243 Double_t det = cov[0]*cov[2]-cov[1]*cov[1];
244 if (det<=0) {
245 AliError("DCA Covariance matrix is not positive definite!");
246 }
247 else {
248 weightedDCA = (dca[0]*dca[0]*cov[2]+dca[1]*dca[1]*cov[0]-2*dca[0]*dca[1]*cov[1])/det;
249 weightedDCA = weightedDCA>0 ? TMath::Sqrt(weightedDCA) : 10;
250 }
251 // printf("dR:%e dZ%e sigR2:%e sigRZ:%e sigZ2:%e\n",dca[0],dca[1],cov[0],cov[1],cov[2]);
252 }
253
254
255
256
257 // Alternative: p*DCA
258 // Float_t xz[2];
259 // esdTrack->GetDZ(vtxESD->GetX(),vtxESD->GetY(),vtxESD->GetZ(), fESD->GetMagneticField(), xz);
260 // Float_t dca = xz[0]*esdTrack->P();
261
262 // for each track
263 if(accepted)
264 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
265 if(acceptedNoDCA)
266 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRec]->Fill(weightedDCA);
267
268 // Fill separately primaries and secondaries
269 // FIXME: fakes? Is this the correct way to account for them?
270 // Get label and corresponding mcPart;
271 if (fIsMC) {
272 // Int_t label = TMath::Abs(esdTrack->GetLabel()); // no fakes!!!
273 Int_t label = esdTrack->GetLabel(); //
e0376287 274 AliMCParticle *mcPart = label < 0 ? 0 : (AliMCParticle*)fMCEvent->GetTrack(label);
a23f7c97 275 if (!mcPart) {
276 if(accepted)
277 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecFake]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
278 if(acceptedNoDCA)
279 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecFake]->Fill(weightedDCA);
280 }
281 else {
e0376287 282 if(IsPhysicalPrimaryAndTransportBit(label)) {
283 // Fill species histo
3b8cbf2d 284 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->Fill(mcPart->Particle()->GetUniqueID());
4d0aa70f 285 if(accepted) {
a23f7c97 286 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
4d0aa70f 287 Int_t partCode = fHistoManager->GetLocalParticleID(mcPart);
288 if (partCode == AliAnalysisMultPbTrackHistoManager::kPartPiPlus ||
289 partCode == AliAnalysisMultPbTrackHistoManager::kPartPiMinus)
290 fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, partCode);
291 }
a23f7c97 292 if(acceptedNoDCA)
293 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim]->Fill(weightedDCA);
294 }
295 else {
296 Int_t mfl=0;
297 Int_t indexMoth=mcPart->Particle()->GetFirstMother();
298 if(indexMoth>=0){
299 TParticle* moth = fMCEvent->Stack()->Particle(indexMoth);
300 Float_t codemoth = TMath::Abs(moth->GetPdgCode());
301 mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));
302 }
303 if(mfl==3){ // strangeness
3b8cbf2d 304 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak)->Fill(mcPart->Particle()->GetUniqueID());
a23f7c97 305 if(accepted)
306 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
307 if(acceptedNoDCA)
308 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak]->Fill(weightedDCA);
309 }else{ // material
3b8cbf2d 310 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat)->Fill(mcPart->Particle()->GetUniqueID());
a23f7c97 311 if(accepted)
312 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
313 if(acceptedNoDCA)
314 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat]->Fill(weightedDCA);
315
316 }
317
318
319 }
320 }
321 }
322
323
324 }
2bbfd8c6 325 // cout << acceptedTracks << endl;
326
327 hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec] ->Fill(acceptedTracks);
7f5f2e0c 328 // FIXME
329 // hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec] ->Fill(fESD->GetMultiplicity()->GetNumberOfTracklets());
a23f7c97 330
331
332}
333
334void AliAnalysisTaskMultPbTracks::Terminate(Option_t *){
335 // terminate
336
337}
338
339
e0376287 340Bool_t AliAnalysisTaskMultPbTracks::IsPhysicalPrimaryAndTransportBit(Int_t ipart) {
341
342 Bool_t physprim=fMCEvent->IsPhysicalPrimary(ipart);
343 if (!physprim) return kFALSE;
344 Bool_t transported = ((AliMCParticle*)fMCEvent->GetTrack(ipart))->Particle()->TestBit(kTransportBit);
345 if(!transported) return kFALSE;
346
347 return kTRUE;
348
349}
eef42d18 350
351// void AliAnalysisTaskEvil::PrintProcInfo()
352// {
353// ProcInfo_t info;
354// gSystem->GetProcInfo(&info);
355// AliInfo(Form("fMemResident=%10ld kB fMemVirtual=%10ld kB",info.fMemResident,info.fMemVirtual));
356// }