#ifndef __TUsrMux_h__
#define __TUsrMux_h__
namespace std {} using namespace std;
#include <iostream>
#include "TObject.h"
#include "TObjArray.h"
#include "TString.h"
#include "TEnv.h"
#include "TH1F.h"
#include "TUsrHit.h"
#include "TUsrHitBuffer.h"
#include "TUsrHBX.h"
class TUsrMuxLookup : public TNamed, public TArrayI {
friend class TUsrMux;
public:
TUsrMuxLookup(const Char_t * MuxName, Int_t Size) : TNamed(MuxName, MuxName) {
fGoodHits = 0;
fBadHits = 0;
fHitRatio = 0;
this->Set(Size);
this->Reset(0);
};
inline void CountHit(Int_t Channel) {
if (Channel > 0) {
fGoodHits = (fGoodHits * 999 + 1) / 1000;
} else {
fBadHits = (fBadHits * 999 + 1) / 1000;
}
}
inline Int_t GetEntries() {
Int_t nofEntries = 0;
for (Int_t i = 0; i < this->GetSize(); i++) {
if (this->At(i) != 0) nofEntries++;
}
return(nofEntries);
}
inline Double_t CalculateRatio() { if (fGoodHits > 0) fHitRatio = fBadHits / fGoodHits; return(fHitRatio); };
protected:
Double_t fGoodHits;
Double_t fBadHits;
Double_t fHitRatio;
ClassDef(TUsrMuxLookup, 0)
};
class TUsrMuxEntry : public TObject {
friend class TUsrMux;
public:
TUsrMuxEntry(TEnv * LkpEnv, TUsrMuxLookup * Lookup, TUsrHit * Hit = NULL) {
fLkpEnv = LkpEnv;
fLookup = Lookup;
fHit = Hit;
};
~TUsrMuxEntry() {};
const Char_t * PrintEntry(TString & Output);
protected:
TEnv * fLkpEnv;
TUsrMuxLookup * fLookup;
TUsrHit * fHit;
ClassDef(TUsrMuxEntry, 0)
};
class TUsrMux : public TObject {
public:
TUsrMux() {};
TUsrMux(const Char_t * ConfigFile);
~TUsrMux() {};
Bool_t Init(const Char_t * ConfigFile);
void ClearTables();
TUsrMuxLookup * MakeLookupTable(TEnv * LkpEnv);
TUsrMuxEntry * IsMuxChannel(TUsrHit * Hit);
Bool_t CollectHits(TUsrHBX * HbufIndex);
void AccuSingles();
inline void ResetIndex() { fHitIter = fLofMuxHits.MakeIterator(); };
inline TUsrHit * NextHit() { return((TUsrHit *) fHitIter->Next()); };
inline Int_t GetNofHits() { return(fLofMuxHits.GetEntriesFast()); };
inline TObjArray * GetLofLookups() { return(&fLofLookups); };
inline Bool_t IsVerbose() { return(fVerbose); };
inline Bool_t IsDebug() { return(fDebug); };
inline Int_t GetIndexOfFirstHisto() { return(fIndexOfFirstHisto); };
inline Int_t GetNofHistograms() { return(fNofHistograms); };
void PrintChanTable();
void PrintLookup(TUsrMuxLookup * Lookup);
void PrintLofMuxHits();
protected:
TEnv * fConfig;
Bool_t fVerbose;
Bool_t fDebug;
TString fDebugLock;
Int_t fSmin;
Int_t fSmax;
Int_t fChansPerModule;
Int_t fModuleRange;
Int_t fIndexOfFirstHisto;
Int_t fNofHistograms;
TIterator * fHitIter;
TObjArray fChanTable;
TObjArray fLofMuxEntries;
TObjArray fLofMuxHits;
TObjArray fLofLookups;
ClassDef(TUsrMux, 1)
};
#endif