]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Possibility to recompute primary vertex
authorprino <prino@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 5 Mar 2012 11:17:29 +0000 (11:17 +0000)
committerprino <prino@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 5 Mar 2012 11:17:29 +0000 (11:17 +0000)
PWGHF/vertexingHF/AliRDHFCuts.cxx
PWGHF/vertexingHF/AliRDHFCuts.h

index aef6c5ec31b3bcc8773f7d841a61c7ceef70bd06..f6b8157f73c6b318ffc36dcd1bb7602f875e8b14 100644 (file)
@@ -38,6 +38,7 @@
 #include "AliAnalysisVertexingHF.h"
 #include "AliAODMCHeader.h"
 #include "AliAODMCParticle.h"
+#include "AliVertexerTracks.h"
 #include "AliRDHFCuts.h"
 #include "AliAnalysisManager.h"
 #include "AliInputEventHandler.h"
@@ -73,6 +74,7 @@ fPidHF(0),
 fWhyRejection(0),
 fEvRejectionBits(0),
 fRemoveDaughtersFromPrimary(kFALSE),
+fRecomputePrimVertex(kFALSE),
 fUseMCVertex(kFALSE),
 fUsePhysicsSelection(kTRUE),
 fOptPileup(0),
@@ -122,6 +124,7 @@ AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
   fWhyRejection(source.fWhyRejection),
   fEvRejectionBits(source.fEvRejectionBits),
   fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
+  fRecomputePrimVertex(source.fRecomputePrimVertex),
   fUseMCVertex(source.fUseMCVertex),
   fUsePhysicsSelection(source.fUsePhysicsSelection),
   fOptPileup(source.fOptPileup),
@@ -182,6 +185,7 @@ AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
   fWhyRejection=source.fWhyRejection;
   fEvRejectionBits=source.fEvRejectionBits;
   fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
+  fRecomputePrimVertex=source.fRecomputePrimVertex;
   fUseMCVertex=source.fUseMCVertex;
   fUsePhysicsSelection=source.fUsePhysicsSelection;
   fOptPileup=source.fOptPileup;
@@ -257,6 +261,14 @@ Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
   fEvRejectionBits=0;
   Bool_t accept=kTRUE;
 
+  if(fRecomputePrimVertex){
+    Bool_t vertOK= RecomputePrimaryVertex((AliAODEvent*)event);
+    if(!vertOK){
+      fWhyRejection=6;
+      return kFALSE;
+    }
+  }
+
   // check if it's MC
   Bool_t isMC=kFALSE;
   TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)event)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
@@ -583,6 +595,7 @@ void AliRDHFCuts::PrintAll() const {
   printf("Min SPD mult %d\n",fMinSPDMultiplicity);
   printf("Use PID %d\n",(Int_t)fUsePID);
   printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
+  printf("Recompute primary vertex %d\n",(Int_t)fRecomputePrimVertex);
   printf("Physics selection: %s\n",fUsePhysicsSelection ? "Yes" : "No");
   printf("Pileup rejection: %s\n",(fOptPileup > 0) ? "Yes" : "No");
   if(fOptPileup==1) printf(" -- Reject pileup event");
@@ -1032,3 +1045,44 @@ Bool_t AliRDHFCuts::IsSignalMC(AliAODRecoDecay *d,AliAODEvent *aod,Int_t pdg) co
 }
 
 
