1 /**************************************************************************
2 * Copyright(c) 1998-2009, 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 **************************************************************************/
16 //*************************************************************************
17 // Class AliAnalysisTaskIPInfo
18 // AliAnalysisTask to extract from the ESD the IP position and sigma
19 // as well as to estimate the primary vertex and tracks DCA resolution.
20 // Uses external class AliIntSpotEstimator
22 // Author: ruben.shahoyan@cern.ch
23 //*************************************************************************
29 #include <TClonesArray.h>
30 #include <TObjArray.h>
35 #include "AliAnalysisTask.h"
36 #include "AliAnalysisManager.h"
38 #include "AliESDtrack.h"
39 #include "AliExternalTrackParam.h"
40 #include "AliESDVertex.h"
41 #include "AliESDEvent.h"
42 #include "AliVertexerTracks.h"
43 #include "AliESDInputHandler.h"
44 #include "AliAnalysisTaskIPInfo.h"
45 #include "AliIntSpotEstimator.h"
48 ClassImp(AliAnalysisTaskIPInfo)
50 //________________________________________________________________________
51 AliAnalysisTaskIPInfo::AliAnalysisTaskIPInfo(const char *name)
52 : AliAnalysisTask(name, "IP analysis"),
53 fESD(0),fOutput(0),fTracks(50)
56 // Define input and output slots here
57 // Input slot #0 works with a TChain
58 DefineInput(0, TChain::Class());
59 // Output slot #0 writes into a TList container
60 DefineOutput(0, TList::Class()); //My private output
62 for (int i=0;i<kNEst;i++) { // default settings
68 //________________________________________________________________________
69 AliAnalysisTaskIPInfo::~AliAnalysisTaskIPInfo()
78 //________________________________________________________________________
79 void AliAnalysisTaskIPInfo::SetOptions(Int_t estID, Bool_t recoVtx,
80 Double_t outcut,Int_t nPhiBins,Int_t nestb,
81 Double_t estmin,Double_t estmax,
82 Int_t ntrBins,Int_t ntMn,Int_t ntMx,
83 Int_t nPBins,Double_t pmn,Double_t pmx)
85 // set options for estimators
86 if (estID<0 || estID>= kNEst) return;
87 fRecoVtx[estID] = recoVtx;
88 fNPhiBins[estID] = nPhiBins;
89 fNEstb[estID] = nestb;
90 fNTrBins[estID] = ntrBins;
91 fNPBins[estID] = nPBins;
92 fNTrMin[estID] = ntMn;
93 fNTrMax[estID] = ntMx;
94 fOutCut[estID] = outcut;
95 fEstMin[estID] = estmin;
96 fEstMax[estID] = estmax;
101 //________________________________________________________________________
102 void AliAnalysisTaskIPInfo::ConnectInputData(Option_t *)
104 // Connect ESD or AOD here
107 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
109 Printf("ERROR: Could not read chain from input slot 0");
112 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
113 if (!esdH) Printf("ERROR: Could not get ESDInputHandler");
114 else fESD = esdH->GetEvent();
120 //________________________________________________________________________
121 void AliAnalysisTaskIPInfo::CreateOutputObjects()
124 // Several histograms are more conveniently managed in a TList
128 TString nm = GetName();
130 fIPEst[kTPC] = new AliIntSpotEstimator(nm.Data(),fOutCut[kTPC],fNPhiBins[kTPC],
131 fNEstb[kTPC],fEstMin[kTPC],fEstMax[kTPC],
132 fNTrBins[kTPC],fNTrMin[kTPC],fNTrMax[kTPC],
133 fNPBins[kTPC],fPMin[kTPC],fPMax[kTPC]);
134 fIPEst[kTPC]->GetVertexer()->SetTPCMode();
135 fIPEst[kTPC]->GetVertexer()->SetConstraintOff();
139 fIPEst[kITS] = new AliIntSpotEstimator(nm.Data(),fOutCut[kITS],fNPhiBins[kITS],
140 fNEstb[kITS],fEstMin[kITS],fEstMax[kITS],
141 fNTrBins[kITS],fNTrMin[kITS],fNTrMax[kITS],
142 fNPBins[kITS],fPMin[kITS],fPMax[kITS]);
144 fIPEst[kITS]->GetVertexer()->SetITSMode();
145 fIPEst[kITS]->GetVertexer()->SetConstraintOff();
147 fOutput->Add(fIPEst[kTPC]);
148 fOutput->Add(fIPEst[kITS]);
153 //________________________________________________________________________
154 void AliAnalysisTaskIPInfo::Exec(Option_t *)
157 // Called for each event
160 Printf("ERROR: fESD not available");
164 fIPEst[kTPC]->GetVertexer()->SetFieldkG( fESD->GetMagneticField() );
165 fIPEst[kITS]->GetVertexer()->SetFieldkG( fESD->GetMagneticField() );
166 const AliESDVertex *vtx;
170 // Process vertex made of TPC tracks only
171 vtx = fRecoVtx[kTPC] ? fIPEst[kTPC]->GetVertexer()->FindPrimaryVertex(fESD) : fESD->GetPrimaryVertexTPC();
173 ntracks = vtx->GetNIndices();
174 trackID = (UShort_t*)vtx->GetIndices();
175 for (int i=ntracks;i--;) fTracks.Add((TObject*)fESD->GetTrack(trackID[i])->GetTPCInnerParam());
176 fIPEst[kTPC]->ProcessEvent(&fTracks);
180 // Process vertex made of TPC+ITS tracks
181 vtx = fRecoVtx[kITS] ? fIPEst[kITS]->GetVertexer()->FindPrimaryVertex(fESD) : fESD->GetPrimaryVertex();
183 ntracks = vtx->GetNIndices();
184 trackID = (UShort_t*)vtx->GetIndices();
185 for (int i=ntracks;i--;) fTracks.Add((TObject*)fESD->GetTrack(trackID[i]));
186 fIPEst[kITS]->ProcessEvent(&fTracks);
190 PostData(0, fOutput);
195 //________________________________________________________________________
196 void AliAnalysisTaskIPInfo::Terminate(Option_t *)
198 // Draw result to the screen
199 // Called once at the end of the query
200 fOutput = dynamic_cast<TList*> (GetOutputData(0));
202 Printf("ERROR: fOutput not available");