#ifndef ALITPCCALIBRAW_H
#define ALITPCCALIBRAW_H
#include <TVectorF.h>
#include <TObjArray.h>
#include <THnSparse.h>
#include "AliTPCCalibRawBase.h"
#include "AliTPCCalPad.h"
#include "AliTPCROC.h"
class TH2C;
class TH1F;
class TMap;
class TGraph;
class TCanvas;
class AliTPCCalibRaw : public AliTPCCalibRawBase {
public:
AliTPCCalibRaw();
AliTPCCalibRaw(const TMap *config);
virtual ~AliTPCCalibRaw();
enum {kNRCU=216};
virtual Int_t Update(const Int_t isector, const Int_t iRow, const Int_t iPad,
const Int_t iTimeBin, const Float_t signal);
virtual void UpdateDDL();
virtual void EndEvent();
virtual void ResetEvent();
virtual void Analyse();
UInt_t GetNFailL1Phase() const {return fNFailL1Phase;}
UInt_t GetNFailL1PhaseEvents() const {return fNFailL1PhaseEvent;}
Int_t GetPeakDetectionMinus() const {return fPeakDetMinus;}
Int_t GetPeakDetectionPlus() const {return fPeakDetPlus;}
const TVectorF* GetALTROL1PhaseEvents() const {return &fArrALTROL1Phase;}
const TVectorF *GetALTROL1PhaseEventsRCU(Int_t rcu) const {return (TVectorF*)fArrALTROL1PhaseEvent.At(rcu);}
const TVectorF *GetALTROL1PhaseFailEventsRCU(Int_t rcu) const {return (TVectorF*)fArrALTROL1PhaseFailEvent.At(rcu);}
const TVectorF *GetOccupancyEvent() const {return &fVOccupancyEvent;}
const TVectorF *GetOccupancyEventSensitive() const {return &fVOccupancySenEvent;}
const TVectorF *GetSignalSumEvent() const {return &fVSignalSumEvent;}
const TVectorF *GetSignalSumEventSensitive() const {return &fVSignalSumSenEvent;}
const TVectorF *GetFiredPadsSensitive() const {return &fVNfiredPadsSenEvent;}
const TVectorF *GetEventTimeStamps() const {return &fVTimeStampEvent;}
UInt_t GetFirstTimeStamp() const {return fFirstTimeStamp;}
void SetRangePeakDetection(Int_t minus, Int_t plus) { fPeakDetMinus=minus; fPeakDetPlus=plus;}
TH2C *MakeHistL1RCUEvents(Int_t type=0);
TH2C *MakeHistL1RCUEventsIROC(Int_t type=0);
TH2C *MakeHistL1RCUEventsOROC(Int_t type=0);
TH1F *MakeHistL1PhaseDist();
TVectorF *MakeVectL1PhaseDist();
TGraph* MakeGraphOccupancy(const Int_t type=0, const Int_t xType=0);
TCanvas* MakeCanvasOccupancy(const Int_t xType=1, Bool_t sen=kFALSE);
const THnSparseI *GetHnDrift() const {return fHnDrift;}
void Merge(AliTPCCalibRaw * const sig);
virtual Long64_t Merge(TCollection * const list);
private:
Int_t fPeakDetMinus;
Int_t fPeakDetPlus;
UInt_t fNFailL1Phase;
UInt_t fNFailL1PhaseEvent;
UInt_t fNSecTime;
UInt_t fNBinsTime;
Bool_t fPadProcessed;
Int_t fCurrentChannel;
Int_t fCurrentSector;
Int_t fLastSector;
Int_t fCurrentRow;
Int_t fCurrentPad;
Int_t fLastTimeBinProc;
Int_t fPeakTimeBin;
Int_t fLastSignal;
Int_t fNOkPlus;
Int_t fNOkMinus;
Int_t fNanoSec;
TVectorF fArrCurrentPhaseDist;
TVectorF fArrCurrentPhase;
TVectorF fArrFailEventNumber;
TVectorF fArrALTROL1Phase;
TObjArray fArrALTROL1PhaseEvent;
TObjArray fArrALTROL1PhaseFailEvent;
enum {kHnBinsDV=3};
THnSparseI *fHnDrift;
TVectorF fVOccupancyEvent;
TVectorF fVSignalSumEvent;
TVectorF fVOccupancySenEvent;
TVectorF fVSignalSumSenEvent;
TVectorF fVNfiredPadsSenEvent;
TVectorF fVTimeStampEvent;
TVectorF *MakeArrL1PhaseRCU(Int_t rcu, Bool_t force=kFALSE);
TVectorF *MakeArrL1PhaseFailRCU(Int_t rcu, Bool_t force=kFALSE);
Bool_t IsEdgePad(Int_t sector, Int_t row, Int_t pad) const;
void CreateDVhist();
AliTPCCalibRaw(const AliTPCCalibRaw &calib);
AliTPCCalibRaw& operator = (const AliTPCCalibRaw &source);
ClassDef(AliTPCCalibRaw,4)
};
inline TVectorF *AliTPCCalibRaw::MakeArrL1PhaseRCU(Int_t rcu, Bool_t force)
{
TVectorF *arr=(TVectorF*)fArrALTROL1PhaseEvent.UncheckedAt(rcu);
if (!arr && force) {
arr=new TVectorF(100);
fArrALTROL1PhaseEvent.AddAt(arr,rcu);
}
return arr;
}
inline TVectorF *AliTPCCalibRaw::MakeArrL1PhaseFailRCU(Int_t rcu, Bool_t force)
{
TVectorF *arr=(TVectorF*)fArrALTROL1PhaseFailEvent.UncheckedAt(rcu);
if (!arr && force) {
arr=new TVectorF(100);
fArrALTROL1PhaseFailEvent.AddAt(arr,rcu);
}
return arr;
}
inline Bool_t AliTPCCalibRaw::IsEdgePad(Int_t sector, Int_t row, Int_t pad) const
{
Int_t edge1 = 0;
if ( pad == edge1 ) return kTRUE;
Int_t edge2 = fROC->GetNPads(sector,row)-1;
if ( pad == edge2 ) return kTRUE;
return kFALSE;
}
#endif