+//--------------------------------------------------------------------------
+Bool_t AliRDHFCuts::RecomputePrimaryVertex(AliAODEvent* event) const{
+  // recompute event primary vertex from AOD tracks
+
+   AliVertexerTracks *vertexer = new AliVertexerTracks(event->GetMagneticField());
+   vertexer->SetITSMode();
+   vertexer->SetMinClusters(3);
+
+   AliAODVertex* pvtx=event->GetPrimaryVertex(); 
+   if(strstr(pvtx->GetTitle(),"VertexerTracksWithConstraint")) {
+     Float_t diamondcovxy[3];
+     event->GetDiamondCovXY(diamondcovxy);
+     Double_t pos[3]={event->GetDiamondX(),event->GetDiamondY(),0.};
+     Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
+     AliESDVertex *diamond = new AliESDVertex(pos,cov,1.,1);
+     vertexer->SetVtxStart(diamond);
+     delete diamond; diamond=NULL;
+   }
+
+   AliESDVertex* vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event); 
+   if(!vertexESD) return kFALSE;
+   if(vertexESD->GetNContributors()<=0) { 
+     //AliDebug(2,"vertexing failed"); 
+     delete vertexESD; vertexESD=NULL;
+     return kFALSE;
+   }
+   delete vertexer; vertexer=NULL;
+
+   // convert to AliAODVertex
+   Double_t pos[3],cov[6],chi2perNDF;
+   vertexESD->GetXYZ(pos); // position
+   vertexESD->GetCovMatrix(cov); //covariance matrix
+   chi2perNDF = vertexESD->GetChi2toNDF();
+   delete vertexESD; vertexESD=NULL;
+   
+   pvtx->SetPosition(pos[0],pos[1],pos[2]);
+   pvtx->SetChi2perNDF(chi2perNDF);
+   pvtx->SetCovMatrix(cov);
+
+   return kTRUE;
+}
index 443efc95d043bb2ab9cf64104643117ee8024735..d636c027e0f4fd6b1714a046a966d724ce195d2b 100644 (file)
@@ -119,6 +119,7 @@ class AliRDHFCuts : public AliAnalysisCuts
     fPidHF=new AliAODPidHF(*pidObj);
   }
   void SetRemoveDaughtersFromPrim(Bool_t removeDaughtersPrim) {fRemoveDaughtersFromPrimary=removeDaughtersPrim;}
+  void SetRecomputePrimaryVertex(Bool_t opt) {fRecomputePrimVertex=opt;}
   void SetMinPtCandidate(Double_t ptCand=-1.) {fMinPtCand=ptCand; return;}
   void SetMaxPtCandidate(Double_t ptCand=1000.) {fMaxPtCand=ptCand; return;}
   void SetOptPileup(Int_t opt=0){
@@ -241,6 +242,7 @@ class AliRDHFCuts : public AliAnalysisCuts
   void SetNVars(Int_t nVars){fnVars=nVars;}
 
   Bool_t IsSignalMC(AliAODRecoDecay *d,AliAODEvent *aod,Int_t pdg) const;
+  Bool_t RecomputePrimaryVertex(AliAODEvent* event) const;
 
   // cuts on the event
   Int_t fMinVtxType; // 0: not cut; 1: SPDZ; 2: SPD3D; 3: Tracks
@@ -270,6 +272,7 @@ class AliRDHFCuts : public AliAnalysisCuts
   Int_t fWhyRejection; // used to code the step at which candidate was rejected
   UInt_t fEvRejectionBits; //bit map storing the full info about event rejection
   Bool_t fRemoveDaughtersFromPrimary; // flag to switch on the removal of duaghters from the primary vertex computation
+  Bool_t fRecomputePrimVertex; // flag to recompute primary vertex
   Bool_t fUseMCVertex; // use MC primary vertex 
   Bool_t fUsePhysicsSelection; // use Physics selection criteria
   Int_t  fOptPileup;      // option for pielup selection
@@ -291,7 +294,7 @@ class AliRDHFCuts : public AliAnalysisCuts
   Bool_t fIsCandTrackSPDFirst; // flag to select the track kFirst criteria for pt < ptlimit
   Double_t fMaxPtCandTrackSPDFirst; // maximum pt of the candidate for which to check if the daughters fulfill kFirst criteria
 
-  ClassDef(AliRDHFCuts,21);  // base class for cuts on AOD reconstructed heavy-flavour decays
+  ClassDef(AliRDHFCuts,22);  // base class for cuts on AOD reconstructed heavy-flavour decays
 };
 
 #endif