ROOT logo
#ifndef ALIITSUTRACKCOND_H
#define ALIITSUTRACKCOND_H

#include <TObject.h>
#include <TArrayS.h>
#include <TArrayI.h>

//------------------------------------------------------------------------------
//
// This class defines a set of hit patterns (conditions) to consider the track reconstructable
// Each condidition (few consequitive elements from fConditions array) is set of bit patterns, 
// with each element of condition defining a group of layers which must be present in the tracks.
// For instance, if we require the track to have contributions from
// {lr0 or lr1 or lr2} AND {lr2 or lr 3 or lr 4} AND {lr5 or lr6} then the condition should
// be {BIT(0)|BIT(1)|BIT(2), BIT(2)|BIT(3)|BIT(4), BIT(5)|BIT(6)}.
// Additionally, each condition may request min number of hits to be present
//
// Each AliITSUTrackCond should correspond to single track finding pass and may contain multiple
// conditions. To consider the track reconstructable it is enough to satisfy 1 condition
//
//------------------------------------------------------------------------------


class AliITSUTrackCond : public TObject
{
 public:
  enum {kCondStart,kNGroups,kMinClus,kNAuxSz};
  enum {kShiftNcl=24};  // the min_Nclusters for each pattern is stored starting from this bit
  //
  AliITSUTrackCond(Int_t nLayers=0);
  AliITSUTrackCond(const AliITSUTrackCond& src);
  AliITSUTrackCond &operator=(const AliITSUTrackCond& src);

  ~AliITSUTrackCond() {}
  
  void        SetNLayers(Int_t nl);
  void        SetClSharing(Int_t lr, Char_t v=0)   {fClSharing[lr] = v;}
  void        SetMaxBranches(Int_t lr, Int_t mb)   {fMaxBranches[lr] = mb;}
  void        SetMaxCandidates(Int_t lr, Int_t nc) {fMaxCandidates[lr] = nc;}
  void        SetID(Int_t id)                      {SetUniqueID(id);}
  void        AddNewCondition(Int_t minClusters);
  void        AddGroupPattern(UShort_t patt,Int_t ncl);

  Int_t       GetID()                                  const {return GetUniqueID();}
  Int_t       GetMaxBranches(Int_t lr)                 const {return fMaxBranches[lr];}
  Int_t       GetMaxCandidates(Int_t lr)               const {return fMaxCandidates[lr];}
  Int_t       GetNConditions()                         const {return fNConditions;}
  UShort_t    GetGroup(Int_t condID,Int_t grID)        const {return fConditions[fAuxData[condID*kNAuxSz+kCondStart]+grID];}
  Bool_t      CheckPattern(UShort_t patt)    const;
  //
  virtual void  Print(Option_t* option = "")           const;

