1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
19 // Raphaelle Bailhache <R.Bailhache@gsi.de>
\r
24 #include <TString.h>
\r
28 #include <TDirectory.h>
\r
29 #include <TTreeStream.h>
\r
31 #include "AliVEventHandler.h"
\r
32 #include "AliMCEventHandler.h"
\r
33 #include "AliAnalysisTaskSE.h"
\r
34 #include "AliAnalysisManager.h"
\r
36 #include "AliVEvent.h"
\r
37 #include "AliESDInputHandler.h"
\r
38 #include "AliMCEvent.h"
\r
40 #include "AliESDEvent.h"
\r
42 #include "AliPIDResponse.h"
\r
43 #include "AliESDUtils.h"
\r
44 #include "AliMCParticle.h"
\r
45 #include "AliAODMCParticle.h"
\r
46 #include "AliAODEvent.h"
\r
47 #include "AliAODVertex.h"
\r
48 #include "AliAODTrack.h"
\r
49 #include "AliVTrack.h"
\r
50 #include "AliESDtrack.h"
\r
51 #include "AliESDtrackCuts.h"
\r
52 #include "AliAODTrack.h"
\r
53 #include "AliStack.h"
\r
54 #include "AliMCEvent.h"
\r
56 #include "AliHFEcuts.h"
\r
57 #include "AliHFEpid.h"
\r
58 #include "AliHFEpidQAmanager.h"
\r
59 #include "AliHFEtools.h"
\r
61 #include "AliCentrality.h"
\r
62 #include "AliEventplane.h"
\r
63 #include "AliAnalysisTaskHFEQA.h"
\r
64 #include "AliAODMCHeader.h"
\r
67 ClassImp(AliAnalysisTaskHFEQA)
\r
69 //____________________________________________________________________
\r
70 AliAnalysisTaskHFEQA::AliAnalysisTaskHFEQA() :
\r
71 AliAnalysisTaskSE(),
\r
73 fAODAnalysis(kFALSE),
\r
75 fAODArrayMCInfo(NULL),
\r
84 fCentralityEstimator("V0M"),
\r
85 fCollisionSystem(3),
\r
94 //______________________________________________________________________________
\r
95 AliAnalysisTaskHFEQA:: AliAnalysisTaskHFEQA(const char *name) :
\r
96 AliAnalysisTaskSE(name),
\r
98 fAODAnalysis(kFALSE),
\r
100 fAODArrayMCInfo(NULL),
\r
109 fCentralityEstimator("V0M"),
\r
110 fCollisionSystem(3),
\r
120 fPIDTPConly = new AliHFEpid("hfePidTPConly");
\r
121 fPIDTOFTPC = new AliHFEpid("hfePidTOFTPC");
\r
122 fPIDTPCTRD = new AliHFEpid("hfePidTPCTRD");
\r
123 fPIDTPCEMCal = new AliHFEpid("hfePidTPCEMCal");
\r
125 fPIDqaTOFTPC = new AliHFEpidQAmanager;
\r
126 fPIDqaTPCTRD = new AliHFEpidQAmanager;
\r
127 fPIDqaTPCEMCal = new AliHFEpidQAmanager;
\r
131 DefineInput(0,TChain::Class());
\r
132 DefineOutput(1, TList::Class());
\r
135 //____________________________________________________________
\r
136 AliAnalysisTaskHFEQA::AliAnalysisTaskHFEQA(const AliAnalysisTaskHFEQA &ref):
\r
137 AliAnalysisTaskSE(ref),
\r
139 fAODAnalysis(ref.fAODAnalysis),
\r
140 fAODMCHeader(ref.fAODMCHeader),
\r
141 fAODArrayMCInfo(ref.fAODArrayMCInfo),
\r
150 fCentralityEstimator(ref.fCentralityEstimator),
\r
151 fCollisionSystem(ref.fCollisionSystem),
\r
152 fTPConly(ref.fTPConly),
\r
153 fTOFTPC(ref.fTOFTPC),
\r
154 fTPCTRD(ref.fTPCTRD),
\r
155 fTPCEMCal(ref.fTPCEMCal)
\r
158 // Copy Constructor
\r
164 //____________________________________________________________
\r
165 AliAnalysisTaskHFEQA &AliAnalysisTaskHFEQA::operator=(const AliAnalysisTaskHFEQA &ref){
\r
167 // Assignment operator
\r
174 //____________________________________________________________
\r
175 void AliAnalysisTaskHFEQA::Copy(TObject &o) const {
\r
177 // Copy into object o
\r
179 AliAnalysisTaskHFEQA &target = dynamic_cast<AliAnalysisTaskHFEQA &>(o);
\r
180 target.fListHist = fListHist;
\r
181 target.fAODAnalysis = fAODAnalysis;
\r
182 target.fAODMCHeader = fAODMCHeader;
\r
183 target.fAODArrayMCInfo = fAODArrayMCInfo;
\r
184 target.fHFECuts = fHFECuts;
\r
185 target.fPIDTPConly = fPIDTPConly;
\r
186 target.fPIDTOFTPC = fPIDTOFTPC;
\r
187 target.fPIDTPCTRD = fPIDTPCTRD;
\r
188 target.fPIDTPCEMCal = fPIDTPCEMCal;
\r
189 target.fPIDqaTOFTPC = fPIDqaTOFTPC;
\r
190 target.fPIDqaTPCTRD = fPIDqaTPCTRD;
\r
191 target.fPIDqaTPCEMCal = fPIDqaTPCEMCal;
\r
192 target.fCentralityEstimator = fCentralityEstimator;
\r
193 target.fCollisionSystem = fCollisionSystem;
\r
194 target.fTPConly = fTPConly;
\r
195 target.fTOFTPC = fTOFTPC;
\r
196 target.fTPCTRD = fTPCTRD;
\r
197 target.fTPCEMCal = fTPCEMCal;
\r
201 //____________________________________________________________
\r
202 AliAnalysisTaskHFEQA::~AliAnalysisTaskHFEQA(){
\r
208 if(fListHist) delete fListHist;
\r
209 if(fHFECuts) delete fHFECuts;
\r
210 if(fPIDTPConly) delete fPIDTPConly;
\r
211 if(fPIDTOFTPC) delete fPIDTOFTPC;
\r
212 if(fPIDTPCTRD) delete fPIDTPCTRD;
\r
213 if(fPIDTPCEMCal) delete fPIDTPCEMCal;
\r
217 //________________________________________________________________________
\r
218 void AliAnalysisTaskHFEQA::UserCreateOutputObjects()
\r
221 //********************
\r
222 // Create histograms
\r
223 //********************
\r
224 AliDebug(2,"AliAnalysisTaskHFEQA: User create output objects");
\r
228 AliVEventHandler *inputHandler = dynamic_cast<AliVEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
\r
229 if(!TString(inputHandler->IsA()->GetName()).CompareTo("AliAODInputHandler")){
\r
230 SetAODAnalysis(kTRUE);
\r
231 AliDebug(2,"Put AOD analysis on");
\r
233 SetAODAnalysis(kFALSE);
\r
236 AliDebug(2,"AliAnalysisTaskHFEQA: AOD ESD");
\r
241 fHFECuts = new AliHFEcuts;
\r
242 fHFECuts->CreateStandardCuts();
\r
244 fHFECuts->Initialize();
\r
246 fHFECuts->SetAOD();
\r
249 AliDebug(2,"AliAnalysisTaskHFEQA: HFE cuts");
\r
254 fPIDTPConly =new AliHFEpid("hfePidTPC");
\r
256 if(!fPIDTPConly->GetNumberOfPIDdetectors()) fPIDTPConly->AddDetector("TPC", 0);
\r
257 fPIDTPConly->InitializePID();
\r
258 fPIDTPConly->SortDetectors();
\r
262 fPIDTOFTPC =new AliHFEpid("hfePidTOFTPC");
\r
264 if(!fPIDTOFTPC->GetNumberOfPIDdetectors()) {
\r
265 fPIDTOFTPC->AddDetector("TOF", 0);
\r
266 fPIDTOFTPC->AddDetector("TPC", 1);
\r
268 fPIDTOFTPC->InitializePID();
\r
269 fPIDqaTOFTPC->Initialize(fPIDTOFTPC);
\r
270 fPIDTOFTPC->SortDetectors();
\r
275 fPIDTPCTRD =new AliHFEpid("hfePidTPCTRD");
\r
277 if(!fPIDTPCTRD->GetNumberOfPIDdetectors()) {
\r
278 fPIDTPCTRD->AddDetector("TPC", 0);
\r
279 fPIDTPCTRD->AddDetector("TRD", 1);
\r
281 fPIDTPCTRD->InitializePID();
\r
282 fPIDqaTPCTRD->Initialize(fPIDTPCTRD);
\r
283 fPIDTPCTRD->SortDetectors();
\r
286 if(!fPIDTPCEMCal) {
\r
287 fPIDTPCEMCal =new AliHFEpid("hfePidTPCEMCal");
\r
289 if(!fPIDTPCEMCal->GetNumberOfPIDdetectors()) {
\r
290 fPIDTPCEMCal->AddDetector("TPC", 0);
\r
291 fPIDTPCEMCal->AddDetector("EMCal", 1);
\r
293 fPIDTPCEMCal->InitializePID();
\r
294 fPIDqaTPCEMCal->Initialize(fPIDTPCEMCal);
\r
295 fPIDTPCEMCal->SortDetectors();
\r
298 Double_t ptbinning[36] = {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5., 5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.};
\r
299 fTPConly = new TH1F("TPCOnly", "",35,&ptbinning[0]);
\r
301 fTOFTPC = new TH1F("TOFTPC", "",35,&ptbinning[0]);
\r
303 fTPCTRD = new TH1F("TPCTRD", "",35,&ptbinning[0]);
\r
305 fTPCEMCal = new TH1F("TPCEMCal", "",35,&ptbinning[0]);
\r
306 fTPCEMCal->Sumw2();
\r
311 fListHist = new TList();
\r
312 fListHist->SetOwner();
\r
314 fListHist->Add(fPIDqaTOFTPC->MakeList("HFEpidQATOFTPC"));
\r
315 fListHist->Add(fPIDqaTPCTRD->MakeList("HFEpidQATPCTRD"));
\r
316 fListHist->Add(fPIDqaTPCEMCal->MakeList("HFEpidQATPCEMCal"));
\r
318 fListHist->Add(fTPConly);
\r
319 fListHist->Add(fTOFTPC);
\r
320 fListHist->Add(fTPCTRD);
\r
321 fListHist->Add(fTPCEMCal);
\r
323 AliDebug(2,"AliAnalysisTaskHFEQA: list");
\r
326 fListHist->Print();
\r
328 PostData(1, fListHist);
\r
330 AliDebug(2,"AliAnalysisTaskHFEQA: post");
\r
335 //________________________________________________________________________
\r
336 void AliAnalysisTaskHFEQA::UserExec(Option_t */*option*/)
\r
342 Double_t binct = 11.5;
\r
344 AliMCEvent *mcEvent = MCEvent();
\r
347 AliDebug(2,"MC info");
\r
349 Bool_t mcthere = kTRUE;
\r
351 AliAODEvent *aodE = dynamic_cast<AliAODEvent *>(fInputEvent);
\r
353 AliError("No AOD Event");
\r
356 fAODMCHeader = dynamic_cast<AliAODMCHeader *>(fInputEvent->FindListObject(AliAODMCHeader::StdBranchName()));
\r
357 if(!fAODMCHeader){
\r
360 fAODArrayMCInfo = dynamic_cast<TClonesArray *>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
\r
361 if(!fAODArrayMCInfo){
\r
365 fHFECuts->SetMCEvent(aodE);
\r
369 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
\r
373 if(mcEvent) fHFECuts->SetMCEvent(mcEvent);
\r
377 ////////////////////////////////////
\r
378 // Number of contributors
\r
379 ///////////////////////////////////
\r
380 AliDebug(2,"Number of contributors");
\r
381 Int_t ncontribVtx = 0;
\r
383 AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
\r
385 AliError("AOD Event required for AOD Analysis");
\r
388 AliAODVertex *priVtx = fAOD->GetPrimaryVertex();
\r
390 ncontribVtx = priVtx->GetNContributors();
\r
394 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
\r
396 AliError("ESD Event required for ESD Analysis");
\r
399 const AliESDVertex *priVtx = fESD->GetPrimaryVertexTracks();
\r
401 ncontribVtx = priVtx->GetNContributors();
\r
404 AliDebug(2,Form("Number of contributors %d",ncontribVtx));
\r
407 /////////////////////////////////
\r
409 ////////////////////////////////
\r
411 //printf("Centrality \n");
\r
412 AliCentrality *centrality = fInputEvent->GetCentrality();
\r
413 AliDebug(2,"Got the centrality");
\r
415 if(centrality && (! Ispp())) {
\r
416 cntr = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
417 if((0.0< cntr) && (cntr<5.0)) binct = 0.5;
\r
418 if((5.0< cntr) && (cntr<10.0)) binct = 1.5;
\r
419 if((10.0< cntr) && (cntr<20.0)) binct = 2.5;
\r
420 if((20.0< cntr) && (cntr<30.0)) binct = 3.5;
\r
421 if((30.0< cntr) && (cntr<40.0)) binct = 4.5;
\r
422 if((40.0< cntr) && (cntr<50.0)) binct = 5.5;
\r
423 if((50.0< cntr) && (cntr<60.0)) binct = 6.5;
\r
424 if((60.0< cntr) && (cntr<70.0)) binct = 7.5;
\r
425 if((70.0< cntr) && (cntr<80.0)) binct = 8.5;
\r
426 if((80.0< cntr) && (cntr<90.0)) binct = 9.5;
\r
427 if((90.0< cntr) && (cntr<100.0)) binct = 10.5;
\r
428 if(binct > 11.0) return;
\r
430 AliDebug(2,Form("Centrality %f with %s",binct,fCentralityEstimator.Data()));
\r
432 //////////////////////
\r
434 //////////////////////
\r
436 Int_t runnumber = fInputEvent->GetRunNumber();
\r
437 AliDebug(2,Form("Run number %d",runnumber));
\r
439 if(!fPIDTPConly->IsInitialized()){
\r
440 fPIDTPConly->InitializePID(runnumber);
\r
442 if(!fPIDTOFTPC->IsInitialized()){
\r
443 fPIDTOFTPC->InitializePID(runnumber);
\r
445 if(!fPIDTPCTRD->IsInitialized()){
\r
446 fPIDTPCTRD->InitializePID(runnumber);
\r
448 if(!fPIDTPCEMCal->IsInitialized()){
\r
449 fPIDTPCEMCal->InitializePID(runnumber);
\r
453 fHFECuts->SetRecEvent(fInputEvent);
\r
460 AliDebug(2,"PID response");
\r
461 AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();
\r
463 AliDebug(2,"No PID response set");
\r
466 fPIDTPConly->SetPIDResponse(pidResponse);
\r
467 fPIDTOFTPC->SetPIDResponse(pidResponse);
\r
468 fPIDTPCTRD->SetPIDResponse(pidResponse);
\r
469 fPIDTPCEMCal->SetPIDResponse(pidResponse);
\r
474 AliDebug(2,"Event cut");
\r
475 if(!fHFECuts->CheckEventCuts("fEvRecCuts", fInputEvent)) {
\r
476 AliDebug(2,"Does not pass the event cut");
\r
477 PostData(1, fListHist);
\r
481 //////////////////////////
\r
483 //////////////////////////
\r
484 Int_t nbtracks = fInputEvent->GetNumberOfTracks();
\r
485 AliDebug(2,Form("Number of tracks %d",nbtracks));
\r
486 for(Int_t k = 0; k < nbtracks; k++){
\r
488 AliVTrack *track = (AliVTrack *) fInputEvent->GetTrack(k);
\r
489 if(!track) continue;
\r
490 Double_t pt = track->Pt();
\r
492 AliDebug(2,"test 0\n");
\r
494 // RecKine: ITSTPC cuts
\r
495 if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;
\r
496 AliDebug(2,"test 1\n");
\r
499 if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepRecPrim + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;
\r
500 AliDebug(2,"test 2\n");
\r
502 // HFEcuts: ITS layers cuts
\r
503 if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepHFEcutsITS + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;
\r
504 AliDebug(2,"test 3\n");
\r
506 // HFE cuts: TOF and mismatch flag
\r
507 if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTOF + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;
\r
508 AliDebug(2,"test 4\n");
\r
510 // HFE cuts: TPC PID cleanup
\r
511 if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTPC + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;
\r
512 AliDebug(2,"test 5\n");
\r
514 // HFEcuts: Nb of tracklets TRD0
\r
515 if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;
\r
517 AliDebug(2,"Survived");
\r
520 ////////////////////////
\r
522 ////////////////////////
\r
523 AliHFEpidObject hfetrack;
\r
524 if(!fAODAnalysis) hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
\r
525 else hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);
\r
526 hfetrack.SetRecTrack(track);
\r
527 hfetrack.SetCentrality((Int_t)binct);
\r
528 hfetrack.SetMulitplicity(ncontribVtx); // for correction
\r
529 if(IsPbPb()) hfetrack.SetPbPb();
\r
531 if(IspPb()) hfetrack.SetpPb();
\r
537 AliDebug(2,Form("centrality %f and %d",binct,hfetrack.GetCentrality()));
\r
539 //printf("test 7\n");
\r
541 // Complete PID TPC alone
\r
542 if(fPIDTPConly->IsSelected(&hfetrack,0x0,"recTrackCont",0x0)) {
\r
543 fTPConly->Fill(pt);
\r
545 AliDebug(2,"TPC only PID\n");
\r
548 // Complete PID TPC TOF
\r
549 if(fPIDTOFTPC->IsSelected(&hfetrack,0x0,"recTrackCont",fPIDqaTOFTPC)) {
\r
551 AliDebug(2,"TOF TPC PID\n");
\r
554 // Complete PID TPC TRD
\r
555 if(fPIDTPCTRD->IsSelected(&hfetrack,0x0,"recTrackCont",fPIDqaTPCTRD)) {
\r
558 AliDebug(2,"TPC TRD PID\n");
\r
562 if(!fAODAnalysis) {
\r
563 // Complete PID TPC TRD
\r
564 if(fPIDTPCEMCal->IsSelected(&hfetrack,0x0,"recTrackCont",fPIDqaTPCEMCal)) {
\r
565 fTPCEMCal->Fill(pt);
\r
568 AliDebug(2,"TPC EMCal PID\n");
\r
573 PostData(1, fListHist);
\r