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>
25 #include "AliAnalysisManager.h"
26 #include "AliCentrality.h"
27 #include "AliAODTrack.h"
28 #include "AliAODEvent.h"
29 #include "AliAODPid.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 "AliVCluster.h"
45 #include "AliAODVertex.h"
47 #include "AliHFEdebugTreeTaskAOD.h"
49 ClassImp(AliHFEdebugTreeTaskAOD)
51 AliHFEdebugTreeTaskAOD::AliHFEdebugTreeTaskAOD():
54 fAODArrayMCInfo(NULL),
63 fFilename("HFEtree.root"),
69 AliHFEdebugTreeTaskAOD::AliHFEdebugTreeTaskAOD(const char *name):
70 AliAnalysisTaskSE(name),
72 fAODArrayMCInfo(NULL),
81 fFilename("HFEtree.root"),
84 fTPCpid = new AliHFEpidTPC("QAtpcPID");
87 AliHFEdebugTreeTaskAOD::~AliHFEdebugTreeTaskAOD(){
89 if(fDebugTree) delete fDebugTree;
90 if(fTPCpid) delete fTPCpid;
93 void AliHFEdebugTreeTaskAOD::UserCreateOutputObjects(){
95 // Create debug tree, signal cuts and track cuts
99 fDebugTree = new TTreeSRedirector(fFilename.Data());
101 // printf("testa\n");
102 fSignalCuts = new AliHFEsignalCuts("HFEsignalCuts", "HFE MC Signal definition");
105 fTrackCuts = new AliHFEcuts("fTrackCuts", "Basic HFE track cuts");
106 fTrackCuts->CreateStandardCuts();
107 fTrackCuts->SetAOD();
109 fTrackCuts->SetMinNClustersTPC(fNclustersTPC);
110 fTrackCuts->SetMinRatioTPCclusters(0);
111 fTrackCuts->SetTPCmodes(AliHFEextraCuts::kFound, AliHFEextraCuts::kFoundOverFindable);
112 fTrackCuts->SetMinNClustersTPCPID(fNclustersTPCPID);
113 fTrackCuts->SetMinNClustersITS(fNclustersITS);
115 fTrackCuts->SetUseMixedVertex(kTRUE);
116 fTrackCuts->SetVertexRange(10.);
118 fTrackCuts->Initialize();
121 fExtraCuts = new AliHFEextraCuts("hfeExtraCuts","HFE Extra Cuts");
125 void AliHFEdebugTreeTaskAOD::UserExec(Option_t *){
127 // User Exec: Fill debug Tree
131 AliPIDResponse *pid = NULL;
132 AliInputEventHandler *handler = dynamic_cast<AliInputEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
134 // printf("testb\n");
135 pid = handler->GetPIDResponse();
137 AliError("No Handler");
140 // printf("testc\n");
141 AliError("No PID response");
145 AliError("No Input event");
149 AliAODTrack copyTrack;
152 Bool_t mcthere = kTRUE;
153 AliAODEvent *aodE = dynamic_cast<AliAODEvent *>(fInputEvent);
155 // printf("testd\n");
156 AliError("No AOD Event");
159 fAODMCHeader = dynamic_cast<AliAODMCHeader *>(fInputEvent->FindListObject(AliAODMCHeader::StdBranchName()));
164 fAODArrayMCInfo = dynamic_cast<TClonesArray *>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
165 if(!fAODArrayMCInfo){
170 fSignalCuts->SetMCAODInfo(fAODArrayMCInfo);
171 fTrackCuts->SetMCEvent(aodE);
174 // Set for track cuts
175 fTrackCuts->SetRecEvent(fInputEvent);
177 if(!fTrackCuts->CheckEventCuts("fCutsEvRec", fInputEvent)){
178 AliDebug(1, "Event rejected by the event cuts\n");
182 fExtraCuts = new AliHFEextraCuts("hfeExtraCuts","HFE Extra Cuts");
184 fExtraCuts->SetRecEventInfo(fInputEvent);
190 Int_t run = fInputEvent->GetRunNumber();
193 UInt_t trigger = fInputHandler->IsEventSelected();
194 Bool_t isMBTrigger = trigger & AliVEvent::kMB;
195 Bool_t isCentralTrigger = trigger & AliVEvent::kCentral;
196 Bool_t isSemicentralTrigger = trigger & AliVEvent::kSemiCentral;
197 Bool_t isEMCALTrigger = trigger & AliVEvent::kEMCEJE;
199 // Get Primary Vertex
200 const AliVVertex *vertex = fInputEvent->GetPrimaryVertex();
203 Double_t ncontrib = fInputEvent->GetPrimaryVertex()->GetNContributors();
206 Float_t centrality = -1.;
207 AliCentrality *hicent = fInputEvent->GetCentrality();
208 centrality = hicent->GetCentralityPercentile("V0M");
210 // Store event selection variables
211 (*fDebugTree) << "EventDebug"
212 << "Centrality=" << centrality
213 << "VertexZ=" << vtx[2]
214 << "NumberOfContributors=" << ncontrib
220 // Look for kink mother
221 Int_t numberofvertices = aodE->GetNumberOfVertices();
222 Double_t listofmotherkink[numberofvertices];
223 Int_t numberofmotherkink = 0;
224 //printf("Number of vertices %d\n",numberofvertices);
225 for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {
226 AliAODVertex *aodvertex = aodE->GetVertex(ivertex);
227 if(!aodvertex) continue;
228 //printf("Type %d\n",aodvertex->GetType());
229 if(aodvertex->GetType()==AliAODVertex::kKink) {
230 //printf("Find one kink\n");
231 AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();
232 if(!mother) continue;
233 Int_t idmother = mother->GetID();
234 listofmotherkink[numberofmotherkink] = idmother;
235 //printf("ID %d\n",idmother);
236 numberofmotherkink++;
239 //printf("Number of kink mother in the events %d\n",numberofmotherkink);
242 // Loop on MC tracks only
244 AliAODMCParticle *mctrack = NULL;
246 Double_t eR,vx,vy,vz;
247 Double_t chargemc, etamc, phimc, momentummc, transversemomentummc;
248 Int_t source,pdg,signal;
250 for(Int_t itrack = 0; itrack < fAODArrayMCInfo->GetEntriesFast(); itrack++) {
251 mctrack = (AliAODMCParticle *)(fAODArrayMCInfo->At(itrack));
252 if(!mctrack) continue;
254 if(fTrackCuts->CheckParticleCuts(static_cast<UInt_t>(AliHFEcuts::kStepMCGenerated), mctrack)) signal = 1;
256 chargemc = mctrack->Charge() > 0. ? 1. : -1.;
257 momentummc = mctrack->P() * chargemc;
258 transversemomentummc = mctrack->Pt() * chargemc;
259 etamc = mctrack->Eta();
260 phimc = mctrack->Phi();
261 pdg = mctrack->GetPdgCode();
263 // Get Production Vertex in radial direction
267 eR = TMath::Sqrt(vx*vx+vy*vy);
269 // Get Mother PDG code of the particle
271 Int_t motherlabel = TMath::Abs(mctrack->GetMother());
272 if(motherlabel >= 0 && motherlabel < fAODArrayMCInfo->GetEntriesFast()){
273 AliAODMCParticle *mother = dynamic_cast<AliAODMCParticle *>(fAODArrayMCInfo->At(motherlabel));
274 if(mother) motherPdg = mother->GetPdgCode();
279 if(fSignalCuts->IsCharmElectron(mctrack)) source = 0;
280 else if(fSignalCuts->IsBeautyElectron(mctrack)) source = 1;
281 else if(fSignalCuts->IsGammaElectron(mctrack)) source = 2;
282 else if(fSignalCuts->IsNonHFElectron(mctrack)) source = 3;
283 else if(TMath::Abs(pdg) == 11) source = 4;
286 (*fDebugTree) << "MCDebug"
287 << "centrality=" << centrality
288 << "MBtrigger=" << isMBTrigger
289 << "CentralTrigger=" << isCentralTrigger
290 << "SemicentralTrigger=" << isSemicentralTrigger
291 << "EMCALtrigger=" << isEMCALTrigger
293 << "p=" << momentummc
294 << "pt=" << transversemomentummc
301 << "ProductionVertex=" << eR
302 << "motherPdg=" << motherPdg
303 << "source=" << source
309 Double_t charge, eta, phi, momentum, momentumTPC, transversemomentum;
312 // Loop on reconstructed tracks
315 TArrayI arraytrack(fInputEvent->GetNumberOfTracks());
318 AliAODTrack *track = 0x0;
319 for(Int_t itrack = 0; itrack < fInputEvent->GetNumberOfTracks(); itrack++){
321 track = dynamic_cast<AliAODTrack *>(fInputEvent->GetTrack(itrack));
323 // Cut track (Only basic track cuts)
324 // printf("testv\n");
325 if(!fTrackCuts->CheckParticleCuts(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepRecKineITSTPC, track)) continue;
328 Double_t nSigmaTOF = pid->NumberOfSigmasTOF(track, AliPID::kElectron);
329 Double_t nSigmaTPC = pid->NumberOfSigmasTPC(track, AliPID::kElectron);
330 Double_t tPCdEdx = track->GetDetPid() ? track->GetDetPid()->GetTPCsignal() : 0.;
332 copyTrack.~AliAODTrack();
333 new(©Track) AliAODTrack(*track);
334 if(fTPCpid->HasCentralityCorrection()) fTPCpid->ApplyCentralityCorrection(©Track, static_cast<Double_t>(ncontrib),AliHFEpidObject::kAODanalysis);
335 if(fTPCpid->HasEtaCorrection()) fTPCpid->ApplyEtaCorrection(©Track, AliHFEpidObject::kAODanalysis);
336 Double_t nSigmaTPCcorr = pid->NumberOfSigmasTPC(©Track, AliPID::kElectron);
337 Double_t tPCdEdxcorr = copyTrack.GetDetPid() ? copyTrack.GetDetPid()->GetTPCsignal() : 0.;
340 charge = track->Charge() > 0 ? 1. : -1.;
343 momentum = track->P() * charge;
344 transversemomentum = track->Pt() * charge;
345 momentumTPC = track->GetDetPid() ? track->GetDetPid()->GetTPCmomentum() : track->P();
348 ULong_t status = track->GetStatus();
350 if((status & AliESDtrack::kITSrefit) == AliESDtrack::kITSrefit) itsrefit = 1;
352 if((status & AliESDtrack::kTPCrefit) == AliESDtrack::kTPCrefit) tpcrefit = 1;
354 if((status & AliESDtrack::kTOFpid) == AliESDtrack::kTOFpid) tofpid = 1;
356 // ITS number of clusters
357 UChar_t nclustersITS = track->GetITSNcls();
358 // TPC number of clusters (different definitions)
359 UChar_t nclustersTPCfit = track->GetTPCNcls();
360 UChar_t nclustersTPCall = 0;
361 const TBits &clusterTPC = track->GetTPCClusterMap();
362 nclustersTPCall = clusterTPC.CountBits();
363 UChar_t nclustersTPCPID = track->GetTPCsignalN();
364 UChar_t nfindableTPC = track->GetTPCNclsF();
365 Double_t clusterRatioTPCfit = 0.0;
366 if((static_cast<Double_t>(nfindableTPC))>0.0) clusterRatioTPCfit = static_cast<Double_t>(nclustersTPCfit)/static_cast<Double_t>(nfindableTPC);
367 Double_t clusterRatioTPCall = 0.0;
368 if((static_cast<Double_t>(nfindableTPC))>0.0) clusterRatioTPCall = static_cast<Double_t>(nclustersTPCall)/static_cast<Double_t>(nfindableTPC);
369 UChar_t nclustersTPCshared = 0;
370 Float_t ncrossedRowsTPC = track->GetTPCNCrossedRows();
371 const TBits &sharedTPC = track->GetTPCSharedMap();
372 for(Int_t ibit = 0; ibit < 160; ibit++) if(sharedTPC.TestBitNumber(ibit)) nclustersTPCshared++;
373 // TRD clusters and tracklets
374 UChar_t nclustersTRD = track->GetTRDncls();
375 UChar_t ntrackletsTRDPID = track->GetTRDntrackletsPID();
376 Int_t nslicesTRD = track->GetDetPid()->GetTRDnSlices();
377 Int_t chi2TRD = track->GetTRDchi2();
378 AliAODPid* aodpid= track->GetDetPid();
379 Double_t* arraytrdsignals;
380 arraytrdsignals=aodpid->GetTRDslices();
383 for(Int_t iplane = 0; iplane < 6; iplane++){
387 for(Int_t iplane = 0; iplane < 6; iplane++){
389 for(Int_t b=(iplane*8);b<((iplane*8)+8);b++){
390 if(ntrackletsTRDPID>0){
391 if(arraytrdsignals[b]>0.001) nslicetemp++;
394 if(nslicetemp > 0) trdlayer[iplane]=1;
397 // ITS and TRD acceptance maps
398 UChar_t itsPixel = track->GetITSClusterMap();
399 Bool_t statusL0 = kFALSE;
400 if(TESTBIT(itsPixel, 0)) statusL0 = kTRUE;
401 Bool_t statusL1 = kFALSE;
402 if(TESTBIT(itsPixel, 1)) statusL1 = kTRUE;
405 Float_t dcaxy = -999.;
406 Float_t dcaz = -999.;
407 fExtraCuts->GetImpactParameters((AliVTrack *)track,dcaxy,dcaz);
411 if(fExtraCuts->IsKinkDaughter(track)) kink = 1;
414 Int_t kinkmotherpass = 0;
415 for(Int_t kinkmother = 0; kinkmother < numberofmotherkink; kinkmother++) {
416 if(track->GetID() == listofmotherkink[kinkmother]) {
422 // ID track to see if negative
423 Int_t id = track->GetID();
427 for(Int_t l=0; l < counterdc; l++){
428 Int_t iTrack2 = arraytrack.At(l);
429 if(iTrack2==id) doublec=1;
431 //printf("Doublec %d\n",doublec);
433 // Add the id at this place
434 arraytrack.AddAt(id,counterdc);
439 for(Int_t k=0; k<20; k++) {
442 if((track->TestFilterBit(u))) {
446 Int_t filter0 = filter[0];
447 Int_t filter1 = filter[1];
448 Int_t filter2 = filter[2];
449 Int_t filter3 = filter[3];
450 Int_t filter4 = filter[4];
451 Int_t filter5 = filter[5];
452 Int_t filter6 = filter[6];
453 Int_t filter7 = filter[7];
454 Int_t filter8 = filter[8];
455 Int_t filter9 = filter[9];
456 Int_t filter10 = filter[10];
457 Int_t filter11 = filter[11];
458 Int_t filter12 = filter[12];
459 Int_t filter13 = filter[13];
460 Int_t filter14 = filter[14];
461 Int_t filter15 = filter[15];
462 Int_t filter16 = filter[16];
463 Int_t filter17 = filter[17];
464 Int_t filter18 = filter[18];
465 Int_t filter19 = filter[19];
468 Double_t emcalEnergyOverP = -1.,
470 showershape[4] = {0.,0.,0.,0.};
471 if(track->IsEMCAL()){
472 emcalNSigma = pid->NumberOfSigmasEMCAL(track, AliPID::kElectron, emcalEnergyOverP, &showershape[0]);
475 Int_t eventnb = fEventNumber;
481 Int_t label = TMath::Abs(track->GetLabel());
482 if(label && label < fAODArrayMCInfo->GetEntriesFast())
483 mctrack = dynamic_cast<AliAODMCParticle *>(fAODArrayMCInfo->At(label));
484 if(!mctrack) continue;
485 if(fTrackCuts->CheckParticleCuts(static_cast<UInt_t>(AliHFEcuts::kStepMCGenerated), mctrack)) signal = 1;
487 chargemc = mctrack->Charge() > 0. ? 1. : -1.;
488 momentummc = mctrack->P() * chargemc;
489 transversemomentummc = mctrack->Pt() * chargemc;
490 etamc = mctrack->Eta();
491 phimc = mctrack->Phi();
492 pdg = mctrack->GetPdgCode();
494 // Get Production Vertex in radial direction
498 eR = TMath::Sqrt(vx*vx+vy*vy);
500 // Get Mother PDG code of the particle
502 Int_t motherlabel = TMath::Abs(mctrack->GetMother());
503 if(motherlabel >= 0 && motherlabel < fAODArrayMCInfo->GetEntriesFast()){
504 AliAODMCParticle *mother = dynamic_cast<AliAODMCParticle *>(fAODArrayMCInfo->At(motherlabel));
505 if(mother) motherPdg = mother->GetPdgCode();
510 if(fSignalCuts->IsCharmElectron(mctrack)) source = 0;
511 else if(fSignalCuts->IsBeautyElectron(mctrack)) source = 1;
512 else if(fSignalCuts->IsGammaElectron(mctrack)) source = 2;
513 else if(fSignalCuts->IsNonHFElectron(mctrack)) source = 3;
514 else if(TMath::Abs(pdg) == 11) source = 4;
522 (*fDebugTree) << "PIDdebug"
523 << "centrality=" << centrality
524 << "MBtrigger=" << isMBTrigger
525 << "CentralTrigger=" << isCentralTrigger
526 << "SemicentralTrigger=" << isSemicentralTrigger
527 << "EMCALtrigger=" << isEMCALTrigger
529 << "eventnb=" << eventnb
533 << "ncontrib=" << ncontrib
537 << "ptpc=" << momentumTPC
538 << "pt=" << transversemomentum
541 << "itsrefit=" << itsrefit
542 << "tpcrefit=" << tpcrefit
543 << "tofpid=" << tofpid
544 << "nclustersTPC=" << nclustersTPCfit
545 << "nclustersTPCall=" << nclustersTPCall
546 << "nclustersTPCPID=" << nclustersTPCPID
547 << "nclustersTPCshared=" << nclustersTPCshared
548 << "ncrossedRowsTPC=" << ncrossedRowsTPC
549 << "clusterRatioTPC=" << clusterRatioTPCfit
550 << "clusterRatioTPCall=" << clusterRatioTPCall
551 << "nclustersITS=" << nclustersITS
552 << "nclustersTRD=" << nclustersTRD
553 << "ntrackletsTRD=" << ntrackletsTRDPID
554 << "nslicesTRD=" << nslicesTRD
555 << "trd0=" << trdlayer[0]
556 << "trd1=" << trdlayer[1]
557 << "trd2=" << trdlayer[2]
558 << "trd3=" << trdlayer[3]
559 << "trd4=" << trdlayer[4]
560 << "trd5=" << trdlayer[5]
561 << "chi2TRD=" << chi2TRD
562 << "statusITS0=" << statusL0
563 << "statusITS1=" << statusL1
564 << "TOFsigmaEl=" << nSigmaTOF
565 << "TPCsigmaEl=" << nSigmaTPC
566 << "TPCsigmaElcorr=" << nSigmaTPCcorr
567 << "TPCdEdx=" << tPCdEdx
568 << "TPCdEdxcorr=" << tPCdEdxcorr
570 << "EMCALEOP=" << emcalEnergyOverP
571 << "EMCALsigmaEl=" << emcalNSigma
572 << "showershape0=" << showershape[0]
573 << "showershape1=" << showershape[1]
574 << "showershape2=" << showershape[2]
575 << "showershape3=" << showershape[3]
577 << "kinkdaughter=" << kink
578 << "kinkmother=" << kinkmotherpass
579 << "nbofmotherkink=" << numberofmotherkink
580 << "filter0=" << filter0
581 << "filter1=" << filter1
582 << "filter2=" << filter2
583 << "filter3=" << filter3
584 << "filter4=" << filter4
585 << "filter5=" << filter5
586 << "filter6=" << filter6
587 << "filter7=" << filter7
588 << "filter8=" << filter8
589 << "filter9=" << filter9
590 << "filter10=" << filter10
591 << "filter11=" << filter11
592 << "filter12=" << filter12
593 << "filter13=" << filter13
594 << "filter14=" << filter14
595 << "filter15=" << filter15
596 << "filter16=" << filter16
597 << "filter17=" << filter17
598 << "filter18=" << filter18
599 << "filter19=" << filter19
600 << "mcp=" << momentummc
601 << "mcpt=" << transversemomentummc
605 << "source=" << source
610 << "mccharge=" << chargemc
611 << "signal=" << signal
625 void AliHFEdebugTreeTaskAOD::SetFileName(const char *filename){ fFilename = filename; }
626 void AliHFEdebugTreeTaskAOD::Terminate(Option_t *){
628 if(fDebugTree) delete fDebugTree;