#ifndef __TMrbModule_h__
#define __TMrbModule_h__
namespace std {} using namespace std;
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <fstream>
#include "Rtypes.h"
#include "TSystem.h"
#include "TObject.h"
#include "TNamed.h"
#include "TString.h"
#include "TObjArray.h"
#include "TMrbNamedX.h"
#include "TMrbLofNamedX.h"
#include "TMrbTemplate.h"
#include "TMrbConfig.h"
class TMrbSubevent;
class TMrbModuleChannel;
class TMrbModule : public TNamed {
public:
TMrbModule() {};
TMrbModule(const Char_t * ModuleName, const Char_t * ModuleID, Int_t NofChannels, Int_t Range);
~TMrbModule() {
DeleteRegisters();
};
Bool_t Set(const Char_t * RegName, Int_t Value, Int_t Channel = -1);
Bool_t Set(Int_t RegIndex, Int_t Value, Int_t Channel = -1);
Int_t Get(const Char_t * RegName, Int_t Channel = -1) const;
Int_t Get(Int_t RegIndex, Int_t Channel = -1) const;
Bool_t Set(const Char_t * RegName, const Char_t * Value, Int_t Channel = -1);
Bool_t Set(Int_t RegIndex, const Char_t * Value, Int_t Channel = -1);
inline TMrbNamedX * FindRegister(const Char_t * RegName) const {
return(fLofRegisters.FindByName(RegName, TMrbLofNamedX::kFindUnique | TMrbLofNamedX::kFindIgnoreCase));
};
inline TMrbNamedX * FindRegister(Int_t RegIndex) const { return(fLofRegisters.FindByIndex(RegIndex)); };
inline Bool_t HasRegisters() const { return(fLofRegisters.GetEntriesFast() > 0); };
inline Bool_t AllocateHistograms(Bool_t Flag = kTRUE) { fHistosToBeAllocated = Flag; return(kTRUE); };
inline Bool_t HistosToBeAllocated() const { return(fHistosToBeAllocated); };
inline Bool_t ConvertToInt() const { return(kTRUE); };
inline void SetActive(Bool_t ActiveFlag = kTRUE) { fIsActive = ActiveFlag; };
inline Bool_t IsActive() const { return(fIsActive); };
inline void ExcludeFromReadout(Bool_t ExcludeFlag = kTRUE) { fExcludeFromReadout = ExcludeFlag; };
inline Bool_t ToBeExcludedFromReadout() const { return(fExcludeFromReadout); };
Bool_t SetBlockReadout(Bool_t Flag = kTRUE);
inline Bool_t HasBlockReadout() const { return(fBlockReadout); };
inline TMrbLofNamedX * GetLofRegisters() { return(&fLofRegisters); };
inline Int_t GetRange() { return(fRange); };
inline TMrbNamedX * GetDataType() const { return(fDataType); };
inline void SetBinning(Int_t ChansPerBin = 1) {
fChansPerBin = ChansPerBin;
fBinRange = (fXmax - fXmin + fChansPerBin - 1) / fChansPerBin;
};
inline Int_t GetBinning() const { return(fChansPerBin); };
inline void SetBinRange(Int_t BinRange) { fBinRange = BinRange; };
inline Int_t GetBinRange() const { return(fBinRange); };
Bool_t SetXmin(Int_t Xmin = 0);
Bool_t SetXmax(Int_t Xmax = 0);
inline Int_t GetXmin() { return(fXmin); };
inline Int_t GetXmax() { return(fXmax); };
inline Int_t GetSubDevice() const { return(fSubDevice); };
void SetType(UInt_t ModuleType, Bool_t OrFlag = kTRUE);
inline TMrbNamedX * GetType() { return(&fModuleType); };
inline TMrbNamedX * GetModuleID() { return(&fModuleID); };
virtual inline const Char_t * GetMnemonic() const { return("unknown"); };
inline const Char_t * GetPosition() const { return(fPosition.Data()); };
inline Int_t GetCrate() const { return(fCrate); };
inline Int_t GetSerial() const { return(fSerial); };
Bool_t SetMbsBranch(Int_t MbsBranchNo, const Char_t * MbsBranchName = NULL);
inline Bool_t SetMbsBranch(TMrbNamedX * MbsBranch) { return(this->SetMbsBranch(MbsBranch->GetIndex(), MbsBranch->GetName())); };
inline TMrbNamedX * GetMbsBranch() { return(&fMbsBranch); };
inline Int_t GetMbsBranchNo() { return(fMbsBranch.GetIndex()); };
inline Bool_t IsAssignedToBranch() { return (fMbsBranch.GetIndex() != -1); };
inline void SetTimeOffset(Int_t TimeOffset) { fTimeOffset = TimeOffset; };
inline Int_t GetTimeOffset() const { return(fTimeOffset); };
inline Bool_t CheckID(TMrbConfig::EMrbModuleID ModuleID) const { return(fModuleID.GetIndex() == ModuleID); };
inline Int_t GetNofShortsPerChannel() const { return(fNofShortsPerChannel); };
inline Int_t GetNofShortsPerDatum() const { return(fNofShortsPerDatum); };
inline Int_t GetNofDataBits() const { return(fNofDataBits); };
inline Int_t GetNofChannels() const { return(fNofChannels); };
Int_t GetNofChannelsUsed() const;
UInt_t GetPatternOfChannelsUsed() const;
Bool_t CheckIfPatternIsContiguous() const;
inline TObjArray * GetLofChannels() { return(&fChannelSpec); };
const Char_t * GetLofChannelsAsString(TString & LofChannels) const;
TMrbModuleChannel * GetChannel(Int_t) const;
Bool_t LoadCodeTemplates(const Char_t * TemplateFile);
virtual Bool_t MakeReadoutCode(ofstream & RdoStrm, TMrbConfig::EMrbReadoutTag TagIndex, TMrbTemplate & Template, const Char_t * Prefix = NULL) { return(kFALSE); };
virtual Bool_t MakeReadoutCode(ofstream & RdoStrm, TMrbConfig::EMrbModuleTag TagIndex) { return(kFALSE); };
virtual Bool_t MakeReadoutCode(ofstream & RdoStrm, TMrbConfig::EMrbModuleTag TagIndex, TMrbModuleChannel * Channel, Int_t Value = 0) { return(kFALSE); };
virtual Bool_t MakeAnalyzeCode(ofstream & AnaStrm, TMrbConfig::EMrbAnalyzeTag TagIndex, const Char_t * Extension);
virtual Bool_t MakeRcFile(ofstream & RcStrm, TMrbConfig::EMrbRcFileTag TagIndex, const Char_t * ResourceName) { return(kFALSE); };
inline Bool_t IsCamac() const { return((fModuleType.GetIndex() & TMrbConfig::kModuleCamac) != 0); };
inline Bool_t IsVME() const { return((fModuleType.GetIndex() & TMrbConfig::kModuleVME) != 0); };
void PrintRegister(ostream & OutStrm, const Char_t * RegName, const Char_t * Prefix = "") const;
inline void PrintRegister(const Char_t * RegName) const { PrintRegister(cout, RegName, ""); };
void Print(Option_t * Option) const { TObject::Print(Option); }
void Print(ostream & OutStrm, const Char_t * Prefix = "") const {};
inline virtual void Print() const { Print(cout, ""); };
virtual inline Int_t GetNofSubDevices() const { return(1); };
virtual inline Bool_t HasRandomReadout() const { return(kTRUE); };
virtual inline Bool_t IsRaw() const { return(kFALSE); };
virtual inline Bool_t CheckSubeventType(TMrbSubevent * Subevent) const { return(kTRUE); };
virtual inline Bool_t CheckProcType() { return(kTRUE); };
virtual inline Bool_t HasPrivateCode() const { return(kFALSE); };
virtual inline const Char_t * GetPrivateCodeFile() const { return(NULL); };
virtual inline const Char_t * GetCommonCodeFile() { return(NULL); };
inline void CreateHistoArray(const Char_t * ArrayName = NULL) {
fCreateHistoArray = kTRUE;
fHistoArrayName = ArrayName ? ArrayName : this->GetName();
}
inline Bool_t HistoArrayToBeCreated() { return(fCreateHistoArray); };
inline const Char_t * GetHistoArrayName() { return(fHistoArrayName.Data()); };
virtual inline Char_t * GetDeviceStruct() { return(NULL); };
Bool_t SetMbsFctName(const Char_t * FctName, TMrbConfig::EMrbModuleFunction Fct);
const Char_t * GetMbsFctName(TString & FctName, TMrbConfig::EMrbModuleFunction Fct);
inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };
protected:
virtual void DefineRegisters() {};
void DeleteRegisters();
protected:
TMrbNamedX fModuleID;
TMrbNamedX fModuleType;
Int_t fSerial;
Bool_t UtilitiesLoaded;
Int_t fNofChannels;
Bool_t fIsActive;
Bool_t fExcludeFromReadout;
TMrbNamedX * fDataType;
Int_t fNofShortsPerChannel;
Int_t fNofShortsPerDatum;
Int_t fNofDataBits;
TMrbNamedX fMbsBranch;
Int_t fCrate;
TString fPosition;
Int_t fRange;
Int_t fXmin;
Int_t fXmax;
Int_t fChansPerBin;
Int_t fBinRange;
Int_t fSubDevice;
Int_t fTimeOffset;
Bool_t fBlockReadout;
Bool_t fHistosToBeAllocated;
TMrbLofNamedX fLofRegisters;
TMrbTemplate fCodeTemplates;
Bool_t fCreateHistoArray;
TString fHistoArrayName;
TObjArray fChannelSpec;
TObjArray fLofMbsFctNames;
ClassDef(TMrbModule, 1)
};
#endif