#ifndef __TMrbDGF_h__
#define __TMrbDGF_h__
#include <time.h>
#include "TROOT.h"
#include "TTimer.h"
#include "TNamed.h"
#include "TEnv.h"
#include "TH1.h"
#include "TF1.h"
#include "TArrayS.h"
#include "TMrbLofNamedX.h"
#include "TMrbEsone.h"
#include "TMrbDGFData.h"
#include "TMrbDGFEventBuffer.h"
#include "TMrbDGFHistogramBuffer.h"
class TMrbDGF : public TNamed {
public:
enum EMrbDGFStatusMBits { kSetupOk = BIT(0),
kConnected = BIT(1),
kOffline = BIT(2),
kLocalData = BIT(3),
kSystemFPGACodeLoaded = BIT(4),
kFippiFPGACodeLoaded = BIT(5),
kDSPCodeLoaded = BIT(6),
kParamValuesRead = BIT(7),
kParamsIncoreChanged = BIT(8),
kDSPRunning = BIT(9),
kDSPAborted = BIT(10)
};
enum EMrbBitOp { kBitSet = 1,
kBitOr,
kBitMask,
kBitClear
};
enum EMrbWaitStatus { kWaitError = -3,
kWaitTimedOut = -2,
kWaitAborted = -1,
kWaitActive = 1,
kWaitForLAM = 2,
kWaitOk = 3
};
enum { kTimeout = 1000 };
enum { kCalibrationSize = 1024 };
enum EMrbDGFSaveIdx { kSaveTrace,
kSaveUntrigTrace,
kSaveDacRamp,
kSaveTaufit,
kSaveAccuHist
};
public:
TMrbDGF( const Char_t * DgfName = "DGF-4C") : TNamed(DgfName, "Xia DGF-4C") {
fStatusM = 0;
};
TMrbDGF( const Char_t * DGFName,
const Char_t * HostName, Int_t Crate, Int_t Station,
Bool_t Connect = kTRUE, Bool_t Offline = kFALSE,
Bool_t LocalData = kFALSE);
TMrbDGF( const Char_t * DGFName,
const Char_t * HostName, const Char_t * CamacAddr,
Bool_t Connect = kTRUE, Bool_t Offline = kFALSE,
Bool_t LocalData = kFALSE);
~TMrbDGF() {
gROOT->GetList()->Remove(this);
ResetDGF();
};
Bool_t DownloadFPGACode(TMrbDGFData::EMrbFPGAType FPGAType);
Bool_t DownloadFPGACode(const Char_t * FPGAType);
Bool_t FPGACodeLoaded(TMrbDGFData::EMrbFPGAType FPGAType);
Bool_t FPGACodeLoaded(const Char_t * FPGAType);
Bool_t SetSwitchBusDefault(Bool_t IndiFlag = kFALSE, const Char_t * Prefix = NULL, TEnv * Env = NULL);
Bool_t SetSwitchBus(UInt_t Bits = 0, TMrbDGF::EMrbBitOp BitOp = kBitSet);
Bool_t SetSwitchBus(const Char_t * DSPTrigger, const Char_t * FastTrigger = NULL);
UInt_t GetSwitchBus();
Bool_t DownloadDSPCode(Int_t Retry = 3, Bool_t TriedOnce = kFALSE);
Bool_t UploadDSPCode(TArrayS & DSPCode);
inline Bool_t DSPCodeLoaded() { return((fStatusM & TMrbDGF::kDSPCodeLoaded) != 0); };
void ClearRegisters();
Bool_t ActivateUserPSACode(Bool_t Activate);
Bool_t ReadParamMemory(Bool_t ReadInputParams = kTRUE, Bool_t ReadOutputParams = kFALSE);
Bool_t ReadParamMemory(Int_t Channel);
Bool_t ReadParamMemory(const Char_t * ParamName);
Bool_t ReadParamMemory(Int_t FromParam, Int_t ToParam);
Bool_t WriteParamMemory(Bool_t Reprogram = kTRUE);
Bool_t WriteParamMemory(Int_t Channel);
Bool_t WriteParamMemory(const Char_t * ParamName);
Bool_t CopyParamMemory(TMrbDGF * Module, Bool_t CopyInputParams = kTRUE, Bool_t CopyOutputParams = kFALSE);
Bool_t CopyParamMemory(TMrbDGF * Module, Int_t Channel);
Bool_t CopyParamMemory(TMrbDGF * Module, const Char_t * ParamName);
inline Short_t * GetParamAddr() { return(fParams.GetArray()); };
inline Bool_t ParamValuesRead() { return((fStatusM & TMrbDGF::kParamValuesRead) != 0); };
inline void SetParamValuesRead(Bool_t Flag = kTRUE) {
if (Flag) fStatusM |= TMrbDGF::kParamValuesRead;
else fStatusM &= ~TMrbDGF::kParamValuesRead;
};
inline Bool_t ParamsIncoreChanged() { return((fStatusM & TMrbDGF::kParamsIncoreChanged) != 0); };
inline void SetParamsIncoreChanged(Bool_t Flag = kTRUE) {
if (Flag) fStatusM |= TMrbDGF::kParamsIncoreChanged;
else fStatusM &= ~TMrbDGF::kParamsIncoreChanged;
};
Bool_t SetParValue(const Char_t * ParamName, Int_t Value, Bool_t UpdateDSP = kTRUE);
Int_t GetParValue(const Char_t * ParamName, Bool_t ReadFromDSP = kTRUE);
Bool_t SetParValue(Int_t Channel, const Char_t * ParamName, Int_t Value, Bool_t UpdateDSP = kTRUE);
Int_t GetParValue(Int_t Channel, const Char_t * ParamName, Bool_t ReadFromDSP = kTRUE);
Bool_t SetParValue(Int_t Offset, Int_t Value, Bool_t UpdateDSP = kTRUE);
Int_t GetParValue(Int_t Offset, Bool_t ReadFromDSP = kTRUE);
Bool_t WriteParamsToFile(const Char_t * FileName = "", const Char_t * ParamName = "*");
Bool_t WriteParamsToFile(const Char_t * FileName, Int_t Channel);
Bool_t PrintParams(ostream & OutStrm, const Char_t * ParamName = "*");
Bool_t PrintParams(ostream & OutStrm, Int_t Channel);
inline Bool_t PrintParams(const Char_t * ParamName = "*") { return(PrintParams(cout, ParamName)); };
inline Bool_t PrintParams(Int_t Channel) { return(PrintParams(cout, Channel)); };
Bool_t PrintStatus(ostream & OutStrm, Int_t Channel = -1);
inline Bool_t PrintStatus(Int_t Channel = -1) { return(PrintStatus(cout, Channel)); };
Int_t SaveParams(const Char_t * ParamFile, Bool_t ReadFromDSP = kTRUE);
Int_t LoadParams(const Char_t * ParamFile, const Char_t * AltParamFile = "", Bool_t UpdateDSP = kTRUE);
Int_t LoadParamsToEnv(TEnv * Env, const Char_t * ParamFile, const Char_t * AltParamFile = "");
Int_t SaveValues(const Char_t * ValueFile, Bool_t ReadFromDSP = kTRUE);
Int_t LoadPsaParams(const Char_t * ParamFile, const Char_t * AltParamFile = "", Bool_t UpdateDSP = kTRUE);
Bool_t SaveParams(TArrayS & TempStorage);
Bool_t RestoreParams(TArrayS & TempStorage);
Bool_t SaveParams(EMrbDGFSaveIdx SaveIdx);
Bool_t RestoreParams(EMrbDGFSaveIdx SaveIdx);
Double_t Rounded(Double_t Value);
UInt_t * ToFixedPoint(Double_t Value, UInt_t * DspFixPt);
Double_t FromFixedPoint(UInt_t * DspFixPt);
UInt_t * ToDouble(Double_t Value, UInt_t * DspDouble);
Bool_t SetModCSRA(UInt_t Bits, TMrbDGF::EMrbBitOp BitOp, Bool_t UpdateDSP = kTRUE);
UInt_t GetModCSRA(Bool_t ReadFromDSP = kTRUE);
Bool_t SetCoincPattern(UInt_t Pattern, Bool_t UpdateDSP = kTRUE);
UInt_t GetCoincPattern(Bool_t ReadFromDSP = kTRUE);
Bool_t ModifyCoincPattern(UInt_t Pattern, EMrbBitOp AddOrRemove, Bool_t UpdateDSP = kTRUE);
Bool_t CoincPatternSet(UInt_t Pattern, Bool_t ReadFromDSP = kTRUE);
Bool_t SetChanCSRA(Int_t Channel, UInt_t Bits, TMrbDGF::EMrbBitOp BitOp, Bool_t UpdateDSP = kTRUE);
UInt_t GetChanCSRA(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetUserPsaCSR(Int_t Channel, UInt_t Bits, TMrbDGF::EMrbBitOp BitOp, Bool_t UpdateDSP = kTRUE);
UInt_t GetUserPsaCSR(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Int_t GetUserPsaData4(Int_t Channel, Int_t Offset, Bool_t ReadFromDSP = kTRUE);
Bool_t SetUserPsaData4(Int_t Channel, Int_t Offset, Int_t Value, Bool_t UpdateDSP = kTRUE);
Int_t GetUserPsaData8(Int_t Channel, Int_t Offset, Bool_t ReadFromDSP = kTRUE);
Bool_t SetUserPsaData8(Int_t Channel, Int_t Offset, Int_t Value, Bool_t UpdateDSP = kTRUE);
Bool_t SetChannelMask(const Char_t * ChannelMask, Bool_t UpdateDSP = kTRUE);
Bool_t SetChannelMask(UInt_t ChannelMask, Bool_t UpdateDSP = kTRUE);
UInt_t GetChannelMask(Bool_t ReadFromDSP = kTRUE);
Bool_t SetGoodChannel(Int_t Channel, EMrbBitOp SetOrClear = kBitOr, Bool_t UpdateDSP = kTRUE);
Bool_t IsGoodChannel(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Int_t GetNofGoodChannels(Bool_t ReadFromDSP = kTRUE);
void PrintChannelMask(Bool_t CrFlag, Bool_t ReadFromDSP = kTRUE);
inline Bool_t ClearChannelMask(Bool_t UpdateDSP = kTRUE) { return(SetChannelMask((UInt_t) 0, UpdateDSP)); };
Bool_t SetTriggerMask(const Char_t * ChannelMask, const Char_t * Polarity, Bool_t UpdateDSP = kTRUE);
Bool_t SetTriggerMask(UInt_t ChannelMask, Int_t Polarity, Bool_t UpdateDSP = kTRUE);
Bool_t SetTriggerMask(UInt_t ChannelMask, const Char_t * Polarity, Bool_t UpdateDSP = kTRUE);
UInt_t GetTriggerMask(Bool_t ReadFromDSP = kTRUE);
Bool_t SetTriggerBit(Int_t Channel, Int_t Polarity, EMrbBitOp SetOrClear = kBitOr, Bool_t UpdateDSP = kTRUE);
Bool_t SetTriggerBit(Int_t Channel, const Char_t * Polarity, EMrbBitOp SetOrClear = kBitOr, Bool_t UpdateDSP = kTRUE);
Bool_t SetTriggerPolarity(Int_t Channel, Int_t Polarity, Bool_t UpdateDSP = kTRUE);
Int_t GetTriggerPolarity(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t HasTriggerBitSet(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
void PrintTriggerMask(Bool_t CrFlag, Bool_t ReadFromDSP = kTRUE);
inline Bool_t ClearTriggerMask(Bool_t UpdateDSP = kTRUE) { return(SetTriggerMask((UInt_t) 0, -1, UpdateDSP)); };
Bool_t SetXwait(Int_t Xwait = 0, Bool_t UpdateDSP = kTRUE);
Bool_t SetSynchWait(Bool_t SynchFlag = kTRUE, Bool_t UpdateDSP = kTRUE);
Bool_t SetInSynch(Bool_t SynchFlag = kTRUE, Bool_t UpdateDSP = kTRUE);
Bool_t SetDelay(Int_t Channel, Double_t Delay, Bool_t UpdateDSP = kTRUE);
Double_t GetDelay(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Int_t SetGain(Int_t Channel, Double_t Gain, Bool_t UpdateDSP = kTRUE);
Double_t GetGain(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Int_t SetOffset(Int_t Channel, Double_t Offset, Bool_t UpdateDSP=kTRUE);
Double_t GetOffset(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetCFD(Int_t Channel, Int_t CfdVal, Bool_t UpdateDSP=kTRUE);
Int_t GetCFD(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t UpdateSlowFilter(Int_t Channel, Bool_t UpdateDSP = kTRUE);
Bool_t ResetPGTime(Int_t Channel, Bool_t UpdateDSP = kTRUE);
Bool_t SetPeakTime(Int_t Channel, Double_t PeakTime, Bool_t UpdateDSP = kTRUE);
Double_t GetPeakTime(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetGapTime(Int_t Channel, Double_t GapTime, Bool_t UpdateDSP = kTRUE);
Double_t GetGapTime(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t ResetFastPGTime(Int_t Channel, Bool_t UpdateDSP = kTRUE);
Bool_t SetFastPeakTime(Int_t Channel, Double_t PeakTime, Bool_t UpdateDSP = kTRUE);
Double_t GetFastPeakTime(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetFastGapTime(Int_t Channel, Double_t GapTime, Bool_t UpdateDSP = kTRUE);
Double_t GetFastGapTime(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
void SetFastFilter(Int_t Channel, Int_t Length, Int_t Gap, Bool_t UpdateDSP);
Double_t GetDeltaT(Bool_t ReadFromDSP = kTRUE);
Int_t CalcCoincWait(Bool_t ReadFromDSP = kTRUE);
Bool_t SetCoincWait(Bool_t ReadFromDSP = kTRUE);
Bool_t SetThreshold(Int_t Channel, Int_t Threshold, Bool_t UpdateDSP = kTRUE);
Int_t GetThreshold(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetTraceLength(Int_t Channel, Double_t TraceLength, Bool_t UpdateDSP = kTRUE);
Double_t GetTraceLength(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetTau(Int_t Channel, Double_t Tau, Bool_t UpdateDSP = kTRUE);
Double_t GetTau(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetPSALength(Int_t Channel, Double_t PsaLength, Bool_t UpdateDSP = kTRUE);
Double_t GetPSALength(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetPSAOffset(Int_t Channel, Double_t PsaOffset, Bool_t UpdateDSP = kTRUE);
Double_t GetPSAOffset(Int_t Channel, Bool_t ReadFromDSP = kTRUE);
Bool_t SetBinning(Int_t Channel, Int_t EnBin, Bool_t UpdateDSP = kTRUE);
Int_t GetTrace(TMrbDGFEventBuffer & Data, Int_t TraceLength,
UInt_t ChannelPattern, Int_t XwaitStates = 0, Bool_t AutoTrigFlag = kTRUE);
Bool_t GetTrace_Init(Int_t TraceLength, UInt_t ChannelPattern,
Int_t XwaitStates = 0, Bool_t AutoTrigFlag = kTRUE);
Bool_t GetTrace_Start();
Int_t GetTrace_Stop(TMrbDGFEventBuffer & Data, Int_t SecsToWait = 5);
Int_t GetUntrigTrace(TArrayI & Buffer, UInt_t ChannelPattern, Int_t XwaitStates = 0);
Bool_t GetUntrigTrace_Init(TArrayI & Buffer, UInt_t ChannelPattern, Int_t XwaitStates = 0);
Bool_t GetUntrigTrace_Start(Int_t Channel);
Int_t GetUntrigTrace_Stop(Int_t Channel, TArrayI & Buffer, Int_t SecsToWait = 5);
Bool_t GetUntrigTrace_Restore();
Int_t GetDacRamp(TArrayI & Buffer);
Bool_t GetDacRamp_Init();
Bool_t GetDacRamp_Start();
Int_t GetDacRamp_Stop(TArrayI & Buffer, Int_t SecsToWait = 10);
Int_t ReadEventBuffer(TMrbDGFEventBuffer & Buffer);
Bool_t AccuHistograms(Int_t Time, const Char_t * Scale = "secs",
UInt_t ChannelPattern = TMrbDGFData::kChannelPattern);
Bool_t AccuHist_Init(UInt_t ChannelPattern = TMrbDGFData::kChannelPattern);
Bool_t AccuHist_Start(Bool_t ClearMCA = kTRUE);
Bool_t AccuHist_Stop(Int_t SecsToWait = 10);
Int_t ReadHistograms(TMrbDGFHistogramBuffer & Buffer, UInt_t ChannelPattern);
Int_t ReadHistogramsViaRsh(TMrbDGFHistogramBuffer & Buffer, UInt_t ChannelPattern);
Double_t TauFit(Int_t Channel, Int_t NofTraces, Int_t TraceLength, Double_t A0, Double_t A1,
Int_t From = 0, Int_t To = 0,
Stat_t TraceError = 0, Stat_t ChiSquare = 5.,
Bool_t DrawIt = kTRUE);
Bool_t StartRun(Bool_t NewRun = kTRUE);
Bool_t StopRun();
inline void InhibitNewRun(Bool_t Flag = kTRUE) { fInhibitNewRun = Flag; };
inline void AbortRun() { fStatusM |= TMrbDGF::kDSPAborted; };
inline Bool_t IsAborted() { return((fStatusM & TMrbDGF::kDSPAborted) != 0); };
inline Bool_t SetupOk() { return((fStatusM & TMrbDGF::kSetupOk) != 0); };
Bool_t Connect();
inline Bool_t IsConnected() { return((fStatusM & TMrbDGF::kConnected) != 0); };
Bool_t SetCamacHost(const Char_t * Host);
Bool_t SetCrate(Int_t Crate);
Bool_t SetStation(Int_t Station);
inline const Char_t * GetCamacHost() { return(fCamacHost.Data()); };
inline Int_t GetCrate() { return(fCrate); };
inline Int_t GetStation() { return(fStation); };
inline void SetClusterID(Int_t ClusterSerial = 0, const Char_t * ClusterColor = "", const Char_t * SegmentID = "", Int_t HexNum = 0) {
fClusterID.Set((Int_t) (ClusterSerial << 12) + HexNum, ClusterColor, SegmentID);
};
inline TMrbNamedX * GetClusterID() { return(&fClusterID); };
inline Int_t GetClusterSerial() const { return((Int_t) (fClusterID.GetIndex() >> 12)); };
inline Int_t GetClusterHexNum() const { return(fClusterID.GetIndex() & 0xFFF); };
inline const Char_t * GetClusterColor() const { return(fClusterID.GetName()); };
inline const Char_t * GetClusterSegments() const { return(fClusterID.GetTitle()); };
const Char_t * GetClusterInfo(TMrbString & Info);
Bool_t IsCore(Int_t Channel);
TMrbNamedX * GetRevision(Bool_t Renew = kFALSE);
inline void SetModuleNumber(Int_t ModNum) { fModNum = ModNum; };
inline Int_t GetModuleNumber() { return(fModNum); };
inline UInt_t GetStatus() { return(fStatusM); };
inline void SetStatus(UInt_t Status) { fStatusM = Status; };
inline void Wait(Int_t Msecs = 100) { gSystem->Sleep(Msecs); };
EMrbWaitStatus WaitActive(Int_t Timeout = 10);
EMrbWaitStatus WaitLAM(Int_t Timeout = 10);
inline EMrbWaitStatus GetWaitStatus() { return(fStatusW); };
inline Bool_t ActiveBit() { return((this->ReadCSR() & TMrbDGFData::kActive) != 0); };
inline Bool_t LAMBit() { return((this->ReadCSR() & TMrbDGFData::kLAMActive) != 0); };
inline Bool_t IsOffline() { return((fStatusM & TMrbDGF::kOffline) != 0); };
inline Bool_t HasLocalDataBase() { return((fStatusM & TMrbDGF::kLocalData) != 0); };
void Print(Option_t * Option) const { TObject::Print(Option); }
void Print(ostream & OutStrm);
virtual inline void Print() { Print(cout); };
inline TMrbDGFData * Data() { return(fDGFData); };
inline TMrbEsone * Camac() { return(&fCamac); };
inline UShort_t * GetPAddr() { return((UShort_t *) fParams.GetArray()); };
inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };
void SetVerboseMode(Bool_t VerboseFlag = kTRUE);
Bool_t WriteICSR(UInt_t Bits);
Bool_t WriteCSR(UInt_t Bits);
Bool_t WriteTSAR(UInt_t Data);
Bool_t WriteWCR(Int_t WordCount);
UInt_t ReadICSR();
UInt_t ReadCSR();
UInt_t ReadTSAR();
Int_t ReadWCR();
virtual Bool_t HandleTimer(TTimer * Timer);
protected:
void ResetDGF();
void SetupDGF(Bool_t LocalData = kFALSE);
Bool_t CheckConnect(const Char_t * Method);
Bool_t CheckActive(const Char_t * Method);
Bool_t CheckChannel(const Char_t * Method, Int_t Channel);
Bool_t CheckChannelMask(const Char_t * Method);
Bool_t CheckTriggerMask(const Char_t * Method);
Bool_t CheckTriggerPolarity(const Char_t * Method);
inline void CopyData(TArrayI & Dest, Short_t * Src, Int_t NofWords) {
Dest.Set(NofWords); for (Int_t i = 0; i < NofWords; i++) Dest[i] = (Int_t) *Src++;
};
inline void CopyData(TArrayS & Dest, Int_t * Src, Int_t NofWords) {
Dest.Set(NofWords); for (Int_t i = 0; i < NofWords; i++) Dest[i] = (Short_t) *Src++;
};
inline void CopyData(TArrayI & Dest, UShort_t * Src, Int_t NofWords) {
Dest.Set(NofWords); for (Int_t i = 0; i < NofWords; i++) Dest[i] = (Int_t) *Src++;
};
inline Bool_t WritePSA(Int_t Offset) { return(WriteTSAR(TMrbDGFData::kDSPInparStartAddr + Offset)); };
Bool_t CheckBufferSize(const Char_t * Method, Int_t BufSize);
Int_t ReadHistogramBufferPage();
void SetRevision(Int_t ManufactIndex = TMrbDGFData::kRevUnknown);
const Char_t * GetSynonyms(TString & Synonyms, TMrbNamedX * Param);
public:
TMrbLofNamedX fLofDGFStatusMBits;
TMrbLofNamedX fLofDGFSwitchBusModes;
protected:
UInt_t fXiaRelease;
UInt_t fStatusM;
EMrbWaitStatus fStatusW;
Bool_t fInhibitNewRun;
Int_t fModNum;
TMrbEsone fCamac;
TString fCamacHost;
Int_t fCrate;
Int_t fStation;
TMrbNamedX fClusterID;
TMrbNamedX fRevision;
TArrayS fParams;
TH1F * fTauDistr;
TF1 * fGaussian;
TMrbDGFData * fDGFData;
TTimer * fAccuTimer;
Int_t fSecsToWait;
Int_t fStopWatch;
TArrayS fTmpParTrace;
TArrayS fTmpParUntrigTrace;
TArrayS fTmpParDacRamp;
TArrayS fTmpParTaufit;
TArrayS fTmpParAccuHist;
ClassDef(TMrbDGF, 1)
};
#endif