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 AOD reconstructed heavy-flavour decay
22 // Author: A.Dainese, andrea.dainese@pd.infn.it
23 /////////////////////////////////////////////////////////////
24 #include <Riostream.h>
26 #include "AliVEvent.h"
27 #include "AliESDEvent.h"
28 #include "AliAODEvent.h"
29 #include "AliVVertex.h"
30 #include "AliESDVertex.h"
32 #include "AliAODVertex.h"
33 #include "AliESDtrack.h"
34 #include "AliAODTrack.h"
35 #include "AliESDtrackCuts.h"
36 #include "AliCentrality.h"
37 #include "AliAODRecoDecayHF.h"
38 #include "AliAnalysisVertexingHF.h"
39 #include "AliRDHFCuts.h"
43 //--------------------------------------------------------------------------
44 AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) :
45 AliAnalysisCuts(name,title),
50 fMinSPDMultiplicity(0),
52 fTriggerClass("CINT1"),
67 fRemoveDaughtersFromPrimary(kFALSE),
81 // Default Constructor
84 //--------------------------------------------------------------------------
85 AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
86 AliAnalysisCuts(source),
87 fMinVtxType(source.fMinVtxType),
88 fMinVtxContr(source.fMinVtxContr),
89 fMaxVtxRedChi2(source.fMaxVtxRedChi2),
90 fMaxVtxZ(source.fMaxVtxZ),
91 fMinSPDMultiplicity(source.fMinSPDMultiplicity),
92 fTriggerMask(source.fTriggerMask),
93 fTriggerClass(source.fTriggerClass),
95 fnPtBins(source.fnPtBins),
96 fnPtBinLimits(source.fnPtBinLimits),
98 fnVars(source.fnVars),
100 fnVarsForOpt(source.fnVarsForOpt),
102 fGlobalIndex(source.fGlobalIndex),
105 fUsePID(source.fUsePID),
107 fWhyRejection(source.fWhyRejection),
108 fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
109 fOptPileup(source.fOptPileup),
110 fMinContrPileup(source.fMinContrPileup),
111 fMinDzPileup(source.fMinDzPileup),
112 fUseCentrality(source.fUseCentrality),
113 fMinCentrality(source.fMinCentrality),
114 fMaxCentrality(source.fMaxCentrality),
115 fFixRefs(source.fFixRefs),
116 fIsSelectedCuts(source.fIsSelectedCuts),
117 fIsSelectedPID(source.fIsSelectedPID),
118 fMinPtCand(source.fMinPtCand),
119 fMaxPtCand(source.fMaxPtCand)
124 cout<<"Copy constructor"<<endl;
125 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
126 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
127 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
128 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
129 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
130 if(source.fPidHF) SetPidHF(source.fPidHF);
134 //--------------------------------------------------------------------------
135 AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
138 // assignment operator
140 if(&source == this) return *this;
142 AliAnalysisCuts::operator=(source);
144 fMinVtxType=source.fMinVtxType;
145 fMinVtxContr=source.fMinVtxContr;
146 fMaxVtxRedChi2=source.fMaxVtxRedChi2;
147 fMaxVtxZ=source.fMaxVtxZ;
148 fMinSPDMultiplicity=source.fMinSPDMultiplicity;
149 fTriggerMask=source.fTriggerMask;
150 fTriggerClass=source.fTriggerClass;
151 fnPtBins=source.fnPtBins;
152 fnVars=source.fnVars;
153 fGlobalIndex=source.fGlobalIndex;
154 fnVarsForOpt=source.fnVarsForOpt;
155 fUsePID=source.fUsePID;
156 SetPidHF(source.GetPidHF());
157 fWhyRejection=source.fWhyRejection;
158 fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
159 fOptPileup=source.fOptPileup;
160 fMinContrPileup=source.fMinContrPileup;
161 fMinDzPileup=source.fMinDzPileup;
162 fUseCentrality=source.fUseCentrality;
163 fMinCentrality=source.fMinCentrality;
164 fMaxCentrality=source.fMaxCentrality;
165 fFixRefs=source.fFixRefs;
166 fIsSelectedCuts=source.fIsSelectedCuts;
167 fIsSelectedPID=source.fIsSelectedPID;
168 fMinPtCand=source.fMinPtCand;
169 fMaxPtCand=source.fMaxPtCand;
171 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
172 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
173 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
174 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
175 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
180 //--------------------------------------------------------------------------
181 AliRDHFCuts::~AliRDHFCuts() {
183 // Default Destructor
185 if(fPtBinLimits) {delete [] fPtBinLimits; fPtBinLimits=0;}
186 if(fVarNames) {delete [] fVarNames; fVarNames=0;}
187 if(fVarsForOpt) {delete [] fVarsForOpt; fVarsForOpt=0;}
192 if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
198 //---------------------------------------------------------------------------
199 Int_t AliRDHFCuts::IsEventSelectedInCentrality(AliVEvent *event) {
201 // Centrality selection
204 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid){
205 AliWarning("Centrality estimator not valid");
208 Float_t centvalue=GetCentrality((AliAODEvent*)event);
212 if (centvalue<fMinCentrality || centvalue>fMaxCentrality){
219 //---------------------------------------------------------------------------
220 Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
224 //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
229 TString firedTriggerClasses=((AliAODEvent*)event)->GetFiredTriggerClasses();
230 // don't do for PbPb 2010 data
231 if(event->GetRunNumber()<136851 || event->GetRunNumber()>139517) {
232 if(!firedTriggerClasses.Contains(fTriggerClass.Data())) {
238 // TEMPORARY FIX FOR REFERENCES
239 // Fix references to daughter tracks
241 AliAnalysisVertexingHF *fixer = new AliAnalysisVertexingHF();
242 fixer->FixReferences((AliAODEvent*)event);
249 // multiplicity cuts no implemented yet
251 const AliVVertex *vertex = event->GetPrimaryVertex();
253 if(!vertex) return kFALSE;
255 TString title=vertex->GetTitle();
256 if(title.Contains("Z") && fMinVtxType>1) return kFALSE;
257 if(title.Contains("3D") && fMinVtxType>2) return kFALSE;
259 if(vertex->GetNContributors()<fMinVtxContr) return kFALSE;
261 if(TMath::Abs(vertex->GetZ())>fMaxVtxZ) return kFALSE;
263 // switch to settings for 1-pad cls in TPC
265 if(event->GetRunNumber()>121693 && event->GetRunNumber()<136851)
266 fPidHF->SetOnePad(kTRUE);
267 if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517)
268 fPidHF->SetPbPb(kTRUE);
271 if(fOptPileup==kRejectPileupEvent){
272 Int_t cutc=(Int_t)fMinContrPileup;
273 Double_t cutz=(Double_t)fMinDzPileup;
274 if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
280 //centrality selection
281 if (fUseCentrality!=kCentOff) {
282 Int_t rejection=IsEventSelectedInCentrality(event);
284 fWhyRejection=rejection;
291 //---------------------------------------------------------------------------
292 Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
294 // Daughter tracks selection
296 if(!fTrackCuts) return kTRUE;
298 Int_t ndaughters = d->GetNDaughters();
299 AliAODVertex *vAOD = d->GetPrimaryVtx();
300 Double_t pos[3],cov[6];
302 vAOD->GetCovarianceMatrix(cov);
303 const AliESDVertex vESD(pos,cov,100.,100);
307 for(Int_t idg=0; idg<ndaughters; idg++) {
308 AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);
309 if(!dgTrack) {retval = kFALSE; continue;}
310 //printf("charge %d\n",dgTrack->Charge());
311 if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
313 if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
318 //---------------------------------------------------------------------------
319 Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
321 // Convert to ESDtrack, relate to vertex and check cuts
323 if(!cuts) return kTRUE;
327 // convert to ESD track here
328 AliESDtrack esdTrack(track);
329 // set the TPC cluster info
330 esdTrack.SetTPCClusterMap(track->GetTPCClusterMap());
331 esdTrack.SetTPCSharedMap(track->GetTPCSharedMap());
332 esdTrack.SetTPCPointsF(track->GetTPCNclsF());
333 // needed to calculate the impact parameters
334 esdTrack.RelateToVertex(primary,0.,3.);
336 if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
338 if(fOptPileup==kRejectTracksFromPileupVertex){
340 // we need either to have here the AOD Event,
341 // or to have the pileup vertex object
345 //---------------------------------------------------------------------------
346 void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
350 delete [] fPtBinLimits;
352 printf("Changing the pt bins\n");
355 if(nPtBinLimits != fnPtBins+1){
356 cout<<"Warning: ptBinLimits dimention "<<nPtBinLimits<<" != nPtBins+1 ("<<fnPtBins+1<<")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;
357 SetNPtBins(nPtBinLimits-1);
360 fnPtBinLimits = nPtBinLimits;
362 //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
363 fPtBinLimits = new Float_t[fnPtBinLimits];
364 for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
368 //---------------------------------------------------------------------------
369 void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){
370 // Set the variable names
375 //printf("Changing the variable names\n");
378 printf("Wrong number of variables: it has to be %d\n",fnVars);
382 fVarNames = new TString[nVars];
383 fIsUpperCut = new Bool_t[nVars];
384 for(Int_t iv=0; iv<nVars; iv++) {
385 fVarNames[iv] = varNames[iv];
386 fIsUpperCut[iv] = isUpperCut[iv];
391 //---------------------------------------------------------------------------
392 void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {
393 // Set the variables to be used for cuts optimization
396 delete [] fVarsForOpt;
398 //printf("Changing the variables for cut optimization\n");
401 if(nVars==0){//!=fnVars) {
402 printf("%d not accepted as number of variables: it has to be %d\n",nVars,fnVars);
407 fVarsForOpt = new Bool_t[fnVars];
408 for(Int_t iv=0; iv<fnVars; iv++) {
409 fVarsForOpt[iv]=forOpt[iv];
410 if(fVarsForOpt[iv]) fnVarsForOpt++;
416 //---------------------------------------------------------------------------
417 void AliRDHFCuts::SetUseCentrality(Int_t flag) {
419 // set centrality estimator
422 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid) AliWarning("Centrality estimator not valid");
428 //---------------------------------------------------------------------------
429 void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) {
434 printf("Wrong number of variables: it has to be %d\n",fnVars);
437 if(nPtBins!=fnPtBins) {
438 printf("Wrong number of pt bins: it has to be %d\n",fnPtBins);
442 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
445 for(Int_t iv=0; iv<fnVars; iv++) {
447 for(Int_t ib=0; ib<fnPtBins; ib++) {
450 if(GetGlobalIndex(iv,ib)>=fGlobalIndex) {
451 cout<<"Overflow, exit..."<<endl;
455 fCutsRD[GetGlobalIndex(iv,ib)] = cutsRD[iv][ib];
461 //---------------------------------------------------------------------------
462 void AliRDHFCuts::SetCuts(Int_t glIndex,Float_t* cutsRDGlob){
466 if(glIndex != fGlobalIndex){
467 cout<<"Wrong array size: it has to be "<<fGlobalIndex<<endl;
470 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
472 for(Int_t iGl=0;iGl<fGlobalIndex;iGl++){
473 fCutsRD[iGl] = cutsRDGlob[iGl];
477 //---------------------------------------------------------------------------
478 void AliRDHFCuts::PrintAll() const {
480 // print all cuts values
483 printf("Minimum vtx type %d\n",fMinVtxType);
484 printf("Minimum vtx contr %d\n",fMinVtxContr);
485 printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
486 printf("Min SPD mult %d\n",fMinSPDMultiplicity);
487 printf("Use PID %d\n",(Int_t)fUsePID);
488 printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
489 printf("Pileup rejection: %s\n",(fOptPileup > 0) ? "Yes" : "No");
490 if(fOptPileup==1) printf(" -- Reject pileup event");
491 if(fOptPileup==2) printf(" -- Reject tracks from pileup vtx");
492 if(fUseCentrality>0) {
493 TString estimator="";
494 if(fUseCentrality==1) estimator = "V0";
495 if(fUseCentrality==2) estimator = "Tracks";
496 if(fUseCentrality==3) estimator = "Tracklets";
497 if(fUseCentrality==4) estimator = "SPD clusters outer";
498 printf("Centrality class considered: %.1f-%.1f, estimated with %s",fMinCentrality,fMaxCentrality,estimator.Data());
502 cout<<"Array of variables"<<endl;
503 for(Int_t iv=0;iv<fnVars;iv++){
504 cout<<fVarNames[iv]<<"\t";
509 cout<<"Array of optimization"<<endl;
510 for(Int_t iv=0;iv<fnVars;iv++){
511 cout<<fVarsForOpt[iv]<<"\t";
516 cout<<"Array of upper/lower cut"<<endl;
517 for(Int_t iv=0;iv<fnVars;iv++){
518 cout<<fIsUpperCut[iv]<<"\t";
523 cout<<"Array of ptbin limits"<<endl;
524 for(Int_t ib=0;ib<fnPtBinLimits;ib++){
525 cout<<fPtBinLimits[ib]<<"\t";
530 cout<<"Matrix of cuts"<<endl;
531 for(Int_t iv=0;iv<fnVars;iv++){
532 for(Int_t ib=0;ib<fnPtBins;ib++){
533 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";
541 //---------------------------------------------------------------------------
542 void AliRDHFCuts::GetCuts(Float_t**& cutsRD) const{
547 //cout<<"Give back a "<<fnVars<<"x"<<fnPtBins<<" matrix."<<endl;
552 //cout<<"Initialization..."<<endl;
553 cutsRD=new Float_t*[fnVars];
554 for(iv=0; iv<fnVars; iv++) {
555 cutsRD[iv] = new Float_t[fnPtBins];
559 for(Int_t iGlobal=0; iGlobal<fGlobalIndex; iGlobal++) {
560 GetVarPtIndex(iGlobal,iv,ib);
561 cutsRD[iv][ib] = fCutsRD[iGlobal];
567 //---------------------------------------------------------------------------
568 Int_t AliRDHFCuts::GetGlobalIndex(Int_t iVar,Int_t iPtBin) const{
570 // give the global index from variable and pt bin
572 return iPtBin*fnVars+iVar;
575 //---------------------------------------------------------------------------
576 void AliRDHFCuts::GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const {
578 //give the index of the variable and of the pt bin from the global index
580 iPtBin=(Int_t)iGlob/fnVars;
586 //---------------------------------------------------------------------------
587 Int_t AliRDHFCuts::PtBin(Double_t pt) const {
589 //give the pt bin where the pt lies.
592 if(pt<fPtBinLimits[0])return ptbin;
593 for (Int_t i=0;i<fnPtBins;i++){
594 if(pt<fPtBinLimits[i+1]) {
601 //-------------------------------------------------------------------
602 Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {
604 // Give the value of cut set for the variable iVar and the pt bin iPtBin
607 cout<<"Cuts not iniziaisez yet"<<endl;
610 return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
612 //-------------------------------------------------------------------
613 Float_t AliRDHFCuts::GetCentrality(AliAODEvent* aodEvent,AliRDHFCuts::ECentrality estimator) const {
615 // Get centrality percentile
617 AliAODHeader *header=aodEvent->GetHeader();
618 AliCentrality *centrality=header->GetCentralityP();
620 if(!centrality) return cent;
622 if (estimator==kCentV0M) cent=(Float_t)(centrality->GetCentralityPercentile("V0M"));
624 if (estimator==kCentTRK) cent=(Float_t)(centrality->GetCentralityPercentile("TRK"));
626 if (estimator==kCentTKL) cent=(Float_t)(centrality->GetCentralityPercentile("TKL"));
628 if (estimator==kCentCL1) cent=(Float_t)(centrality->GetCentralityPercentile("CL1"));
630 AliWarning("Centrality estimator not valid");
639 //-------------------------------------------------------------------
640 Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
642 // Compare two cuts objects
645 Bool_t areEqual=kTRUE;
647 if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
649 if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
651 if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) { printf("Max vtx red chi2 %f %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
653 if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) { printf("Min SPD mult %d\n %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
655 if(fUsePID!=obj->fUsePID) { printf("Use PID %d %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
657 if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
659 if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
661 if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
663 if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
665 if(fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)!=obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)) {printf("ClusterReq SPD %d %d\n",fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD),obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)); areEqual=kFALSE;}
669 for(Int_t iv=0;iv<fnVars;iv++) {
670 for(Int_t ib=0;ib<fnPtBins;ib++) {
671 if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
672 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<" "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
681 //---------------------------------------------------------------------------
682 void AliRDHFCuts::MakeTable() const {
684 // print cuts values in table format
687 TString ptString = "pT range";
688 if(fVarNames && fPtBinLimits && fCutsRD){
689 TString firstLine(Form("* %-15s",ptString.Data()));
690 for (Int_t ivar=0; ivar<fnVars; ivar++){
691 firstLine+=Form("* %-15s ",fVarNames[ivar].Data());
696 Printf("%s",firstLine.Data());
698 for (Int_t ipt=0; ipt<fnPtBins; ipt++){
700 if (ipt==fnPtBins-1){
701 line=Form("* %5.1f < pt < inf ",fPtBinLimits[ipt]);
704 line=Form("* %5.1f < pt < %4.1f ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);
706 for (Int_t ivar=0; ivar<fnVars; ivar++){
707 line+=Form("* %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);
709 Printf("%s",line.Data());
717 //--------------------------------------------------------------------------
718 Bool_t AliRDHFCuts::RecalcOwnPrimaryVtx(AliAODRecoDecayHF *d,AliAODEvent *aod,
719 AliAODVertex *origownvtx,AliAODVertex *recvtx) const
722 // Recalculate primary vertex without daughters
726 AliError("Can not remove daughters from vertex without AOD event");
729 if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());
730 recvtx=d->RemoveDaughtersFromPrimaryVtx(aod);
732 AliDebug(2,"Removal of daughter tracks failed");
739 //set recalculed primary vertex
740 d->SetOwnPrimaryVtx(recvtx);
741 delete recvtx; recvtx=NULL;
745 //--------------------------------------------------------------------------
746 void AliRDHFCuts::CleanOwnPrimaryVtx(AliAODRecoDecayHF *d,AliAODVertex *origownvtx) const
749 // Clean-up own primary vertex if needed
753 d->SetOwnPrimaryVtx(origownvtx);
756 } else if(fRemoveDaughtersFromPrimary) {
757 d->UnsetOwnPrimaryVtx();
758 AliDebug(3,"delete new vertex\n");