]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/JetTasks/AliPWG4CosmicCandidates.cxx
Corrected initialization
[u/mrichter/AliRoot.git] / PWG4 / JetTasks / AliPWG4CosmicCandidates.cxx
CommitLineData
1f329128 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16//-----------------------------------------------------------------------
9b58297c 17// Analysis task looking for cosmic candidates embedded in a p-p event
1f329128 18// Task checks if particles are back-to-back in eta and phi
19//
20//
21// Author : Marta Verweij - UU - marta.verweij@cern.ch
22//-----------------------------------------------------------------------
23
24#include "TVector3.h"
25#include <iostream>
26#include "TH1.h"
27#include "TH2.h"
28#include "TH3.h"
29#include "TList.h"
30#include "TChain.h"
31
32#include "AliAnalysisTask.h"
33#include "AliAnalysisManager.h"
34
35#include "AliESDEvent.h"
36#include "AliESDInputHandler.h"
37
38#include "AliESDtrack.h"
39#include "AliESDtrackCuts.h"
40#include "AliExternalTrackParam.h"
41
42#include "AliLog.h"
43
44#include "AliPWG4CosmicCandidates.h"
45
ffc1a68e 46//using namespace std; //required for resolving the 'cout' symbol
1f329128 47using namespace std;
1f329128 48
ffc1a68e 49ClassImp(AliPWG4CosmicCandidates)
1f329128 50
51//________________________________________________________________________
52AliPWG4CosmicCandidates::AliPWG4CosmicCandidates()
ffc1a68e 53: AliAnalysisTaskSE(),
54 fTrackCuts(0),
55 fPtMin(5.),
56 fMaxCosmicAngle(0.002),
57 fNEventAll(0),
58 fNEventSel(0),
59 fPtSignedCosmicCandidates(0),
60 fDeltaPtCosmicCandidates(0),
61 fDeltaPhiSumEta(0),
62 fDCAZCosmicCandidates(0),
63 fDCARCosmicCandidates(0),
64 fTheta(0),
65 fThetaZoom(0),
66 fThetaPt1Pt2(0),
67 fThetaPt1Pt2Signed(0),
68 fDeltaPhiSumEtaPt1(0),
69 fDeltaPhiSumEtaPt2(0),
70 fThetaDCAZ1DCAZ2(0),
71 fRisol(0),
72 fRisolTheta(0),
73 fHistListCosmics(0)
1f329128 74{
ffc1a68e 75 //
1f329128 76 // Default constructor
ffc1a68e 77 //
1f329128 78}
79
80//________________________________________________________________________
81AliPWG4CosmicCandidates::AliPWG4CosmicCandidates(const char *name)
82 : AliAnalysisTaskSE(name),
83 fTrackCuts(0),
84 fPtMin(5.),
85 fMaxCosmicAngle(0.002),
ffc1a68e 86 fNEventAll(0),
87 fNEventSel(0),
1f329128 88 fPtSignedCosmicCandidates(0),
89 fDeltaPtCosmicCandidates(0),
90 fDeltaPhiSumEta(0),
91 fDCAZCosmicCandidates(0),
92 fDCARCosmicCandidates(0),
93 fTheta(0),
94 fThetaZoom(0),
95 fThetaPt1Pt2(0),
96 fThetaPt1Pt2Signed(0),
97 fDeltaPhiSumEtaPt1(0),
98 fDeltaPhiSumEtaPt2(0),
99 fThetaDCAZ1DCAZ2(0),
100 fRisol(0),
101 fRisolTheta(0),
102 fHistListCosmics(0)
103{
104 // Constructor. Initialization of Inputs and Outputs
105
106 // Define input and output slots here
107 // Input slot #0 works with a TChain
108 // DefineInput(0, TChain::Class());
109 // Output slot #0 id reserved by the base class for AOD
110 // Output slot #1 writes into a TList
111 DefineOutput(1, TList::Class());
112 // Output slot #2 writes into a AliESDtrackCuts
113 DefineOutput(2, AliESDtrackCuts::Class());
114}
115//________________________________________________________________________
116AliPWG4CosmicCandidates::AliPWG4CosmicCandidates(const AliPWG4CosmicCandidates &res)
117 : AliAnalysisTaskSE(res),
118 fTrackCuts(0),
119 fPtMin(5.),
120 fMaxCosmicAngle(0.002),
ffc1a68e 121 fNEventAll(0),
122 fNEventSel(0),
1f329128 123 fPtSignedCosmicCandidates(0),
124 fDeltaPtCosmicCandidates(0),
125 fDeltaPhiSumEta(0),
126 fDCAZCosmicCandidates(0),
127 fDCARCosmicCandidates(0),
128 fTheta(0),
129 fThetaZoom(0),
130 fThetaPt1Pt2(0),
131 fThetaPt1Pt2Signed(0),
132 fDeltaPhiSumEtaPt1(0),
133 fDeltaPhiSumEtaPt2(0),
134 fThetaDCAZ1DCAZ2(0),
135 fRisol(0),
136 fRisolTheta(0),
137 fHistListCosmics(0)
138{
9b58297c 139 //
140 // Dummy copy constructor
141 //
1f329128 142}
143
144//________________________________________________________________________
145AliPWG4CosmicCandidates& AliPWG4CosmicCandidates::operator=(const AliPWG4CosmicCandidates& /*trclass*/)
146{
9b58297c 147 //
148 // Dummy assignment operator
149 //
150 return *this;
1f329128 151}
152
153//________________________________________________________________________
154void AliPWG4CosmicCandidates::LocalInit()
155{
156 //
157 // Only called once at beginning
158 //
159 PostData(2,fTrackCuts);
160}
161
162//________________________________________________________________________
163void AliPWG4CosmicCandidates::UserCreateOutputObjects()
164{
9b58297c 165 //
166 // Create output objects
1f329128 167 // Called once
168 AliDebug(2,Form(">> AliPWG4CosmicCandidates::UserCreateOutputObjects \n"));
169
170 Bool_t oldStatus = TH1::AddDirectoryStatus();
171 TH1::AddDirectory(kFALSE);
172
173 OpenFile(1);
174 fHistListCosmics = new TList();
175
176 fNEventAll = new TH1F("fNEventAll","NEventAll",1,-0.5,0.5);
177 fHistListCosmics->Add(fNEventAll);
178 fNEventSel = new TH1F("fNEventSel","NEvent Selected for analysis",1,-0.5,0.5);
179 fHistListCosmics->Add(fNEventSel);
180
181 Float_t fgkPtMin=0.;
182 Float_t fgkPtMax=100.;
183 Int_t fgkNPtBins= (int)(fgkPtMax-fgkPtMin);
21a0adae 184 Int_t fgkNPtBins2D= (int)((fgkPtMax-fgkPtMin)/4.);
1f329128 185
186 Int_t fgkNPhiBins=18;
187 Float_t kMinPhi = -0.5*TMath::Pi();
188 Float_t kMaxPhi = 3./2.*TMath::Pi();
189
190 Int_t fgkNThetaBins=fgkNPhiBins*8;
191 Float_t kMinTheta = -0.5*TMath::Pi();
192 Float_t kMaxTheta = 3./2.*TMath::Pi();
193
21a0adae 194 Int_t fgkNDCARBins=40;
1f329128 195 Float_t fgkDCARMin = -0.2;
196 Float_t fgkDCARMax = 0.2;
60829498 197 Float_t *binsDCAR=new Float_t[fgkNDCARBins+1];
198 for(Int_t i=0; i<=fgkNDCARBins; i++) binsDCAR[i]=(Float_t)fgkDCARMin + (fgkDCARMax-fgkDCARMin)/fgkNDCARBins*(Float_t)i ;
1f329128 199
21a0adae 200 Int_t fgkNDCAZBins=40;
1f329128 201 Float_t fgkDCAZMin = -2.;
202 Float_t fgkDCAZMax = 2.;
60829498 203 Float_t *binsDCAZ=new Float_t[fgkNDCAZBins+1];
204 for(Int_t i=0; i<=fgkNDCAZBins; i++) binsDCAZ[i]=(Float_t)fgkDCAZMin + (fgkDCAZMax-fgkDCAZMin)/fgkNDCAZBins*(Float_t)i ;
1f329128 205
21a0adae 206 fPtSignedCosmicCandidates = new TH1F("fPtSignedCosmicCandidates","fPtSignedCosmicCandidates",2*fgkNPtBins, -1.*fgkPtMax, fgkPtMax);
1f329128 207 fHistListCosmics->Add(fPtSignedCosmicCandidates);
208
209 fDeltaPtCosmicCandidates = new TH1F("fDeltaPtCosmicCandidates","fDeltaPtCosmicCandidates",fgkNPtBins, -50., 50.);
210 fHistListCosmics->Add(fDeltaPtCosmicCandidates);
211
212 fDeltaPhiSumEta = new TH2F("fDeltaPhiSumEta","fDeltaPhiSumEta",fgkNPhiBins*4,kMinPhi,kMaxPhi,80, -2.,2.);
213 fHistListCosmics->Add(fDeltaPhiSumEta);
214
215 fDCAZCosmicCandidates = new TH2F("fDCAZCosmicCandidates","fDCAZCosmicCandidates",fgkNDCAZBins,binsDCAZ,fgkNDCAZBins,binsDCAZ);
216 fHistListCosmics->Add(fDCAZCosmicCandidates);
217
218 fDCARCosmicCandidates = new TH2F("fDCARCosmicCandidates","fDCARCosmicCandidates",fgkNDCARBins,binsDCAR,fgkNDCARBins,binsDCAR);
219 fHistListCosmics->Add(fDCARCosmicCandidates);
220
221 fTheta = new TH1F("fTheta","fTheta",fgkNThetaBins,kMinTheta,kMaxTheta);
222 fHistListCosmics->Add(fTheta);
223
224 fThetaZoom = new TH1F("fThetaZoom","fThetaZoom",100,TMath::Pi()-1.,TMath::Pi()+1.);
225 fHistListCosmics->Add(fThetaZoom);
226
21a0adae 227 fThetaPt1Pt2 = new TH3F("fThetaPt1Pt2","fThetaPt1Pt2",fgkNThetaBins,kMinTheta,kMaxTheta,fgkNPtBins2D,fgkPtMin,fgkPtMax,fgkNPtBins2D,fgkPtMin,fgkPtMax);
1f329128 228 fHistListCosmics->Add(fThetaPt1Pt2);
229
21a0adae 230 fThetaPt1Pt2Signed = new TH3F("fThetaPt1Pt2Signed","fThetaPt1Pt2Signed",fgkNThetaBins,kMinTheta,kMaxTheta,fgkNPtBins2D,-1.*fgkPtMax,fgkPtMax,fgkNPtBins2D,-1.*fgkPtMax,fgkPtMax);
1f329128 231 fHistListCosmics->Add(fThetaPt1Pt2Signed);
232
21a0adae 233 fDeltaPhiSumEtaPt1 = new TH3F("fDeltaPhiSumEtaPt1","fDeltaPhiSumEtaPt1",fgkNThetaBins,kMinTheta,kMaxTheta,80, -2.,2.,fgkNPtBins2D,fgkPtMin,fgkPtMax);
1f329128 234 fHistListCosmics->Add(fDeltaPhiSumEtaPt1);
235
21a0adae 236 fDeltaPhiSumEtaPt2 = new TH3F("fDeltaPhiSumEtaPt2","fDeltaPhiSumEtaPt2",fgkNThetaBins,kMinTheta,kMaxTheta,80, -2.,2.,fgkNPtBins2D,fgkPtMin,fgkPtMax);
1f329128 237 fHistListCosmics->Add(fDeltaPhiSumEtaPt2);
238
239 fThetaDCAZ1DCAZ2 = new TH3F("fThetaDCAZ1DCAZ2","fThetaDCAZ1DCAZ2",fgkNThetaBins,kMinTheta,kMaxTheta,fgkNDCAZBins,-2.,2.,fgkNDCAZBins,-2.,2.);
240 fHistListCosmics->Add(fThetaDCAZ1DCAZ2);
241
242 fRisol = new TH1F("fRisol","fRisol",100,0.,10.);
243 fHistListCosmics->Add(fRisol);
244
245 fRisolTheta = new TH2F("fRisolTheta","fRisolTheta",100,0.,10.,fgkNThetaBins,kMinTheta,kMaxTheta);
246 fHistListCosmics->Add(fRisolTheta);
247
248 TH1::AddDirectory(oldStatus);
249
250 if(binsDCAR) delete [] binsDCAR;
251 if(binsDCAZ) delete [] binsDCAZ;
252
253}
254
255//________________________________________________________________________
256void AliPWG4CosmicCandidates::UserExec(Option_t *)
257{
9b58297c 258 // Main loop
259 // Called for each event
260 //
1f329128 261
262 // All events without selection
263 fNEventAll->Fill(0.);
264
265 if (!fInputEvent) {
266 AliDebug(2,Form("ERROR: fESD not available"));
267 cout << "ERROR: fESD not available" << endl;
268 PostData(1, fHistListCosmics);
269 return;
270 }
271
272 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
b85b355c 273 if(!vtx){
274 PostData(1, fHistListCosmics);
275 return;
276 }
277
278// Need vertex cut
75946d5d 279 TString vtxName(vtx->GetName());
b85b355c 280 if( vtx->GetNContributors() < 2 || (vtxName.Contains("TPCVertex")) ) {
1f329128 281 // Post output data
282 PostData(1, fHistListCosmics);
283 return;
284 }
285
286 // AliDebug(2,Form("Vertex title %s, status %d, nCont %d\n",vtx->GetTitle(), vtx->GetStatus(), vtx->GetNContributors()));
287 double primVtx[3];
288 vtx->GetXYZ(primVtx);
289 if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){
290 // Post output data
291 PostData(1, fHistListCosmics);
292 return;
293 }
294 if(!fInputEvent->GetNumberOfTracks() || fInputEvent->GetNumberOfTracks()<2){
295 // Post output data
296 PostData(1, fHistListCosmics);
297 return;
298 }
299 Int_t nTracks = fInputEvent->GetNumberOfTracks();
300
301 if(!fTrackCuts) {
302 // Post output data
303 PostData(1, fHistListCosmics);
304 return;
305 }
306
9b58297c 307 fNEventSel->Fill(0.);
1f329128 308
309 Float_t dcaR[2] = {0.,0.};
310 Float_t dcaZ[2] = {0.,0.};
311
1f329128 312 for (Int_t iTrack1 = 0; iTrack1 < nTracks; iTrack1++) {
313
314 AliESDtrack* track1 = (AliESDtrack*)fInputEvent->GetTrack(iTrack1);
315 if (!track1) continue;
316 if(!(fTrackCuts->AcceptTrack(track1))) { continue; }
317 if(track1->Pt()<fPtMin) continue;
318 //Start 2nd track loop to look for correlations
319 for (Int_t iTrack2 = iTrack1+1; iTrack2 < nTracks; iTrack2++) {
320 AliESDtrack *track2 = (AliESDtrack*)fInputEvent->GetTrack(iTrack2);
321 if(!track2) continue;
322 if(!(fTrackCuts->AcceptTrack(track2))) { continue; }
323
324 //Check if back-to-back
325 Double_t mom1[3],mom2[3];
326 track1->GetPxPyPz(mom1);
327 track2->GetPxPyPz(mom2);
328 // Double_t cosTheta = (mom1[0]*mom2[0]+mom1[1]*mom2[1]+mom1[2]*mom2[2])/( TMath::Sqrt(mom1[0]*mom1[0]+mom1[1]*mom1[1]+mom1[2]*mom1[2])*TMath::Sqrt(mom2[0]*mom2[0]+mom2[1]*mom2[1]+mom2[2]*mom2[2]) );
329 TVector3 momv1(mom1[0],mom1[1],mom1[2]);
330 TVector3 momv2(mom2[0],mom2[1],mom2[2]);
331 //Double_t theta = momv1.Angle(momv2);
332 Double_t theta = momv1.Phi()-momv2.Phi();
333 if(theta<-0.5*TMath::Pi()) theta+=2.*TMath::Pi();
334
335 fDeltaPtCosmicCandidates->Fill(track1->Pt()-track2->Pt());
336 Float_t deltaPhi = track1->Phi()-track2->Phi();
337 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
338 fDeltaPhiSumEta->Fill(deltaPhi,track1->Eta()+track2->Eta());
339
340 track1->GetImpactParameters(dcaR[0],dcaZ[0]);
341 track2->GetImpactParameters(dcaR[1],dcaZ[1]);
342
343 if(track2->Pt()<0.5) continue;
344 Double_t rIsol = TMath::Sqrt( deltaPhi*deltaPhi+(track1->Eta()-track2->Eta())*(track1->Eta()-track2->Eta()) );
345 fRisol->Fill(rIsol); //Fill R histogram
346 if(track2->Pt()<fPtMin) continue;
347
348 fTheta->Fill(theta);
349 fThetaZoom->Fill(theta);
350 fThetaPt1Pt2->Fill(theta,track1->Pt(),track2->Pt());
351 fThetaPt1Pt2Signed->Fill(theta,track1->GetSign()*track1->Pt(),track2->GetSign()*track2->Pt());
352 fDeltaPhiSumEtaPt1->Fill(deltaPhi,track1->Eta()+track2->Eta(),track1->Pt());
353 fDeltaPhiSumEtaPt2->Fill(deltaPhi,track1->Eta()+track2->Eta(),track2->Pt());
354 fThetaDCAZ1DCAZ2->Fill(theta,dcaZ[0],dcaZ[1]);
355 fRisolTheta->Fill(rIsol,theta);
356 if(TMath::Abs(TMath::Pi()-theta)<fMaxCosmicAngle) {
357 fDCAZCosmicCandidates->Fill(dcaZ[0],dcaZ[1]);
358 fDCARCosmicCandidates->Fill(dcaR[0],dcaR[1]);
359 fPtSignedCosmicCandidates->Fill(track1->GetSign()*track1->Pt());
360 }
361
362 } // track2 loop
363
364 } // track1 loop
365
366 PostData(1,fHistListCosmics);
367}
368
369//________________________________________________________________________
370void AliPWG4CosmicCandidates::Terminate(Option_t *)
371{
9b58297c 372 //
1f329128 373 // Called once at the end of the query
9b58297c 374 //
1f329128 375
376}