Moving the classes that belong to the following libraries: STEERBase, ESD, CDB, AOD...
[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  protected:
58   Int_t      GetDtBufferSize()                               const {return GetUniqueID()&0x0000ffff;}
59   Int_t      GetGrBufferSize()                               const {return GetUniqueID()>>16;}
60   void       SetDtBufferSize(Int_t sz)                             {SetUniqueID((GetGrBufferSize()<<16)+sz);}
61   void       SetGrBufferSize(Int_t sz)                             {SetUniqueID(GetDtBufferSize()+(sz<<16));}
62   void       ExpandDtBuffer(Int_t bfsize);
63   void       ExpandGrBuffer(Int_t bfsize);
64   //
65  protected:
66   Int_t      fSize;                             // size of the record
67   Int_t      fNGroups;                          // number of groups (e.g. detectors) contributing
68   UInt_t     fRunID;                            // run ID  
69   UShort_t*  fGroupID;                          //[fNGroups] groups id's+1 (in increasing order)
70   Int_t   *  fIndex;                            //[fSize] index of variables
71   Double32_t* fValue;                           //[fSize] array of values: derivs,residuals
72   Double32_t  fWeight;                          //global weight for the record
73   //
74   ClassDef(AliMillePedeRecord,3)                // Record of track residuals and local/global deriavtives
75 };
76
77 //_____________________________________________________________________________________________
78 inline void  AliMillePedeRecord::AddIndexValue(Int_t ind, Double_t val) 
79 {
80   // add new pair of index/value
81   if (fSize>=GetDtBufferSize()) ExpandDtBuffer(2*(fSize+1));
82   fIndex[fSize]=ind; 
83   fValue[fSize++]=val;
84 }
85
86 //_____________________________________________________________________________________________
87 inline Bool_t AliMillePedeRecord::IsGroupPresent(Int_t id) const
88 {
89   // check if group is defined
90   id++;
91   for (int i=fNGroups;i--;) if (fGroupID[i]==id) return kTRUE;
92   return kFALSE;
93 }
94
95 #endif