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
15 //------------------------------------------------------------------------------
\r
16 // AliPtResolAnalysis class.
\r
18 // a. functionality:
\r
19 // - fills analysis control histograms
\r
22 // - control histograms
\r
24 // Author: J.Otwinowski 04/11/2008
\r
25 //------------------------------------------------------------------------------
\r
29 #include "TCanvas.h"
\r
30 #include "THnSparse.h"
\r
32 #include "AliHeader.h"
\r
33 #include "AliInputEventHandler.h"
\r
34 #include "AliAnalysisManager.h"
\r
35 #include "AliGenEventHeader.h"
\r
36 #include "AliStack.h"
\r
37 #include "AliESDEvent.h"
\r
38 #include "AliMCEvent.h"
\r
39 #include "AliESDtrackCuts.h"
\r
40 #include "AliLog.h"
\r
41 #include "AliMultiplicity.h"
\r
42 #include "AliTracker.h"
\r
44 #include "AlidNdPtEventCuts.h"
\r
45 #include "AlidNdPtAcceptanceCuts.h"
\r
46 #include "AliPhysicsSelection.h"
\r
47 #include "AliTriggerAnalysis.h"
\r
49 #include "AliPWG0Helper.h"
\r
50 #include "AlidNdPtHelper.h"
\r
51 #include "AliPtResolAnalysis.h"
\r
53 using namespace std;
\r
55 ClassImp(AliPtResolAnalysis)
\r
57 //_____________________________________________________________________________
\r
58 AliPtResolAnalysis::AliPtResolAnalysis(): AlidNdPt(),
\r
63 // default constructor
\r
67 //_____________________________________________________________________________
\r
68 AliPtResolAnalysis::AliPtResolAnalysis(Char_t* name, Char_t* title): AlidNdPt(name,title),
\r
76 //_____________________________________________________________________________
\r
77 AliPtResolAnalysis::~AliPtResolAnalysis() {
\r
81 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
\r
82 if(fTrackParamHist) delete fTrackParamHist; fTrackParamHist=0;
\r
83 if(fTrackParamHist2) delete fTrackParamHist2; fTrackParamHist2=0;
\r
86 //_____________________________________________________________________________
\r
87 void AliPtResolAnalysis::Init(){
\r
89 // Generic histograms to be corrected
\r
92 Int_t binsTrackParamHist[2]={400,300};
\r
93 Double_t minTrackParamHist[2]={0,0};
\r
94 Double_t maxTrackParamHist[2]={1,0.015};
\r
96 fTrackParamHist = new THnSparseF("fTrackParamHist","1/pT:#sigma(1/pT)",2,binsTrackParamHist,minTrackParamHist,maxTrackParamHist);
\r
97 fTrackParamHist->GetAxis(0)->SetTitle("1/pT (GeV/c)^{-1}");
\r
98 fTrackParamHist->GetAxis(1)->SetTitle("#sigma(1/pT)");
\r
99 fTrackParamHist->Sumw2();
\r
101 //pt:sigma(1/pT)*pT
\r
102 const Int_t ptNbins = 73;
\r
103 Double_t bins[74] = {0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 40.0, 45.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0 };
\r
105 Int_t binsTrackParamHist2[2]={ptNbins,200};
\r
106 Double_t minTrackParamHist2[2]={0,0};
\r
107 Double_t maxTrackParamHist2[2]={100,0.2};
\r
109 fTrackParamHist2 = new THnSparseF("fTrackParamHist2","pT:#sigma(1/pT)*pT",2,binsTrackParamHist2,minTrackParamHist2,maxTrackParamHist2);
\r
110 fTrackParamHist2->SetBinEdges(0,bins);
\r
111 fTrackParamHist2->GetAxis(0)->SetTitle("pT (GeV/c)");
\r
112 fTrackParamHist2->GetAxis(1)->SetTitle("#sigma(1/pT)*pT");
\r
113 fTrackParamHist2->Sumw2();
\r
116 fAnalysisFolder = CreateFolder("folderdNdPt","Analysis dNdPt Folder");
\r
119 //_____________________________________________________________________________
\r
120 void AliPtResolAnalysis::Process(AliESDEvent *const esdEvent, AliMCEvent *const mcEvent)
\r
123 // Process real and/or simulated events
\r
126 AliDebug(AliLog::kError, "esdEvent not available");
\r
130 // get selection cuts
\r
131 AlidNdPtEventCuts *evtCuts = GetEventCuts();
\r
132 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
\r
133 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
\r
135 if(!evtCuts || !accCuts || !esdTrackCuts) {
\r
136 AliDebug(AliLog::kError, "cuts not available");
\r
140 // trigger selection
\r
141 Bool_t isEventTriggered = kTRUE;
\r
142 AliPhysicsSelection *physicsSelection = NULL;
\r
143 AliTriggerAnalysis* triggerAnalysis = NULL;
\r
146 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
\r
149 Printf("ERROR: Could not receive input handler");
\r
153 if(evtCuts->IsTriggerRequired())
\r
156 isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
\r
158 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
\r
159 if(!physicsSelection) return;
\r
160 //SetPhysicsTriggerSelection(physicsSelection);
\r
162 if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
\r
163 // set trigger (V0AND)
\r
164 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
\r
165 if(!triggerAnalysis) return;
\r
166 isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
\r
169 // get reconstructed vertex
\r
170 const AliESDVertex* vtxESD = 0;
\r
171 Bool_t isRecVertex = kFALSE;
\r
172 if(evtCuts->IsRecVertexRequired())
\r
174 Bool_t bRedoTPCVertex = evtCuts->IsRedoTPCVertex();
\r
175 Bool_t bUseConstraints = evtCuts->IsUseBeamSpotConstraint();
\r
176 vtxESD = AlidNdPtHelper::GetVertex(esdEvent,evtCuts,accCuts,esdTrackCuts,GetAnalysisMode(),kFALSE,bRedoTPCVertex,bUseConstraints);
\r
177 isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, esdEvent->GetPrimaryVertexSPD(), GetAnalysisMode(), kFALSE);
\r
180 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD) && isRecVertex;
\r
181 //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
\r
182 //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
\r
185 TObjArray *allChargedTracks=0;
\r
186 // check event cuts
\r
187 if(isEventOK && isEventTriggered)
\r
189 // get all charged tracks
\r
190 allChargedTracks = AlidNdPtHelper::GetAllChargedTracks(esdEvent,GetAnalysisMode());
\r
191 if(!allChargedTracks) return;
\r
193 Int_t entries = allChargedTracks->GetEntries();
\r
194 //printf("entries %d \n",entries);
\r
197 for(Int_t i=0; i<entries;++i)
\r
199 AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);
\r
200 if(!track) continue;
\r
201 if(track->Charge()==0) continue;
\r
203 // only postive charged
\r
204 if(GetParticleMode() == AlidNdPtHelper::kPlus && track->Charge() < 0)
\r
207 // only negative charged
\r
208 if(GetParticleMode() == AlidNdPtHelper::kMinus && track->Charge() > 0)
\r
211 if(esdTrackCuts->AcceptTrack(track))
\r
213 if(accCuts->AcceptTrack(track))
\r
215 //Double_t x, par[5], cov[15];
\r
216 //track->GetExternalParameters(x, p);
\r
217 //track->GetExternalCovariance(cov);
\r
219 Double_t v1[2] = {track->OneOverPt(),TMath::Sqrt(track->GetSigma1Pt2())};
\r
220 fTrackParamHist->Fill(v1);
\r
222 Double_t v2[2] = {track->Pt(),track->Pt()*TMath::Sqrt(track->GetSigma1Pt2())};
\r
223 fTrackParamHist2->Fill(v2);
\r
231 //_____________________________________________________________________________
\r
232 Long64_t AliPtResolAnalysis::Merge(TCollection* const list)
\r
234 // Merge list of objects (needed by PROOF)
\r
239 if (list->IsEmpty())
\r
242 TIterator* iter = list->MakeIterator();
\r
246 //TList *collPhysSelection = new TList;
\r
248 // collection of generated histograms
\r
251 while((obj = iter->Next()) != 0) {
\r
252 AliPtResolAnalysis* entry = dynamic_cast<AliPtResolAnalysis*>(obj);
\r
253 if (entry == 0) continue;
\r
256 fTrackParamHist->Add(entry->fTrackParamHist);
\r
257 fTrackParamHist2->Add(entry->fTrackParamHist2);
\r
263 //_____________________________________________________________________________
\r
264 void AliPtResolAnalysis::Analyse()
\r
266 // Analyse histograms
\r
268 TH1::AddDirectory(kFALSE);
\r
269 TObjArray *aFolderObj = new TObjArray;
\r
270 if(!aFolderObj) return;
\r
273 // Reconstructed event vertex
\r
276 // export objects to analysis folder
\r
277 fAnalysisFolder = ExportToFolder(aFolderObj);
\r
278 if(!fAnalysisFolder) {
\r
279 if(aFolderObj) delete aFolderObj;
\r
283 // delete only TObjArray
\r
284 if(aFolderObj) delete aFolderObj;
\r
287 //_____________________________________________________________________________
\r
288 TFolder* AliPtResolAnalysis::ExportToFolder(TObjArray * const array)
\r
290 // recreate folder every time and export objects to new one
\r
292 if(!array) return NULL;
\r
294 AliPtResolAnalysis * comp=this;
\r
295 TFolder *folder = comp->GetAnalysisFolder();
\r
297 TString name, title;
\r
298 TFolder *newFolder = 0;
\r
300 Int_t size = array->GetSize();
\r
303 // get name and title from old folder
\r
304 name = folder->GetName();
\r
305 title = folder->GetTitle();
\r
311 newFolder = CreateFolder(name.Data(),title.Data());
\r
312 newFolder->SetOwner();
\r
314 // add objects to folder
\r
316 newFolder->Add(array->At(i));
\r
324 //_____________________________________________________________________________
\r
325 TFolder* AliPtResolAnalysis::CreateFolder(TString name,TString title) {
\r
326 // create folder for analysed histograms
\r
328 TFolder *folder = 0;
\r
329 folder = new TFolder(name.Data(),title.Data());
\r