ROOT logo
#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 BgID_t   {kBg1,kBg2,kBg3,kNBGs};
  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,
	kBPTXdeltaTB1B2,
	kBPTXdeltaTRMSB1B2,
	kBPTXPhase,
	kBPTXPhaseRMS,
	kBPTXPhaseShift,
	//
	kALILumiTotalInst,
	kALILumiTotalDeliveredStabBeam,
	kALILumiBunchInst,
	kALIBackground,
	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 GetNLumiAliceSBDelivered()                const {return fLumiAliceStB[kNStor];}
  Int_t GetNLumiAliceBunch()                      const {return fLumiAliceBbB[kNStor];}  
  //
  Int_t GetNBckgAlice(int bg)                     const {return (bg>-1&&bg<kNBGs) ? fBckgAlice[bg][kNStor] : -1;}
  //
  Int_t GetNBPTXdeltaTB1B2()                      const {return fBPTXdTB1B2[kNStor];}
  Int_t GetNBPTXdeltaTRMSB1B2()                   const {return fBPTXdTRMSB1B2[kNStor];}
  Int_t GetNBPTXPhase(int bm)                     const {return GoodPairID(bm)?fBPTXPhase[bm][kNStor]:-1;}
  Int_t GetNBPTXPhaseRMS(int bm)                  const {return GoodPairID(bm)?fBPTXPhaseRMS[bm][kNStor]:-1;}
  Int_t GetNBPTXPhaseShift(int bm)                const {return GoodPairID(bm)?fBPTXPhaseShift[bm][kNStor]:-1;}
  //
  //
  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* GetLumiAlice(int i=0)                    const; 
  AliLHCDipValF* GetLumiAliceSBDelivered(int i=0)         const; 
  AliLHCDipValF* GetLumiAliceBunch(int i=0)               const; 
  AliLHCDipValF* GetBckgAlice(int bg, int i=0)            const; 
  //
  AliLHCDipValF* GetBPTXdeltaTB1B2(int i=0)               const;
  AliLHCDipValF* GetBPTXdeltaTRMSB1B2(int i=0)            const;
  AliLHCDipValF* GetBPTXPhase(int bm, int i=0)            const;
  AliLHCDipValF* GetBPTXPhaseRMS(int bm, int i=0)         const;
  AliLHCDipValF* GetBPTXPhaseShift(int bm, int i=0)       const;
  //
  Float_t        GetLumiAlice(Double_t tstamp)            const;
  Float_t        GetLumiAliceSBDelivered(Double_t tstamp) const;
  Float_t        GetBckgAlice(Int_t bg,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* GetOffsLumiAliceSBDelivered()              const {return fLumiAliceStB;}
  const Int_t* GetOffsLumiAliceBunch()                    const {return fLumiAliceBbB;}
  const Int_t* GetOffsBckgAlice(int bg)                   const {return (bg>-1&&bg<kNBGs) ? fBckgAlice[bg] : 0;}
  //
  const Int_t* GetOffsBPTXdeltaTB1B2()                       const {return fBPTXdTB1B2;}
  const Int_t* GetOffsBPTXdeltaTRMSB1B2()                    const {return fBPTXdTRMSB1B2;}
  const Int_t* GetOffsBPTXPhase(int bm)                      const {return GoodPairID(bm)?fBPTXPhase[bm]:0;}
  const Int_t* GetOffsBPTXPhaseRMS(int bm)                   const {return GoodPairID(bm)?fBPTXPhaseRMS[bm]:0;}
  const Int_t* GetOffsBPTXPhaseShift(int bm)                 const {return GoodPairID(bm)?fBPTXPhaseShift[bm]:0;}
  //
  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                  FillLumiAliceOFL(Int_t nrec, Int_t* time, Double_t* val);
  //  void                  FillBckgAliceOFL(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, Total_Inst      : Float  |kALILumiTotalInst
  Int_t           fLumiAliceStB[2];                   // luminosity measured by Alice, Deli.StabBeam   : Float  |kALILumiTotalDeliveredStabBeam
  Int_t           fLumiAliceBbB[2];                   // luminosity measured by Alice, B-by-B          : Float  |kALILumiBunchInst
  //
  Int_t           fBckgAlice[kNBGs][2];               // backgrounds measured by Alice                 : Float  |kALIBackground1,2,3
  //
  Int_t           fBPTXdTB1B2[2];                     // BPTX_deltaT_B1_B2                             : Float  |kBPTXdeltaTB1B2,
  Int_t           fBPTXdTRMSB1B2[2];                  // BPTX_deltaTRMS_B1_B2                          : Float  |kBPTXdeltaTRMSB1B2,
  Int_t           fBPTXPhase[2][2];                   // BPTX_Phase_B1, and BPTX_Phase_B2              : Float  |kBPTXPhase
  Int_t           fBPTXPhaseRMS[2][2];                // BPTX_PhaseRMS_B1, and BPTX_PhaseRMS_B2        : Float  |kBPTXPhaseRMS
  Int_t           fBPTXPhaseShift[2][2];              // BPTX_Phase_Shift_B1 and BPTX_Phase_Shift_B2   : Float  |kBPTXPhaseShift 
  //
  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,4)
};


