1 // AliAnalysisTaskMultPbTracks
3 // Author: Michele Floris, CERN
5 // - Add chi2/cluster plot for primary, secondaries and fakes
7 #include "AliAnalysisTaskMultPbTracks.h"
8 #include "AliESDInputHandler.h"
9 #include "AliAnalysisMultPbTrackHistoManager.h"
10 #include "AliAnalysisManager.h"
11 #include "AliESDtrackCuts.h"
12 #include "AliMCEvent.h"
17 #include "AliMCParticle.h"
18 #include "AliGenEventHeader.h"
19 #include "AliESDCentrality.h"
20 #include "AliMultiplicity.h"
23 #include "AliAnalysisMultPbCentralitySelector.h"
24 #include "AliTriggerAnalysis.h"
28 ClassImp(AliAnalysisTaskMultPbTracks)
30 AliAnalysisTaskMultPbTracks::AliAnalysisTaskMultPbTracks()
31 : AliAnalysisTaskSE("TaskMultPbTracks"),
32 fESD(0),fHistoManager(0),fCentrSelector(0),fTrackCuts(0),fTrackCutsNoDCA(0),fOfflineTrigger(0), fIsMC(0),fIsTPCOnly(0), fTriggerAnalysis(0)
36 DefineOutput(1, AliAnalysisMultPbTrackHistoManager::Class());
37 DefineOutput(2, AliESDtrackCuts::Class());
38 DefineOutput(3, AliAnalysisMultPbCentralitySelector::Class());
40 fHistoManager = new AliAnalysisMultPbTrackHistoManager("histoManager","Hitograms, Multiplicity, Track analysis");
41 if(fIsMC) fHistoManager->SetSuffix("MC");
44 AliAnalysisTaskMultPbTracks::AliAnalysisTaskMultPbTracks(const char * name)
45 : AliAnalysisTaskSE(name),
46 fESD(0),fHistoManager(0),fCentrSelector(0),fTrackCuts(0),fTrackCutsNoDCA(0),fOfflineTrigger(0),fIsMC(0),fIsTPCOnly(0), fTriggerAnalysis(0)
49 // Standard constructur which should be used
52 DefineOutput(1, AliAnalysisMultPbTrackHistoManager::Class());
53 DefineOutput(2, AliESDtrackCuts::Class());
54 DefineOutput(3, AliAnalysisMultPbCentralitySelector::Class());
56 fHistoManager = new AliAnalysisMultPbTrackHistoManager("histoManager","Hitograms, Multiplicity, Track analysis");
57 if(fIsMC) fHistoManager->SetSuffix("MC");
61 AliAnalysisTaskMultPbTracks::AliAnalysisTaskMultPbTracks(const AliAnalysisTaskMultPbTracks& obj) :
62 AliAnalysisTaskSE(obj) ,fESD (0), fHistoManager(0), fCentrSelector(0), fTrackCuts(0),fTrackCutsNoDCA(0),fOfflineTrigger(0),fIsMC(0),fIsTPCOnly(0), fTriggerAnalysis(0)
66 fHistoManager= obj.fHistoManager;
67 fTrackCuts = obj.fTrackCuts;
68 fTrackCutsNoDCA = obj.fTrackCutsNoDCA;
69 fCentrSelector = obj.fCentrSelector;
70 fOfflineTrigger = obj.fOfflineTrigger;
72 fIsTPCOnly = obj.fIsTPCOnly;
73 fTriggerAnalysis = obj.fTriggerAnalysis;
77 AliAnalysisTaskMultPbTracks::~AliAnalysisTaskMultPbTracks(){
80 if(!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
84 delete fTriggerAnalysis;
88 // Histo list should not be destroyed: fListWrapper is owner!
91 void AliAnalysisTaskMultPbTracks::UserCreateOutputObjects()
95 // For the DCA distributions, we want to use exactly the same cuts
96 // as for the other distributions, with the exception of the DCA cut
97 fTrackCutsNoDCA = new AliESDtrackCuts(*fTrackCuts); // clone cuts
98 // Reset all DCA cuts; FIXME: is this all?
99 fTrackCutsNoDCA->SetMaxDCAToVertexXY();
100 fTrackCutsNoDCA->SetMaxDCAToVertexZ ();
101 fTrackCutsNoDCA->SetMaxDCAToVertexXYPtDep();
102 fTrackCutsNoDCA->SetMaxDCAToVertexZPtDep();
104 fTriggerAnalysis = new AliTriggerAnalysis();
105 fTriggerAnalysis->SetAnalyzeMC(fIsMC);
109 void AliAnalysisTaskMultPbTracks::UserExec(Option_t *)
114 /* PostData(0) is taken care of by AliAnalysisTaskSE */
115 PostData(1,fHistoManager);
116 PostData(2,fTrackCuts);
117 PostData(3,fCentrSelector);
119 // Cache (some) histogram pointers to avoid loop in the histo manager
120 static TH3D * hTracks [AliAnalysisMultPbTrackHistoManager::kNHistos];
121 static TH2D * hDCA [AliAnalysisMultPbTrackHistoManager::kNHistos];
122 static TH1D * hNTracks [AliAnalysisMultPbTrackHistoManager::kNHistos];
123 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen );
124 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec );
125 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim );
126 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecFake] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake );
127 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat );
128 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak] = fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak);
130 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoGen] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen );
131 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRec] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec );
132 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim );
133 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecFake] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake );
134 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat );
135 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak] = fHistoManager->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak);
137 hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen] = fHistoManager->GetHistoMult(AliAnalysisMultPbTrackHistoManager::kHistoGen );
138 hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec] = fHistoManager->GetHistoMult(AliAnalysisMultPbTrackHistoManager::kHistoRec );
141 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->Reset();
143 fESD = dynamic_cast<AliESDEvent*>(fInputEvent);
144 if (strcmp(fESD->ClassName(),"AliESDEvent")) {
145 AliFatal("Not processing ESDs");
148 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatAll);
151 // Centrality selection
152 Bool_t isCentralitySelected = fCentrSelector->IsCentralityBinSelected(fESD,fTrackCuts);
153 if(!isCentralitySelected) return;
155 // AliESDCentrality *centrality = fESD->GetCentrality();
157 // AliFatal("Centrality object not available");
160 // Int_t centrBin = centrality->GetCentralityClass5(fCentralityEstimator.Data()) ;
162 // if (centrBin != fCentrBin && fCentrBin != -1) return;
165 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatCentr);
167 Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fOfflineTrigger);
169 if(!isSelected) return;
170 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatPhysSel);
175 //FIXME: which vertex do I take for MC?
177 fMCEvent->GenEventHeader()->PrimaryVertex(vertex);
178 Float_t zvGen = vertex[2];
181 AliError("No MC info found");
184 //loop on the MC event, only over primaries, which are always
185 // the first in stack.
186 // WRONG: D&B decays are produced in the transport... Need To Loop over all particles
187 // Int_t nMCTracks = fMCEvent->GetNumberOfPrimaries();
188 Int_t nMCTracks = fMCEvent->GetNumberOfTracks();
189 Int_t nPhysicalPrimaries = 0;
190 for (Int_t ipart=0; ipart<nMCTracks; ipart++) {
192 AliMCParticle *mcPart = (AliMCParticle*)fMCEvent->GetTrack(ipart);
194 // We don't care about neutrals and non-physical primaries
195 if(mcPart->Charge() == 0) continue;
197 //check if current particle is a physical primary
198 if(!IsPhysicalPrimaryAndTransportBit(ipart)) continue;
199 if(TMath::Abs(mcPart->Zv()-zvGen)>1e-6) {
200 // This cures a bug in Hijing
201 // A little hack here: I put those in the underflow bin of the process type to keep track of them
202 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Fill(-1);
206 nPhysicalPrimaries++;
207 // Fill species histo and particle species
208 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Fill(mcPart->Particle()->GetUniqueID());
209 fHistoManager->FillParticleID(AliAnalysisMultPbTrackHistoManager::kHistoGen, mcPart);
211 // Float_t zv = vtxESD->GetZ();
212 // Fill generated histo
213 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen]->Fill(mcPart->Pt(),mcPart->Eta(),zvGen);
214 Int_t partCode = fHistoManager->GetLocalParticleID(mcPart);
215 // cout << "Part " << partCode << endl;
216 if (partCode == AliAnalysisMultPbTrackHistoManager::kPartPiPlus ||
217 partCode == AliAnalysisMultPbTrackHistoManager::kPartPiMinus ||
218 partCode == AliAnalysisMultPbTrackHistoManager::kPartKPlus ||
219 partCode == AliAnalysisMultPbTrackHistoManager::kPartKMinus ||
220 partCode == AliAnalysisMultPbTrackHistoManager::kPartP ||
221 partCode == AliAnalysisMultPbTrackHistoManager::kPartPBar
223 // cout << "Found " << partCode << endl;
225 fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen, partCode);
228 hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen]->Fill(nPhysicalPrimaries);
229 fHistoManager->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Fill(zvGen);
236 const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();
238 // TODO: leave the cuts here or find a better place?)
239 // Quality cut on vertexer Z, as suggested by Francesco Prino
240 if(vtxESD->IsFromVertexerZ()) {
241 if (vtxESD->GetNContributors() <= 0) return;
242 if (vtxESD->GetDispersion() > 0.04) return;
243 if (vtxESD->GetZRes() > 0.25) return;
245 // "Beam gas" vertex cut
246 const AliESDVertex * vtxESDTPC= fESD->GetPrimaryVertexTPC();
247 if(vtxESDTPC->GetNContributors()<1) return;
248 if (vtxESDTPC->GetNContributors()<(-10.+0.25*fESD->GetMultiplicity()->GetNumberOfITSClusters(0))) return;
251 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatVtx);
254 Bool_t zdcA = fTriggerAnalysis->ZDCTDCTrigger(fESD, AliTriggerAnalysis::kASide, kTRUE, kFALSE) ;
255 Bool_t zdcC = fTriggerAnalysis->ZDCTDCTrigger(fESD, AliTriggerAnalysis::kCSide, kTRUE, kFALSE) ;
257 if (!(zdcA && zdcC) && (!fIsMC)) return;
258 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatZDCCut);
261 if(TMath::Abs(vtxESD->GetZ()) > 10) return;
262 fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatVtxRangeCut);
265 Float_t ntracksOk = fTrackCuts->CountAcceptedTracks(fESD);
266 const AliMultiplicity * mult = fESD->GetMultiplicity();
267 if (ntracksOk < 1000 && mult->GetNumberOfITSClusters(1) > 4500) {
269 Printf("IEV: %d, Orbit: %x, Period: %d, BC: %d\n",fESD->GetEventNumberInFile(), fESD->GetOrbitNumber(),fESD->GetPeriodNumber(),fESD->GetBunchCrossNumber());
270 printf("%s ----> Processing event # %lld\n", CurrentFileName(), Entry());
271 cout << "File " << AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName() << endl;
272 cout << "Nt " << ntracksOk << ", "<< fESD->GetNumberOfTracks() << " V0 " << fCentrSelector->GetCorrV0(fESD,dummy) << " SPD1 " << mult->GetNumberOfITSClusters(1) << endl;
279 fHistoManager->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->Fill(vtxESD->GetZ());
282 Int_t ntracks = fESD->GetNumberOfTracks();
283 Int_t acceptedTracks = 0;
285 for (Int_t itrack = 0; itrack<ntracks; itrack++) {
286 AliESDtrack * esdTrack = fIsTPCOnly ? fTrackCuts->GetTPCOnlyTrack(fESD,itrack) : fESD->GetTrack(itrack);// FIXMEL TrackCuts or TrackCutsNoDCA for the TPC?
287 if (!esdTrack) continue;
289 // Fill DCA distibutions, without the DCA cut, Fill the other stuff, with all cuts!
290 Bool_t accepted = fTrackCuts->AcceptTrack(esdTrack);
291 Bool_t acceptedNoDCA = fTrackCutsNoDCA->AcceptTrack(esdTrack);
293 if(accepted) acceptedTracks++;
295 // Compute weighted offset
296 // TODO: other choiches for the DCA?
297 Double_t weightedDCA = 10;
300 #if defined WEIGHTED_DCA
301 Double_t b = fESD->GetMagneticField();
304 if (esdTrack->PropagateToDCA(vtxESD, b,3., dca, cov)) {
305 Double_t det = cov[0]*cov[2]-cov[1]*cov[1];
307 AliError("DCA Covariance matrix is not positive definite!");
310 weightedDCA = (dca[0]*dca[0]*cov[2]+dca[1]*dca[1]*cov[0]-2*dca[0]*dca[1]*cov[1])/det;
311 weightedDCA = weightedDCA>0 ? TMath::Sqrt(weightedDCA) : 10;
313 // printf("dR:%e dZ%e sigR2:%e sigRZ:%e sigZ2:%e\n",dca[0],dca[1],cov[0],cov[1],cov[2]);
316 #elif defined TRANSVERSE_DCA
318 esdTrack->GetDZ(vtxESD->GetX(),vtxESD->GetY(),vtxESD->GetZ(), fESD->GetMagneticField(), xz);
323 // Alternative: p*DCA
325 // esdTrack->GetDZ(vtxESD->GetX(),vtxESD->GetY(),vtxESD->GetZ(), fESD->GetMagneticField(), xz);
326 // Float_t dca = xz[0]*esdTrack->P();
328 // This cures a bug in Hijing (displaced primaries)
330 Int_t label = TMath::Abs(esdTrack->GetLabel()); // no fakes!!!
331 if (IsPhysicalPrimaryAndTransportBit(label)) {
332 AliMCParticle *mcPart = (AliMCParticle*)fMCEvent->GetTrack(label);
333 if(!mcPart) AliFatal("No particle");
335 fMCEvent->GenEventHeader()->PrimaryVertex(vertex);
336 Float_t zvGen = vertex[2];
337 if(TMath::Abs(mcPart->Zv()-zvGen)>1e-6) continue;
342 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
343 if (TMath::Abs(esdTrack->Eta())<0.5 && TMath::Abs(vtxESD->GetZ())<7)
344 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->Fill(esdTrack->Pt());
347 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRec]->Fill(weightedDCA,esdTrack->Pt());
349 // Fill separately primaries and secondaries
350 // FIXME: fakes? Is this the correct way to account for them?
351 // Get label and corresponding mcPart;
353 Int_t label = TMath::Abs(esdTrack->GetLabel()); // no fakes!!!
354 //Int_t label = esdTrack->GetLabel(); //
355 AliMCParticle *mcPart = label < 0 ? 0 : (AliMCParticle*)fMCEvent->GetTrack(label);
358 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecFake]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
360 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecFake]->Fill(weightedDCA,esdTrack->Pt());
363 if(IsPhysicalPrimaryAndTransportBit(label)) {
364 // Fill species histo
365 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->Fill(mcPart->Particle()->GetUniqueID());
367 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
368 Int_t partCode = fHistoManager->GetLocalParticleID(mcPart);
369 if (partCode == AliAnalysisMultPbTrackHistoManager::kPartPiPlus ||
370 partCode == AliAnalysisMultPbTrackHistoManager::kPartPiMinus ||
371 partCode == AliAnalysisMultPbTrackHistoManager::kPartKPlus ||
372 partCode == AliAnalysisMultPbTrackHistoManager::kPartKMinus ||
373 partCode == AliAnalysisMultPbTrackHistoManager::kPartP ||
374 partCode == AliAnalysisMultPbTrackHistoManager::kPartPBar
376 fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, partCode);
379 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim]->Fill(weightedDCA,esdTrack->Pt());
383 Int_t indexMoth=mcPart->Particle()->GetFirstMother();
385 TParticle* moth = fMCEvent->Stack()->Particle(indexMoth);
386 Float_t codemoth = TMath::Abs(moth->GetPdgCode());
387 mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));
389 if(mfl==3){ // strangeness
390 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak)->Fill(mcPart->Particle()->GetUniqueID());
392 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
394 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak]->Fill(weightedDCA,esdTrack->Pt());
396 fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat)->Fill(mcPart->Particle()->GetUniqueID());
398 hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
400 hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat]->Fill(weightedDCA,esdTrack->Pt());
411 // cout << acceptedTracks << endl;
413 hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoRec] ->Fill(acceptedTracks);
415 fHistoManager->GetHistoV0vsNtracks(AliAnalysisMultPbTrackHistoManager::kHistoRec)->Fill(acceptedTracks, fCentrSelector->GetCorrV0(fESD,v0));
417 // Fill <pt> analysis histos
418 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->Scale(1,"width");// correct bin width
419 if (fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->GetEntries()>0)
420 fHistoManager->GetHistoMeanPt(AliAnalysisMultPbTrackHistoManager::kHistoRec)->Fill(fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->GetMean());
421 if (fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->GetMean() >
422 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRecHighestMeanPt)->GetMean()) {
423 // Found a new highest pt: first reset than add it to the container for the highest
424 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRecHighestMeanPt)->Reset();
425 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRecHighestMeanPt)
426 ->Add(fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec));
428 if ((fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->GetMean() <
429 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRecLowestMeanPt)->GetMean() &&
430 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->GetEntries()>0) ||
431 !(fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRecLowestMeanPt)->GetEntries()>0)) {
432 // Found a new lowest pt: first reset than add it to the container for the lowest
433 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRecLowestMeanPt)->Reset();
434 fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRecLowestMeanPt)
435 ->Add(fHistoManager->GetHistoPtEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec));
439 void AliAnalysisTaskMultPbTracks::Terminate(Option_t *){
445 Bool_t AliAnalysisTaskMultPbTracks::IsPhysicalPrimaryAndTransportBit(Int_t ipart) {
446 // Check if it is a primary and if it was transported
447 Bool_t physprim=fMCEvent->IsPhysicalPrimary(ipart);
448 if (!physprim) return kFALSE;
449 Bool_t transported = ((AliMCParticle*)fMCEvent->GetTrack(ipart))->Particle()->TestBit(kTransportBit);
450 if(!transported) return kFALSE;
456 // void AliAnalysisTaskEvil::PrintProcInfo()
459 // gSystem->GetProcInfo(&info);
460 // AliInfo(Form("fMemResident=%10ld kB fMemVirtual=%10ld kB",info.fMemResident,info.fMemVirtual));