1 /**************************************************************************
2 * Copyright(c) 1998-2010, 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 **************************************************************************/
18 ////////////////////////////////////////////////////////////////////////
20 // Base class for cuts on Associated tracks for HF Correlation analysis
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"
30 #include "AliAODVertex.h"
31 #include "AliAODMCParticle.h"
32 #include "AliAnalysisManager.h"
33 #include "AliInputEventHandler.h"
39 ClassImp(AliHFAssociatedTrackCuts)
41 //--------------------------------------------------------------------------
42 AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts():
80 //--------------------------------------------------------------------------
81 AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts(const char* name, const char* title):
82 AliAnalysisCuts(name,title),
111 //default constructor
115 //--------------------------------------------------------------------------
116 AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts(const AliHFAssociatedTrackCuts &source) :
117 AliAnalysisCuts(source),
118 fESDTrackCuts(source.fESDTrackCuts),
119 fPidObj(source.fPidObj),
121 fPoolMaxNEvents(source.fPoolMaxNEvents),
122 fPoolMinNTracks(source.fPoolMinNTracks),
123 fMinEventsToMix(source.fMinEventsToMix),
124 fNzVtxBins(source.fNzVtxBins),
125 fNzVtxBinsDim(source.fNzVtxBinsDim),
126 fZvtxBins(source.fZvtxBins),
127 fNCentBins(source.fNCentBins),
128 fNCentBinsDim(source.fNCentBinsDim),
129 fCentBins(source.fCentBins),
131 fNofMCEventType(source.fNofMCEventType),
132 fMCEventType(source.fMCEventType),
134 fNTrackCuts(source.fNTrackCuts),
135 fAODTrackCuts(source.fAODTrackCuts),
136 fTrackCutsNames(source.fTrackCutsNames),
137 fNvZeroCuts(source.fNvZeroCuts),
138 fAODvZeroCuts(source.fAODvZeroCuts),
139 fvZeroCutsNames(source.fvZeroCutsNames),
141 fCharge(source.fCharge),
142 fDescription(source.fDescription)
149 AliInfo("AliHFAssociatedTrackCuts::Copy constructor ");
150 if(source.fESDTrackCuts) AddTrackCuts(source.fESDTrackCuts);
151 if(source.fAODTrackCuts) SetAODTrackCuts(source.fAODTrackCuts);
152 if(source.fAODvZeroCuts) SetAODvZeroCuts(source.fAODvZeroCuts);
153 if(source.fPidObj) SetPidHF(source.fPidObj);
155 //--------------------------------------------------------------------------
156 AliHFAssociatedTrackCuts &AliHFAssociatedTrackCuts::operator=(const AliHFAssociatedTrackCuts &source)
159 // assignment operator
161 if(&source == this) return *this;
163 AliAnalysisCuts::operator=(source);
164 fESDTrackCuts=source.fESDTrackCuts;
165 fPidObj=source.fPidObj;
166 fNTrackCuts=source.fNTrackCuts;
167 fAODTrackCuts=source.fAODTrackCuts;
168 fTrackCutsNames=source.fTrackCutsNames;
169 fNvZeroCuts=source.fNvZeroCuts;
170 fAODvZeroCuts=source.fAODvZeroCuts;
171 fvZeroCutsNames=source.fvZeroCutsNames;
173 fCharge=source.fCharge;
180 //--------------------------------------------------------------------------
181 AliHFAssociatedTrackCuts::~AliHFAssociatedTrackCuts()
183 if(fESDTrackCuts) {delete fESDTrackCuts; fESDTrackCuts = 0;}
184 if(fPidObj) {delete fPidObj; fPidObj = 0;}
185 if(fZvtxBins) {delete[] fZvtxBins; fZvtxBins=0;}
186 if(fCentBins) {delete[] fCentBins; fCentBins=0;}
187 if(fAODTrackCuts) {delete[] fAODTrackCuts; fAODTrackCuts=0;}
188 if(fTrackCutsNames) {delete[] fTrackCutsNames; fTrackCutsNames=0;}
189 if(fAODvZeroCuts){delete[] fAODvZeroCuts; fAODvZeroCuts=0;}
190 if(fvZeroCutsNames) {delete[] fvZeroCutsNames; fvZeroCutsNames=0;}
194 //--------------------------------------------------------------------------
195 Bool_t AliHFAssociatedTrackCuts::IsInAcceptance()
197 printf("Careful: method AliHFAssociatedTrackCuts::IsInAcceptance is not implemented yet \n");
200 //--------------------------------------------------------------------------
201 Bool_t AliHFAssociatedTrackCuts::IsHadronSelected(AliAODTrack * track)
203 AliESDtrack esdtrack(track);
204 if(!fESDTrackCuts->IsSelected(&esdtrack)) return kFALSE;
206 if(fBit && !track->TestFilterBit(fBit)) return kFALSE; // check the filter bit
212 //--------------------------------------------------------------------------
213 Bool_t AliHFAssociatedTrackCuts::CheckHadronKinematic(Double_t pt, Double_t d0)
218 if(pt < fAODTrackCuts[0]) return kFALSE;
219 if(pt > fAODTrackCuts[1]) return kFALSE;
220 if(d0 < fAODTrackCuts[2]) return kFALSE;
221 if(d0 > fAODTrackCuts[3]) return kFALSE;
227 //--------------------------------------------------------------------------
229 Bool_t AliHFAssociatedTrackCuts::Charge(Short_t charge, AliAODTrack* track)
230 {// charge is the charge to compare to (for example, a daughter of a D meson)
232 if(!fCharge) return kTRUE; // if fCharge is set to 0 (no selection on the charge), returns always true
233 if(track->Charge()!= fCharge*charge) return kFALSE;
237 //--------------------------------------------------------------------------
238 Bool_t AliHFAssociatedTrackCuts::CheckKaonCompatibility(AliAODTrack * track, Bool_t useMc, TClonesArray* mcArray, Int_t method)
240 Bool_t isKaon = kFALSE;
243 Int_t hadLabel = track->GetLabel();
244 if(hadLabel < 0) return kFALSE;
245 AliAODMCParticle* hadron = dynamic_cast<AliAODMCParticle*>(mcArray->At(hadLabel));
246 Int_t pdg = TMath::Abs(hadron->GetPdgCode());
247 if (pdg == 321) isKaon = kTRUE;
250 if(!useMc) { // on DATA
253 Bool_t isKTPC=kFALSE;
254 Bool_t isPiTPC=kFALSE;
255 Bool_t isPTPC=kFALSE;
256 Bool_t isKTOF=kFALSE;
257 Bool_t isPiTOF=kFALSE;
258 Bool_t isPTOF=kFALSE;
260 Bool_t KaonHyp = kFALSE;
261 Bool_t PionHyp = kFALSE;
262 Bool_t ProtonHyp = kFALSE;
264 if(fPidObj->CheckStatus(track,"TOF")) {
265 isKTOF=fPidObj->IsKaonRaw(track,"TOF");
266 isPiTOF=fPidObj->IsPionRaw(track,"TOF");
267 isPTOF=fPidObj->IsProtonRaw(track,"TOF");
269 if(fPidObj->CheckStatus(track,"TPC")){
270 isKTPC=fPidObj->IsKaonRaw(track,"TPC");
271 isPiTPC=fPidObj->IsPionRaw(track,"TPC");
272 isPTPC=fPidObj->IsProtonRaw(track,"TPC");
275 if (isKTOF && isKTPC) KaonHyp = kTRUE;
276 if (isPiTOF && isPiTPC) PionHyp = kTRUE;
277 if (isPTOF && isPTPC) ProtonHyp = kTRUE;
279 if(KaonHyp && !PionHyp && !ProtonHyp) isKaon = kTRUE;
283 if(fPidObj->MakeRawPid(track,3)>=1) isKaon = kTRUE;
292 //--------------------------------------------------------------------------
293 Bool_t AliHFAssociatedTrackCuts::IsKZeroSelected(AliAODv0 *vzero, AliAODVertex *vtx1)
296 if(vzero->DcaV0Daughters()>fAODvZeroCuts[0]) return kFALSE;
297 if(vzero->Chi2V0()>fAODvZeroCuts[1]) return kFALSE;
298 if(vzero->DecayLength(vtx1) < fAODvZeroCuts[2]) return kFALSE;
299 if(vzero->DecayLength(vtx1) > fAODvZeroCuts[3]) return kFALSE;
300 if(vzero->OpenAngleV0() > fAODvZeroCuts[4]) return kFALSE;
301 if(vzero->Pt() < fAODvZeroCuts[5]) return kFALSE;
302 if(TMath::Abs(vzero->Eta()) > fAODvZeroCuts[6]) return kFALSE;
307 //--------------------------------------------------------------------------
308 Bool_t *AliHFAssociatedTrackCuts::IsMCpartFromHF(Int_t label, TClonesArray*mcArray){
309 // Check origin in MC
311 AliAODMCParticle* mcParticle;
314 Bool_t isCharmy = kFALSE;
315 Bool_t isBeauty = kFALSE;
319 Bool_t *originvect = new Bool_t[4];
321 originvect[0] = kFALSE;
322 originvect[1] = kFALSE;
323 originvect[2] = kFALSE;
324 originvect[3] = kFALSE;
326 if (label<0) return originvect;
328 while(pdgCode!=2212){ // loops back to the collision to check the particle source
330 mcParticle = dynamic_cast<AliAODMCParticle*>(mcArray->At(label));
331 if(!mcParticle) {AliError("NO MC PARTICLE"); break;}
332 pdgCode = TMath::Abs(mcParticle->GetPdgCode());
334 label = mcParticle->GetMother();
337 if((pdgCode>=400 && pdgCode <500) || (pdgCode>=4000 && pdgCode<5000 )) isD = kTRUE;
338 if((pdgCode>=500 && pdgCode <600) || (pdgCode>=5000 && pdgCode<6000 )) {isD = kFALSE; isB = kTRUE;}
341 if(pdgCode == 4) isCharmy = kTRUE;
342 if(pdgCode == 5) {isBeauty = kTRUE; isCharmy = kFALSE;}
348 originvect[0] = isCharmy;
349 originvect[1] = isBeauty;
357 //--------------------------------------------------------------------------
358 Bool_t AliHFAssociatedTrackCuts::InvMassDstarRejection(AliAODRecoDecayHF2Prong* d, AliAODTrack *track, Int_t hypD0) const {
360 // Calculates invmass of track+D0 and rejects if compatible with D*
361 // (to remove pions from D*)
363 Double_t nsigma = 3.;
365 Double_t mD0, mD0bar;
366 d->InvMassD0(mD0,mD0bar);
368 Double_t invmassDstar1 = 0, invmassDstar2 = 0;
369 Double_t e1Pi = d->EProng(0,211), e2K = d->EProng(1,321); //hyp 1 (pi,K) - D0
370 Double_t e1K = d->EProng(0,321), e2Pi = d->EProng(1,211); //hyp 2 (K,pi) - D0bar
371 Double_t psum2 = (d->Px()+track->Px())*(d->Px()+track->Px())
372 +(d->Py()+track->Py())*(d->Py()+track->Py())
373 +(d->Pz()+track->Pz())*(d->Pz()+track->Pz());
377 invmassDstar1 = TMath::Sqrt(pow(e1Pi+e2K+track->E(0.1396),2.)-psum2);
378 if ((TMath::Abs(invmassDstar1-mD0)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
381 invmassDstar2 = TMath::Sqrt(pow(e2Pi+e1K+track->E(0.1396),2.)-psum2);
382 if ((TMath::Abs(invmassDstar2-mD0bar)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
385 invmassDstar1 = TMath::Sqrt(pow(e1Pi+e2K+track->E(0.1396),2.)-psum2);
386 invmassDstar2 = TMath::Sqrt(pow(e2Pi+e1K+track->E(0.1396),2.)-psum2);
387 if ((TMath::Abs(invmassDstar1-mD0)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
388 if ((TMath::Abs(invmassDstar2-mD0bar)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
394 //________________________________________________________
395 void AliHFAssociatedTrackCuts::SetMCEventTypes(Int_t *MCEventTypeArray)
396 // set the array of event types you want to process in MonteCarlo (gluon splitting, pair production etc.)
398 if(!fMCEventType) fMCEventType = new Int_t[fNofMCEventType];
400 for(Int_t k=0; k<fNofMCEventType; k++){
401 fMCEventType[k] = MCEventTypeArray[k];
406 //________________________________________________________
407 void AliHFAssociatedTrackCuts::SetAODTrackCuts(Float_t *cutsarray)
409 if(!fAODTrackCuts) fAODTrackCuts = new Float_t[fNTrackCuts];
410 for(Int_t i =0; i<fNTrackCuts; i++){
411 fAODTrackCuts[i] = cutsarray[i];
416 //________________________________________________________
417 void AliHFAssociatedTrackCuts::SetTrackCutsNames(/*TString *namearray*/){
419 fTrackCutsNames = new TString[4];
420 fTrackCutsNames[0]= "associated track:: pt min [GeV/c]................: ";
421 fTrackCutsNames[1]= "associated track:: pt max [GeV/c]................: ";
422 fTrackCutsNames[2]= "associated track:: d0 min [cm]...................: ";
423 fTrackCutsNames[3]= "associated track:: d0 max [cm]...................: ";
429 //--------------------------------------------------------------------------
430 void AliHFAssociatedTrackCuts::SetAODvZeroCuts(Float_t *cutsarray)
434 if(!fAODvZeroCuts) fAODvZeroCuts = new Float_t[fNvZeroCuts];
435 for(Int_t i =0; i<fNvZeroCuts; i++){
436 fAODvZeroCuts[i] = cutsarray[i];
441 //--------------------------------------------------------------------------
442 void AliHFAssociatedTrackCuts::SetvZeroCutsNames(/*TString *namearray*/){
444 fvZeroCutsNames = new TString[7];
445 fvZeroCutsNames[0] = "vZero:: max DCA between two daughters [cm].......: ";
446 fvZeroCutsNames[1] = "vZero:: max fit Chi Square between two daughters.: ";
447 fvZeroCutsNames[2] = "vZero:: min decay length [cm]....................: ";
448 fvZeroCutsNames[3] = "vZero:: max decay length [cm]....................: ";
449 fvZeroCutsNames[4] = "vZero:: max opening angle between daughters [rad]: ";
450 fvZeroCutsNames[5] = "vZero:: pt min [Gev/c]...........................: ";
451 fvZeroCutsNames[6] = "vZero:: |Eta| range <............................: ";
457 //--------------------------------------------------------------------------
458 void AliHFAssociatedTrackCuts::SetPidAssociated()
460 //setting PidResponse
461 if(fPidObj->GetOldPid()==kFALSE && fPidObj->GetPidResponse()==0x0){
462 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
463 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
464 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
465 fPidObj->SetPidResponse(pidResp);
469 //--------------------------------------------------------------------------
470 void AliHFAssociatedTrackCuts::PrintAll()
473 printf("\n=================================================");
474 printf("\nCuts for the associated track: \n \n");
476 printf("ITS Refit........................................: %s\n",fESDTrackCuts->GetRequireITSRefit() ? "Yes" : "No");
477 printf("TPC Refit........................................: %s\n",fESDTrackCuts->GetRequireTPCRefit() ? "Yes" : "No");
478 printf("ITS SA...........................................: %s\n",fESDTrackCuts->GetRequireITSStandAlone() ? "Yes" : "No");
479 printf("TPC SA...........................................: %s\n",fESDTrackCuts->GetRequireTPCStandAlone() ? "Yes" : "No");
480 printf("Min number of ITS clusters.......................: %d\n",fESDTrackCuts->GetMinNClustersITS());
481 printf("Min number of TPC clusters.......................: %d\n",fESDTrackCuts->GetMinNClusterTPC());
482 Int_t spd = fESDTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD);
483 if(spd==0) std::cout << "SPD..............................................: kOff" << std::endl;
484 if(spd==1) std::cout << "SPD..............................................: kNone" << std::endl;
485 if(spd==2) std::cout << "SPD..............................................: kAny" << std::endl;
486 if(spd==3) std::cout << "SPD..............................................: kFirst" << std::endl;
487 if(spd==4) std::cout << "SPD..............................................: kOnlyFirst" << std::endl;
488 if(spd==5) std::cout << "SPD..............................................: kSecond" << std::endl;
489 if(spd==6) std::cout << "SPD..............................................: kOnlySecond" << std::endl;
490 if(spd==7) std::cout << "SPD..............................................: kBoth" << std::endl;
492 std::cout << "Filter Bit.......................................: " << fBit << std::endl;
493 std::cout << "Charge...........................................: " << fCharge << std::endl;
495 for(Int_t j=0;j<fNTrackCuts;j++){
496 std::cout << fTrackCutsNames[j] << fAODTrackCuts[j] << std::endl;
499 printf("=================================================");
500 printf("\nCuts for the K0 candidates: \n \n");
501 for(Int_t k=0;k<fNvZeroCuts;k++){
502 std::cout << fvZeroCutsNames[k] << fAODvZeroCuts[k] << std::endl;
504 std::cout << " " << std::endl;
505 PrintPoolParameters();
506 PrintSelectedMCevents();
508 printf("=================================================");
509 printf("\nAdditional description\n");
510 std::cout << fDescription << std::endl;
515 //--------------------------------------------------------------------------
516 void AliHFAssociatedTrackCuts::PrintPoolParameters()
518 printf("=================================================");
519 printf("\nEvent Pool settings: \n \n");
521 printf("Number of zVtx Bins: %d\n", fNzVtxBins);
522 printf("\nzVtx Bins:\n");
523 //Double_t zVtxbinLims[fNzVtxBins+1] = fNzVtxBins;
524 for(Int_t k=0; k<fNzVtxBins; k++){
525 printf("Bin %d..............................................: %.1f - %.1f cm\n", k, fZvtxBins[k], fZvtxBins[k+1]);
528 printf("\nNumber of Centrality(multiplicity) Bins: %d\n", fNCentBins);
529 printf("\nCentrality(multiplicity) Bins:\n");
530 for(Int_t k=0; k<fNCentBins; k++){
531 printf("Bin %d..............................................: %.1f - %.1f\n", k, fCentBins[k], fCentBins[k+1]);
538 //--------------------------------------------------------------------------
539 void AliHFAssociatedTrackCuts::PrintSelectedMCevents()
541 printf("\n=================================================");
543 printf("\nSelected MC events: \n \n");
544 printf("Number of selected events: %d\n",fNofMCEventType);
546 for(Int_t k=0; k<fNofMCEventType; k++){
547 if(fMCEventType[k]==28) printf("=> Flavour excitation \n");
548 if(fMCEventType[k]==53) printf("=> Pair creation \n");
549 if(fMCEventType[k]==68) printf("=> Gluon splitting \n");
553 for(Int_t k=0; k<fNofMCEventType; k++){
554 printf("MC process code %d \n",fMCEventType[k]);