//_____________________________________________________________________________
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::GetLumiAlice(int i) const { // get record on integrated luminosity
  return (i>=0 && i<fLumiAlice[kNStor]) ? (AliLHCDipValF*)fData[fLumiAlice[kStart]+i]:0;
}

inline AliLHCDipValF* AliLHCData::GetLumiAliceSBDelivered(int i) const { // get record on st.beam delivered luminosity
  return (i>=0 && i<fLumiAliceStB[kNStor]) ? (AliLHCDipValF*)fData[fLumiAliceStB[kStart]+i]:0;
}

inline AliLHCDipValF* AliLHCData::GetLumiAliceBunch(int i) const { // get record on b-by-b luminosity
  return (i>=0 && i<fLumiAliceBbB[kNStor]) ? (AliLHCDipValF*)fData[fLumiAliceBbB[kStart]+i]:0;
}

inline AliLHCDipValF* AliLHCData::GetBckgAlice(int bg, int i) const { // get record on integrated background
  return (bg>=0&&bg<kNBGs&&i>=0&&i<fBckgAlice[bg][kNStor]) ? (AliLHCDipValF*)fData[fBckgAlice[bg][kStart]+i]:0;
}

inline AliLHCDipValF* AliLHCData::GetBPTXdeltaTB1B2(int i) const { // get record 
  return (i>=0 && i<fBPTXdTB1B2[kNStor]) ? (AliLHCDipValF*)fData[fBPTXdTB1B2[kStart]+i]:0;
}

inline AliLHCDipValF* AliLHCData::GetBPTXdeltaTRMSB1B2(int i) const { // get record 
  return (i>=0 && i<fBPTXdTRMSB1B2[kNStor]) ? (AliLHCDipValF*)fData[fBPTXdTRMSB1B2[kStart]+i]:0;
}

inline AliLHCDipValF* AliLHCData::GetBPTXPhase(int bm, int i) const { // get record 
  return (GoodPairID(bm) && i>=0 && i<fBPTXPhase[bm][kNStor]) ? (AliLHCDipValF*)fData[fBPTXPhase[bm][kStart]+i]:0;
}

inline AliLHCDipValF* AliLHCData::GetBPTXPhaseRMS(int bm, int i) const { // get record 
  return (GoodPairID(bm) && i>=0 && i<fBPTXPhaseRMS[bm][kNStor]) ? (AliLHCDipValF*)fData[fBPTXPhaseRMS[bm][kStart]+i]:0;
}