  void        SetMaxITSTPCMatchChi2(Float_t v)               {fMaxITSTPCMatchChi2 = v;}
  void        SetMaxITSSAChi2(Int_t ncl, Float_t v)          {if (ncl>0&&ncl<=2*fNLayers) fMaxITSSAChi2[ncl-1] = v;}
  void        SetMaxTr2ClChi2(Int_t lr, Float_t v)           {fMaxTr2ClChi2[lr] = v;}
  void        SetMaxChi2GloNrm(Int_t lr, Float_t v)          {fMaxChi2GloNrm[lr] = v;}
  void        SetMissPenalty(Int_t lr,  Float_t v)           {fMissPenalty[lr] = v;}
  void        SetNSigmaRoadY(Int_t lr,  Float_t v)           {fNSigmaRoadY[lr] = v;}
  void        SetNSigmaRoadZ(Int_t lr,  Float_t v)           {fNSigmaRoadZ[lr] = v;}
  void        ExcludeLayer(Int_t lr)                         {fAllowLayers &= ~(0x1<<lr);}
  //
  Float_t     GetMaxITSTPCMatchChi2()                  const {return fMaxITSTPCMatchChi2;}
  Float_t     GetMaxITSSAChi2(Int_t ncl)               const {return fMaxITSSAChi2[ncl-1];}
  Char_t      GetClSharing(Int_t lr)                   const {return fClSharing[lr];}
  Float_t     GetMissPenalty(Int_t lr)                 const {return fMissPenalty[lr];}
  Float_t     GetMaxTr2ClChi2(Int_t lr)                const {return fMaxTr2ClChi2[lr];}
  Float_t     GetMaxChi2GloNrm(Int_t lr)               const {return fMaxChi2GloNrm[lr];}
  Float_t     GetNSigmaRoadY(Int_t lr)                 const {return fNSigmaRoadY[lr];}
  Float_t     GetNSigmaRoadZ(Int_t lr)                 const {return fNSigmaRoadZ[lr];}
  Bool_t      IsLayerExcluded(Int_t lr)                const {return !(fAllowLayers&(0x1<<lr));}
  Int_t       GetActiveLrInner()                       const {return fActiveLrInner;}
  Int_t       GetActiveLrOuter()                       const {return fActiveLrOuter;}
  UShort_t    GetAllowedLayers()                       const {return fAllowLayers;}
  //
  void        Init();
  Bool_t      IsInitDone()                             const {return fInitDone;}
  //
 protected: 
  //
  Bool_t      fInitDone;                 // initialization flag
  Char_t      fActiveLrInner;            // innermost active layer to consider
  Char_t      fActiveLrOuter;            // outermose active layer to consider
  UShort_t    fAllowLayers;              // pattern of active layers to be checked
  Int_t       fNLayers;                  // total number of layers
  Int_t       fMaxClus;                  // max number of clusters in track (by default, 2*fNLayers)
  Float_t     fMaxITSTPCMatchChi2;       // max chi2 for ITS/TPC matching
  Char_t*     fClSharing;                // [fNLayers] is cluster sharing allowed
  Short_t*    fMaxBranches;              // [fNLayers] max allowed branches per seed on each layer
  Short_t*    fMaxCandidates;            // [fNLayers] max allowed candidates per TPC seed on each layer
  Float_t*    fMaxITSSAChi2;             // [fMaxClus] max chi2 for ITS standalone fit (backward) vs N cl
  Float_t*    fMaxTr2ClChi2;             // [fNLayers] max track-to-cluster chi2
  Float_t*    fMaxChi2GloNrm;            // [fNLayers] max norm global chi2
  Float_t*    fMissPenalty;              // [fNLayers] chi2 penalty for missing hit on the layer
  Float_t*    fNSigmaRoadY;              // [fNLayers] number of sigmas in Y
  Float_t*    fNSigmaRoadZ;              // [fNLayers] number of sigmas in Z
  //
  Short_t     fNConditions;              // number of conditions defined
  TArrayI     fConditions;               // fNConditions  set of conditions
  TArrayS     fAuxData;                  // condition beginning (1st group), n groups, min clus
  //
  static Char_t  fgkClSharing;            // def cl.sharing allowed level
  static Int_t   fgkMaxBranches;          // def max number of branches per seed on current layer 
  static Int_t   fgkMaxCandidates;        // def max number of total candidates on current layer 
  static Float_t fgkMaxTr2ClChi2;         // def track-to-cluster chi2 cut
  static Float_t fgkMaxChi2GloNrm;        // def global norm chi2 cut
  static Float_t fgkMissPenalty;          // penalty for missing cluster
  static Float_t fgkMaxMatchChi2;         // max acceptable matching chi2
  static Float_t fgkMaxITSSAChi2;         // max acceptable standalone ITS backward fit chi2
  //
  ClassDef(AliITSUTrackCond,10)           // set of requirements on track hits pattern
};



