]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/STEER/AliLHCData.h
coverity fix
[u/mrichter/AliRoot.git] / STEER / STEER / AliLHCData.h
1 #ifndef ALILHCDATA_H
2 #define ALILHCDATA_H
3
4 /********************************************************************************
5 *                                                                               *
6 *   AliLHCData: summary of the LHC related information from LHC DIP.            *
7 *   Created from the TMap provided by the AliLHCReader with optional beginning  *
8 *                                                                               *
9 *   The data are (wrapped in the AliLHCDipValT):                                *
10 *   made of TimeStamp (double) and array of values                              *
11 *                                                                               *
12 *   Multiple entries for each type of data are possible. To obtaine number of   *
13 *   records (with distinct timestamp) for give type od records use:             *
14 *   int GetNBunchConfigMeasured(int beam) (with beam=0,1) etc.                  *
15 *                                                                               *
16 *   To get i-th entry, use brec= AliLHCDipValI* GetBunchConfigMeasured(bm,i);   *
17 *   Note: exact type of templated AliLHCDipValT pointer depends on the record   *
18 *   type, concult getters to know it.                                           *
19 *                                                                               *
20 *   Then, once the pointer is obtained, details can be accessed:                *
21 *   int nBunches = brec->GetSize();                                             *
22 *   for (int i=0;i<nBunches;i++) printf("Bunch#%d: %d\n",i,(*brec)[i]);         *
23 *                                                                               *
24 *   ATTENTION: Bunch RFBucked is NEGATIVE for bunches interacting at IR2        *
25 *                                                                               *
26 *                                                                               *
27 *                                                                               *
28 *   Author: ruben.shahoyan@cern.ch                                              *
29 *                                                                               *
30 ********************************************************************************/
31
32 #include "AliLHCDipValT.h"
33 #include "TObject.h"
34 class TObjArray;
35 //class AliLHCDipValT;
36
37 class AliDCSArray;
38 class TString;
39 class TMap;
40 class AliLHCReader;
41 class TGraph;
42
43 class AliLHCData : public TObject
44 {
45  public:
46   enum          {kStart,kNStor};
47   enum BeamID_t {kBeam1,kBeam2};
48   enum BgID_t   {kBg1,kBg2,kBg3,kNBGs};
49   enum Proj_t   {kX,kY};
50   enum Side_t   {kLeft,kRight};
51   enum Collim_t {kTCTVB4L2, kTCTVB4R2, kTCLIA4R2, kNCollimators};
52   enum ColJaw_t {kGapDn,kGapUp,kLeftDn,kLeftUp,kRightDn,kRightUp,kNJaws};
53   enum          {kMaxBSlots = 3564, kOffsBeam1=346, kOffsBeam2 = 3019};
54   enum          {kMarginSOR = 60*60*24*30, // use margin of 30 days for SOR, when looking for the 1st record
55                  kMarginEOR = 60*15};      // use margin of 15 min for EOR, when looking for the last record
56   //
57   enum {kIntTot,kIntTotAv,kIntBunchAv,
58         kLumAcqMode,kLumTot,kLumTotErr,kLumBunch,kLumBunchErr,kLumCrossAng,kLumCrossAngErr,
59         kBunchConf,kFillNum,kBunchLgtNB,kBunchLgt,kBunchLgtFillB,
60         kRCInjSch,kRCBeta,kRCCrossAng,kRCVang,
61         kBeamSzAcqMode,kBeamSzSigH,kBeamSzSigV,kBeamSzEmittH,kBeamSzEmittV,kBeamSzSigHErr,kBeamSzSigVErr,
62         kCollPos,
63         kBPTXdeltaTB1B2,
64         kBPTXdeltaTRMSB1B2,
65         kBPTXPhase,
66         kBPTXPhaseRMS,
67         kBPTXPhaseShift,
68         //
69         kALILumiTotalInst,
70         kALILumiTotalDeliveredStabBeam,
71         kALILumiBunchInst,
72         kALIBackground,
73         kNRecordTypes};
74   //
75   //le
76  public:
77   //
78  AliLHCData() : fTMin(0),fTMax(1e10),fFillNumber(0),fData(0),fkFile2Process(0),fkMap2Process(0) {Clear();}
79   AliLHCData(const TMap*   dcsMap,  double tmin=0, double tmax=1.e10);
80   AliLHCData(const Char_t* dcsFile, double tmin=0, double tmax=1.e10);
81   virtual ~AliLHCData() {}
82   //
83   Bool_t                FillData(const TMap*   dcsMap,  double tmin=0, double tmax=1.e20);
84   Bool_t                FillData(const Char_t* dcsFile, double tmin=0, double tmax=1.e20);
85   Double_t              GetTMin()                                    const {return fTMin;}
86   Double_t              GetTMax()                                    const {return fTMax;}
87   Int_t                 GetFillNumber()                              const {return fFillNumber;}
88   void                  SetFillNumber(Int_t fill)                          {fFillNumber = fill;}
89   void                  SetTMin(Double_t t)                                {fTMin = t<0?0:(t>1e10?1e10:t);}
90   void                  SetTMax(Double_t t)                                {fTMax = t<0?0:(t>1e10?1e10:t);}
91   //
92   virtual void          Print(const Option_t *opt="")                const;
93   TGraph*               ExportGraph(Int_t *coord, Int_t elID=0)      const;
94   //
95   Int_t GetNBunchConfigMeasured(int bm)           const {return GoodPairID(bm)?fBunchConfMeas[bm][kNStor]:-1;}
96   Int_t GetNBunchConfigDeclared(int bm)           const {return GoodPairID(bm)?fBunchConfDecl[bm][kNStor]:-1;}
97   Int_t GetNBunchLengths(int bm)                  const {return GoodPairID(bm)?fBunchLengths[bm][kNStor]:-1;}
98   Int_t GetNTotalIntensity(int bm)                const {return GoodPairID(bm)?fIntensTotal[bm][kNStor]:-1;}
99   Int_t GetNTotalIntensityAv(int bm)              const {return GoodPairID(bm)?fIntensTotalAv[bm][kNStor]:-1;}
100   Int_t GetNIntensityPerBunch(int bm)             const {return GoodPairID(bm)?fIntensPerBunch[bm][kNStor]:-1;}
101   Int_t GetNEmittanceH(int bm)                    const {return GoodPairID(bm)?fEmittanceH[bm][kNStor]:-1;}
102   Int_t GetNEmittanceV(int bm)                    const {return GoodPairID(bm)?fEmittanceV[bm][kNStor]:-1;}
103   Int_t GetNBeamSigmaH(int bm)                    const {return GoodPairID(bm)?fBeamSigmaH[bm][kNStor]:-1;}
104   Int_t GetNBeamSigmaV(int bm)                    const {return GoodPairID(bm)?fBeamSigmaV[bm][kNStor]:-1;}
105   //
106   Int_t GetNLuminosityTotal(int lr)               const {return GoodPairID(lr)?fLuminTotal[lr][kNStor]:-1;}
107   Int_t GetNLuminosityPerBunch(int lr)            const {return GoodPairID(lr)?fLuminPerBC[lr][kNStor]:-1;}
108   Int_t GetNLuminosityAcqMode(int lr)             const {return GoodPairID(lr)?fLuminAcqMode[lr][kNStor]:-1;}
109   Int_t GetNCrossingAngle(int lr)                 const {return GoodPairID(lr)?fCrossAngle[lr][kNStor]:-1;}
110   //
111   Int_t GetNInjectionScheme()                     const {return fRCInjScheme[kNStor];}
112   Int_t GetNRCBetaStar()                          const {return fRCBeta[kNStor];}
113   Int_t GetNRCAngleH()                            const {return fRCAngH[kNStor];}
114   Int_t GetNRCAngleV()                            const {return fRCAngV[kNStor];}
115   //
116   Int_t GetNLumiAlice()                           const {return fLumiAlice[kNStor];}
117   Int_t GetNLumiAliceSBDelivered()                const {return fLumiAliceStB[kNStor];}
118   Int_t GetNLumiAliceBunch()                      const {return fLumiAliceBbB[kNStor];}  
119   //
120   Int_t GetNBckgAlice(int bg)                     const {return (bg>-1&&bg<kNBGs) ? fBckgAlice[bg][kNStor] : -1;}
121   //
122   Int_t GetNBPTXdeltaTB1B2()                      const {return fBPTXdTB1B2[kNStor];}
123   Int_t GetNBPTXdeltaTRMSB1B2()                   const {return fBPTXdTRMSB1B2[kNStor];}
124   Int_t GetNBPTXPhase(int bm)                     const {return GoodPairID(bm)?fBPTXPhase[bm][kNStor]:-1;}
125   Int_t GetNBPTXPhaseRMS(int bm)                  const {return GoodPairID(bm)?fBPTXPhaseRMS[bm][kNStor]:-1;}
126   Int_t GetNBPTXPhaseShift(int bm)                const {return GoodPairID(bm)?fBPTXPhaseShift[bm][kNStor]:-1;}
127   //
128   //
129   Int_t GetNCollimatorJawPos(int coll,int jaw)    const;
130   //
131   AliLHCDipValI* GetBunchConfigMeasured(int bm, int i=0)  const;
132   AliLHCDipValF* GetBunchLengths(int bm, int i=0)         const;
133   AliLHCDipValI* GetBunchConfigDeclared(int bm, int i=0)  const;
134   AliLHCDipValF* GetTotalIntensity(int bm, int i=0)       const;
135   AliLHCDipValF* GetTotalIntensityAv(int bm, int i=0)     const;
136   AliLHCDipValF* GetIntensityPerBunch(int bm, int i=0)    const;
137   AliLHCDipValF* GetEmittanceH(int bm, int i=0)           const;
138   AliLHCDipValF* GetEmittanceV(int bm, int i=0)           const;
139   AliLHCDipValF* GetBeamSigmaH(int bm, int i=0)           const;
140   AliLHCDipValF* GetBeamSigmaV(int bm, int i=0)           const;
141   AliLHCDipValF* GetLuminosityTotal(int lr, int i=0)      const;
142   AliLHCDipValF* GetLuminosityPerBunch(int lr, int i=0)   const;
143   AliLHCDipValI* GetLuminosityAcqMode(int lr, int i=0)    const;
144   AliLHCDipValF* GetCrossAngle(int lr, int i=0)           const;
145   AliLHCDipValC* GetInjectionScheme(int i=0)              const;
146   AliLHCDipValF* GetRCBetaStar(int i=0)                   const;
147   AliLHCDipValF* GetRCAngleH(int i=0)                     const; 
148   AliLHCDipValF* GetRCAngleV(int i=0)                     const; 
149   AliLHCDipValF* GetCollimJawPos(int coll, int jaw, int i=0) const;
150   //
151   AliLHCDipValF* GetLumiAlice(int i=0)                    const; 
152   AliLHCDipValF* GetLumiAliceSBDelivered(int i=0)         const; 
153   AliLHCDipValF* GetLumiAliceBunch(int i=0)               const; 
154   AliLHCDipValF* GetBckgAlice(int bg, int i=0)            const; 
155   //
156   AliLHCDipValF* GetBPTXdeltaTB1B2(int i=0)               const;
157   AliLHCDipValF* GetBPTXdeltaTRMSB1B2(int i=0)            const;
158   AliLHCDipValF* GetBPTXPhase(int bm, int i=0)            const;
159   AliLHCDipValF* GetBPTXPhaseRMS(int bm, int i=0)         const;
160   AliLHCDipValF* GetBPTXPhaseShift(int bm, int i=0)       const;
161   //
162   Float_t        GetLumiAlice(Double_t tstamp)            const;
163   Float_t        GetLumiAliceSBDelivered(Double_t tstamp) const;
164   Float_t        GetBckgAlice(Int_t bg,Double_t tstamp)   const;
165   //
166   //  Float_t        GetLumiInstAlice(Double_t tstamp)        const;
167   //  Float_t        GetBckgInstAlice(Double_t tstamp)        const;
168   //
169   void           FlagInteractingBunches(const Int_t beam1[2],const Int_t beam2[2]);
170   TObject*       FindRecValidFor(int start,int nrec, double tstamp) const;
171   Int_t          FindEntryValidFor(int start,int nrec, double tstamp) const;
172   AliLHCDipValI* GetBunchConfigMeasured(int beam,double tstamp)  const;
173   AliLHCDipValI* GetBunchConfigDeclared(int beam,double tstamp)  const;
174   Int_t          GetNInteractingBunchesMeasured(int i=0)         const;
175   Int_t          GetNInteractingBunchesDeclared(int i=0)         const;
176   Int_t          IsPilotPresent(int i=0)                         const;
177   //
178   // return array with beginning [0] and number of records for corresponding info (in the fData)
179   const Int_t* GetOffsBunchConfigMeasured(int bm)         const {return GoodPairID(bm)?fBunchConfMeas[bm]:0;}
180   const Int_t* GetOffsBunchConfigDeclared(int bm)         const {return GoodPairID(bm)?fBunchConfDecl[bm]:0;}
181   const Int_t* GetOffsBunchLengths(int bm)                const {return GoodPairID(bm)?fBunchLengths[bm]:0;}
182   const Int_t* GetOffsTotalIntensity(int bm)              const {return GoodPairID(bm)?fIntensTotal[bm]:0;}
183   const Int_t* GetOffsTotalIntensityAv(int bm)            const {return GoodPairID(bm)?fIntensTotalAv[bm]:0;}
184   const Int_t* GetOffsIntensityPerBunch(int bm)           const {return GoodPairID(bm)?fIntensPerBunch[bm]:0;}
185   const Int_t* GetOffsEmittanceH(int bm)                  const {return GoodPairID(bm)?fEmittanceH[bm]:0;}
186   const Int_t* GetOffsEmittanceV(int bm)                  const {return GoodPairID(bm)?fEmittanceV[bm]:0;}
187   const Int_t* GetOffsBeamSigmaH(int bm)                  const {return GoodPairID(bm)?fBeamSigmaH[bm]:0;}
188   const Int_t* GetOffsBeamSigmaV(int bm)                  const {return GoodPairID(bm)?fBeamSigmaV[bm]:0;}
189   //
190   const Int_t* GetOffsLuminosityTotal(int lr)             const {return GoodPairID(lr)?fLuminTotal[lr]:0;}
191   const Int_t* GetOffsLuminosityPerBunch(int lr)          const {return GoodPairID(lr)?fLuminPerBC[lr]:0;}
192   const Int_t* GetOffsLuminosityAcqMode(int lr)           const {return GoodPairID(lr)?fLuminAcqMode[lr]:0;}
193   const Int_t* GetOffsCrossingAngle(int lr)               const {return GoodPairID(lr)?fCrossAngle[lr]:0;}
194   //
195   const Int_t* GetOffsInjectionScheme()                   const {return fRCInjScheme;}
196   const Int_t* GetOffsRCBetaStar()                        const {return fRCBeta;}
197   const Int_t* GetOffsRCAngleH()                          const {return fRCAngH;}
198   const Int_t* GetOffsRCAngleV()                          const {return fRCAngV;}
199   //
200   const Int_t* GetOffsLumiAlice()                         const {return fLumiAlice;}
201   const Int_t* GetOffsLumiAliceSBDelivered()              const {return fLumiAliceStB;}
202   const Int_t* GetOffsLumiAliceBunch()                    const {return fLumiAliceBbB;}
203   const Int_t* GetOffsBckgAlice(int bg)                   const {return (bg>-1&&bg<kNBGs) ? fBckgAlice[bg] : 0;}
204   //
205   const Int_t* GetOffsBPTXdeltaTB1B2()                       const {return fBPTXdTB1B2;}
206   const Int_t* GetOffsBPTXdeltaTRMSB1B2()                    const {return fBPTXdTRMSB1B2;}
207   const Int_t* GetOffsBPTXPhase(int bm)                      const {return GoodPairID(bm)?fBPTXPhase[bm]:0;}
208   const Int_t* GetOffsBPTXPhaseRMS(int bm)                   const {return GoodPairID(bm)?fBPTXPhaseRMS[bm]:0;}
209   const Int_t* GetOffsBPTXPhaseShift(int bm)                 const {return GoodPairID(bm)?fBPTXPhaseShift[bm]:0;}
210   //
211   const Int_t* GetOffsCollimatorJawPos(int coll,int jaw)  const;
212   //
213   const TObjArray&  GetData()                             const {return fData;}
214   //
215   // analysis methods
216   Int_t GetMeanIntensity(int beamID, Double_t &colliding, Double_t &noncolliding, const TObjArray* bcmasks=0) const;
217   static Int_t GetBCId(int bucket, int beamID)                  {return (TMath::Abs(bucket)/10 + (beamID==0 ? kOffsBeam1:kOffsBeam2))%kMaxBSlots;}
218   //
219   // for retrofitting, these methods has to be public
220   //  void                  FillLumiAliceOFL(Int_t nrec, Int_t* time, Double_t* val);
221   //  void                  FillBckgAliceOFL(Int_t nrec, Int_t* time, Double_t* val);
222
223  protected:
224   //
225   Bool_t                FillData(double tmin=0, double tmax=1.e20);
226   virtual void          Clear(const Option_t *opt="");
227   void                  PrintAux(Bool_t full,const Int_t refs[2],const Option_t *opt="") const;
228   TObjArray*            GetDCSEntry(const char* key,int &entry,int &last,double tmin,double tmax) const;
229   Int_t                 FillScalarRecord(  int refs[2], const char* rec, const char* recErr=0, Double_t maxAbsVal=1.e30);
230   Int_t                 FillBunchConfig(   int refs[2], const char* rec);
231   Int_t                 FillStringRecord(  int refs[2], const char* rec);
232   Int_t                 FillAcqMode(       int refs[2], const char* rec);
233   Int_t                 FillBunchInfo(     int refs[2], const char* rec,int ibm, Bool_t inRealSlots, Double_t maxAbsVal=1.e30);
234   Int_t                 FillBCLuminosities(int refs[2], const char* rec, const char* recErr, Int_t useBeam, Double_t maxAbsVal=1.e30);
235   //
236   Int_t                 ExtractInt(AliDCSArray* dcsArray,Int_t el)    const;
237   Double_t              ExtractDouble(AliDCSArray* dcsArray,Int_t el) const;
238   TString&              ExtractString(AliDCSArray* dcsArray)          const;
239   AliLHCData(const AliLHCData& src) : TObject(src),fTMin(0),fTMax(0),fFillNumber(0),fData(0),fkFile2Process(0),fkMap2Process(0) { /*dummy*/ }
240   AliLHCData& operator=(const AliLHCData& ) { /*dummy*/ return *this;}
241   Int_t                 TimeDifference(double v1,double v2,double tol=0.9) const;
242   Bool_t                IzZero(double val, double tol=1e-16)         const {return TMath::Abs(val)<tol;}
243   Bool_t                GoodPairID(int beam)                         const;
244   //
245  protected:
246   //
247   Double_t        fTMin;                              // selection timeMin
248   Double_t        fTMax;                              // selection timeMax
249   Int_t           fFillNumber;                        // fill number           : kFillNum
250   //
251   //---------------- Last index gives: 0 - beginning of the records in fData, 1 - number of records
252   //
253   //              infrormation from RunControl
254   Int_t           fRCInjScheme[2];                    // active injection scheme                       : String |kRCInjScheme
255   Int_t           fRCBeta[2];                         // target beta                                   : Float  |kRCBeta
256   Int_t           fRCAngH[2];                         // horisontal angle                              : Float  |kRCCrossAng
257   Int_t           fRCAngV[2];                         // vertical angle                                : Float  |kRCVang
258   Int_t           fBunchConfDecl[2][2];               // declared beam configuration                   : Float  |kBunchConf                
259   //
260   //              measured information
261   Int_t           fBunchConfMeas[2][2];               // measured beam configuration                   : Int    |kBunchLgtFillB
262   Int_t           fBunchLengths[2][2];                // measured beam lenghts                         : Float  |kBunchLgt
263   Int_t           fIntensTotal[2][2];                 // total beam intensities                        : Float  |kIntTot
264   Int_t           fIntensTotalAv[2][2];               // total beam intensities from bunch averages    : Float  |kIntTotAv
265   Int_t           fIntensPerBunch[2][2];              // bunch-by-bunch intensities                    : Float  |kIntBunchAv
266   //
267   Int_t           fCrossAngle[2][2];                  // crossing angle   at IP2 and its error         : Float  |kLimCrossAng, kLumCrossAngErr
268   Int_t           fEmittanceH[2][2];                  // beam H emittances                             : Float  |kBeamSzEmittH
269   Int_t           fEmittanceV[2][2];                  // beam V emittances                             : Float  |kBeamSzEmittV
270   Int_t           fBeamSigmaH[2][2];                  // beam H sigma and error                        : Float  |kBeamSzSigH,kBeamSzSigHErr
271   Int_t           fBeamSigmaV[2][2];                  // beam V sigma and error                        : Float  |kBeamSzSigV,kBeamSzSigVErr
272   //
273   Int_t           fLuminTotal[2][2];                  // total luminosity at IP2 and its error         : Float  |kLumTot, kLumTotErr
274   Int_t           fLuminPerBC[2][2];                  // luminosity at IP2 for each BC and its error   : Float  |kLumBunch,kLumBunchErr
275   Int_t           fLuminAcqMode[2][2];                // luminosity acquisition mode                   : Int    |kLumAcqMode
276   //
277   // here we will store the luminosity and the background measured by Alice. We store the value integrated from the start of fill.
278   // the inst. value can be obtained as its derivative
279   Int_t           fLumiAlice[2];                      // luminosity measured by Alice, Total_Inst      : Float  |kALILumiTotalInst
280   Int_t           fLumiAliceStB[2];                   // luminosity measured by Alice, Deli.StabBeam   : Float  |kALILumiTotalDeliveredStabBeam
281   Int_t           fLumiAliceBbB[2];                   // luminosity measured by Alice, B-by-B          : Float  |kALILumiBunchInst
282   //
283   Int_t           fBckgAlice[kNBGs][2];               // backgrounds measured by Alice                 : Float  |kALIBackground1,2,3
284   //
285   Int_t           fBPTXdTB1B2[2];                     // BPTX_deltaT_B1_B2                             : Float  |kBPTXdeltaTB1B2,
286   Int_t           fBPTXdTRMSB1B2[2];                  // BPTX_deltaTRMS_B1_B2                          : Float  |kBPTXdeltaTRMSB1B2,
287   Int_t           fBPTXPhase[2][2];                   // BPTX_Phase_B1, and BPTX_Phase_B2              : Float  |kBPTXPhase
288   Int_t           fBPTXPhaseRMS[2][2];                // BPTX_PhaseRMS_B1, and BPTX_PhaseRMS_B2        : Float  |kBPTXPhaseRMS
289   Int_t           fBPTXPhaseShift[2][2];              // BPTX_Phase_Shift_B1 and BPTX_Phase_Shift_B2   : Float  |kBPTXPhaseShift 
290   //
291   Int_t           fCollimators[kNCollimators][kNJaws][2];// collimator jaws positions                  : Float  |kCollPos
292   //
293   TObjArray       fData;                              // single storage for various records
294   //
295   static const Char_t *fgkDCSNames[];                 // beam related DCS names to extract
296   static const Char_t *fgkDCSColNames[];              // collimators to extract
297   static const Char_t *fgkDCSColJaws[];               // names of collimator pieces
298   //
299  private:
300   // non-persistent objects used at the filling time
301   const Char_t*   fkFile2Process;                      //! name of DCS file
302   const TMap*     fkMap2Process;                       //! DCS map to process 
303
304   ClassDef(AliLHCData,4)
305 };
306
307
308 //_____________________________________________________________________________
309 inline Int_t AliLHCData::GetNCollimatorJawPos(int coll,int jaw) const {// get n records
310   return (coll>=0&&coll<kNCollimators&&jaw>=0&&jaw<kNJaws)? fCollimators[coll][jaw][kNStor]:0;
311 }
312
313 inline const Int_t* AliLHCData::GetOffsCollimatorJawPos(int coll,int jaw)  const { // offset array
314   return (coll>=0&&coll<kNCollimators&&jaw>=0&&jaw<kNJaws)? fCollimators[coll][jaw]:0;
315 }
316
317 inline AliLHCDipValI* AliLHCData::GetBunchConfigMeasured(int bm, int i) const { // get record
318   return (GoodPairID(bm) && i>=0 && i<fBunchConfMeas[bm][kNStor]) ? (AliLHCDipValI*)fData[fBunchConfMeas[bm][kStart]+i]:0;
319 }
320
321 inline AliLHCDipValF* AliLHCData::GetBunchLengths(int bm, int i) const { // get record
322   return (GoodPairID(bm) && i>=0 && i<fBunchLengths[bm][kNStor]) ? (AliLHCDipValF*)fData[fBunchLengths[bm][kStart]+i]:0;
323 }
324
325 inline AliLHCDipValI* AliLHCData::GetBunchConfigDeclared(int bm, int i) const { // get record
326   return (GoodPairID(bm) && i>=0 && i<fBunchConfDecl[bm][kNStor]) ? (AliLHCDipValI*)fData[fBunchConfDecl[bm][kStart]+i]:0;
327 }
328
329 inline AliLHCDipValF* AliLHCData::GetTotalIntensity(int bm, int i) const { // get record
330   return (GoodPairID(bm) && i>=0 && i<fIntensTotal[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensTotal[bm][kStart]+i]:0;
331 }
332
333 inline AliLHCDipValF* AliLHCData::GetTotalIntensityAv(int bm, int i) const { // get record
334   return (GoodPairID(bm) && i>=0 && i<fIntensTotalAv[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensTotalAv[bm][kStart]+i]:0;
335 }
336
337 inline AliLHCDipValF* AliLHCData::GetIntensityPerBunch(int bm, int i) const { // get record
338   return (GoodPairID(bm) && i>=0 && i<fIntensPerBunch[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensPerBunch[bm][kStart]+i]:0;
339 }
340
341 inline AliLHCDipValF* AliLHCData::GetEmittanceH(int bm, int i) const { // get record
342   return (GoodPairID(bm) && i>=0 && i<fEmittanceH[bm][kNStor]) ? (AliLHCDipValF*)fData[fEmittanceH[bm][kStart]+i]:0;
343 }
344
345 inline AliLHCDipValF* AliLHCData::GetEmittanceV(int bm, int i) const { // get record
346   return (GoodPairID(bm) && i>=0 && i<fEmittanceV[bm][kNStor]) ? (AliLHCDipValF*)fData[fEmittanceV[bm][kStart]+i]:0;
347 }
348
349 inline AliLHCDipValF* AliLHCData::GetBeamSigmaH(int bm, int i) const { // get record
350   return (GoodPairID(bm) && i>=0 && i<fBeamSigmaH[bm][kNStor]) ? (AliLHCDipValF*)fData[fBeamSigmaH[bm][kStart]+i]:0;
351 }
352
353 inline AliLHCDipValF* AliLHCData::GetBeamSigmaV(int bm, int i) const { // get record
354   return (GoodPairID(bm) && i>=0 && i<fBeamSigmaV[bm][kNStor]) ? (AliLHCDipValF*)fData[fBeamSigmaV[bm][kStart]+i]:0;
355 }
356
357 inline AliLHCDipValF* AliLHCData::GetLuminosityTotal(int lr, int i) const { // get record
358   return (GoodPairID(lr) && i>=0 && i<fLuminTotal[lr][kNStor]) ? (AliLHCDipValF*)fData[fLuminTotal[lr][kStart]+i]:0;
359 }
360
361 inline AliLHCDipValF* AliLHCData::GetLuminosityPerBunch(int lr, int i) const { // get record
362   return (GoodPairID(lr) && i>=0 && i<fLuminPerBC[lr][kNStor]) ? (AliLHCDipValF*)fData[fLuminPerBC[lr][kStart]+i]:0;
363 }
364
365 inline AliLHCDipValI* AliLHCData::GetLuminosityAcqMode(int lr, int i) const { // get record
366   return (GoodPairID(lr) && i>=0 && i<fLuminAcqMode[lr][kNStor]) ? (AliLHCDipValI*)fData[fLuminAcqMode[lr][kStart]+i]:0;
367 }
368
369 inline AliLHCDipValF* AliLHCData::GetCrossAngle(int lr, int i) const { // get record
370   return (GoodPairID(lr) && i>=0 && i<fCrossAngle[lr][kNStor]) ? (AliLHCDipValF*)fData[fCrossAngle[lr][kStart]+i]:0;
371 }
372
373 inline AliLHCDipValC* AliLHCData::GetInjectionScheme(int i) const { // get record
374   return (i>=0 && i<fRCInjScheme[kNStor]) ? (AliLHCDipValC*)fData[fRCInjScheme[kStart]+i]:0;
375 }
376
377 inline AliLHCDipValF* AliLHCData::GetRCBetaStar(int i) const { // get record
378   return (i>=0 && i<fRCBeta[kNStor]) ? (AliLHCDipValF*)fData[fRCBeta[kStart]+i]:0;
379 }
380
381 inline AliLHCDipValF* AliLHCData::GetRCAngleH(int i) const { // get record
382   return (i>=0 && i<fRCAngH[kNStor]) ? (AliLHCDipValF*)fData[fRCAngH[kStart]+i]:0;
383 }
384
385 inline AliLHCDipValF* AliLHCData::GetRCAngleV(int i) const { // get record
386   return (i>=0 && i<fRCAngV[kNStor]) ? (AliLHCDipValF*)fData[fRCAngV[kStart]+i]:0;
387 }
388
389 inline AliLHCDipValF* AliLHCData::GetCollimJawPos(int coll, int jaw, int i) const { // get record
390   return (coll>=0 && coll<kNCollimators && jaw>=0 && jaw<kNJaws && 
391           i>=0 && i<fCollimators[coll][jaw][kNStor]) ? (AliLHCDipValF*)fData[fCollimators[coll][jaw][kStart]+i]:0;
392 }
393
394 inline AliLHCDipValF* AliLHCData::GetLumiAlice(int i) const { // get record on integrated luminosity
395   return (i>=0 && i<fLumiAlice[kNStor]) ? (AliLHCDipValF*)fData[fLumiAlice[kStart]+i]:0;
396 }
397
398 inline AliLHCDipValF* AliLHCData::GetLumiAliceSBDelivered(int i) const { // get record on st.beam delivered luminosity
399   return (i>=0 && i<fLumiAliceStB[kNStor]) ? (AliLHCDipValF*)fData[fLumiAliceStB[kStart]+i]:0;
400 }
401
402 inline AliLHCDipValF* AliLHCData::GetLumiAliceBunch(int i) const { // get record on b-by-b luminosity
403   return (i>=0 && i<fLumiAliceBbB[kNStor]) ? (AliLHCDipValF*)fData[fLumiAliceBbB[kStart]+i]:0;
404 }
405
406 inline AliLHCDipValF* AliLHCData::GetBckgAlice(int bg, int i) const { // get record on integrated background
407   return (bg>=0&&bg<kNBGs&&i>=0&&i<fBckgAlice[bg][kNStor]) ? (AliLHCDipValF*)fData[fBckgAlice[bg][kStart]+i]:0;
408 }
409
410 inline AliLHCDipValF* AliLHCData::GetBPTXdeltaTB1B2(int i) const { // get record 
411   return (i>=0 && i<fBPTXdTB1B2[kNStor]) ? (AliLHCDipValF*)fData[fBPTXdTB1B2[kStart]+i]:0;
412 }
413
414 inline AliLHCDipValF* AliLHCData::GetBPTXdeltaTRMSB1B2(int i) const { // get record 
415   return (i>=0 && i<fBPTXdTRMSB1B2[kNStor]) ? (AliLHCDipValF*)fData[fBPTXdTRMSB1B2[kStart]+i]:0;
416 }
417
418 inline AliLHCDipValF* AliLHCData::GetBPTXPhase(int bm, int i) const { // get record 
419   return (GoodPairID(bm) && i>=0 && i<fBPTXPhase[bm][kNStor]) ? (AliLHCDipValF*)fData[fBPTXPhase[bm][kStart]+i]:0;
420 }
421
422 inline AliLHCDipValF* AliLHCData::GetBPTXPhaseRMS(int bm, int i) const { // get record 
423   return (GoodPairID(bm) && i>=0 && i<fBPTXPhaseRMS[bm][kNStor]) ? (AliLHCDipValF*)fData[fBPTXPhaseRMS[bm][kStart]+i]:0;
424 }
425
426 inline AliLHCDipValF* AliLHCData::GetBPTXPhaseShift(int bm, int i) const { // get record 
427   return (GoodPairID(bm) && i>=0 && i<fBPTXPhaseShift[bm][kNStor]) ? (AliLHCDipValF*)fData[fBPTXPhaseShift[bm][kStart]+i]:0;
428 }
429
430 inline Float_t AliLHCData::GetLumiAlice(Double_t tStamp) const { // get closest in time value on integrated luminosity
431   int idx = FindEntryValidFor(fLumiAlice[kStart],fLumiAlice[kNStor],tStamp);
432   return idx<0 ? -1 : ((AliLHCDipValF*)fData[fLumiAlice[kStart]+idx])->GetValue();
433 }
434
435 inline Float_t AliLHCData::GetLumiAliceSBDelivered(Double_t tStamp) const { // get closest in time value on delivered luminosity
436   int idx = FindEntryValidFor(fLumiAliceStB[kStart],fLumiAliceStB[kNStor],tStamp);
437   return idx<0 ? -1 : ((AliLHCDipValF*)fData[fLumiAliceStB[kStart]+idx])->GetValue();
438 }
439
440 inline Float_t AliLHCData::GetBckgAlice(int bg,Double_t tStamp) const { // get closest in time value on integrated bckg
441   if (bg<0||bg>=kNBGs) return 0;
442   int idx = FindEntryValidFor(fBckgAlice[bg][kStart],fBckgAlice[bg][kNStor],tStamp);
443   return idx<0 ? -1 : ((AliLHCDipValF*)fData[fBckgAlice[bg][kStart]+idx])->GetValue();
444 }
445
446
447
448 inline Int_t AliLHCData::FindEntryValidFor(int start,int nrec, double tstamp) const
449 {
450   // find index of record within this limits valid for given tstamp (i.e. the last one before or equal to tstamp)
451   int idx;
452   for (idx=0;idx<nrec;idx++) {
453     if (TimeDifference(tstamp,((AliLHCDipValI*)fData[start+idx])->GetTimeStamp())<=0) break;
454   }
455   return (idx<nrec) ? idx : nrec-1;
456 }
457
458 #endif