1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
19 // R.Bailhache <R.Bailhache@gsi.de>
26 #include "AliAnalysisManager.h"
27 #include "AliCentrality.h"
28 #include "AliAODTrack.h"
29 #include "AliAODEvent.h"
30 #include "AliHFEcuts.h"
31 #include "AliHFEextraCuts.h"
32 #include "AliInputEventHandler.h"
34 #include "AliPIDResponse.h"
35 #include "AliVEvent.h"
36 #include "AliHFEpidTPC.h"
37 #include "TTreeStream.h"
38 #include "AliESDtrack.h"
39 #include "TClonesArray.h"
40 #include "AliAODMCHeader.h"
41 #include "AliHFEsignalCuts.h"
42 #include "AliAODMCParticle.h"
43 #include "AliVTrack.h"
44 #include "AliAODVertex.h"
46 #include "AliHFEdebugTreeTaskAOD.h"
48 ClassImp(AliHFEdebugTreeTaskAOD)
50 AliHFEdebugTreeTaskAOD::AliHFEdebugTreeTaskAOD():
53 fAODArrayMCInfo(NULL),
62 fFilename("HFEtree.root"),
71 fTransverseMomentum(0.),
77 fNClustersTPCshared(0),
79 fClusterRatioTPCall(0.),
96 AliHFEdebugTreeTaskAOD::AliHFEdebugTreeTaskAOD(const char *name):
97 AliAnalysisTaskSE(name),
99 fAODArrayMCInfo(NULL),
108 fFilename("HFEtree.root"),
109 fDebugstream(kFALSE),
117 fTransverseMomentum(0.),
123 fNClustersTPCshared(0),
125 fClusterRatioTPCall(0.),
139 fTPCpid = new AliHFEpidTPC("QAtpcPID");
140 DefineOutput(1, TTree::Class());
143 AliHFEdebugTreeTaskAOD::~AliHFEdebugTreeTaskAOD(){
145 if(fDebugTree) delete fDebugTree;
146 if(fTPCpid) delete fTPCpid;
147 //if(fDebugTreee) delete fDebugTreee;
150 void AliHFEdebugTreeTaskAOD::UserCreateOutputObjects(){
152 // Create debug tree, signal cuts and track cuts
157 fDebugTree = new TTreeSRedirector(fFilename.Data());
161 fDebugTreee = new TTree("PIDdebug","PIDdebug");
162 fDebugTreee->Branch("centrality",&fRun);
163 fDebugTreee->Branch("run",&fDoublec);
164 fDebugTreee->Branch("p",&fMomentum);
165 fDebugTreee->Branch("ptpc",&fMomentumTPC);
166 fDebugTreee->Branch("pt",&fTransverseMomentum);
167 fDebugTreee->Branch("eta",&fEta);
168 fDebugTreee->Branch("phi",&fPhi);
169 fDebugTreee->Branch("charge",&fCharge);
170 fDebugTreee->Branch("nclustersTPCall",&fNClustersTPCall);
171 fDebugTreee->Branch("nclustersTPCPID",&fNClustersTPCPID);
172 fDebugTreee->Branch("nclustersTPCshared",&fNClustersTPCshared);
173 fDebugTreee->Branch("nCrossedRowsTPC",&fNCrossedRowsTPC);
174 fDebugTreee->Branch("clusterRatioTPCall",&fClusterRatioTPCall);
175 fDebugTreee->Branch("nclustersITS",&fNClustersITS);
176 fDebugTreee->Branch("statusL0",&fStatusL0);
177 fDebugTreee->Branch("statusL1",&fStatusL1);
178 fDebugTreee->Branch("sigmaTOF",&fSigmaTOF);
179 fDebugTreee->Branch("sigmaTPC",&fSigmaTPC);
180 fDebugTreee->Branch("dcaxy",&fDcaxy);
181 fDebugTreee->Branch("dcaz",&fDcaz);
182 fDebugTreee->Branch("filter2",&fFilter2);
183 fDebugTreee->Branch("filter4",&fFilter4);
184 fDebugTreee->Branch("source",&fSource);
185 fDebugTreee->Branch("eR",&fEr);
186 fDebugTreee->Branch("signal",&fSignal);
187 PostData(1,fDebugTreee);
190 // printf("testa\n");
191 fSignalCuts = new AliHFEsignalCuts("HFEsignalCuts", "HFE MC Signal definition");
194 fTrackCuts = new AliHFEcuts("fTrackCuts", "Basic HFE track cuts");
195 fTrackCuts->CreateStandardCuts();
196 fTrackCuts->SetAOD();
198 fTrackCuts->SetMinNClustersTPC(fNclustersTPC);
199 fTrackCuts->SetMinRatioTPCclusters(0);
200 fTrackCuts->SetTPCmodes(AliHFEextraCuts::kFound, AliHFEextraCuts::kFoundOverFindable);
201 fTrackCuts->SetMinNClustersTPCPID(fNclustersTPCPID);
202 fTrackCuts->SetMinNClustersITS(fNclustersITS);
204 fTrackCuts->SetUseMixedVertex(kTRUE);
205 fTrackCuts->SetVertexRange(10.);
207 fTrackCuts->Initialize();
210 fExtraCuts = new AliHFEextraCuts("hfeExtraCuts","HFE Extra Cuts");
214 void AliHFEdebugTreeTaskAOD::UserExec(Option_t *){
216 // User Exec: Fill debug Tree
220 AliPIDResponse *pid = NULL;
221 AliInputEventHandler *handler = dynamic_cast<AliInputEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
223 // printf("testb\n");
224 pid = handler->GetPIDResponse();
226 AliError("No Handler");
229 // printf("testc\n");
230 AliError("No PID response");
234 AliError("No Input event");
239 Bool_t mcthere = kTRUE;
240 AliAODEvent *aodE = dynamic_cast<AliAODEvent *>(fInputEvent);
242 // printf("testd\n");
243 AliError("No AOD Event");
246 fAODMCHeader = dynamic_cast<AliAODMCHeader *>(fInputEvent->FindListObject(AliAODMCHeader::StdBranchName()));
251 fAODArrayMCInfo = dynamic_cast<TClonesArray *>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
252 if(!fAODArrayMCInfo){
257 fSignalCuts->SetMCAODInfo(fAODArrayMCInfo);
258 fTrackCuts->SetMCEvent(aodE);
261 // Set for track cuts
262 fTrackCuts->SetRecEvent(fInputEvent);
264 if(!fTrackCuts->CheckEventCuts("fCutsEvRec", fInputEvent)){
265 AliDebug(1, "Event rejected by the event cuts\n");
269 fExtraCuts = new AliHFEextraCuts("hfeExtraCuts","HFE Extra Cuts");
271 fExtraCuts->SetRecEventInfo(fInputEvent);
274 fRun = fInputEvent->GetRunNumber();
277 UInt_t trigger = fInputHandler->IsEventSelected();
278 Bool_t isMBTrigger = trigger & AliVEvent::kMB;
279 Bool_t isCentralTrigger = trigger & AliVEvent::kCentral;
280 Bool_t isSemicentralTrigger = trigger & AliVEvent::kSemiCentral;
281 Bool_t isEMCALTrigger = trigger & AliVEvent::kEMCEJE;
283 // Get Primary Vertex
284 const AliVVertex *vertex = fInputEvent->GetPrimaryVertex();
287 Double_t ncontrib = fInputEvent->GetPrimaryVertex()->GetNContributors();
291 AliCentrality *hicent = fInputEvent->GetCentrality();
292 fCentrality = hicent->GetCentralityPercentile("V0M");
295 // Look for kink mother
296 Int_t numberofvertices = aodE->GetNumberOfVertices();
297 Double_t listofmotherkink[numberofvertices];
298 Int_t numberofmotherkink = 0;
299 //printf("Number of vertices %d\n",numberofvertices);
300 for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {
301 AliAODVertex *aodvertex = aodE->GetVertex(ivertex);
302 if(!aodvertex) continue;
303 //printf("Type %d\n",aodvertex->GetType());
304 if(aodvertex->GetType()==AliAODVertex::kKink) {
305 //printf("Find one kink\n");
306 AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();
307 if(!mother) continue;
308 Int_t idmother = mother->GetID();
309 listofmotherkink[numberofmotherkink] = idmother;
310 //printf("ID %d\n",idmother);
311 numberofmotherkink++;
314 //printf("Number of kink mother in the events %d\n",numberofmotherkink);
317 //Double_t charge, eta, phi, momentum, momentumTPC, transversemomentum;
320 // Loop on reconstructed tracks
323 TArrayI *arraytrack = new TArrayI(fInputEvent->GetNumberOfTracks());
325 AliAODTrack *track = 0x0;
326 AliAODMCParticle *mctrack = NULL;
327 for(Int_t itrack = 0; itrack < fInputEvent->GetNumberOfTracks(); itrack++){
329 track = dynamic_cast<AliAODTrack *>(fInputEvent->GetTrack(itrack));
331 // Cut track (Only basic track cuts)
332 // printf("testv\n");
333 if(!fTrackCuts->CheckParticleCuts(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepRecKineITSTPC, track)) continue;
336 fSigmaTOF = pid->NumberOfSigmasTOF(track, AliPID::kElectron);
337 fSigmaTPC = pid->NumberOfSigmasTPC(track, AliPID::kElectron);
338 Double_t tPCdEdx = track->GetDetPid() ? track->GetDetPid()->GetTPCsignal() : 0.;
341 fCharge = track->Charge() > 0 ? 1. : -1.;
344 fMomentum = track->P() * fCharge;
345 fTransverseMomentum = track->Pt() * fCharge;
346 fMomentumTPC = track->GetDetPid() ? track->GetDetPid()->GetTPCmomentum() : track->P();
349 ULong_t status = track->GetStatus();
351 if((status & AliESDtrack::kITSrefit) == AliESDtrack::kITSrefit) itsrefit = 1;
353 if((status & AliESDtrack::kTPCrefit) == AliESDtrack::kTPCrefit) tpcrefit = 1;
355 // ITS number of clusters
356 fNClustersITS = (Int_t) track->GetITSNcls();
357 // TPC number of clusters (different definitions)
358 UChar_t nclustersTPCfit = track->GetTPCNcls();
359 //UChar_t nclustersTPCall = 0;
360 const TBits &clusterTPC = track->GetTPCClusterMap();
361 fNClustersTPCall = (Int_t) clusterTPC.CountBits();
362 fNClustersTPCPID = (Int_t) track->GetTPCsignalN();
363 UChar_t nfindableTPC = track->GetTPCNclsF();
364 Double_t clusterRatioTPCfit = 0.0;
365 if((static_cast<Double_t>(nfindableTPC))>0.0) clusterRatioTPCfit = static_cast<Double_t>(nclustersTPCfit)/static_cast<Double_t>(nfindableTPC);
366 //Double_t clusterRatioTPCall = 0.0;
367 if((static_cast<Double_t>(nfindableTPC))>0.0) fClusterRatioTPCall = static_cast<Float_t>(fNClustersTPCall)/static_cast<Float_t>(nfindableTPC);
368 fNClustersTPCshared = 0;
369 fNCrossedRowsTPC = (Int_t) track->GetTPCNCrossedRows();
370 const TBits &sharedTPC = track->GetTPCSharedMap();
371 for(Int_t ibit = 0; ibit < 160; ibit++) if(sharedTPC.TestBitNumber(ibit)) fNClustersTPCshared++;
372 // TRD clusters and tracklets
373 UChar_t nclustersTRD = track->GetTRDncls();
374 UChar_t ntrackletsTRDPID = track->GetTRDntrackletsPID();
375 Int_t nslicesTRD = track->GetNumberOfTRDslices();
376 Int_t chi2TRD = track->GetTRDchi2();
377 // ITS and TRD acceptance maps
378 UChar_t itsPixel = track->GetITSClusterMap();
380 if(TESTBIT(itsPixel, 0)) fStatusL0 = 1;
382 if(TESTBIT(itsPixel, 1)) fStatusL1 = 1;
387 fExtraCuts->GetImpactParameters((AliVTrack *)track,fDcaxy,fDcaz);
391 if(fExtraCuts->IsKinkDaughter(track)) kink = 1;
394 Int_t kinkmotherpass = 0;
395 for(Int_t kinkmother = 0; kinkmother < numberofmotherkink; kinkmother++) {
396 if(track->GetID() == listofmotherkink[kinkmother]) {
402 // ID track to see if negative
403 Int_t id = track->GetID();
407 for(Int_t l=0; l < itrack; l++){
408 Int_t iTrack2 = arraytrack->At(l);
409 if(iTrack2==id) fDoublec=1;
411 //printf("Doublec %d\n",doublec);
413 // Add the id at this place
414 arraytrack->AddAt(id,itrack);
418 for(Int_t k=0; k<20; k++) {
421 if((track->TestFilterBit(u))) {
425 Int_t filter0 = filter[0];
426 Int_t filter1 = filter[1];
427 fFilter2 = filter[2];
428 Int_t filter3 = filter[3];
429 fFilter4 = filter[4];
430 Int_t filter5 = filter[5];
431 Int_t filter6 = filter[6];
432 Int_t filter7 = filter[7];
433 Int_t filter8 = filter[8];
434 Int_t filter9 = filter[9];
435 Int_t filter10 = filter[10];
436 Int_t filter11 = filter[11];
437 Int_t filter12 = filter[12];
438 Int_t filter13 = filter[13];
439 Int_t filter14 = filter[14];
440 Int_t filter15 = filter[15];
441 Int_t filter16 = filter[16];
442 Int_t filter17 = filter[17];
443 Int_t filter18 = filter[18];
444 Int_t filter19 = filter[19];
446 Int_t eventnb = fEventNumber;
453 Double_t chargemc, etamc, phimc, momentummc, transversemomentummc;
458 Int_t label = TMath::Abs(track->GetLabel());
459 if(label && label < fAODArrayMCInfo->GetEntriesFast())
460 mctrack = dynamic_cast<AliAODMCParticle *>(fAODArrayMCInfo->At(label));
461 if(!mctrack) continue;
462 if(fTrackCuts->CheckParticleCuts(static_cast<UInt_t>(AliHFEcuts::kStepMCGenerated), mctrack)) fSignal = 1;
464 chargemc = mctrack->Charge() > 0. ? 1. : -1.;
465 momentummc = mctrack->P() * chargemc;
466 transversemomentummc = mctrack->Pt() * chargemc;
467 etamc = mctrack->Eta();
468 phimc = mctrack->Phi();
469 pdg = mctrack->GetPdgCode();
471 // Get Production Vertex in radial direction
475 fEr = TMath::Sqrt(vx*vx+vy*vy);
477 // Get Mother PDG code of the particle
479 Int_t motherlabel = TMath::Abs(mctrack->GetMother());
480 if(motherlabel >= 0 && motherlabel < fAODArrayMCInfo->GetEntriesFast()){
481 AliAODMCParticle *mother = dynamic_cast<AliAODMCParticle *>(fAODArrayMCInfo->At(motherlabel));
482 if(mother) motherPdg = mother->GetPdgCode();
487 if(fSignalCuts->IsCharmElectron(mctrack)) fSource = 0;
488 else if(fSignalCuts->IsBeautyElectron(mctrack)) fSource = 1;
489 else if(fSignalCuts->IsGammaElectron(mctrack)) fSource = 2;
490 else if(fSignalCuts->IsNonHFElectron(mctrack)) fSource = 3;
491 else if(TMath::Abs(pdg) == 11) fSource = 4;
500 (*fDebugTree) << "PIDdebug"
501 << "centrality=" << fCentrality
502 << "MBtrigger=" << isMBTrigger
503 << "CentralTrigger=" << isCentralTrigger
504 << "SemicentralTrigger=" << isSemicentralTrigger
505 << "EMCALtrigger=" << isEMCALTrigger
507 << "eventnb=" << eventnb
511 << "ncontrib=" << ncontrib
515 << "ptpc=" << fMomentumTPC
516 << "pt=" << fTransverseMomentum
519 << "charge=" << fCharge
520 << "itsrefit=" << itsrefit
521 << "tpcrefit=" << tpcrefit
522 << "nclustersTPC=" << nclustersTPCfit
523 << "nclustersTPCall=" << fNClustersTPCall
524 << "nclustersTPCPID=" << fNClustersTPCPID
525 << "nclustersTPCshared=" << fNClustersTPCshared
526 << "ncrossedRowsTPC=" << fNCrossedRowsTPC
527 << "clusterRatioTPC=" << clusterRatioTPCfit
528 << "clusterRatioTPCall=" << fClusterRatioTPCall
529 << "nclustersITS=" << fNClustersITS
530 << "nclustersTRD=" << nclustersTRD
531 << "ntrackletsTRD=" << ntrackletsTRDPID
532 << "nslicesTRD=" << nslicesTRD
533 << "chi2TRD=" << chi2TRD
534 << "statusITS0=" << fStatusL0
535 << "statusITS1=" << fStatusL1
536 << "TOFsigmaEl=" << fSigmaTOF
537 << "TPCsigmaEl=" << fSigmaTPC
538 << "TPCdEdx=" << tPCdEdx
541 << "kinkdaughter=" << kink
542 << "kinkmother=" << kinkmotherpass
543 << "nbofmotherkink=" << numberofmotherkink
544 << "filter0=" << filter0
545 << "filter1=" << filter1
546 << "filter2=" << fFilter2
547 << "filter3=" << filter3
548 << "filter4=" << fFilter4
549 << "filter5=" << filter5
550 << "filter6=" << filter6
551 << "filter7=" << filter7
552 << "filter8=" << filter8
553 << "filter9=" << filter9
554 << "filter10=" << filter10
555 << "filter11=" << filter11
556 << "filter12=" << filter12
557 << "filter13=" << filter13
558 << "filter14=" << filter14
559 << "filter15=" << filter15
560 << "filter16=" << filter16
561 << "filter17=" << filter17
562 << "filter18=" << filter18
563 << "filter19=" << filter19
564 << "mcp=" << momentummc
565 << "mcpt=" << transversemomentummc
569 << "source=" << fSource
574 << "mccharge=" << chargemc
575 << "signal=" << fSignal
578 if((fFilter2==1) || (fFilter4==1)) fDebugTreee->Fill();
585 arraytrack->~TArrayI();
588 if(!fDebugstream) PostData(1,fDebugTreee);
594 void AliHFEdebugTreeTaskAOD::SetFileName(const char *filename){ fFilename = filename; }
595 void AliHFEdebugTreeTaskAOD::Terminate(Option_t *){
597 if(fDebugTree) delete fDebugTree;