Aux.getter for weights
[u/mrichter/AliRoot.git] / STEER / STEER / AliMillePedeRecord.h
1 #ifndef ALIMILLEPEDERECORD_H
2 #define ALIMILLEPEDERECORD_H
3
4 /**********************************************************************************************/
5 /* AliMillePedeRecords: class to store the data of single track processing                    */
6 /* Format: for each measured point the data is stored consequtively                           */
7 /* INDEX                                                      VALUE                           */
8 /* -1                                                         residual                        */
9 /* Local_param_id                                             dResidual/dLocal_param          */
10 /* ...                                                        ...                             */
11 /* -2                                                         weight of the measurement       */
12 /* Global_param_od                                            dResidual/dGlobal_param         */
13 /* ...                                                        ...                             */
14 /*                                                                                            */
15 /* The records for all processed tracks are stored in the temporary tree in orgder to be      */
16 /* reused for multiple iterations of MillePede                                                */
17 /*                                                                                            */
18 /* Author: ruben.shahoyan@cern.ch                                                             */
19 /*                                                                                            */
20 /**********************************************************************************************/
21 #include <TObject.h>
22
23 class AliMillePedeRecord : public TObject
24 {
25  public:
26   AliMillePedeRecord();
27   AliMillePedeRecord(const AliMillePedeRecord& src);
28   AliMillePedeRecord& operator=(const AliMillePedeRecord& rhs);
29   //
30   virtual    ~AliMillePedeRecord();
31   void       Reset();
32   void       Print(const Option_t *opt="")                   const;
33   //
34   Int_t      GetSize()                                       const {return fSize;}
35   Int_t     *GetIndex()                                      const {return fIndex;}
36   Int_t      GetIndex(int i)                                 const {return fIndex[i];}
37   //
38   void       GetIndexValue(Int_t i,Int_t &ind,Double_t &val) const {ind=fIndex[i]; val=fValue[i];}
39   void       AddIndexValue(Int_t ind, Double_t val);
40   void       AddResidual(Double_t val)                             {AddIndexValue(-1,val);}
41   void       AddWeight(Double_t val)                               {AddIndexValue(-2,val);}
42   void       SetWeight(Double_t w=1)                               {fWeight = w;}
43   Bool_t     IsResidual(Int_t i)                             const {return fIndex[i]==-1;}
44   Bool_t     IsWeight(Int_t i)                               const {return fIndex[i]==-2;}
45   //
46   Double_t  *GetValue()                                      const {return fValue;}
47   Double_t   GetValue(Int_t i)                               const {return fValue[i];}
48   Double_t   GetWeight()                                     const {return fWeight;}
49   //
50   void       MarkGroup(Int_t id);
51   Int_t      GetNGroups()                                    const {return fNGroups;}
52   Int_t      GetGroupID(Int_t i)                             const {return fGroupID[i]-1;}
53   Bool_t     IsGroupPresent(Int_t id)                        const;
54   UInt_t     GetRunID()                                      const {return fRunID;}
55   void       SetRunID(UInt_t run)                                  {fRunID = run;}  
56   //
57   // Aux methods
58   Double_t   GetGlobalDeriv(Int_t pnt, Int_t indx)           const;
59   Double_t   GetLocalDeriv(Int_t pnt, Int_t indx)            const;
60   Double_t   GetResidual(Int_t pnt)                          const;
61   Double_t   GetGloResWProd(Int_t indx)                      const;
62   Double_t   GetWeight(Int_t indx)                           const;
63   //
64  protected:
65   Int_t      GetDtBufferSize()                               const {return GetUniqueID()&0x0000ffff;}
66   Int_t      GetGrBufferSize()                               const {return GetUniqueID()>>16;}
67   void       SetDtBufferSize(Int_t sz)                             {SetUniqueID((GetGrBufferSize()<<16)+sz);}
68   void       SetGrBufferSize(Int_t sz)                             {SetUniqueID(GetDtBufferSize()+(sz<<16));}
69   void       ExpandDtBuffer(Int_t bfsize);
70   void       ExpandGrBuffer(Int_t bfsize);
71   //
72  protected:
73   Int_t      fSize;                             // size of the record
74   Int_t      fNGroups;                          // number of groups (e.g. detectors) contributing
75   UInt_t     fRunID;                            // run ID  
76   UShort_t*  fGroupID;                          //[fNGroups] groups id's+1 (in increasing order)
77   Int_t   *  fIndex;                            //[fSize] index of variables
78   Double32_t* fValue;                           //[fSize] array of values: derivs,residuals
79   Double32_t  fWeight;                          //global weight for the record
80   //
81   ClassDef(AliMillePedeRecord,3)                // Record of track residuals and local/global deriavtives
82 };
83
84 //_____________________________________________________________________________________________
85 inline void  AliMillePedeRecord::AddIndexValue(Int_t ind, Double_t val) 
86 {
87   // add new pair of index/value
88   if (fSize>=GetDtBufferSize()) ExpandDtBuffer(2*(fSize+1));
89   fIndex[fSize]=ind; 
90   fValue[fSize++]=val;
91 }
92
93 //_____________________________________________________________________________________________
94 inline Bool_t AliMillePedeRecord::IsGroupPresent(Int_t id) const
95 {
96   // check if group is defined
97   id++;
98   for (int i=fNGroups;i--;) if (fGroupID[i]==id) return kTRUE;
99   return kFALSE;
100 }
101
102 #endif