#ifndef __TUsrHit_h__
#define __TUsrHit_h__
namespace std {} using namespace std;
#include <iostream>
#include "TObject.h"
#include "TString.h"
class TUsrHit : public TObject {
public:
enum { kHitFastTrigger = 0 };
enum { kHitEnergy = 1 };
enum { kHitXiaPSA = 2 };
enum { kHitUserPSA = 3 };
enum { kHitGSLTHi = 4 };
enum { kHitGSLTMi = 5 };
enum { kHitGSLTLo = 6 };
enum { kHitRealTimeHi = 7 };
enum { kHitLast = kHitRealTimeHi };
enum { kHitWaveForm = kHitLast + 1 };
enum { kMaxHitData = kHitLast + 1 };
enum { kHitPSA1 = 2 };
enum { kHitPSA_T0 = kHitPSA1 };
enum { kHitPSA2 = 3 };
enum { kHitPSA_Tslope = kHitPSA2 };
enum { kHitPSA3 = 4 };
enum { kHitPSA_Qmax = kHitPSA3 };
enum { kHitPSA4 = 5 };
enum { kHitPSA_Tqmax = kHitPSA4 };
enum { kHitPSA5 = 6 };
enum { kHitPSA_Error = kHitPSA5 };
enum { kHitPSA6 = 7 };
enum { kHitPSA_T90 = kHitPSA6 };
enum { kHitEnergyLong = 2 };
enum { kHitPattern = 2 };
enum { kHitCounterT1 = 4 };
enum { kHitCounterT2 = 6 };
enum { kHitMuxModNo = 2 };
enum { kHitMuxChannel = 3 };
enum { kHitMadc32Res = 2 };
enum { kHitGassiModule = 2 };
enum { kHitGassiChannel = 3 };
enum { kHitGassiPort = 4 };
enum { kHitGassiRace = 5 };
enum { kHitGassiSector = 6 };
enum { kHitGassiDprRest = 7 };
public:
TUsrHit() { this->Reset(); };
TUsrHit(Int_t BufferNumber, Int_t EventNumber, Int_t ModuleNumber, Int_t Channel,
UShort_t BufferTimeHi, UShort_t EventTimeHi, UShort_t FastTrigTime,
UShort_t * Data, Int_t NofData);
TUsrHit(Int_t BufferNumber, Int_t EventNumber, Int_t ModuleNumber, Int_t Channel,
UShort_t * ChannelTime,
UShort_t * Data, Int_t NofData);
~TUsrHit() {};
virtual Int_t Compare(const TObject * Hit) const;
Int_t Compare(Long64_t ChannelTime) const;
void Print(Option_t * Option) const { TObject::Print(Option); };
void Print(ostream & Out, Bool_t PrintNames = kFALSE, Bool_t CrLf = kTRUE, Bool_t EnergyLongFlag = kFALSE) const;
inline void Print(Bool_t PrintNames = kFALSE, Bool_t CrLf = kTRUE, Bool_t EnergyLongFlag = kFALSE) const { Print(cout, PrintNames, CrLf, EnergyLongFlag); };
inline Int_t GetBufferNumber() const { return(fBufferNumber); };
inline Int_t GetEventNumber() const { return(fEventNumber); };
inline Int_t GetModuleNumber() const { return(fModuleNumber); };
inline Int_t GetChannel() const { return(fChannel); };
inline Long64_t GetChannelTime() const { return(fChannelTime); };
const Char_t * ChannelTime2Ascii(TString & TimeString) const;
Long64_t GetChannelTimeCorr();
inline UShort_t * GetDataAddr() { return(fData); };
inline UShort_t GetData(Int_t Index = TUsrHit::kHitEnergy) const { return(fData[Index]); };
inline UShort_t GetEnergy() const { return(fData[kHitEnergy]); };
inline UShort_t GetFastTrigger() const { return(fData[kHitFastTrigger]); };
Double_t GetCalEnergy(Bool_t Randomize = kTRUE, Bool_t WithinLimits = kFALSE) const;
Double_t GetDCorrEnergy(Bool_t Randomize = kTRUE) const;
inline UInt_t GetDataLong(Int_t Index = TUsrHit::kHitEnergyLong) const { UInt_t * dp = (UInt_t *) &fData[Index]; return(*dp); };
inline UInt_t GetEnergyLong() const { UInt_t * dp = (UInt_t *) &fData[kHitEnergyLong]; return(*dp); };
inline Int_t GetMuxModuleNumber() const { return((Int_t) fData[kHitMuxModNo]); };
inline void SetMuxModuleNumber(Int_t ModuleNumber) { fData[kHitMuxModNo] = (UShort_t) ModuleNumber; };
inline Int_t GetMuxChannel() const { return((Int_t) fData[kHitMuxChannel]); };
inline void SetMuxChannel(Int_t Channel) { fData[kHitMuxChannel] = (UShort_t) Channel; };
inline UInt_t GetPatternWord() { return(* (UInt_t *) &fData[kHitPattern]); };
inline UInt_t GetCounterT1() { return(* (UInt_t *) &fData[kHitCounterT1]); };
inline UInt_t GetCounterT2() { return(* (UInt_t *) &fData[kHitCounterT2]); };
inline Int_t GetMadc32Resolution() const { return((Int_t) fData[kHitMadc32Res]); };
inline void SetMadc32Resolution(Int_t Resolution) { fData[kHitMadc32Res] = (UShort_t) Resolution; };
virtual inline Bool_t IsSortable() const { return(kTRUE); };
inline void SetBufferNumber(Int_t BufferNumber) { fBufferNumber = BufferNumber; };
inline void SetEventNumber(Int_t EventNumber) { fEventNumber = EventNumber; };
inline void SetModuleNumber(Int_t ModuleNumber) { fModuleNumber = ModuleNumber; };
inline void SetChannel(Int_t Channel) { fChannel = Channel; };
inline Long64_t SetChannelTime(UShort_t * ChannelTime) {
fChannelTime = 0;
for (Int_t i = 0; i < 3; i++) fChannelTime = (fChannelTime << 16) | *ChannelTime++;
return(fChannelTime);
};
inline Long64_t SetChannelTime(UShort_t BufferTimeHi, UShort_t EventTimeHi, UShort_t FastTrigTime) {
fChannelTime = ((ULong64_t) BufferTimeHi << 32) | ((ULong64_t) EventTimeHi << 16) | (ULong64_t) FastTrigTime;
return(fChannelTime);
};
inline Long64_t SetChannelTime(TUsrHit * Hit) {
fChannelTime = Hit->GetChannelTime();
return(fChannelTime);
};
inline void CopyData(UShort_t * Data, Int_t NofData, Int_t Offset = 0) {
if (Data) for (Int_t i = 0; i < NofData; i++) fData[i + Offset] = *Data++;
};
inline void SetData(UShort_t Data, Int_t Offset = TUsrHit::kHitEnergy) { fData[Offset] = Data; }
inline void SetDataLong(UInt_t Data, Int_t Offset = TUsrHit::kHitEnergyLong) { UInt_t * dp = (UInt_t *) &fData[Offset]; *dp = Data; }
inline void CopyData(TUsrHit * Hit, Int_t NofData, Int_t Offset = 0) {
UShort_t * dp = Hit->GetDataAddr() + Offset;
for (Int_t i = 0; i < NofData; i++) fData[i + Offset] = *dp++;
};
inline virtual Int_t GetNofData() { return(fNofData); };
Bool_t WriteToSevtData(Int_t Index = TUsrHit::kHitEnergy);
Bool_t FillHistogram(Int_t Index = TUsrHit::kHitEnergy);
inline virtual void Reset() {
fBufferNumber = -1;
fEventNumber = -1;
fModuleNumber = -1;
fChannel = -1;
fChannelTime = 0LL;
this->ClearData();
};
inline virtual void ClearData() { memset(fData, 0, kMaxHitData * sizeof(UShort_t)); };
protected:
Int_t fBufferNumber;
Int_t fEventNumber;
Int_t fModuleNumber;
Int_t fChannel;
Long64_t fChannelTime;
Int_t fNofData;
UShort_t fData[kMaxHitData];
ClassDef(TUsrHit, 1)
};
#endif