inline AliLHCDipValF* AliLHCData::GetBPTXPhaseShift(int bm, int i) const { // get record 
  return (GoodPairID(bm) && i>=0 && i<fBPTXPhaseShift[bm][kNStor]) ? (AliLHCDipValF*)fData[fBPTXPhaseShift[bm][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::GetLumiAliceSBDelivered(Double_t tStamp) const { // get closest in time value on delivered luminosity
  int idx = FindEntryValidFor(fLumiAliceStB[kStart],fLumiAliceStB[kNStor],tStamp);
  return idx<0 ? -1 : ((AliLHCDipValF*)fData[fLumiAliceStB[kStart]+idx])->GetValue();
}

inline Float_t AliLHCData::GetBckgAlice(int bg,Double_t tStamp) const { // get closest in time value on integrated bckg
  if (bg<0||bg>=kNBGs) return 0;
  int idx = FindEntryValidFor(fBckgAlice[bg][kStart],fBckgAlice[bg][kNStor],tStamp);
  return idx<0 ? -1 : ((AliLHCDipValF*)fData[fBckgAlice[bg][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
 AliLHCData.h:1
 AliLHCData.h:2
 AliLHCData.h:3
 AliLHCData.h:4
 AliLHCData.h:5
 AliLHCData.h:6
 AliLHCData.h:7
 AliLHCData.h:8
 AliLHCData.h:9
 AliLHCData.h:10
 AliLHCData.h:11
 AliLHCData.h:12
 AliLHCData.h:13
 AliLHCData.h:14
 AliLHCData.h:15
 AliLHCData.h:16
 AliLHCData.h:17
 AliLHCData.h:18
 AliLHCData.h:19
 AliLHCData.h:20
 AliLHCData.h:21
 AliLHCData.h:22
 AliLHCData.h:23
 AliLHCData.h:24
 AliLHCData.h:25
 AliLHCData.h:26
 AliLHCData.h:27
 AliLHCData.h:28
 AliLHCData.h:29
 AliLHCData.h:30
 AliLHCData.h:31
 AliLHCData.h:32
 AliLHCData.h:33
 AliLHCData.h:34
 AliLHCData.h:35
 AliLHCData.h:36
 AliLHCData.h:37
 AliLHCData.h:38
 AliLHCData.h:39
 AliLHCData.h:40
 AliLHCData.h:41
 AliLHCData.h:42
 AliLHCData.h:43
 AliLHCData.h:44
 AliLHCData.h:45
 AliLHCData.h:46
 AliLHCData.h:47
 AliLHCData.h:48
 AliLHCData.h:49
 AliLHCData.h:50
 AliLHCData.h:51
 AliLHCData.h:52
 AliLHCData.h:53
 AliLHCData.h:54
 AliLHCData.h:55
 AliLHCData.h:56
 AliLHCData.h:57
 AliLHCData.h:58
 AliLHCData.h:59
 AliLHCData.h:60
 AliLHCData.h:61
 AliLHCData.h:62
 AliLHCData.h:63
 AliLHCData.h:64
 AliLHCData.h:65
 AliLHCData.h:66
 AliLHCData.h:67
 AliLHCData.h:68
 AliLHCData.h:69
 AliLHCData.h:70
 AliLHCData.h:71
 AliLHCData.h:72
 AliLHCData.h:73
 AliLHCData.h:74
 AliLHCData.h:75
 AliLHCData.h:76
 AliLHCData.h:77
 AliLHCData.h:78
 AliLHCData.h:79
 AliLHCData.h:80
 AliLHCData.h:81
 AliLHCData.h:82
 AliLHCData.h:83
 AliLHCData.h:84
 AliLHCData.h:85
 AliLHCData.h:86
 AliLHCData.h:87
 AliLHCData.h:88
 AliLHCData.h:89
 AliLHCData.h:90
 AliLHCData.h:91
 AliLHCData.h:92
 AliLHCData.h:93
 AliLHCData.h:94
 AliLHCData.h:95
 AliLHCData.h:96
 AliLHCData.h:97
 AliLHCData.h:98
 AliLHCData.h:99
 AliLHCData.h:100
 AliLHCData.h:101
 AliLHCData.h:102
 AliLHCData.h:103
 AliLHCData.h:104
 AliLHCData.h:105
 AliLHCData.h:106
 AliLHCData.h:107
 AliLHCData.h:108
 AliLHCData.h:109
 AliLHCData.h:110
 AliLHCData.h:111
 AliLHCData.h:112
 AliLHCData.h:113
 AliLHCData.h:114
 AliLHCData.h:115
 AliLHCData.h:116
 AliLHCData.h:117
 AliLHCData.h:118
 AliLHCData.h:119
 AliLHCData.h:120
 AliLHCData.h:121
 AliLHCData.h:122
 AliLHCData.h:123
 AliLHCData.h:124
 AliLHCData.h:125
 AliLHCData.h:126
 AliLHCData.h:127
 AliLHCData.h:128
 AliLHCData.h:129
 AliLHCData.h:130
 AliLHCData.h:131
 AliLHCData.h:132
 AliLHCData.h:133
 AliLHCData.h:134
 AliLHCData.h:135
 AliLHCData.h:136
 AliLHCData.h:137
 AliLHCData.h:138
 AliLHCData.h:139
 AliLHCData.h:140
 AliLHCData.h:141
 AliLHCData.h:142
 AliLHCData.h:143
 AliLHCData.h:144
 AliLHCData.h:145
 AliLHCData.h:146
 AliLHCData.h:147
 AliLHCData.h:148
 AliLHCData.h:149
 AliLHCData.h:150
 AliLHCData.h:151
 AliLHCData.h:152
 AliLHCData.h:153
 AliLHCData.h:154
 AliLHCData.h:155
 AliLHCData.h:156
 AliLHCData.h:157
 AliLHCData.h:158
 AliLHCData.h:159
 AliLHCData.h:160
 AliLHCData.h:161
 AliLHCData.h:162
 AliLHCData.h:163
 AliLHCData.h:164
 AliLHCData.h:165
 AliLHCData.h:166
 AliLHCData.h:167
 AliLHCData.h:168
 AliLHCData.h:169
 AliLHCData.h:170
 AliLHCData.h:171
 AliLHCData.h:172
 AliLHCData.h:173
 AliLHCData.h:174
 AliLHCData.h:175
 AliLHCData.h:176
 AliLHCData.h:177
 AliLHCData.h:178
 AliLHCData.h:179
 AliLHCData.h:180
 AliLHCData.h:181
 AliLHCData.h:182
 AliLHCData.h:183
 AliLHCData.h:184
 AliLHCData.h:185
 AliLHCData.h:186
 AliLHCData.h:187
 AliLHCData.h:188
 AliLHCData.h:189
 AliLHCData.h:190
 AliLHCData.h:191
 AliLHCData.h:192
 AliLHCData.h:193
 AliLHCData.h:194
 AliLHCData.h:195
 AliLHCData.h:196
 AliLHCData.h:197
 AliLHCData.h:198
 AliLHCData.h:199
 AliLHCData.h:200
 AliLHCData.h:201
 AliLHCData.h:202
 AliLHCData.h:203
 AliLHCData.h:204
 AliLHCData.h:205
 AliLHCData.h:206
 AliLHCData.h:207
 AliLHCData.h:208
 AliLHCData.h:209
 AliLHCData.h:210
 AliLHCData.h:211
 AliLHCData.h:212
 AliLHCData.h:213
 AliLHCData.h:214
 AliLHCData.h:215
 AliLHCData.h:216
 AliLHCData.h:217
 AliLHCData.h:218
 AliLHCData.h:219
 AliLHCData.h:220
 AliLHCData.h:221
 AliLHCData.h:222
 AliLHCData.h:223
 AliLHCData.h:224
 AliLHCData.h:225
 AliLHCData.h:226
 AliLHCData.h:227
 AliLHCData.h:228
 AliLHCData.h:229
 AliLHCData.h:230
 AliLHCData.h:231
 AliLHCData.h:232
 AliLHCData.h:233
 AliLHCData.h:234
 AliLHCData.h:235
 AliLHCData.h:236
 AliLHCData.h:237
 AliLHCData.h:238
 AliLHCData.h:239
 AliLHCData.h:240
 AliLHCData.h:241
 AliLHCData.h:242
 AliLHCData.h:243
 AliLHCData.h:244
 AliLHCData.h:245
 AliLHCData.h:246
 AliLHCData.h:247
 AliLHCData.h:248
 AliLHCData.h:249
 AliLHCData.h:250
 AliLHCData.h:251
 AliLHCData.h:252
 AliLHCData.h:253
 AliLHCData.h:254
 AliLHCData.h:255
 AliLHCData.h:256
 AliLHCData.h:257
 AliLHCData.h:258
 AliLHCData.h:259
 AliLHCData.h:260
 AliLHCData.h:261
 AliLHCData.h:262
 AliLHCData.h:263
 AliLHCData.h:264
 AliLHCData.h:265
 AliLHCData.h:266
 AliLHCData.h:267
 AliLHCData.h:268
 AliLHCData.h:269
 AliLHCData.h:270
 AliLHCData.h:271
 AliLHCData.h:272
 AliLHCData.h:273
 AliLHCData.h:274
 AliLHCData.h:275
 AliLHCData.h:276
 AliLHCData.h:277
 AliLHCData.h:278
 AliLHCData.h:279
 AliLHCData.h:280
 AliLHCData.h:281
 AliLHCData.h:282
 AliLHCData.h:283
 AliLHCData.h:284
 AliLHCData.h:285
 AliLHCData.h:286
 AliLHCData.h:287
 AliLHCData.h:288
 AliLHCData.h:289
 AliLHCData.h:290
 AliLHCData.h:291
 AliLHCData.h:292
 AliLHCData.h:293
 AliLHCData.h:294
 AliLHCData.h:295
 AliLHCData.h:296
 AliLHCData.h:297
 AliLHCData.h:298
 AliLHCData.h:299
 AliLHCData.h:300
 AliLHCData.h:301
 AliLHCData.h:302
 AliLHCData.h:303
 AliLHCData.h:304
 AliLHCData.h:305
 AliLHCData.h:306
 AliLHCData.h:307
 AliLHCData.h:308
 AliLHCData.h:309
 AliLHCData.h:310
 AliLHCData.h:311
 AliLHCData.h:312
 AliLHCData.h:313
 AliLHCData.h:314
 AliLHCData.h:315
 AliLHCData.h:316
 AliLHCData.h:317
 AliLHCData.h:318
 AliLHCData.h:319
 AliLHCData.h:320
 AliLHCData.h:321
 AliLHCData.h:322
 AliLHCData.h:323
 AliLHCData.h:324
 AliLHCData.h:325
 AliLHCData.h:326
 AliLHCData.h:327
 AliLHCData.h:328
 AliLHCData.h:329
 AliLHCData.h:330
 AliLHCData.h:331
 AliLHCData.h:332
 AliLHCData.h:333
 AliLHCData.h:334
 AliLHCData.h:335
 AliLHCData.h:336
 AliLHCData.h:337
 AliLHCData.h:338
 AliLHCData.h:339
 AliLHCData.h:340
 AliLHCData.h:341
 AliLHCData.h:342
 AliLHCData.h:343
 AliLHCData.h:344
 AliLHCData.h:345
 AliLHCData.h:346
 AliLHCData.h:347
 AliLHCData.h:348
 AliLHCData.h:349
 AliLHCData.h:350
 AliLHCData.h:351
 AliLHCData.h:352
 AliLHCData.h:353
 AliLHCData.h:354
 AliLHCData.h:355
 AliLHCData.h:356
 AliLHCData.h:357
 AliLHCData.h:358
 AliLHCData.h:359
 AliLHCData.h:360
 AliLHCData.h:361
 AliLHCData.h:362
 AliLHCData.h:363
 AliLHCData.h:364
 AliLHCData.h:365
 AliLHCData.h:366
 AliLHCData.h:367
 AliLHCData.h:368
 AliLHCData.h:369
 AliLHCData.h:370
 AliLHCData.h:371
 AliLHCData.h:372
 AliLHCData.h:373
 AliLHCData.h:374
 AliLHCData.h:375
 AliLHCData.h:376
 AliLHCData.h:377
 AliLHCData.h:378
 AliLHCData.h:379
 AliLHCData.h:380
 AliLHCData.h:381
 AliLHCData.h:382
 AliLHCData.h:383
 AliLHCData.h:384
 AliLHCData.h:385
 AliLHCData.h:386
 AliLHCData.h:387
 AliLHCData.h:388
 AliLHCData.h:389
 AliLHCData.h:390
 AliLHCData.h:391
 AliLHCData.h:392
 AliLHCData.h:393
 AliLHCData.h:394
 AliLHCData.h:395
 AliLHCData.h:396
 AliLHCData.h:397
 AliLHCData.h:398
 AliLHCData.h:399
 AliLHCData.h:400
 AliLHCData.h:401
 AliLHCData.h:402
 AliLHCData.h:403
 AliLHCData.h:404
 AliLHCData.h:405
 AliLHCData.h:406
 AliLHCData.h:407
 AliLHCData.h:408
 AliLHCData.h:409
 AliLHCData.h:410
 AliLHCData.h:411
 AliLHCData.h:412
 AliLHCData.h:413
 AliLHCData.h:414
 AliLHCData.h:415
 AliLHCData.h:416
 AliLHCData.h:417
 AliLHCData.h:418
 AliLHCData.h:419
 AliLHCData.h:420
 AliLHCData.h:421
 AliLHCData.h:422
 AliLHCData.h:423
 AliLHCData.h:424
 AliLHCData.h:425
 AliLHCData.h:426
 AliLHCData.h:427
 AliLHCData.h:428
 AliLHCData.h:429
 AliLHCData.h:430
 AliLHCData.h:431
 AliLHCData.h:432
 AliLHCData.h:433
 AliLHCData.h:434
 AliLHCData.h:435
 AliLHCData.h:436
 AliLHCData.h:437
 AliLHCData.h:438
 AliLHCData.h:439
 AliLHCData.h:440
 AliLHCData.h:441
 AliLHCData.h:442
 AliLHCData.h:443
 AliLHCData.h:444
 AliLHCData.h:445
 AliLHCData.h:446
 AliLHCData.h:447
 AliLHCData.h:448
 AliLHCData.h:449
 AliLHCData.h:450
 AliLHCData.h:451
 AliLHCData.h:452
 AliLHCData.h:453
 AliLHCData.h:454
 AliLHCData.h:455
 AliLHCData.h:456
 AliLHCData.h:457
 AliLHCData.h:458