]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/STEER/AliLHCData.h
end-of-line normalization
[u/mrichter/AliRoot.git] / STEER / STEER / AliLHCData.h
index c173883787927ad430175a1972ea0716a24ecd66..3d802221e31842f23c8874d4744a431577150484 100755 (executable)
-#ifndef ALILHCDATA_H\r
-#define ALILHCDATA_H\r
-\r
-/********************************************************************************\r
-*                                                                               *\r
-*   AliLHCData: summary of the LHC related information from LHC DIP.            *\r
-*   Created from the TMap provided by the AliLHCReader with optional beginning  *\r
-*                                                                               *\r
-*   The data are (wrapped in the AliLHCDipValT):                                *\r
-*   made of TimeStamp (double) and array of values                              *\r
-*                                                                               *\r
-*   Multiple entries for each type of data are possible. To obtaine number of   *\r
-*   records (with distinct timestamp) for give type od records use:             *\r
-*   int GetNBunchConfigMeasured(int beam) (with beam=0,1) etc.                  *\r
-*                                                                               *\r
-*   To get i-th entry, use brec= AliLHCDipValI* GetBunchConfigMeasured(bm,i);   *\r
-*   Note: exact type of templated AliLHCDipValT pointer depends on the record   *\r
-*   type, concult getters to know it.                                           *\r
-*                                                                               *\r
-*   Then, once the pointer is obtained, details can be accessed:                *\r
-*   int nBunches = brec->GetSize();                                             *\r
-*   for (int i=0;i<nBunches;i++) printf("Bunch#%d: %d\n",i,(*brec)[i]);         *\r
-*                                                                               *\r
-*   ATTENTION: Bunch RFBucked is NEGATIVE for bunches interacting at IR2        *\r
-*                                                                               *\r
-*                                                                               *\r
-*                                                                               *\r
-*   Author: ruben.shahoyan@cern.ch                                              *\r
-*                                                                               *\r
-********************************************************************************/\r
-\r
-#include "AliLHCDipValT.h"\r
-#include "TObject.h"\r
-class TObjArray;\r
-//class AliLHCDipValT;\r
-\r
-class AliDCSArray;\r
-class TString;\r
-class TMap;\r
-class AliLHCReader;\r
-class TGraph;\r
-\r
-class AliLHCData : public TObject\r
-{\r
- public:\r
-  enum          {kStart,kNStor};\r
-  enum BeamID_t {kBeam1,kBeam2};\r
-  enum Proj_t   {kX,kY};\r
-  enum Side_t   {kLeft,kRight};\r
-  enum Collim_t {kTCTVB4L2, kTCTVB4R2, kTCLIA4R2, kNCollimators};\r
-  enum ColJaw_t {kGapDn,kGapUp,kLeftDn,kLeftUp,kRightDn,kRightUp,kNJaws};\r
-  enum          {kMaxBSlots = 3564, kOffsBeam1=346, kOffsBeam2 = 3019};\r
-  enum          {kMarginSOR = 60*60*24*30, // use margin of 30 days for SOR, when looking for the 1st record\r
-                kMarginEOR = 60*15};      // use margin of 15 min for EOR, when looking for the last record\r
-  //\r
-  enum {kIntTot,kIntTotAv,kIntBunchAv,\r
-       kLumAcqMode,kLumTot,kLumTotErr,kLumBunch,kLumBunchErr,kLumCrossAng,kLumCrossAngErr,\r
-       kBunchConf,kFillNum,kBunchLgtNB,kBunchLgt,kBunchLgtFillB,\r
-       kRCInjSch,kRCBeta,kRCCrossAng,kRCVang,\r
-       kBeamSzAcqMode,kBeamSzSigH,kBeamSzSigV,kBeamSzEmittH,kBeamSzEmittV,kBeamSzSigHErr,kBeamSzSigVErr,\r
-       kCollPos,kLumiAlice,kBckgAlice\r
-       ,kNRecordTypes};\r
-  //\r
-  //le\r
- public:\r
-  //\r
- AliLHCData() : fTMin(0),fTMax(1e10),fFillNumber(0),fData(0),fkFile2Process(0),fkMap2Process(0) {Clear();}\r
-  AliLHCData(const TMap*   dcsMap,  double tmin=0, double tmax=1.e10);\r
-  AliLHCData(const Char_t* dcsFile, double tmin=0, double tmax=1.e10);\r
-  virtual ~AliLHCData() {}\r
-  //\r
-  Bool_t                FillData(const TMap*   dcsMap,  double tmin=0, double tmax=1.e20);\r
-  Bool_t                FillData(const Char_t* dcsFile, double tmin=0, double tmax=1.e20);\r
-  Double_t              GetTMin()                                    const {return fTMin;}\r
-  Double_t              GetTMax()                                    const {return fTMax;}\r
-  Int_t                 GetFillNumber()                              const {return fFillNumber;}\r
-  void                  SetFillNumber(Int_t fill)                          {fFillNumber = fill;}\r
-  void                  SetTMin(Double_t t)                                {fTMin = t<0?0:(t>1e10?1e10:t);}\r
-  void                  SetTMax(Double_t t)                                {fTMax = t<0?0:(t>1e10?1e10:t);}\r
-  //\r
-  virtual void          Print(const Option_t *opt="")                const;\r
-  TGraph*               ExportGraph(Int_t *coord, Int_t elID=0)      const;\r
-  //\r
-  Int_t GetNBunchConfigMeasured(int bm)           const {return GoodPairID(bm)?fBunchConfMeas[bm][kNStor]:-1;}\r
-  Int_t GetNBunchConfigDeclared(int bm)           const {return GoodPairID(bm)?fBunchConfDecl[bm][kNStor]:-1;}\r
-  Int_t GetNBunchLengths(int bm)                  const {return GoodPairID(bm)?fBunchLengths[bm][kNStor]:-1;}\r
-  Int_t GetNTotalIntensity(int bm)                const {return GoodPairID(bm)?fIntensTotal[bm][kNStor]:-1;}\r
-  Int_t GetNTotalIntensityAv(int bm)              const {return GoodPairID(bm)?fIntensTotalAv[bm][kNStor]:-1;}\r
-  Int_t GetNIntensityPerBunch(int bm)             const {return GoodPairID(bm)?fIntensPerBunch[bm][kNStor]:-1;}\r
-  Int_t GetNEmittanceH(int bm)                    const {return GoodPairID(bm)?fEmittanceH[bm][kNStor]:-1;}\r
-  Int_t GetNEmittanceV(int bm)                    const {return GoodPairID(bm)?fEmittanceV[bm][kNStor]:-1;}\r
-  Int_t GetNBeamSigmaH(int bm)                    const {return GoodPairID(bm)?fBeamSigmaH[bm][kNStor]:-1;}\r
-  Int_t GetNBeamSigmaV(int bm)                    const {return GoodPairID(bm)?fBeamSigmaV[bm][kNStor]:-1;}\r
-  //\r
-  Int_t GetNLuminosityTotal(int lr)               const {return GoodPairID(lr)?fLuminTotal[lr][kNStor]:-1;}\r
-  Int_t GetNLuminosityPerBunch(int lr)            const {return GoodPairID(lr)?fLuminPerBC[lr][kNStor]:-1;}\r
-  Int_t GetNLuminosityAcqMode(int lr)             const {return GoodPairID(lr)?fLuminAcqMode[lr][kNStor]:-1;}\r
-  Int_t GetNCrossingAngle(int lr)                 const {return GoodPairID(lr)?fCrossAngle[lr][kNStor]:-1;}\r
-  //\r
-  Int_t GetNInjectionScheme()                     const {return fRCInjScheme[kNStor];}\r
-  Int_t GetNRCBetaStar()                          const {return fRCBeta[kNStor];}\r
-  Int_t GetNRCAngleH()                            const {return fRCAngH[kNStor];}\r
-  Int_t GetNRCAngleV()                            const {return fRCAngV[kNStor];}\r
-  //\r
-  Int_t GetNLumiAlice()                           const {return fLumiAlice[kNStor];}\r
-  Int_t GetNBckgAlice()                           const {return fBckgAlice[kNStor];}\r
-  //\r
-  Int_t GetNCollimatorJawPos(int coll,int jaw)    const;\r
-  //\r
-  AliLHCDipValI* GetBunchConfigMeasured(int bm, int i=0)  const;\r
-  AliLHCDipValF* GetBunchLengths(int bm, int i=0)         const;\r
-  AliLHCDipValI* GetBunchConfigDeclared(int bm, int i=0)  const;\r
-  AliLHCDipValF* GetTotalIntensity(int bm, int i=0)       const;\r
-  AliLHCDipValF* GetTotalIntensityAv(int bm, int i=0)     const;\r
-  AliLHCDipValF* GetIntensityPerBunch(int bm, int i=0)    const;\r
-  AliLHCDipValF* GetEmittanceH(int bm, int i=0)           const;\r
-  AliLHCDipValF* GetEmittanceV(int bm, int i=0)           const;\r
-  AliLHCDipValF* GetBeamSigmaH(int bm, int i=0)           const;\r
-  AliLHCDipValF* GetBeamSigmaV(int bm, int i=0)           const;\r
-  AliLHCDipValF* GetLuminosityTotal(int lr, int i=0)      const;\r
-  AliLHCDipValF* GetLuminosityPerBunch(int lr, int i=0)   const;\r
-  AliLHCDipValI* GetLuminosityAcqMode(int lr, int i=0)    const;\r
-  AliLHCDipValF* GetCrossAngle(int lr, int i=0)           const;\r
-  AliLHCDipValC* GetInjectionScheme(int i=0)              const;\r
-  AliLHCDipValF* GetRCBetaStar(int i=0)                   const;\r
-  AliLHCDipValF* GetRCAngleH(int i=0)                     const; \r
-  AliLHCDipValF* GetRCAngleV(int i=0)                     const; \r
-  AliLHCDipValF* GetCollimJawPos(int coll, int jaw, int i=0) const;\r
-  //\r
-  AliLHCDipValF* GetLumiAliceRecord(int i=0)              const; \r
-  AliLHCDipValF* GetBckgAliceRecord(int i=0)              const; \r
-  //\r
-  Float_t        GetLumiAlice(Double_t tstamp)            const;\r
-  Float_t        GetBckgAlice(Double_t tstamp)            const;\r
-  //\r
-  Float_t        GetLumiInstAlice(Double_t tstamp)        const;\r
-  Float_t        GetBckgInstAlice(Double_t tstamp)        const;\r
-  //\r
-  void           FlagInteractingBunches(const Int_t beam1[2],const Int_t beam2[2]);\r
-  TObject*       FindRecValidFor(int start,int nrec, double tstamp) const;\r
-  Int_t          FindEntryValidFor(int start,int nrec, double tstamp) const;\r
-  AliLHCDipValI* GetBunchConfigMeasured(int beam,double tstamp)  const;\r
-  AliLHCDipValI* GetBunchConfigDeclared(int beam,double tstamp)  const;\r
-  Int_t          GetNInteractingBunchesMeasured(int i=0)         const;\r
-  Int_t          GetNInteractingBunchesDeclared(int i=0)         const;\r
-  Int_t          IsPilotPresent(int i=0)                         const;\r
-  //\r
-  // return array with beginning [0] and number of records for corresponding info (in the fData)\r
-  const Int_t* GetOffsBunchConfigMeasured(int bm)         const {return GoodPairID(bm)?fBunchConfMeas[bm]:0;}\r
-  const Int_t* GetOffsBunchConfigDeclared(int bm)         const {return GoodPairID(bm)?fBunchConfDecl[bm]:0;}\r
-  const Int_t* GetOffsBunchLengths(int bm)                const {return GoodPairID(bm)?fBunchLengths[bm]:0;}\r
-  const Int_t* GetOffsTotalIntensity(int bm)              const {return GoodPairID(bm)?fIntensTotal[bm]:0;}\r
-  const Int_t* GetOffsTotalIntensityAv(int bm)            const {return GoodPairID(bm)?fIntensTotalAv[bm]:0;}\r
-  const Int_t* GetOffsIntensityPerBunch(int bm)           const {return GoodPairID(bm)?fIntensPerBunch[bm]:0;}\r
-  const Int_t* GetOffsEmittanceH(int bm)                  const {return GoodPairID(bm)?fEmittanceH[bm]:0;}\r
-  const Int_t* GetOffsEmittanceV(int bm)                  const {return GoodPairID(bm)?fEmittanceV[bm]:0;}\r
-  const Int_t* GetOffsBeamSigmaH(int bm)                  const {return GoodPairID(bm)?fBeamSigmaH[bm]:0;}\r
-  const Int_t* GetOffsBeamSigmaV(int bm)                  const {return GoodPairID(bm)?fBeamSigmaV[bm]:0;}\r
-  //\r
-  const Int_t* GetOffsLuminosityTotal(int lr)             const {return GoodPairID(lr)?fLuminTotal[lr]:0;}\r
-  const Int_t* GetOffsLuminosityPerBunch(int lr)          const {return GoodPairID(lr)?fLuminPerBC[lr]:0;}\r
-  const Int_t* GetOffsLuminosityAcqMode(int lr)           const {return GoodPairID(lr)?fLuminAcqMode[lr]:0;}\r
-  const Int_t* GetOffsCrossingAngle(int lr)               const {return GoodPairID(lr)?fCrossAngle[lr]:0;}\r
-  //\r
-  const Int_t* GetOffsInjectionScheme()                   const {return fRCInjScheme;}\r
-  const Int_t* GetOffsRCBetaStar()                        const {return fRCBeta;}\r
-  const Int_t* GetOffsRCAngleH()                          const {return fRCAngH;}\r
-  const Int_t* GetOffsRCAngleV()                          const {return fRCAngV;}\r
-  const Int_t* GetOffsLumiAlice()                         const {return fLumiAlice;}\r
-  const Int_t* GetOffsBckgAlice()                         const {return fBckgAlice;}\r
-  //\r
-  const Int_t* GetOffsCollimatorJawPos(int coll,int jaw)  const;\r
-  //\r
-  const TObjArray&  GetData()                             const {return fData;}\r
-  //\r
-  // analysis methods\r
-  Int_t GetMeanIntensity(int beamID, Double_t &colliding, Double_t &noncolliding, const TObjArray* bcmasks=0) const;\r
-  static Int_t GetBCId(int bucket, int beamID)                  {return (TMath::Abs(bucket)/10 + (beamID==0 ? kOffsBeam1:kOffsBeam2))%kMaxBSlots;}\r
-  //\r
-  // for retrofitting, these methods has to be public\r
-  void                  FillLumiAlice(Int_t nrec, Int_t* time, Double_t* val);\r
-  void                  FillBckgAlice(Int_t nrec, Int_t* time, Double_t* val);\r
-\r
-\r
- protected:\r
-  //\r
-  Bool_t                FillData(double tmin=0, double tmax=1.e20);\r
-  virtual void          Clear(const Option_t *opt="");\r
-  void                  PrintAux(Bool_t full,const Int_t refs[2],const Option_t *opt="") const;\r
-  TObjArray*            GetDCSEntry(const char* key,int &entry,int &last,double tmin,double tmax) const;\r
-  Int_t                 FillScalarRecord(  int refs[2], const char* rec, const char* recErr=0, Double_t maxAbsVal=1.e30);\r
-  Int_t                 FillBunchConfig(   int refs[2], const char* rec);\r
-  Int_t                 FillStringRecord(  int refs[2], const char* rec);\r
-  Int_t                 FillAcqMode(       int refs[2], const char* rec);\r
-  Int_t                 FillBunchInfo(     int refs[2], const char* rec,int ibm, Bool_t inRealSlots, Double_t maxAbsVal=1.e30);\r
-  Int_t                 FillBCLuminosities(int refs[2], const char* rec, const char* recErr, Int_t useBeam, Double_t maxAbsVal=1.e30);\r
-  //\r
-  Int_t                 ExtractInt(AliDCSArray* dcsArray,Int_t el)    const;\r
-  Double_t              ExtractDouble(AliDCSArray* dcsArray,Int_t el) const;\r
-  TString&              ExtractString(AliDCSArray* dcsArray)          const;\r
-  AliLHCData(const AliLHCData& src) : TObject(src),fTMin(0),fTMax(0),fFillNumber(0),fData(0),fkFile2Process(0),fkMap2Process(0) { /*dummy*/ }\r
-  AliLHCData& operator=(const AliLHCData& ) { /*dummy*/ return *this;}\r
-  Int_t                 TimeDifference(double v1,double v2,double tol=0.9) const;\r
-  Bool_t                IzZero(double val, double tol=1e-16)         const {return TMath::Abs(val)<tol;}\r
-  Bool_t                GoodPairID(int beam)                         const;\r
-  //\r
- protected:\r
-  //\r
-  Double_t        fTMin;                              // selection timeMin\r
-  Double_t        fTMax;                              // selection timeMax\r
-  Int_t           fFillNumber;                        // fill number           : kFillNum\r
-  //\r
-  //---------------- Last index gives: 0 - beginning of the records in fData, 1 - number of records\r
-  //\r
-  //              infrormation from RunControl\r
-  Int_t           fRCInjScheme[2];                    // active injection scheme                       : String |kRCInjScheme\r
-  Int_t           fRCBeta[2];                         // target beta                                   : Float  |kRCBeta\r
-  Int_t           fRCAngH[2];                         // horisontal angle                              : Float  |kRCCrossAng\r
-  Int_t           fRCAngV[2];                         // vertical angle                                : Float  |kRCVang\r
-  Int_t           fBunchConfDecl[2][2];               // declared beam configuration                   : Float  |kBunchConf                \r
-  //\r
-  //              measured information\r
-  Int_t           fBunchConfMeas[2][2];               // measured beam configuration                   : Int    |kBunchLgtFillB\r
-  Int_t           fBunchLengths[2][2];                // measured beam lenghts                         : Float  |kBunchLgt\r
-  Int_t           fIntensTotal[2][2];                 // total beam intensities                        : Float  |kIntTot\r
-  Int_t           fIntensTotalAv[2][2];               // total beam intensities from bunch averages    : Float  |kIntTotAv\r
-  Int_t           fIntensPerBunch[2][2];              // bunch-by-bunch intensities                    : Float  |kIntBunchAv\r
-  //\r
-  Int_t           fCrossAngle[2][2];                  // crossing angle   at IP2 and its error         : Float  |kLimCrossAng, kLumCrossAngErr\r
-  Int_t           fEmittanceH[2][2];                  // beam H emittances                             : Float  |kBeamSzEmittH\r
-  Int_t           fEmittanceV[2][2];                  // beam V emittances                             : Float  |kBeamSzEmittV\r
-  Int_t           fBeamSigmaH[2][2];                  // beam H sigma and error                        : Float  |kBeamSzSigH,kBeamSzSigHErr\r
-  Int_t           fBeamSigmaV[2][2];                  // beam V sigma and error                        : Float  |kBeamSzSigV,kBeamSzSigVErr\r
-  //\r
-  Int_t           fLuminTotal[2][2];                  // total luminosity at IP2 and its error         : Float  |kLumTot, kLumTotErr\r
-  Int_t           fLuminPerBC[2][2];                  // luminosity at IP2 for each BC and its error   : Float  |kLumBunch,kLumBunchErr\r
-  Int_t           fLuminAcqMode[2][2];                // luminosity acquisition mode                   : Int    |kLumAcqMode\r
-  //\r
-  // here we will store the luminosity and the background measured by Alice. We store the value integrated from the start of fill.\r
-  // the inst. value can be obtained as its derivative\r
-  Int_t           fLumiAlice[2];                      // luminosity measured by Alice                  : Float  |kLumiAlice\r
-  Int_t           fBckgAlice[2];                      // background measured by Alice                  : Float  |kLumiAlice\r
-  //\r
-  Int_t           fCollimators[kNCollimators][kNJaws][2];// collimator jaws positions                  : Float  |kCollPos\r
-  //\r
-  TObjArray       fData;                              // single storage for various records\r
-  //\r
-  static const Char_t *fgkDCSNames[];                 // beam related DCS names to extract\r
-  static const Char_t *fgkDCSColNames[];              // collimators to extract\r
-  static const Char_t *fgkDCSColJaws[];               // names of collimator pieces\r
-  //\r
- private:\r
-  // non-persistent objects used at the filling time\r
-  const Char_t*   fkFile2Process;                      //! name of DCS file\r
-  const TMap*     fkMap2Process;                       //! DCS map to process \r
-\r
-  ClassDef(AliLHCData,3)\r
-};\r
-\r
-\r
-//_____________________________________________________________________________\r
-inline Int_t AliLHCData::GetNCollimatorJawPos(int coll,int jaw) const {// get n records\r
-  return (coll>=0&&coll<kNCollimators&&jaw>=0&&jaw<kNJaws)? fCollimators[coll][jaw][kNStor]:0;\r
-}\r
-\r
-inline const Int_t* AliLHCData::GetOffsCollimatorJawPos(int coll,int jaw)  const { // offset array\r
-  return (coll>=0&&coll<kNCollimators&&jaw>=0&&jaw<kNJaws)? fCollimators[coll][jaw]:0;\r
-}\r
-\r
-inline AliLHCDipValI* AliLHCData::GetBunchConfigMeasured(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fBunchConfMeas[bm][kNStor]) ? (AliLHCDipValI*)fData[fBunchConfMeas[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetBunchLengths(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fBunchLengths[bm][kNStor]) ? (AliLHCDipValF*)fData[fBunchLengths[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValI* AliLHCData::GetBunchConfigDeclared(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fBunchConfDecl[bm][kNStor]) ? (AliLHCDipValI*)fData[fBunchConfDecl[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetTotalIntensity(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fIntensTotal[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensTotal[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetTotalIntensityAv(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fIntensTotalAv[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensTotalAv[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetIntensityPerBunch(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fIntensPerBunch[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensPerBunch[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetEmittanceH(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fEmittanceH[bm][kNStor]) ? (AliLHCDipValF*)fData[fEmittanceH[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetEmittanceV(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fEmittanceV[bm][kNStor]) ? (AliLHCDipValF*)fData[fEmittanceV[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetBeamSigmaH(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fBeamSigmaH[bm][kNStor]) ? (AliLHCDipValF*)fData[fBeamSigmaH[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetBeamSigmaV(int bm, int i) const { // get record\r
-  return (GoodPairID(bm) && i>=0 && i<fBeamSigmaV[bm][kNStor]) ? (AliLHCDipValF*)fData[fBeamSigmaV[bm][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetLuminosityTotal(int lr, int i) const { // get record\r
-  return (GoodPairID(lr) && i>=0 && i<fLuminTotal[lr][kNStor]) ? (AliLHCDipValF*)fData[fLuminTotal[lr][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetLuminosityPerBunch(int lr, int i) const { // get record\r
-  return (GoodPairID(lr) && i>=0 && i<fLuminPerBC[lr][kNStor]) ? (AliLHCDipValF*)fData[fLuminPerBC[lr][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValI* AliLHCData::GetLuminosityAcqMode(int lr, int i) const { // get record\r
-  return (GoodPairID(lr) && i>=0 && i<fLuminAcqMode[lr][kNStor]) ? (AliLHCDipValI*)fData[fLuminAcqMode[lr][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetCrossAngle(int lr, int i) const { // get record\r
-  return (GoodPairID(lr) && i>=0 && i<fCrossAngle[lr][kNStor]) ? (AliLHCDipValF*)fData[fCrossAngle[lr][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValC* AliLHCData::GetInjectionScheme(int i) const { // get record\r
-  return (i>=0 && i<fRCInjScheme[kNStor]) ? (AliLHCDipValC*)fData[fRCInjScheme[kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetRCBetaStar(int i) const { // get record\r
-  return (i>=0 && i<fRCBeta[kNStor]) ? (AliLHCDipValF*)fData[fRCBeta[kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetRCAngleH(int i) const { // get record\r
-  return (i>=0 && i<fRCAngH[kNStor]) ? (AliLHCDipValF*)fData[fRCAngH[kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetRCAngleV(int i) const { // get record\r
-  return (i>=0 && i<fRCAngV[kNStor]) ? (AliLHCDipValF*)fData[fRCAngV[kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetCollimJawPos(int coll, int jaw, int i) const { // get record\r
-  return (coll>=0 && coll<kNCollimators && jaw>=0 && jaw<kNJaws && \r
-         i>=0 && i<fCollimators[coll][jaw][kNStor]) ? (AliLHCDipValF*)fData[fCollimators[coll][jaw][kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetLumiAliceRecord(int i) const { // get record on integrated luminosity\r
-  return (i>=0 && i<fLumiAlice[kNStor]) ? (AliLHCDipValF*)fData[fLumiAlice[kStart]+i]:0;\r
-}\r
-\r
-inline AliLHCDipValF* AliLHCData::GetBckgAliceRecord(int i) const { // get record on integrated background\r
-  return (i>=0 && i<fBckgAlice[kNStor]) ? (AliLHCDipValF*)fData[fBckgAlice[kStart]+i]:0;\r
-}\r
-\r
-inline Float_t AliLHCData::GetLumiAlice(Double_t tStamp) const { // get closest in time value on integrated luminosity\r
-  int idx = FindEntryValidFor(fLumiAlice[kStart],fLumiAlice[kNStor],tStamp);\r
-  return idx<0 ? -1 : ((AliLHCDipValF*)fData[fLumiAlice[kStart]+idx])->GetValue();\r
-}\r
-\r
-inline Float_t AliLHCData::GetBckgAlice(Double_t tStamp) const { // get closest in time value on integrated bckg\r
-  int idx = FindEntryValidFor(fBckgAlice[kStart],fBckgAlice[kNStor],tStamp);\r
-  return idx<0 ? -1 : ((AliLHCDipValF*)fData[fBckgAlice[kStart]+idx])->GetValue();\r
-}\r
-\r
-inline Int_t AliLHCData::FindEntryValidFor(int start,int nrec, double tstamp) const\r
-{\r
-  // find index of record within this limits valid for given tstamp (i.e. the last one before or equal to tstamp)\r
-  int idx;\r
-  for (idx=0;idx<nrec;idx++) {\r
-    if (TimeDifference(tstamp,((AliLHCDipValI*)fData[start+idx])->GetTimeStamp())<=0) break;\r
-  }\r
-  return (idx<nrec) ? idx : nrec-1;\r
-}\r
-\r
-#endif\r
+#ifndef ALILHCDATA_H
+#define ALILHCDATA_H
+
+/********************************************************************************
+*                                                                               *
+*   AliLHCData: summary of the LHC related information from LHC DIP.            *
+*   Created from the TMap provided by the AliLHCReader with optional beginning  *
+*                                                                               *
+*   The data are (wrapped in the AliLHCDipValT):                                *
+*   made of TimeStamp (double) and array of values                              *
+*                                                                               *
+*   Multiple entries for each type of data are possible. To obtaine number of   *
+*   records (with distinct timestamp) for give type od records use:             *
+*   int GetNBunchConfigMeasured(int beam) (with beam=0,1) etc.                  *
+*                                                                               *
+*   To get i-th entry, use brec= AliLHCDipValI* GetBunchConfigMeasured(bm,i);   *
+*   Note: exact type of templated AliLHCDipValT pointer depends on the record   *
+*   type, concult getters to know it.                                           *
+*                                                                               *
+*   Then, once the pointer is obtained, details can be accessed:                *
+*   int nBunches = brec->GetSize();                                             *
+*   for (int i=0;i<nBunches;i++) printf("Bunch#%d: %d\n",i,(*brec)[i]);         *
+*                                                                               *
+*   ATTENTION: Bunch RFBucked is NEGATIVE for bunches interacting at IR2        *
+*                                                                               *
+*                                                                               *
+*                                                                               *
+*   Author: ruben.shahoyan@cern.ch                                              *
+*                                                                               *
+********************************************************************************/
+
+#include "AliLHCDipValT.h"
+#include "TObject.h"
+class TObjArray;
+//class AliLHCDipValT;
+
+class AliDCSArray;
+class TString;
+class TMap;
+class AliLHCReader;
+class TGraph;
+
+class AliLHCData : public TObject
+{
+ public:
+  enum          {kStart,kNStor};
+  enum BeamID_t {kBeam1,kBeam2};
+  enum Proj_t   {kX,kY};
+  enum Side_t   {kLeft,kRight};
+  enum Collim_t {kTCTVB4L2, kTCTVB4R2, kTCLIA4R2, kNCollimators};
+  enum ColJaw_t {kGapDn,kGapUp,kLeftDn,kLeftUp,kRightDn,kRightUp,kNJaws};
+  enum          {kMaxBSlots = 3564, kOffsBeam1=346, kOffsBeam2 = 3019};
+  enum          {kMarginSOR = 60*60*24*30, // use margin of 30 days for SOR, when looking for the 1st record
+                kMarginEOR = 60*15};      // use margin of 15 min for EOR, when looking for the last record
+  //
+  enum {kIntTot,kIntTotAv,kIntBunchAv,
+       kLumAcqMode,kLumTot,kLumTotErr,kLumBunch,kLumBunchErr,kLumCrossAng,kLumCrossAngErr,
+       kBunchConf,kFillNum,kBunchLgtNB,kBunchLgt,kBunchLgtFillB,
+       kRCInjSch,kRCBeta,kRCCrossAng,kRCVang,
+       kBeamSzAcqMode,kBeamSzSigH,kBeamSzSigV,kBeamSzEmittH,kBeamSzEmittV,kBeamSzSigHErr,kBeamSzSigVErr,
+       kCollPos,kLumiAlice,kBckgAlice
+       ,kNRecordTypes};
+  //
+  //le
+ public:
+  //
+ AliLHCData() : fTMin(0),fTMax(1e10),fFillNumber(0),fData(0),fkFile2Process(0),fkMap2Process(0) {Clear();}
+  AliLHCData(const TMap*   dcsMap,  double tmin=0, double tmax=1.e10);
+  AliLHCData(const Char_t* dcsFile, double tmin=0, double tmax=1.e10);
+  virtual ~AliLHCData() {}
+  //
+  Bool_t                FillData(const TMap*   dcsMap,  double tmin=0, double tmax=1.e20);
+  Bool_t                FillData(const Char_t* dcsFile, double tmin=0, double tmax=1.e20);
+  Double_t              GetTMin()                                    const {return fTMin;}
+  Double_t              GetTMax()                                    const {return fTMax;}
+  Int_t                 GetFillNumber()                              const {return fFillNumber;}
+  void                  SetFillNumber(Int_t fill)                          {fFillNumber = fill;}
+  void                  SetTMin(Double_t t)                                {fTMin = t<0?0:(t>1e10?1e10:t);}
+  void                  SetTMax(Double_t t)                                {fTMax = t<0?0:(t>1e10?1e10:t);}
+  //
+  virtual void          Print(const Option_t *opt="")                const;
+  TGraph*               ExportGraph(Int_t *coord, Int_t elID=0)      const;
+  //
+  Int_t GetNBunchConfigMeasured(int bm)           const {return GoodPairID(bm)?fBunchConfMeas[bm][kNStor]:-1;}
+  Int_t GetNBunchConfigDeclared(int bm)           const {return GoodPairID(bm)?fBunchConfDecl[bm][kNStor]:-1;}
+  Int_t GetNBunchLengths(int bm)                  const {return GoodPairID(bm)?fBunchLengths[bm][kNStor]:-1;}
+  Int_t GetNTotalIntensity(int bm)                const {return GoodPairID(bm)?fIntensTotal[bm][kNStor]:-1;}
+  Int_t GetNTotalIntensityAv(int bm)              const {return GoodPairID(bm)?fIntensTotalAv[bm][kNStor]:-1;}
+  Int_t GetNIntensityPerBunch(int bm)             const {return GoodPairID(bm)?fIntensPerBunch[bm][kNStor]:-1;}
+  Int_t GetNEmittanceH(int bm)                    const {return GoodPairID(bm)?fEmittanceH[bm][kNStor]:-1;}
+  Int_t GetNEmittanceV(int bm)                    const {return GoodPairID(bm)?fEmittanceV[bm][kNStor]:-1;}
+  Int_t GetNBeamSigmaH(int bm)                    const {return GoodPairID(bm)?fBeamSigmaH[bm][kNStor]:-1;}
+  Int_t GetNBeamSigmaV(int bm)                    const {return GoodPairID(bm)?fBeamSigmaV[bm][kNStor]:-1;}
+  //
+  Int_t GetNLuminosityTotal(int lr)               const {return GoodPairID(lr)?fLuminTotal[lr][kNStor]:-1;}
+  Int_t GetNLuminosityPerBunch(int lr)            const {return GoodPairID(lr)?fLuminPerBC[lr][kNStor]:-1;}
+  Int_t GetNLuminosityAcqMode(int lr)             const {return GoodPairID(lr)?fLuminAcqMode[lr][kNStor]:-1;}
+  Int_t GetNCrossingAngle(int lr)                 const {return GoodPairID(lr)?fCrossAngle[lr][kNStor]:-1;}
+  //
+  Int_t GetNInjectionScheme()                     const {return fRCInjScheme[kNStor];}
+  Int_t GetNRCBetaStar()                          const {return fRCBeta[kNStor];}
+  Int_t GetNRCAngleH()                            const {return fRCAngH[kNStor];}
+  Int_t GetNRCAngleV()                            const {return fRCAngV[kNStor];}
+  //
+  Int_t GetNLumiAlice()                           const {return fLumiAlice[kNStor];}
+  Int_t GetNBckgAlice()                           const {return fBckgAlice[kNStor];}
+  //
+  Int_t GetNCollimatorJawPos(int coll,int jaw)    const;
+  //
+  AliLHCDipValI* GetBunchConfigMeasured(int bm, int i=0)  const;
+  AliLHCDipValF* GetBunchLengths(int bm, int i=0)         const;
+  AliLHCDipValI* GetBunchConfigDeclared(int bm, int i=0)  const;
+  AliLHCDipValF* GetTotalIntensity(int bm, int i=0)       const;
+  AliLHCDipValF* GetTotalIntensityAv(int bm, int i=0)     const;
+  AliLHCDipValF* GetIntensityPerBunch(int bm, int i=0)    const;
+  AliLHCDipValF* GetEmittanceH(int bm, int i=0)           const;
+  AliLHCDipValF* GetEmittanceV(int bm, int i=0)           const;
+  AliLHCDipValF* GetBeamSigmaH(int bm, int i=0)           const;
+  AliLHCDipValF* GetBeamSigmaV(int bm, int i=0)           const;
+  AliLHCDipValF* GetLuminosityTotal(int lr, int i=0)      const;
+  AliLHCDipValF* GetLuminosityPerBunch(int lr, int i=0)   const;
+  AliLHCDipValI* GetLuminosityAcqMode(int lr, int i=0)    const;
+  AliLHCDipValF* GetCrossAngle(int lr, int i=0)           const;
+  AliLHCDipValC* GetInjectionScheme(int i=0)              const;
+  AliLHCDipValF* GetRCBetaStar(int i=0)                   const;
+  AliLHCDipValF* GetRCAngleH(int i=0)                     const; 
+  AliLHCDipValF* GetRCAngleV(int i=0)                     const; 
+  AliLHCDipValF* GetCollimJawPos(int coll, int jaw, int i=0) const;
+  //
+  AliLHCDipValF* GetLumiAliceRecord(int i=0)              const; 
+  AliLHCDipValF* GetBckgAliceRecord(int i=0)              const; 
+  //
+  Float_t        GetLumiAlice(Double_t tstamp)            const;
+  Float_t        GetBckgAlice(Double_t tstamp)            const;
+  //
+  Float_t        GetLumiInstAlice(Double_t tstamp)        const;
+  Float_t        GetBckgInstAlice(Double_t tstamp)        const;
+  //
+  void           FlagInteractingBunches(const Int_t beam1[2],const Int_t beam2[2]);
+  TObject*       FindRecValidFor(int start,int nrec, double tstamp) const;
+  Int_t          FindEntryValidFor(int start,int nrec, double tstamp) const;
+  AliLHCDipValI* GetBunchConfigMeasured(int beam,double tstamp)  const;
+  AliLHCDipValI* GetBunchConfigDeclared(int beam,double tstamp)  const;
+  Int_t          GetNInteractingBunchesMeasured(int i=0)         const;
+  Int_t          GetNInteractingBunchesDeclared(int i=0)         const;
+  Int_t          IsPilotPresent(int i=0)                         const;
+  //
+  // return array with beginning [0] and number of records for corresponding info (in the fData)
+  const Int_t* GetOffsBunchConfigMeasured(int bm)         const {return GoodPairID(bm)?fBunchConfMeas[bm]:0;}
+  const Int_t* GetOffsBunchConfigDeclared(int bm)         const {return GoodPairID(bm)?fBunchConfDecl[bm]:0;}
+  const Int_t* GetOffsBunchLengths(int bm)                const {return GoodPairID(bm)?fBunchLengths[bm]:0;}
+  const Int_t* GetOffsTotalIntensity(int bm)              const {return GoodPairID(bm)?fIntensTotal[bm]:0;}
+  const Int_t* GetOffsTotalIntensityAv(int bm)            const {return GoodPairID(bm)?fIntensTotalAv[bm]:0;}
+  const Int_t* GetOffsIntensityPerBunch(int bm)           const {return GoodPairID(bm)?fIntensPerBunch[bm]:0;}
+  const Int_t* GetOffsEmittanceH(int bm)                  const {return GoodPairID(bm)?fEmittanceH[bm]:0;}
+  const Int_t* GetOffsEmittanceV(int bm)                  const {return GoodPairID(bm)?fEmittanceV[bm]:0;}
+  const Int_t* GetOffsBeamSigmaH(int bm)                  const {return GoodPairID(bm)?fBeamSigmaH[bm]:0;}
+  const Int_t* GetOffsBeamSigmaV(int bm)                  const {return GoodPairID(bm)?fBeamSigmaV[bm]:0;}
+  //
+  const Int_t* GetOffsLuminosityTotal(int lr)             const {return GoodPairID(lr)?fLuminTotal[lr]:0;}
+  const Int_t* GetOffsLuminosityPerBunch(int lr)          const {return GoodPairID(lr)?fLuminPerBC[lr]:0;}
+  const Int_t* GetOffsLuminosityAcqMode(int lr)           const {return GoodPairID(lr)?fLuminAcqMode[lr]:0;}
+  const Int_t* GetOffsCrossingAngle(int lr)               const {return GoodPairID(lr)?fCrossAngle[lr]:0;}
+  //
+  const Int_t* GetOffsInjectionScheme()                   const {return fRCInjScheme;}
+  const Int_t* GetOffsRCBetaStar()                        const {return fRCBeta;}
+  const Int_t* GetOffsRCAngleH()                          const {return fRCAngH;}
+  const Int_t* GetOffsRCAngleV()                          const {return fRCAngV;}
+  const Int_t* GetOffsLumiAlice()                         const {return fLumiAlice;}
+  const Int_t* GetOffsBckgAlice()                         const {return fBckgAlice;}
+  //
+  const Int_t* GetOffsCollimatorJawPos(int coll,int jaw)  const;
+  //
+  const TObjArray&  GetData()                             const {return fData;}
+  //
+  // analysis methods
+  Int_t GetMeanIntensity(int beamID, Double_t &colliding, Double_t &noncolliding, const TObjArray* bcmasks=0) const;
+  static Int_t GetBCId(int bucket, int beamID)                  {return (TMath::Abs(bucket)/10 + (beamID==0 ? kOffsBeam1:kOffsBeam2))%kMaxBSlots;}
+  //
+  // for retrofitting, these methods has to be public
+  void                  FillLumiAlice(Int_t nrec, Int_t* time, Double_t* val);
+  void                  FillBckgAlice(Int_t nrec, Int_t* time, Double_t* val);
+
+
+ protected:
+  //
+  Bool_t                FillData(double tmin=0, double tmax=1.e20);
+  virtual void          Clear(const Option_t *opt="");
+  void                  PrintAux(Bool_t full,const Int_t refs[2],const Option_t *opt="") const;
+  TObjArray*            GetDCSEntry(const char* key,int &entry,int &last,double tmin,double tmax) const;
+  Int_t                 FillScalarRecord(  int refs[2], const char* rec, const char* recErr=0, Double_t maxAbsVal=1.e30);
+  Int_t                 FillBunchConfig(   int refs[2], const char* rec);
+  Int_t                 FillStringRecord(  int refs[2], const char* rec);
+  Int_t                 FillAcqMode(       int refs[2], const char* rec);
+  Int_t                 FillBunchInfo(     int refs[2], const char* rec,int ibm, Bool_t inRealSlots, Double_t maxAbsVal=1.e30);
+  Int_t                 FillBCLuminosities(int refs[2], const char* rec, const char* recErr, Int_t useBeam, Double_t maxAbsVal=1.e30);
+  //
+  Int_t                 ExtractInt(AliDCSArray* dcsArray,Int_t el)    const;
+  Double_t              ExtractDouble(AliDCSArray* dcsArray,Int_t el) const;
+  TString&              ExtractString(AliDCSArray* dcsArray)          const;
+  AliLHCData(const AliLHCData& src) : TObject(src),fTMin(0),fTMax(0),fFillNumber(0),fData(0),fkFile2Process(0),fkMap2Process(0) { /*dummy*/ }
+  AliLHCData& operator=(const AliLHCData& ) { /*dummy*/ return *this;}
+  Int_t                 TimeDifference(double v1,double v2,double tol=0.9) const;
+  Bool_t                IzZero(double val, double tol=1e-16)         const {return TMath::Abs(val)<tol;}
+  Bool_t                GoodPairID(int beam)                         const;
+  //
+ protected:
+  //
+  Double_t        fTMin;                              // selection timeMin
+  Double_t        fTMax;                              // selection timeMax
+  Int_t           fFillNumber;                        // fill number           : kFillNum
+  //
+  //---------------- Last index gives: 0 - beginning of the records in fData, 1 - number of records
+  //
+  //              infrormation from RunControl
+  Int_t           fRCInjScheme[2];                    // active injection scheme                       : String |kRCInjScheme
+  Int_t           fRCBeta[2];                         // target beta                                   : Float  |kRCBeta
+  Int_t           fRCAngH[2];                         // horisontal angle                              : Float  |kRCCrossAng
+  Int_t           fRCAngV[2];                         // vertical angle                                : Float  |kRCVang
+  Int_t           fBunchConfDecl[2][2];               // declared beam configuration                   : Float  |kBunchConf                
+  //
+  //              measured information
+  Int_t           fBunchConfMeas[2][2];               // measured beam configuration                   : Int    |kBunchLgtFillB
+  Int_t           fBunchLengths[2][2];                // measured beam lenghts                         : Float  |kBunchLgt
+  Int_t           fIntensTotal[2][2];                 // total beam intensities                        : Float  |kIntTot
+  Int_t           fIntensTotalAv[2][2];               // total beam intensities from bunch averages    : Float  |kIntTotAv
+  Int_t           fIntensPerBunch[2][2];              // bunch-by-bunch intensities                    : Float  |kIntBunchAv
+  //
+  Int_t           fCrossAngle[2][2];                  // crossing angle   at IP2 and its error         : Float  |kLimCrossAng, kLumCrossAngErr
+  Int_t           fEmittanceH[2][2];                  // beam H emittances                             : Float  |kBeamSzEmittH
+  Int_t           fEmittanceV[2][2];                  // beam V emittances                             : Float  |kBeamSzEmittV
+  Int_t           fBeamSigmaH[2][2];                  // beam H sigma and error                        : Float  |kBeamSzSigH,kBeamSzSigHErr
+  Int_t           fBeamSigmaV[2][2];                  // beam V sigma and error                        : Float  |kBeamSzSigV,kBeamSzSigVErr
+  //
+  Int_t           fLuminTotal[2][2];                  // total luminosity at IP2 and its error         : Float  |kLumTot, kLumTotErr
+  Int_t           fLuminPerBC[2][2];                  // luminosity at IP2 for each BC and its error   : Float  |kLumBunch,kLumBunchErr
+  Int_t           fLuminAcqMode[2][2];                // luminosity acquisition mode                   : Int    |kLumAcqMode
+  //
+  // here we will store the luminosity and the background measured by Alice. We store the value integrated from the start of fill.
+  // the inst. value can be obtained as its derivative
+  Int_t           fLumiAlice[2];                      // luminosity measured by Alice                  : Float  |kLumiAlice
+  Int_t           fBckgAlice[2];                      // background measured by Alice                  : Float  |kLumiAlice
+  //
+  Int_t           fCollimators[kNCollimators][kNJaws][2];// collimator jaws positions                  : Float  |kCollPos
+  //
+  TObjArray       fData;                              // single storage for various records
+  //
+  static const Char_t *fgkDCSNames[];                 // beam related DCS names to extract
+  static const Char_t *fgkDCSColNames[];              // collimators to extract
+  static const Char_t *fgkDCSColJaws[];               // names of collimator pieces
+  //
+ private:
+  // non-persistent objects used at the filling time
+  const Char_t*   fkFile2Process;                      //! name of DCS file
+  const TMap*     fkMap2Process;                       //! DCS map to process 
+
+  ClassDef(AliLHCData,3)
+};
+
+
+//_____________________________________________________________________________
+inline Int_t AliLHCData::GetNCollimatorJawPos(int coll,int jaw) const {// get n records
+  return (coll>=0&&coll<kNCollimators&&jaw>=0&&jaw<kNJaws)? fCollimators[coll][jaw][kNStor]:0;
+}
+
+inline const Int_t* AliLHCData::GetOffsCollimatorJawPos(int coll,int jaw)  const { // offset array
+  return (coll>=0&&coll<kNCollimators&&jaw>=0&&jaw<kNJaws)? fCollimators[coll][jaw]:0;
+}
+
+inline AliLHCDipValI* AliLHCData::GetBunchConfigMeasured(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fBunchConfMeas[bm][kNStor]) ? (AliLHCDipValI*)fData[fBunchConfMeas[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetBunchLengths(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fBunchLengths[bm][kNStor]) ? (AliLHCDipValF*)fData[fBunchLengths[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValI* AliLHCData::GetBunchConfigDeclared(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fBunchConfDecl[bm][kNStor]) ? (AliLHCDipValI*)fData[fBunchConfDecl[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetTotalIntensity(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fIntensTotal[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensTotal[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetTotalIntensityAv(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fIntensTotalAv[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensTotalAv[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetIntensityPerBunch(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fIntensPerBunch[bm][kNStor]) ? (AliLHCDipValF*)fData[fIntensPerBunch[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetEmittanceH(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fEmittanceH[bm][kNStor]) ? (AliLHCDipValF*)fData[fEmittanceH[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetEmittanceV(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fEmittanceV[bm][kNStor]) ? (AliLHCDipValF*)fData[fEmittanceV[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetBeamSigmaH(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fBeamSigmaH[bm][kNStor]) ? (AliLHCDipValF*)fData[fBeamSigmaH[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetBeamSigmaV(int bm, int i) const { // get record
+  return (GoodPairID(bm) && i>=0 && i<fBeamSigmaV[bm][kNStor]) ? (AliLHCDipValF*)fData[fBeamSigmaV[bm][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetLuminosityTotal(int lr, int i) const { // get record
+  return (GoodPairID(lr) && i>=0 && i<fLuminTotal[lr][kNStor]) ? (AliLHCDipValF*)fData[fLuminTotal[lr][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetLuminosityPerBunch(int lr, int i) const { // get record
+  return (GoodPairID(lr) && i>=0 && i<fLuminPerBC[lr][kNStor]) ? (AliLHCDipValF*)fData[fLuminPerBC[lr][kStart]+i]:0;
+}
+
+inline AliLHCDipValI* AliLHCData::GetLuminosityAcqMode(int lr, int i) const { // get record
+  return (GoodPairID(lr) && i>=0 && i<fLuminAcqMode[lr][kNStor]) ? (AliLHCDipValI*)fData[fLuminAcqMode[lr][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetCrossAngle(int lr, int i) const { // get record
+  return (GoodPairID(lr) && i>=0 && i<fCrossAngle[lr][kNStor]) ? (AliLHCDipValF*)fData[fCrossAngle[lr][kStart]+i]:0;
+}
+
+inline AliLHCDipValC* AliLHCData::GetInjectionScheme(int i) const { // get record
+  return (i>=0 && i<fRCInjScheme[kNStor]) ? (AliLHCDipValC*)fData[fRCInjScheme[kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetRCBetaStar(int i) const { // get record
+  return (i>=0 && i<fRCBeta[kNStor]) ? (AliLHCDipValF*)fData[fRCBeta[kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetRCAngleH(int i) const { // get record
+  return (i>=0 && i<fRCAngH[kNStor]) ? (AliLHCDipValF*)fData[fRCAngH[kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetRCAngleV(int i) const { // get record
+  return (i>=0 && i<fRCAngV[kNStor]) ? (AliLHCDipValF*)fData[fRCAngV[kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetCollimJawPos(int coll, int jaw, int i) const { // get record
+  return (coll>=0 && coll<kNCollimators && jaw>=0 && jaw<kNJaws && 
+         i>=0 && i<fCollimators[coll][jaw][kNStor]) ? (AliLHCDipValF*)fData[fCollimators[coll][jaw][kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetLumiAliceRecord(int i) const { // get record on integrated luminosity
+  return (i>=0 && i<fLumiAlice[kNStor]) ? (AliLHCDipValF*)fData[fLumiAlice[kStart]+i]:0;
+}
+
+inline AliLHCDipValF* AliLHCData::GetBckgAliceRecord(int i) const { // get record on integrated background
+  return (i>=0 && i<fBckgAlice[kNStor]) ? (AliLHCDipValF*)fData[fBckgAlice[kStart]+i]:0;
+}
+
+inline Float_t AliLHCData::GetLumiAlice(Double_t tStamp) const { // get closest in time value on integrated luminosity
+  int idx = FindEntryValidFor(fLumiAlice[kStart],fLumiAlice[kNStor],tStamp);
+  return idx<0 ? -1 : ((AliLHCDipValF*)fData[fLumiAlice[kStart]+idx])->GetValue();
+}
+
+inline Float_t AliLHCData::GetBckgAlice(Double_t tStamp) const { // get closest in time value on integrated bckg
+  int idx = FindEntryValidFor(fBckgAlice[kStart],fBckgAlice[kNStor],tStamp);
+  return idx<0 ? -1 : ((AliLHCDipValF*)fData[fBckgAlice[kStart]+idx])->GetValue();
+}
+
+inline Int_t AliLHCData::FindEntryValidFor(int start,int nrec, double tstamp) const
+{
+  // find index of record within this limits valid for given tstamp (i.e. the last one before or equal to tstamp)
+  int idx;
+  for (idx=0;idx<nrec;idx++) {
+    if (TimeDifference(tstamp,((AliLHCDipValI*)fData[start+idx])->GetTimeStamp())<=0) break;
+  }
+  return (idx<nrec) ? idx : nrec-1;
+}
+
+#endif