]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGHF/correlationHF/AliHFAssociatedTrackCuts.cxx
Fixes for the trunk: compilation on Lion (Yves)
[u/mrichter/AliRoot.git] / PWGHF / correlationHF / AliHFAssociatedTrackCuts.cxx
CommitLineData
815e6bab 1/**************************************************************************
2 * Copyright(c) 1998-2010, 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/* $Id$ */
17
18////////////////////////////////////////////////////////////////////////
19//
20// Base class for cuts on Associated tracks for HF Correlation analysis
21//
22// Author: S.Bjelogrlic (Utrecht) sandro.bjelogrlic@cern.ch
23////////////////////////////////////////////////////////////////////////
24#include <Riostream.h>
25#include "AliHFAssociatedTrackCuts.h"
26#include "AliAODPidHF.h"
27#include "AliESDtrackCuts.h"
28#include "AliESDtrack.h"
29#include "AliAODv0.h"
30#include "AliAODVertex.h"
31#include "AliAODMCParticle.h"
32#include "TString.h"
33
14c8fedd 34using std::cout;
35using std::endl;
815e6bab 36
37ClassImp(AliHFAssociatedTrackCuts)
38
39//--------------------------------------------------------------------------
40AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts():
41AliAnalysisCuts(),
42fESDTrackCuts(0),
43fPidObj(0),
bce70c96 44
45fPoolMaxNEvents(0),
46fPoolMinNTracks(0),
47fMinEventsToMix(0),
48fNzVtxBins(0),
49fNzVtxBinsDim(0),
50fZvtxBins(0),
51fNCentBins(0),
52fNCentBinsDim(0),
53fCentBins(0),
54
815e6bab 55fNTrackCuts(0),
56fAODTrackCuts(0),
57fTrackCutsNames(0),
58fNvZeroCuts(0),
59fAODvZeroCuts(0),
c84dbedf 60fvZeroCutsNames(0),
61fBit(0),
62fCharge(0)
815e6bab 63
64{
65 //
66 //default constructor
67 //
68 //
69 //default constructor
70 //
71
72}
73
74//--------------------------------------------------------------------------
75AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts(const char* name, const char* title):
76AliAnalysisCuts(name,title),
77fESDTrackCuts(0),
78fPidObj(0),
bce70c96 79
80fPoolMaxNEvents(0),
81fPoolMinNTracks(0),
82fMinEventsToMix(0),
83fNzVtxBins(0),
84fNzVtxBinsDim(0),
85fZvtxBins(0),
86fNCentBins(0),
87fNCentBinsDim(0),
88fCentBins(0),
89
815e6bab 90fNTrackCuts(0),
91fAODTrackCuts(0),
92fTrackCutsNames(0),
93fNvZeroCuts(0),
94fAODvZeroCuts(0),
c84dbedf 95fvZeroCutsNames(0),
96fBit(0),
97fCharge(0)
815e6bab 98
99{
100 //
101 //default constructor
102 //
103
104}
105//--------------------------------------------------------------------------
106AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts(const AliHFAssociatedTrackCuts &source) :
107AliAnalysisCuts(source),
108fESDTrackCuts(source.fESDTrackCuts),
109fPidObj(source.fPidObj),
bce70c96 110
111fPoolMaxNEvents(source.fPoolMaxNEvents),
112fPoolMinNTracks(source.fPoolMinNTracks),
113fMinEventsToMix(source.fMinEventsToMix),
114fNzVtxBins(source.fNzVtxBins),
115fNzVtxBinsDim(source.fNzVtxBinsDim),
116fZvtxBins(source.fZvtxBins),
117fNCentBins(source.fNCentBins),
118fNCentBinsDim(source.fNCentBinsDim),
119fCentBins(source.fCentBins),
120
815e6bab 121fNTrackCuts(source.fNTrackCuts),
122fAODTrackCuts(source.fAODTrackCuts),
123fTrackCutsNames(source.fTrackCutsNames),
124fNvZeroCuts(source.fNvZeroCuts),
125fAODvZeroCuts(source.fAODvZeroCuts),
c84dbedf 126fvZeroCutsNames(source.fvZeroCutsNames),
127fBit(source.fBit),
128fCharge(source.fCharge)
815e6bab 129{
130 //
131 // copy constructor
132 //
133
134
14c8fedd 135 AliInfo("AliHFAssociatedTrackCuts::Copy constructor ");
815e6bab 136 if(source.fESDTrackCuts) AddTrackCuts(source.fESDTrackCuts);
137 if(source.fAODTrackCuts) SetAODTrackCuts(source.fAODTrackCuts);
138 if(source.fAODvZeroCuts) SetAODvZeroCuts(source.fAODvZeroCuts);
139 if(source.fPidObj) SetPidHF(source.fPidObj);
140}
141//--------------------------------------------------------------------------
142AliHFAssociatedTrackCuts &AliHFAssociatedTrackCuts::operator=(const AliHFAssociatedTrackCuts &source)
143{
144 //
145 // assignment operator
146 //
147 if(&source == this) return *this;
148
149 AliAnalysisCuts::operator=(source);
150 fESDTrackCuts=source.fESDTrackCuts;
151 fPidObj=source.fPidObj;
152 fNTrackCuts=source.fNTrackCuts;
153 fAODTrackCuts=source.fAODTrackCuts;
154 fTrackCutsNames=source.fTrackCutsNames;
155 fNvZeroCuts=source.fNvZeroCuts;
156 fAODvZeroCuts=source.fAODvZeroCuts;
157 fvZeroCutsNames=source.fvZeroCutsNames;
c84dbedf 158 fBit=source.fBit;
159 fCharge=source.fCharge;
815e6bab 160
161 return *this;
162
163}
164
165
166//--------------------------------------------------------------------------
167AliHFAssociatedTrackCuts::~AliHFAssociatedTrackCuts()
168{
169 if(fESDTrackCuts) {delete fESDTrackCuts; fESDTrackCuts = 0;}
170 if(fPidObj) {delete fPidObj; fPidObj = 0;}
bce70c96 171 if(fZvtxBins) {delete[] fZvtxBins; fZvtxBins=0;}
172 if(fCentBins) {delete[] fCentBins; fCentBins=0;}
815e6bab 173 if(fAODTrackCuts) {delete[] fAODTrackCuts; fAODTrackCuts=0;}
174 if(fTrackCutsNames) {delete[] fTrackCutsNames; fTrackCutsNames=0;}
175 if(fAODvZeroCuts){delete[] fAODvZeroCuts; fAODvZeroCuts=0;}
176 if(fvZeroCutsNames) {delete[] fvZeroCutsNames; fvZeroCutsNames=0;}
177
178}
179//--------------------------------------------------------------------------
180Bool_t AliHFAssociatedTrackCuts::IsInAcceptance()
181{
182 printf("Careful: method AliHFAssociatedTrackCuts::IsInAcceptance is not implemented yet \n");
183 return kFALSE;
184}
185//--------------------------------------------------------------------------
bce70c96 186Bool_t AliHFAssociatedTrackCuts::IsHadronSelected(AliAODTrack * track)
815e6bab 187{
815e6bab 188 AliESDtrack esdtrack(track);
bce70c96 189 if(!fESDTrackCuts->IsSelected(&esdtrack)) return kFALSE;
c84dbedf 190
191 if(fBit && !track->TestFilterBit(fBit)) return kFALSE; // check the filter bit
192
bce70c96 193 return kTRUE;
815e6bab 194
bce70c96 195}
196
197//--------------------------------------------------------------------------
198Bool_t AliHFAssociatedTrackCuts::CheckHadronKinematic(Double_t pt, Double_t d0)
199{
815e6bab 200
815e6bab 201
815e6bab 202
bce70c96 203 if(pt < fAODTrackCuts[0]) return kFALSE;
204 if(pt > fAODTrackCuts[1]) return kFALSE;
205 if(d0 < fAODTrackCuts[2]) return kFALSE;
206 if(d0 > fAODTrackCuts[3]) return kFALSE;
815e6bab 207
208 return kTRUE;
209
210
211}
c84dbedf 212//--------------------------------------------------------------------------
213
214Bool_t AliHFAssociatedTrackCuts::Charge(Short_t charge, AliAODTrack* track)
215{// charge is the charge to compare to (for example, a daughter of a D meson)
216
217 if(!fCharge) return kTRUE; // if fCharge is set to 0 (no selection on the charge), returns always true
218 if(track->Charge()!= fCharge*charge) return kFALSE;
219 return kTRUE;
220}
221
815e6bab 222//--------------------------------------------------------------------------
14c8fedd 223Bool_t AliHFAssociatedTrackCuts::CheckKaonCompatibility(AliAODTrack * track, Bool_t useMc, TClonesArray* mcArray, Int_t method)
815e6bab 224{
225 Bool_t isKaon = kFALSE;
226
227 if(useMc) { // on MC
228 Int_t hadLabel = track->GetLabel();
229 if(hadLabel < 0) return kFALSE;
230 AliAODMCParticle* hadron = dynamic_cast<AliAODMCParticle*>(mcArray->At(hadLabel));
231 Int_t pdg = TMath::Abs(hadron->GetPdgCode());
232 if (pdg == 321) isKaon = kTRUE;
233 }
234
235 if(!useMc) { // on DATA
14c8fedd 236 switch(method) {
237 case(1): {
815e6bab 238 Bool_t isKTPC=kFALSE;
239 Bool_t isPiTPC=kFALSE;
240 Bool_t isPTPC=kFALSE;
241 Bool_t isKTOF=kFALSE;
242 Bool_t isPiTOF=kFALSE;
243 Bool_t isPTOF=kFALSE;
244
245 Bool_t KaonHyp = kFALSE;
246 Bool_t PionHyp = kFALSE;
247 Bool_t ProtonHyp = kFALSE;
248
249 if(fPidObj->CheckStatus(track,"TOF")) {
250 isKTOF=fPidObj->IsKaonRaw(track,"TOF");
251 isPiTOF=fPidObj->IsPionRaw(track,"TOF");
252 isPTOF=fPidObj->IsProtonRaw(track,"TOF");
253 }
254 if(fPidObj->CheckStatus(track,"TPC")){
255 isKTPC=fPidObj->IsKaonRaw(track,"TPC");
256 isPiTPC=fPidObj->IsPionRaw(track,"TPC");
257 isPTPC=fPidObj->IsProtonRaw(track,"TPC");
258 }
259
260 if (isKTOF && isKTPC) KaonHyp = kTRUE;
261 if (isPiTOF && isPiTPC) PionHyp = kTRUE;
262 if (isPTOF && isPTPC) ProtonHyp = kTRUE;
263
264 if(KaonHyp && !PionHyp && !ProtonHyp) isKaon = kTRUE;
14c8fedd 265 break;
266 }
b9f81146 267 case(2): {
268 if(fPidObj->MakeRawPid(track,3)>=1) isKaon = kTRUE;
14c8fedd 269 break;
270 }
b9f81146 271 }
815e6bab 272 }
273
274 return isKaon;
275
276}
277//--------------------------------------------------------------------------
278Bool_t AliHFAssociatedTrackCuts::IsKZeroSelected(AliAODv0 *vzero, AliAODVertex *vtx1)
279{
280
281 if(vzero->DcaV0Daughters()>fAODvZeroCuts[0]) return kFALSE;
282 if(vzero->Chi2V0()>fAODvZeroCuts[1]) return kFALSE;
283 if(vzero->DecayLength(vtx1) < fAODvZeroCuts[2]) return kFALSE;
284 if(vzero->DecayLength(vtx1) > fAODvZeroCuts[3]) return kFALSE;
285 if(vzero->OpenAngleV0() > fAODvZeroCuts[4]) return kFALSE;
286 if(vzero->Pt() < fAODvZeroCuts[5]) return kFALSE;
287 if(TMath::Abs(vzero->Eta()) > fAODvZeroCuts[6]) return kFALSE;
288
289
290 return kTRUE;
291}
292//--------------------------------------------------------------------------
02f91926 293Int_t AliHFAssociatedTrackCuts::IsMCpartFromHF(Int_t label, TClonesArray*mcArray){
294 // Check origin in MC
815e6bab 295
02f91926 296 AliAODMCParticle* mcParticle;
297 Int_t pdgCode = -1;
298 if (label<0) return 0;
299 Bool_t isCharmy = kFALSE;
300 Bool_t isBeauty = kFALSE;
301 Bool_t isD = kFALSE;
302 Bool_t isB = kFALSE;
815e6bab 303
02f91926 304 while(pdgCode!=2212){ // loops back to the collision to check the particle source
305
306 mcParticle = dynamic_cast<AliAODMCParticle*>(mcArray->At(label));
bf658d5c 307 if(!mcParticle) {AliError("NO MC PARTICLE"); break;}
02f91926 308 pdgCode = TMath::Abs(mcParticle->GetPdgCode());
309
310 label = mcParticle->GetMother();
311
312
313 if((pdgCode>=400 && pdgCode <500) || (pdgCode>=4000 && pdgCode<5000 )) isD = kTRUE;
314 if((pdgCode>=500 && pdgCode <600) || (pdgCode>=5000 && pdgCode<6000 )) {isD = kFALSE; isB = kTRUE;}
315
316
317 if(pdgCode == 4) isCharmy = kTRUE;
318 if(pdgCode == 5) {isBeauty = kTRUE; isCharmy = kFALSE;}
319 if(label<0) break;
320
321 }
322 if (isCharmy && isD) return 44; // the first 4(5) indicates the charm/beauty quark, the second the charmy meson
323 if (isBeauty && isD) return 54;
324 if (isBeauty && isB) return 55;
325 return 0;
815e6bab 326}
bce70c96 327
328//--------------------------------------------------------------------------
329Bool_t AliHFAssociatedTrackCuts::InvMassDstarRejection(AliAODRecoDecayHF2Prong* d, AliAODTrack *track, Int_t hypD0) const {
330 //
331 // Calculates invmass of track+D0 and rejects if compatible with D*
332 // (to remove pions from D*)
333 //
334 Double_t nsigma = 3.;
335
336 Double_t mD0, mD0bar;
337 d->InvMassD0(mD0,mD0bar);
338
339 Double_t invmassDstar1 = 0, invmassDstar2 = 0;
340 Double_t e1Pi = d->EProng(0,211), e2K = d->EProng(1,321); //hyp 1 (pi,K) - D0
341 Double_t e1K = d->EProng(0,321), e2Pi = d->EProng(1,211); //hyp 2 (K,pi) - D0bar
342 Double_t psum2 = (d->Px()+track->Px())*(d->Px()+track->Px())
343 +(d->Py()+track->Py())*(d->Py()+track->Py())
344 +(d->Pz()+track->Pz())*(d->Pz()+track->Pz());
345
346 switch(hypD0) {
347 case 1:
348 invmassDstar1 = TMath::Sqrt(pow(e1Pi+e2K+track->E(0.1396),2.)-psum2);
349 if ((TMath::Abs(invmassDstar1-mD0)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
350 break;
351 case 2:
352 invmassDstar2 = TMath::Sqrt(pow(e2Pi+e1K+track->E(0.1396),2.)-psum2);
353 if ((TMath::Abs(invmassDstar2-mD0bar)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
354 break;
355 case 3:
356 invmassDstar1 = TMath::Sqrt(pow(e1Pi+e2K+track->E(0.1396),2.)-psum2);
357 invmassDstar2 = TMath::Sqrt(pow(e2Pi+e1K+track->E(0.1396),2.)-psum2);
358 if ((TMath::Abs(invmassDstar1-mD0)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
359 if ((TMath::Abs(invmassDstar2-mD0bar)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
360 break;
361 }
362
363 return kTRUE;
364}
815e6bab 365//________________________________________________________
366void AliHFAssociatedTrackCuts::SetAODTrackCuts(Float_t *cutsarray)
367{
bce70c96 368 cout << "Check 1" << endl;
815e6bab 369 if(!fAODTrackCuts) fAODTrackCuts = new Float_t[fNTrackCuts];
bce70c96 370 cout << "Check 2" << endl;
815e6bab 371 for(Int_t i =0; i<fNTrackCuts; i++){
bce70c96 372 cout << "Check 2." << i << endl;
815e6bab 373 fAODTrackCuts[i] = cutsarray[i];
374 }
bce70c96 375 cout << "Check 3" << endl;
815e6bab 376 SetTrackCutsNames();
bce70c96 377 cout << "Check 4" << endl;
815e6bab 378 return;
379}
380//________________________________________________________
381void AliHFAssociatedTrackCuts::SetTrackCutsNames(/*TString *namearray*/){
382
383 fTrackCutsNames = new TString[4];
384 fTrackCutsNames[0]= "associated track:: pt min [GeV/c]................: ";
385 fTrackCutsNames[1]= "associated track:: pt max [GeV/c]................: ";
386 fTrackCutsNames[2]= "associated track:: d0 min [cm]...................: ";
387 fTrackCutsNames[3]= "associated track:: d0 max [cm]...................: ";
388
389
390
391 return;
392}
393//--------------------------------------------------------------------------
394void AliHFAssociatedTrackCuts::SetAODvZeroCuts(Float_t *cutsarray)
395{
396
397
398 if(!fAODvZeroCuts) fAODvZeroCuts = new Float_t[fNvZeroCuts];
399 for(Int_t i =0; i<fNvZeroCuts; i++){
400 fAODvZeroCuts[i] = cutsarray[i];
401 }
402 SetvZeroCutsNames();
403 return;
404}
405//--------------------------------------------------------------------------
406void AliHFAssociatedTrackCuts::SetvZeroCutsNames(/*TString *namearray*/){
407
408 fvZeroCutsNames = new TString[7];
409 fvZeroCutsNames[0] = "vZero:: max DCA between two daughters [cm].......: ";
410 fvZeroCutsNames[1] = "vZero:: max fit Chi Square between two daughters.: ";
411 fvZeroCutsNames[2] = "vZero:: min decay length [cm]....................: ";
412 fvZeroCutsNames[3] = "vZero:: max decay length [cm]....................: ";
413 fvZeroCutsNames[4] = "vZero:: max opening angle between daughters [rad]: ";
414 fvZeroCutsNames[5] = "vZero:: pt min [Gev/c]...........................: ";
415 fvZeroCutsNames[6] = "vZero:: |Eta| range <............................: ";
416
417
418 return;
419}
420
421//--------------------------------------------------------------------------
422void AliHFAssociatedTrackCuts::PrintAll()
423{
424 printf("\nCuts for the associated track: \n \n");
425
426 printf("ITS Refit........................................: %s\n",fESDTrackCuts->GetRequireITSRefit() ? "Yes" : "No");
427 printf("TPC Refit........................................: %s\n",fESDTrackCuts->GetRequireTPCRefit() ? "Yes" : "No");
428 printf("ITS SA...........................................: %s\n",fESDTrackCuts->GetRequireITSStandAlone() ? "Yes" : "No");
429 printf("TPC SA...........................................: %s\n",fESDTrackCuts->GetRequireTPCStandAlone() ? "Yes" : "No");
430 printf("Min number of ITS clusters.......................: %d\n",fESDTrackCuts->GetMinNClustersITS());
431 printf("Min number of TPC clusters.......................: %d\n",fESDTrackCuts->GetMinNClusterTPC());
432 Int_t spd = fESDTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD);
433 if(spd==0) cout << "SPD..............................................: kOff" << endl;
434 if(spd==1) cout << "SPD..............................................: kNone" << endl;
435 if(spd==2) cout << "SPD..............................................: kAny" << endl;
436 if(spd==3) cout << "SPD..............................................: kFirst" << endl;
437 if(spd==4) cout << "SPD..............................................: kOnlyFirst" << endl;
438 if(spd==5) cout << "SPD..............................................: kSecond" << endl;
439 if(spd==6) cout << "SPD..............................................: kOnlySecond" << endl;
440 if(spd==7) cout << "SPD..............................................: kBoth" << endl;
c84dbedf 441
442 cout << "Filter Bit.......................................: " << fBit << endl;
443 cout << "Charge...........................................: " << fCharge << endl;
815e6bab 444
445 for(Int_t j=0;j<fNTrackCuts;j++){
446 cout << fTrackCutsNames[j] << fAODTrackCuts[j] << endl;
447 }
448
449 printf("\nCuts for the K0 candidates: \n \n");
450 for(Int_t k=0;k<fNvZeroCuts;k++){
451 cout << fvZeroCutsNames[k] << fAODvZeroCuts[k] << endl;
452 }
453 cout << " " << endl;
bce70c96 454 PrintPoolParameters();
455
815e6bab 456}
14c8fedd 457
458//--------------------------------------------------------------------------
bce70c96 459void AliHFAssociatedTrackCuts::PrintPoolParameters()
460{
461 printf("\nEvent Pool settings: \n \n");
462
463 printf("Number of zVtx Bins: %d\n", fNzVtxBins);
464 printf("\nzVtx Bins:\n");
465 //Double_t zVtxbinLims[fNzVtxBins+1] = fNzVtxBins;
466 for(Int_t k=0; k<fNzVtxBins; k++){
c84dbedf 467 printf("Bin %d..............................................: %.1f - %.1f cm\n", k, fZvtxBins[k], fZvtxBins[k+1]);
bce70c96 468 }
469
470 printf("\nNumber of Centrality(multiplicity) Bins: %d\n", fNCentBins);
471 printf("\nCentrality(multiplicity) Bins:\n");
472 for(Int_t k=0; k<fNCentBins; k++){
c84dbedf 473 printf("Bin %d..............................................: %.1f - %.1f\n", k, fCentBins[k], fCentBins[k+1]);
bce70c96 474 }
475
476
477
14c8fedd 478}
bce70c96 479
480