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 **************************************************************************/
17 // impact parameter resolution and pull study
18 // for tracks which survivied the particle cuts
22 // Hongyan Yang <hongyan@physi.uni-heidelberg.de>
23 // Carlo Bombonati <carlo.bombonati@cern.ch>
31 #include <TObjArray.h>
32 #include <TParticle.h>
37 #include "AliCFManager.h"
38 #include "AliMCEvent.h"
39 #include "AliESDInputHandler.h"
40 #include "AliESDtrack.h"
41 #include "AliAnalysisManager.h"
42 #include "AliMCEventHandler.h"
43 #include "AliMCParticle.h"
45 #include "AliHFEcuts.h"
46 #include "AliHFEdca.h"
48 #include "AliAnalysisTaskDCA.h"
51 //____________________________________________________________
52 AliAnalysisTaskDCA::AliAnalysisTaskDCA():
53 AliAnalysisTask("Impact Parameter Resolution and Pull Analysis", "")
70 DefineInput(0, TChain::Class());
71 DefineOutput(0, TH1I::Class()); // event
72 DefineOutput(1, TList::Class()); // output
78 //____________________________________________________________
79 AliAnalysisTaskDCA::AliAnalysisTaskDCA(const char * name):
80 AliAnalysisTask(name, "")
95 // Default constructor
97 DefineInput(0, TChain::Class());
98 DefineOutput(0, TH1I::Class());
99 DefineOutput(1, TList::Class());
104 //____________________________________________________________
105 AliAnalysisTaskDCA::AliAnalysisTaskDCA(const AliAnalysisTaskDCA &ref):
107 , fPlugins(ref.fPlugins)
113 , fPixelStatus(ref.fPixelStatus)
114 , fNclustersITS(ref.fNclustersITS)
115 , fNEvents(ref.fNEvents)
116 , fResidualList(ref.fResidualList)
117 , fPullList(ref.fPullList)
118 , fOutput(ref.fOutput)
125 //____________________________________________________________
126 AliAnalysisTaskDCA &AliAnalysisTaskDCA::operator=(const AliAnalysisTaskDCA &ref){
128 // Assignment operator
130 if(this == &ref) return *this;
131 AliAnalysisTask::operator=(ref);
132 fPlugins = ref.fPlugins;
138 fPixelStatus = ref.fPixelStatus;
139 fNclustersITS = ref.fNclustersITS;
140 fNEvents = ref.fNEvents;
141 fOutput = ref.fOutput;
142 fResidualList = ref.fResidualList;
143 fPullList = ref.fPullList;
148 //____________________________________________________________
149 AliAnalysisTaskDCA::~AliAnalysisTaskDCA(){
154 if(fESD) delete fESD;
157 if(fCFM) delete fCFM;
159 if(fDCA) delete fDCA;
167 fResidualList->Clear();
168 delete fResidualList;
176 if(fNEvents) delete fNEvents;
179 //____________________________________________________________
180 void AliAnalysisTaskDCA::ConnectInputData(Option_t *){
182 // Connecting the input
184 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
186 AliError("No ESD input handler");
189 fESD = esdH->GetEvent();
191 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
193 AliError("No MC truth handler");
196 fMC = mcH->MCEvent();
200 //____________________________________________________________
201 void AliAnalysisTaskDCA::CreateOutputObjects(){
202 // create output objects
206 fNEvents = new TH1I("nEvents", "Number of Events in the Analysis", 2, 0, 2); // Number of Events neccessary for the analysis and not a QA histogram
207 if(!fOutput) fOutput = new TList;
208 // Initialize correction Framework and Cuts
209 fCFM = new AliCFManager;
210 MakeParticleContainer();
211 // Temporary fix: Initialize particle cuts with 0x0
212 for(Int_t istep = 0; istep < fCFM->GetParticleContainer()->GetNStep(); istep++)
213 fCFM->SetParticleCutsList(istep, 0x0);
215 AliWarning("Cuts not available. Default cuts will be used");
216 fCuts = new AliHFEcuts;
217 fCuts->CreateStandardCuts();
220 fCuts->SetCutITSpixel(fPixelStatus);
221 fCuts->Initialize(fCFM);
224 // dca study----------------------------------
225 if(!fDCA) fDCA = new AliHFEdca;
226 if(!fResidualList) fResidualList = new TList();
227 if(!fPullList) fPullList = new TList();
229 fDCA->CreateHistogramsResidual(fResidualList);
230 fDCA->CreateHistogramsPull(fPullList);
232 // add output objects to the List
233 fOutput->AddAt(fResidualList,0);
234 fOutput->AddAt(fPullList,1);
238 //____________________________________________________________
239 void AliAnalysisTaskDCA::Exec(Option_t *){
244 AliDebug(3, "Processing ESD events");
247 AliError("No ESD Event");
251 AliError("No MC Event");
255 AliError("HFE cuts not available");
262 AliESDtrack *track = 0x0;
263 fCFM->SetRecEventInfo(fESD);
265 if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) return;
267 for(Int_t itrack = 0; itrack < fESD->GetNumberOfTracks(); itrack++){
269 track = fESD->GetTrack(itrack);
271 // RecPrim: primary cuts
272 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepRecPrim, track)) continue;
273 // RecKine: ITSTPC cuts
274 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
275 // HFEcuts: ITS layers cuts
276 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsITS, track)) continue;
278 if(track->GetITSclusters(0)<=fNclustersITS) continue; // require 6 hits on all pixel layers
280 if(GetPlugin(kImpactPar)) {
281 // Printf("analysis on impact parameter is ON");
282 fDCA->FillHistograms(fESD, track, fMC);
288 PostData(0, fNEvents);
289 PostData(1, fOutput);
292 //____________________________________________________________
293 void AliAnalysisTaskDCA::Terminate(Option_t *){
295 // Terminate not implemented at the moment
298 if(GetPlugin(kPostProcess)){
299 fOutput = dynamic_cast<TList *>(GetOutputData(1));
301 AliError("Results not available");
310 //____________________________________________________________
311 void AliAnalysisTaskDCA::Load(TString filename){
312 // no need for postprocessing for the moment
313 TFile *input = TFile::Open(filename.Data());
314 if(!input || input->IsZombie()){
315 AliError("Cannot read file");
320 TH1 *htmp = dynamic_cast<TH1I *>(input->Get("nEvents"));
322 fNEvents = dynamic_cast<TH1I *>(htmp->Clone());
324 AliError("Event Counter histogram not found");
332 //____________________________________________________________
333 void AliAnalysisTaskDCA::PostProcess(){
334 // do post processing
335 // should do fitting here for dca resolution
336 // moved to an external macro to do the job
338 Load("impactPar.root");
339 TCanvas *c1 = new TCanvas("c1", "number of analyzed events", 300, 400);
341 c1->SaveAs("temp.png");
348 //____________________________________________________________
349 void AliAnalysisTaskDCA::PrintStatus() const {
352 // Print Analysis status
354 printf("\n\tAnalysis Settings\n\t========================================\n");
355 printf("\timpact parameter analysis is %s\n", GetPlugin(kImpactPar)?"ON":"OFF");
356 printf("\tcuts: %s\n", (fCuts != NULL) ? "YES" : "NO");
361 //__________________________________________
362 void AliAnalysisTaskDCA::SwitchOnPlugin(Int_t plug){
366 // - analyze impact parameter
371 SETBIT(fPlugins, plug);
374 SETBIT(fPlugins, plug);
377 AliError("Unknown Plugin");
382 //____________________________________________________________
383 void AliAnalysisTaskDCA::MakeParticleContainer(){
385 // Create the particle container (borrowed from AliAnalysisTaskHFE)
387 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
388 const Double_t kPtmin = 0.1, kPtmax = 10.;
389 const Double_t kEtamin = -0.9, kEtamax = 0.9;
390 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
392 //arrays for the number of bins in each dimension
394 iBin[0] = 40; //bins in pt
395 iBin[1] = 8; //bins in eta
396 iBin[2] = 18; // bins in phi
398 //arrays for lower bounds :
399 Double_t* binEdges[kNvar];
400 for(Int_t ivar = 0; ivar < kNvar; ivar++)
401 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
403 //values for bin lower bounds
404 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)TMath::Power(10,TMath::Log10(kPtmin) + (TMath::Log10(kPtmax)-TMath::Log10(kPtmin))/iBin[0]*(Double_t)i);
405 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
406 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
408 //one "container" for MC
409 AliCFContainer* container = new AliCFContainer("container","container for tracks", (AliHFEcuts::kNcutStepsTrack + 1 + 2*(AliHFEcuts::kNcutStepsESDtrack + 1)), kNvar, iBin);
411 //setting the bin limits
412 for(Int_t ivar = 0; ivar < kNvar; ivar++)
413 container -> SetBinLimits(ivar, binEdges[ivar]);
414 fCFM->SetParticleContainer(container);
416 //create correlation matrix for unfolding
417 Int_t thnDim[2*kNvar];
418 for (int k=0; k<kNvar; k++) {
419 //first half : reconstructed
422 thnDim[k+kNvar] = iBin[k];
426 // add more containers for correction purpose