LCOV - code coverage report
Current view: top level - STEER/ESD - AliVertexerTracks.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 31 50 62.0 %
Date: 2016-06-14 17:26:59 Functions: 30 51 58.8 %

          Line data    Source code
       1             : #ifndef ALIVERTEXERTRACKS_H
       2             : #define ALIVERTEXERTRACKS_H
       3             : /* Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
       4             :  * See cxx source for full Copyright notice                               */
       5             : 
       6             : 
       7             : //-------------------------------------------------------
       8             : // Class for vertex determination with tracks
       9             : //
      10             : //   Origin: AliITSVertexerTracks  
      11             : //           A.Dainese, Padova, andrea.dainese@pd.infn.it
      12             : //           M.Masera,  Torino, massimo.masera@to.infn.it 
      13             : //   Moved to STEER and adapted to ESD tracks: 
      14             : //           F.Prino, Torino, prino@to.infn.it 
      15             : //-------------------------------------------------------
      16             : 
      17             : /*****************************************************************************
      18             :  *                                                                           *
      19             :  * This class determines the vertex of a set of tracks.                      *
      20             :  * Different algorithms are implemented, see data member fAlgo.              *
      21             :  *                                                                           *
      22             :  *****************************************************************************/
      23             : 
      24             : #include <TObjArray.h>
      25             : #include <TMatrixD.h>
      26             : 
      27             : #include "AliLog.h"
      28             : #include "AliESDVertex.h"
      29             : 
      30             : 
      31             : class AliExternalTrackParam;
      32             : class AliVEvent;
      33             : class AliESDEvent;
      34             : class AliStrLine;
      35             : 
      36             : class AliVertexerTracks : public TObject {
      37             :   
      38             :  public:
      39             :   enum {kTOFBCShift=200, 
      40             :         kStrLinVertexFinderMinDist1=1,
      41             :         kStrLinVertexFinderMinDist0=2,
      42             :         kHelixVertexFinder=3,
      43             :         kVertexFinder1=4,
      44             :         kVertexFinder0=5,
      45             :         kMultiVertexer=6};
      46             :   enum {kBitUsed = BIT(16),kBitAccounted = BIT(17)};
      47             :   AliVertexerTracks(); 
      48             :   AliVertexerTracks(Double_t fieldkG); 
      49             :   virtual ~AliVertexerTracks();
      50             : 
      51             :   AliESDVertex* FindPrimaryVertex(const AliVEvent *vEvent);
      52             :   AliESDVertex* FindPrimaryVertex(const TObjArray *trkArrayOrig,UShort_t *idOrig);
      53             :   AliESDVertex* VertexForSelectedTracks(const TObjArray *trkArray,UShort_t *id,
      54             :                                         Bool_t optUseFitter=kTRUE,
      55             :                                         Bool_t optPropagate=kTRUE,
      56             :                                         Bool_t optUseDiamondConstraint=kFALSE);
      57             :   AliESDVertex* VertexForSelectedESDTracks(TObjArray *trkArray,
      58             :                                         Bool_t optUseFitter=kTRUE,
      59             :                                         Bool_t optPropagate=kTRUE,
      60             :                                         Bool_t optUseDiamondConstraint=kFALSE);
      61             :   AliESDVertex* RemoveTracksFromVertex(AliESDVertex *inVtx,
      62             :                                        const TObjArray *trkArray,UShort_t *id,
      63             :                                        const Float_t *diamondxy) const; 
      64             :   AliESDVertex* RemoveConstraintFromVertex(AliESDVertex *inVtx,
      65             :                                            Float_t *diamondxyz,
      66             :                                            Float_t *diamondcov) const;
      67             :   void  SetITSMode(Double_t dcacut=0.1,
      68             :                    Double_t dcacutIter0=0.1,
      69             :                    Double_t maxd0z0=0.5,
      70             :                    Int_t minCls=3,
      71             :                    Int_t mintrks=1,
      72             :                    Double_t nsigma=3.,
      73             :                    Double_t mindetfitter=100.,
      74             :                    Double_t maxtgl=1000.,
      75             :                    Double_t fidR=3.,
      76             :                    Double_t fidZ=30.,
      77             :                    Int_t finderAlgo=1,
      78             :                    Int_t finderAlgoIter0=4); 
      79             :   void  SetTPCMode(Double_t dcacut=0.1,
      80             :                    Double_t dcacutIter0=1.0,
      81             :                    Double_t maxd0z0=5.0,
      82             :                    Int_t minCls=10,
      83             :                    Int_t mintrks=1,
      84             :                    Double_t nsigma=3.,
      85             :                    Double_t mindetfitter=0.1,
      86             :                    Double_t maxtgl=1.5, 
      87             :                    Double_t fidR=3.,
      88             :                    Double_t fidZ=30.,
      89             :                    Int_t finderAlgo=1,
      90             :                    Int_t finderAlgoIter0=4); 
      91             :   void  SetCuts(Double_t *cuts, int ncuts);
      92          32 :   void  SetConstraintOff() { fConstraint=kFALSE; SetVtxStart(); SetVtxStartSigma(); return; }
      93          32 :   void  SetConstraintOn() { fConstraint=kTRUE; return; }
      94          64 :   void  SetDCAcut(Double_t maxdca) { fDCAcut=maxdca; return; }
      95          64 :   void  SetDCAcutIter0(Double_t maxdca) { fDCAcutIter0=maxdca; return; }
      96           0 :   void  SetFinderAlgorithm(Int_t opt=1) { fAlgo=opt; return; }
      97          16 :   void  SetITSrefitRequired() { fITSrefit=kTRUE; return; }
      98           8 :   void  SetITSpureSA(Bool_t v=kTRUE) { fITSpureSA=v; return; }
      99          16 :   Bool_t GetITSpureSA() { return fITSpureSA; }
     100           0 :   Bool_t GetITSrefitRequired() const { return fITSrefit; }
     101          16 :   void  SetITSrefitNotRequired() { fITSrefit=kFALSE; return; }
     102          64 :   void  SetFiducialRZ(Double_t r=3,Double_t z=30) { fFiducialR=r; fFiducialZ=z; return; }
     103          64 :   void  SetMaxd0z0(Double_t maxd0z0=0.5) { fMaxd0z0=maxd0z0; return; }
     104          64 :   void  SetMinClusters(Int_t n=5) { fMinClusters=n; return; }
     105           0 :   Int_t GetMinClusters() const { return fMinClusters; }
     106          64 :   void  SetMinTracks(Int_t n=1) { fMinTracks=n; return; }
     107          64 :   void  SetNSigmad0(Double_t n=3) { fNSigma=n; return; }
     108           0 :   Double_t GetNSigmad0() const { return fNSigma; }
     109          64 :   void  SetMinDetFitter(Double_t mindet=100.) { fMinDetFitter=mindet; return; }
     110          64 :   void  SetMaxTgl(Double_t maxtgl=1.) { fMaxTgl=maxtgl; return; }
     111           0 :   void  SetOnlyFitter() { if(!fConstraint) AliFatal("Set constraint first!"); 
     112           0 :      fOnlyFitter=kTRUE; return; }
     113             :   void  SetSkipTracks(Int_t n,const Int_t *skipped);
     114             :   void  SetVtxStart(Double_t x=0,Double_t y=0,Double_t z=0) 
     115          36 :     { fNominalPos[0]=x; fNominalPos[1]=y; fNominalPos[2]=z; return; }
     116             :   void  SetVtxStartSigma(Double_t sx=3.,Double_t sy=3.,Double_t sz=15.) 
     117          36 :     { fNominalCov[0]=sx*sx; fNominalCov[2]=sy*sy; fNominalCov[5]=sz*sz;
     118          18 :       fNominalCov[1]=0.; fNominalCov[3]=0.; fNominalCov[4]=0.; return; }
     119             :   void  SetVtxStart(AliESDVertex *vtx);
     120          16 :   void  SetSelectOnTOFBunchCrossing(Bool_t select=kFALSE,Bool_t keepAlsoUnflagged=kTRUE) {fSelectOnTOFBunchCrossing=select; fKeepAlsoUnflaggedTOFBunchCrossing=keepAlsoUnflagged; return;}
     121             :   //
     122             :   static Double_t GetStrLinMinDist(const Double_t *p0,const Double_t *p1,const Double_t *x0);
     123             :   static Double_t GetDeterminant3X3(Double_t matr[][3]);
     124             :   static void GetStrLinDerivMatrix(const Double_t *p0,const Double_t *p1,Double_t (*m)[3],Double_t *d);
     125             :   static void GetStrLinDerivMatrix(const Double_t *p0,const Double_t *p1,const Double_t *sigmasq,Double_t (*m)[3],Double_t *d);
     126             :   static AliESDVertex TrackletVertexFinder(const TClonesArray *lines, Int_t optUseWeights=0);
     127             :   static AliESDVertex TrackletVertexFinder(AliStrLine **lines, const Int_t knacc, Int_t optUseWeights=0);
     128           0 :   void     SetFieldkG(Double_t field=-999.) { fFieldkG=field; return; }
     129             :   Double_t GetFieldkG() const { 
     130        3168 :     if(fFieldkG<-99.) AliFatal("Field value not set");
     131        1584 :     return fFieldkG; } 
     132           0 :   void SetNSigmaForUi00(Double_t n=1.5) { fnSigmaForUi00=n; return; }
     133           0 :   Double_t GetNSigmaForUi00() const { return fnSigmaForUi00; }
     134             :   //
     135          32 :   void SetMVTukey2(double t=6)             {fMVTukey2     = t;}
     136          32 :   void SetMVSig2Ini(double t=1e3)          {fMVSig2Ini    = t;}
     137          32 :   void SetMVMaxSigma2(double t=3.)         {fMVMaxSigma2  = t;}
     138          32 :   void SetMVMinSig2Red(double t=0.005)     {fMVMinSig2Red = t;}
     139          32 :   void SetMVMinDst(double t=10e-4)         {fMVMinDst     = t;}
     140          32 :   void SetMVScanStep(double t=2.)          {fMVScanStep   = t;}
     141          16 :   void SetMVFinalWBinary(Bool_t v=kTRUE)   {fMVFinalWBinary = v;}
     142          32 :   void SetMVMaxWghNtr(double w=10.)        {fMVMaxWghNtr  = w;}
     143             :   //
     144             :   void   FindVerticesMV();
     145             :   Bool_t FindNextVertexMV();
     146             :   //
     147           0 :   AliESDVertex* GetCurrentVertex() const {return (AliESDVertex*)fCurrentVertex;}
     148           0 :   TObjArray*    GetVerticesArray() const {return (TObjArray*)fMVVertices;}   // RS to be removed
     149             :   void          AnalyzePileUp(AliESDEvent* esdEv);
     150          32 :   void          SetBCSpacing(Int_t ns=50) {fBCSpacing = ns;}
     151             : 
     152             :   // Configuration of multi-vertexing vis pre-clusterization of tracks
     153           0 :   void SetUseTrackClusterization(Bool_t opt=kFALSE){fClusterize=opt;}
     154           0 :   void SetDeltaZCutForCluster(Double_t cut){fDeltaZCutForCluster=cut;}
     155           0 :   void SetnSigmaZCutForCluster(Double_t cut){fnSigmaZCutForCluster=cut;}
     156           0 :   void SetDisableBCInCPass0(Bool_t v=kTRUE) {fDisableBCInCPass0 = v;}
     157             : 
     158           0 :   Bool_t GetDisableBCInCPass0()      const {return fDisableBCInCPass0;}
     159           0 :   Bool_t GetUseTrackClusterization() const {return fClusterize;}
     160           0 :   Double_t GetDeltaZCutForCluster() const {return fDeltaZCutForCluster;}
     161           0 :   Double_t GetnSigmaZCutForCluster() const {return fnSigmaZCutForCluster;}
     162             : 
     163             : 
     164             :   //
     165             :  protected:
     166             :   void     HelixVertexFinder();
     167             :   void     OneTrackVertFinder();
     168             :   Int_t    PrepareTracks(const TObjArray &trkArrayOrig,const UShort_t *idOrig,
     169             :                          Int_t optImpParCut);
     170             :   Bool_t   PropagateTrackTo(AliExternalTrackParam *track,
     171             :                             Double_t xToGo);
     172             :   Bool_t   TrackToPoint(AliExternalTrackParam *t,
     173             :                         TMatrixD &ri,TMatrixD &wWi,
     174             :                         Bool_t uUi3by3=kFALSE) const;     
     175             :   void     VertexFinder(Int_t optUseWeights=0);
     176             :   void     VertexFitter(Bool_t vfit=kTRUE, Bool_t chiCalc=kTRUE,Int_t useWeights=0);
     177             :   void     StrLinVertexFinderMinDist(Int_t optUseWeights=0);
     178             :   void     TooFewTracks();
     179             : 
     180             :   void     FindAllVertices(Int_t nTrksOrig, const TObjArray *trkArrayOrig, Double_t* zTr, Double_t* err2zTr, UShort_t* idOrig);
     181             : 
     182             :   AliESDVertex fVert;         // vertex after vertex finder
     183             :   AliESDVertex *fCurrentVertex;  // ESD vertex after fitter
     184             :   UShort_t  fMode;            // 0 ITS+TPC; 1 TPC
     185             :   Double_t  fFieldkG;         // z component of field (kGauss) 
     186             :   Double_t  fNominalPos[3];   // initial knowledge on vertex position
     187             :   Double_t  fNominalCov[6];   // initial knowledge on vertex position
     188             :   TObjArray fTrkArraySel;     // array with tracks to be processed
     189             :   UShort_t  *fIdSel;          //! IDs of the tracks (AliESDtrack::GetID())
     190             :   Int_t     *fTrksToSkip;     //! track IDs to be skipped for find and fit 
     191             :   Int_t     fNTrksToSkip;     // number of tracks to be skipped 
     192             :   Bool_t    fConstraint;      // true when "mean vertex" was set in 
     193             :                               // fNominal ... and must be used in the fit
     194             :   Bool_t    fOnlyFitter;      // primary with one fitter shot only
     195             :                               // (use only with beam constraint)
     196             :   Int_t     fMinTracks;       // minimum number of tracks
     197             :   Int_t     fMinClusters;     // minimum number of ITS or TPC clusters per track
     198             :   Double_t  fDCAcut;          // maximum DCA between 2 tracks used for vertex
     199             :   Double_t  fDCAcutIter0;     // maximum DCA between 2 tracks used for vertex
     200             :   Double_t  fNSigma;          // number of sigmas for d0 cut in PrepareTracks()
     201             :   Double_t  fMaxd0z0;         // value for sqrt(d0d0+z0z0) cut 
     202             :                               // in PrepareTracks(1) if fConstraint=kFALSE
     203             :   Double_t  fMinDetFitter;    // minimum determinant to try to invertex matrix
     204             :   Double_t  fMaxTgl;          // maximum tgl of tracks
     205             :   Bool_t    fITSrefit;        // if kTRUE (default), use only kITSrefit tracks
     206             :                               // if kFALSE, use all tracks (also TPC only)
     207             :   Bool_t    fITSpureSA;       // if kFALSE (default) skip ITSpureSA tracks
     208             :                               // if kTRUE use only those
     209             :   Double_t  fFiducialR;       // radius of fiducial cylinder for tracks 
     210             :   Double_t  fFiducialZ;       // length of fiducial cylinder for tracks
     211             :   Double_t  fnSigmaForUi00;   // n. sigmas from finder in TrackToPoint
     212             :   Int_t     fAlgo;            // option for vertex finding algorythm
     213             :   Int_t     fAlgoIter0;       // this is for iteration 0  
     214             :   // fAlgo=1 (default) finds minimum-distance point among all selected tracks
     215             :   //         approximated as straight lines 
     216             :   //         and uses errors on track parameters as weights
     217             :   // fAlgo=2 finds minimum-distance point among all the selected tracks
     218             :   //         approximated as straight lines 
     219             :   // fAlgo=3 finds the average point among DCA points of all pairs of tracks
     220             :   //         treated as helices
     221             :   // fAlgo=4 finds the average point among DCA points of all pairs of tracks
     222             :   //         approximated as straight lines 
     223             :   //         and uses errors on track parameters as weights
     224             :   // fAlgo=5 finds the average point among DCA points of all pairs of tracks
     225             :   //         approximated as straight lines 
     226             :   //
     227             :   Bool_t    fSelectOnTOFBunchCrossing;  // tracks from bunch crossing 0 
     228             :   Bool_t    fKeepAlsoUnflaggedTOFBunchCrossing; // also tracks w/o bunch crossing number (-1)
     229             :   // parameters for multivertexer
     230             :   Double_t fMVWSum;                    // sum of weights for multivertexer
     231             :   Double_t fMVWE2;                     // sum of weighted chi2's for  multivertexer
     232             :   Double_t fMVTukey2;                  // Tukey constant for multivertexer
     233             :   Double_t fMVSigma2;                  // chi2 current scaling param for multivertexer
     234             :   Double_t fMVSig2Ini;                 // initial value for fMVSigma2
     235             :   Double_t fMVMaxSigma2;               // max acceptable value for final fMVSigma2
     236             :   Double_t fMVMinSig2Red;              // min reduction of fMVSigma2 to exit the loop
     237             :   Double_t fMVMinDst;                  // min distance between vertices at two iterations to exit
     238             :   Double_t fMVScanStep;                // step of vertices scan
     239             :   Double_t fMVMaxWghNtr;               // min W-distance*Ncontr_min for close vertices
     240             :   Bool_t   fMVFinalWBinary;            // for the final fit use binary weights
     241             :   Int_t    fBCSpacing;                 // BC Spacing in ns (will define the rounding of BCid)
     242             :   TObjArray* fMVVertices;              // array of found vertices
     243             : 
     244             :   Bool_t   fDisableBCInCPass0;         // do not use BC from TOF in CPass0
     245             :   Bool_t   fClusterize;                // flag to activate track clusterization into vertices before vertex finder
     246             :   Double_t fDeltaZCutForCluster;       // minimum distance in z between tracks to create new cluster
     247             :   Double_t fnSigmaZCutForCluster;      // minimum distacnce in number of sigma along z to create new cluster
     248             :   //
     249             :  private:
     250             :   AliVertexerTracks(const AliVertexerTracks & source);
     251             :   AliVertexerTracks & operator=(const AliVertexerTracks & source);
     252             : 
     253        3780 :   ClassDef(AliVertexerTracks,18) // 3D Vertexing with tracks 
     254             : };
     255             : 
     256             : #endif
     257             : 

Generated by: LCOV version 1.11