#endif
 AliITSUTrackCond.h:1
 AliITSUTrackCond.h:2
 AliITSUTrackCond.h:3
 AliITSUTrackCond.h:4
 AliITSUTrackCond.h:5
 AliITSUTrackCond.h:6
 AliITSUTrackCond.h:7
 AliITSUTrackCond.h:8
 AliITSUTrackCond.h:9
 AliITSUTrackCond.h:10
 AliITSUTrackCond.h:11
 AliITSUTrackCond.h:12
 AliITSUTrackCond.h:13
 AliITSUTrackCond.h:14
 AliITSUTrackCond.h:15
 AliITSUTrackCond.h:16
 AliITSUTrackCond.h:17
 AliITSUTrackCond.h:18
 AliITSUTrackCond.h:19
 AliITSUTrackCond.h:20
 AliITSUTrackCond.h:21
 AliITSUTrackCond.h:22
 AliITSUTrackCond.h:23
 AliITSUTrackCond.h:24
 AliITSUTrackCond.h:25
 AliITSUTrackCond.h:26
 AliITSUTrackCond.h:27
 AliITSUTrackCond.h:28
 AliITSUTrackCond.h:29
 AliITSUTrackCond.h:30
 AliITSUTrackCond.h:31
 AliITSUTrackCond.h:32
 AliITSUTrackCond.h:33
 AliITSUTrackCond.h:34
 AliITSUTrackCond.h:35
 AliITSUTrackCond.h:36
 AliITSUTrackCond.h:37
 AliITSUTrackCond.h:38
 AliITSUTrackCond.h:39
 AliITSUTrackCond.h:40
 AliITSUTrackCond.h:41
 AliITSUTrackCond.h:42
 AliITSUTrackCond.h:43
 AliITSUTrackCond.h:44
 AliITSUTrackCond.h:45
 AliITSUTrackCond.h:46
 AliITSUTrackCond.h:47
 AliITSUTrackCond.h:48
 AliITSUTrackCond.h:49
 AliITSUTrackCond.h:50
 AliITSUTrackCond.h:51
 AliITSUTrackCond.h:52
 AliITSUTrackCond.h:53
 AliITSUTrackCond.h:54
 AliITSUTrackCond.h:55
 AliITSUTrackCond.h:56
 AliITSUTrackCond.h:57
 AliITSUTrackCond.h:58
 AliITSUTrackCond.h:59
 AliITSUTrackCond.h:60
 AliITSUTrackCond.h:61
 AliITSUTrackCond.h:62
 AliITSUTrackCond.h:63
 AliITSUTrackCond.h:64
 AliITSUTrackCond.h:65
 AliITSUTrackCond.h:66
 AliITSUTrackCond.h:67
 AliITSUTrackCond.h:68
 AliITSUTrackCond.h:69
 AliITSUTrackCond.h:70
 AliITSUTrackCond.h:71
 AliITSUTrackCond.h:72
 AliITSUTrackCond.h:73
 AliITSUTrackCond.h:74
 AliITSUTrackCond.h:75
 AliITSUTrackCond.h:76
 AliITSUTrackCond.h:77
 AliITSUTrackCond.h:78
 AliITSUTrackCond.h:79
 AliITSUTrackCond.h:80
 AliITSUTrackCond.h:81
 AliITSUTrackCond.h:82
 AliITSUTrackCond.h:83
 AliITSUTrackCond.h:84
 AliITSUTrackCond.h:85
 AliITSUTrackCond.h:86
 AliITSUTrackCond.h:87
 AliITSUTrackCond.h:88
 AliITSUTrackCond.h:89
 AliITSUTrackCond.h:90
 AliITSUTrackCond.h:91
 AliITSUTrackCond.h:92
 AliITSUTrackCond.h:93
 AliITSUTrackCond.h:94
 AliITSUTrackCond.h:95
 AliITSUTrackCond.h:96
 AliITSUTrackCond.h:97
 AliITSUTrackCond.h:98
 AliITSUTrackCond.h:99
 AliITSUTrackCond.h:100
 AliITSUTrackCond.h:101
 AliITSUTrackCond.h:102
 AliITSUTrackCond.h:103
 AliITSUTrackCond.h:104
 AliITSUTrackCond.h:105
 AliITSUTrackCond.h:106
 AliITSUTrackCond.h:107
 AliITSUTrackCond.h:108
 AliITSUTrackCond.h:109
 AliITSUTrackCond.h:110
 AliITSUTrackCond.h:111
 AliITSUTrackCond.h:112
 AliITSUTrackCond.h:113
 AliITSUTrackCond.h:114
 AliITSUTrackCond.h:115