#ifndef ALITRDMCMSIM_H
#define ALITRDMCMSIM_H
#include <iostream>
class TObject;
class TClonesArray;
class TH2F;
class AliRunLoader;
class AliTRDfeeParam;
class AliTRDtrapConfig;
class AliTRDarrayADC;
class AliTRDarrayDictionary;
class AliTRDdigitsManager;
class TTreeSRedirector;
class AliTRDmcmSim : public TObject {
public:
AliTRDmcmSim();
virtual ~AliTRDmcmSim();
void Init(Int_t det, Int_t rob, Int_t mcm, Bool_t newEvent = kFALSE);
void Reset();
void SetDebugStream(TTreeSRedirector *stream) { fDebugStream = stream; }
TTreeSRedirector* GetDebugStream() const { return fDebugStream; }
Bool_t LoadMCM(AliRunLoader* const runloader, Int_t det, Int_t rob, Int_t mcm);
void NoiseTest(Int_t nsamples, Int_t mean, Int_t sigma, Int_t inputGain = 1, Int_t inputTail = 2);
Int_t GetDataRaw(Int_t iadc, Int_t timebin) const { return (fADCR[iadc][timebin] >> 2); }
Int_t GetDataFiltered(Int_t iadc, Int_t timebin) const { return (fADCF[iadc][timebin] >> 2); }
void SetData(Int_t iadc, const Int_t* const adc);
void SetData(Int_t iadc, Int_t it, Int_t adc);
void SetData(AliTRDarrayADC * const adcArray,
AliTRDdigitsManager * const digitsManager = 0x0);
void SetDataByPad(const AliTRDarrayADC *const adcArray,
AliTRDdigitsManager * const digitsManager = 0x0);
void SetDataPedestal(Int_t iadc);
static Bool_t GetApplyCut() { return fgApplyCut; }
static void SetApplyCut(Bool_t applyCut) { fgApplyCut = applyCut; }
static Int_t GetAddBaseline() { return fgAddBaseline; }
static void SetAddBaseline(Int_t baseline) { fgAddBaseline = baseline; }
static void SetStoreClusters(Bool_t storeClusters) { fgStoreClusters = storeClusters; }
static Bool_t GetStoreClusters() { return fgStoreClusters; }
Int_t GetDetector() const { return fDetector; };
Int_t GetRobPos() const { return fRobPos; };
Int_t GetMcmPos() const { return fMcmPos; };
Int_t GetRow() const { return fRow; };
Int_t GetCol( Int_t iadc );
void WriteData(AliTRDarrayADC *digits);
Bool_t StoreTracklets();
TString GetTrklBranchName() const { return fTrklBranchName; }
void SetTrklBranchName(TString name) { fTrklBranchName = name; }
Int_t ProduceRawStream( UInt_t *buf, Int_t bufsize, UInt_t iEv = 0 ) const;
Int_t ProduceTrackletStream( UInt_t *buf, Int_t bufsize );
void Filter();
void ZSMapping();
void Tracklet();
void FilterPedestal();
void FilterGain();
void FilterTail();
void FilterPedestalInit(Int_t baseline = 10);
void FilterGainInit();
void FilterTailInit(Int_t baseline = -1);
UShort_t FilterPedestalNextSample(Int_t adc, Int_t timebin, UShort_t value);
UShort_t FilterGainNextSample(Int_t adc, UShort_t value);
UShort_t FilterTailNextSample(Int_t adc, UShort_t value);
void AddHitToFitreg(Int_t adc, UShort_t timebin, UShort_t qtot, Short_t ypos, Int_t label[]);
void CalcFitreg();
void TrackletSelection();
void FitTracklet();
Int_t GetNHits() const { return fNHits; }
Bool_t GetHit(Int_t index, Int_t &channel, Int_t &timebin, Int_t &qtot, Int_t &ypos, Float_t &y, Int_t &label) const;
TClonesArray* GetTrackletArray() const { return fTrackletArray; }
void Print(Option_t* const option="") const;
void Draw(Option_t* const option ="");
friend std::ostream& operator<<(std::ostream &os, const AliTRDmcmSim &mcm);
static ostream& Cfdat(ostream &os);
static ostream& Raw (ostream &os);
static ostream& Text (ostream &os);
Int_t GetPID(Int_t q0, Int_t q1);
void PrintPidLutHuman();
void PrintFitRegXml(ostream& os) const;
void PrintTrackletsXml(ostream& os) const;
void PrintAdcDatTxt(ostream& os) const;
void PrintAdcDatHuman(ostream& os) const;
void PrintAdcDatXml(ostream& os) const;
void PrintAdcDatDatx(ostream& os, Bool_t broadcast=kFALSE, Int_t timeBinOffset = -1) const;
static Bool_t ReadPackedConfig(AliTRDtrapConfig *cfg, Int_t hc, UInt_t *data, Int_t size);
static const Int_t fgkDmemAddrLUTcor0 = 0xC02A;
static const Int_t fgkDmemAddrLUTcor1 = 0xC028;
static const Int_t fgkDmemAddrLUTnbins = 0xC029;
static const Int_t fgkDmemAddrLUTStart = 0xC100;
static const Int_t fgkDmemAddrLUTEnd = 0xC3FF;
static const Int_t fgkDmemAddrLUTLength = 0xC02B;
static const Int_t fgkDmemAddrTrackletStart = 0xC0E0;
static const Int_t fgkDmemAddrTrackletEnd = 0xC0E3;
static const Int_t fgkDmemAddrDeflCorr = 0xc022;
static const Int_t fgkDmemAddrNdrift = 0xc025;
static const Int_t fgkDmemAddrDeflCutStart = 0xc030;
static const Int_t fgkDmemAddrDeflCutEnd = 0xc055;
protected:
Bool_t CheckInitialized() const;
void SetNTimebins(Int_t ntimebins);
static const Int_t fgkFormatIndex;
static const Int_t fgkMaxTracklets = 4;
static const Int_t fgkAddDigits = 2;
static const Int_t fgkNCPU = 4;
static const Int_t fgkNHitsMC = 100;
static const UShort_t fgkFPshifts[4];
Bool_t fInitialized;
Int_t fDetector;
Int_t fRobPos;
Int_t fMcmPos;
Int_t fRow;
Int_t fNTimeBin;
Int_t **fADCR;
Int_t **fADCF;
UInt_t *fMCMT;
TClonesArray *fTrackletArray;
Int_t *fZSMap;
Int_t fFitPtr[fgkNCPU];
TString fTrklBranchName;
AliTRDfeeParam *fFeeParam;
AliTRDtrapConfig *fTrapConfig;
AliTRDdigitsManager *fDigitsManager;
AliTRDarrayDictionary* fDict[3];
UInt_t* fPedAcc;
UInt_t* fGainCounterA;
UInt_t* fGainCounterB;
UShort_t* fTailAmplLong;
UShort_t* fTailAmplShort;
struct Hit_t {
Hit_t() : fChannel(0), fTimebin(0), fQtot(0), fYpos(0) { fLabel[0] = 0; fLabel[1] = 0; fLabel[2] = 0; }
Int_t fChannel;
Int_t fTimebin;
Int_t fQtot;
Int_t fYpos;
Int_t fLabel[3];
} fHits[fgkNHitsMC];
Int_t fNHits;
struct FitReg_t {
Int_t fNhits;
UInt_t fQ0;
UInt_t fQ1;
UInt_t fSumX;
Int_t fSumY;
UInt_t fSumX2;
UInt_t fSumY2;
Int_t fSumXY;
} *fFitReg;
void Sort2(UShort_t idx1i, UShort_t idx2i, UShort_t val1i, UShort_t val2i,
UShort_t * const idx1o, UShort_t * const idx2o, UShort_t * const val1o, UShort_t * const val2o) const;
void Sort3(UShort_t idx1i, UShort_t idx2i, UShort_t idx3i,
UShort_t val1i, UShort_t val2i, UShort_t val3i,
UShort_t * const idx1o, UShort_t * const idx2o, UShort_t * const idx3o,
UShort_t * const val1o, UShort_t * const val2o, UShort_t * const val3o);
void Sort6To4(UShort_t idx1i, UShort_t idx2i, UShort_t idx3i, UShort_t idx4i, UShort_t idx5i, UShort_t idx6i,
UShort_t val1i, UShort_t val2i, UShort_t val3i, UShort_t val4i, UShort_t val5i, UShort_t val6i,
UShort_t * const idx1o, UShort_t * const idx2o, UShort_t * const idx3o, UShort_t * const idx4o,
UShort_t * const val1o, UShort_t * const val2o, UShort_t * const val3o, UShort_t * const val4o);
void Sort6To2Worst(UShort_t idx1i, UShort_t idx2i, UShort_t idx3i, UShort_t idx4i, UShort_t idx5i, UShort_t idx6i,
UShort_t val1i, UShort_t val2i, UShort_t val3i, UShort_t val4i, UShort_t val5i, UShort_t val6i,
UShort_t * const idx5o, UShort_t * const idx6o);
UInt_t AddUintClipping(UInt_t a, UInt_t b, UInt_t nbits) const;
TTreeSRedirector *fDebugStream;
private:
AliTRDmcmSim(const AliTRDmcmSim &m);
AliTRDmcmSim &operator=(const AliTRDmcmSim &m);
static Bool_t fgApplyCut;
static Int_t fgAddBaseline;
static Bool_t fgStoreClusters;
ClassDef(AliTRDmcmSim,7)
};
std::ostream& operator<<(std::ostream& os, const AliTRDmcmSim& mcm);
#endif