#ifndef THaSlotData_
#define THaSlotData_
#include "TString.h"
#include <cassert>
const int SD_WARN = -2;
const int SD_ERR = -1;
const int SD_OK = 1;
class THaSlotData {
public:
static const int DEFNCHAN;
static const int DEFNDATA;
static const int DEFNHITCHAN;
THaSlotData();
THaSlotData(int crate, int slot);
virtual ~THaSlotData();
const char* devType() const;
int getNumRaw() const { return numraw; };
int getRawData(int ihit) const;
int getRawData(int chan, int hit) const;
int getNumHits(int chan) const;
int getNumChan() const;
int getNextChan(int index) const;
int getData(int chan, int hit) const;
int getCrate() const { return crate; }
int getSlot() const { return slot; }
void clearEvent();
int loadData(const char* type, int chan, int dat, int raw);
void define(int crate, int slot, UShort_t nchan=DEFNCHAN,
UShort_t ndata=DEFNDATA, UShort_t nhitperchan=DEFNHITCHAN );
void print() const;
int compressdataindex(int numidx);
private:
int crate;
int slot;
TString device;
UShort_t numhitperchan;
UShort_t numraw;
UShort_t numchanhit;
UShort_t firstfreedataidx;
UShort_t numholesdataidx;
UChar_t* numHits;
UShort_t* chanlist;
UShort_t* idxlist;
UShort_t* chanindex;
UShort_t* dataindex;
UChar_t* numMaxHits;
int* rawData;
int* data;
bool didini;
UShort_t maxc;
UShort_t maxd;
UShort_t allocd;
UShort_t alloci;
ClassDef(THaSlotData,0)
};
inline int THaSlotData::getRawData(int hit) const {
assert( hit >= 0 && hit < numraw );
if (hit >= 0 && hit < numraw) return rawData[hit];
return 0;
};
inline
int THaSlotData::getRawData(int chan, int hit) const {
assert( chan >= 0 && chan < maxc && hit >= 0 && hit < numHits[chan] );
if (chan < 0 || chan >= maxc || numHits[chan]<=hit || hit<0 )
return 0;
int index = dataindex[idxlist[chan]+hit];
assert(index >= 0 && index < numraw);
if (index >= 0 && index < numraw) return rawData[index];
return 0;
};
inline
int THaSlotData::getNumHits(int chan) const {
assert( chan >= 0 && chan < maxc );
return (chan >= 0 && chan < maxc) ? numHits[chan] : 0;
};
inline
int THaSlotData::getNumChan() const {
return numchanhit;
};
inline
int THaSlotData::getNextChan(int index) const {
assert(index >= 0 && index < numchanhit);
if (index >= 0 && index < numchanhit)
return chanlist[index];
return 0;
};
inline
int THaSlotData::getData(int chan, int hit) const {
assert( chan >= 0 && chan < maxc && hit >= 0 && hit < numHits[chan] );
if (chan < 0 || chan >= maxc || numHits[chan]<=hit || hit<0 )
return 0;
int index = dataindex[idxlist[chan]+hit];
assert(index >= 0 && index < numraw);
if (index >= 0 && index < numraw) return data[index];
return 0;
};
inline
const char* THaSlotData::devType() const {
return device.Data();
};
inline
void THaSlotData::clearEvent() {
numraw = 0;
firstfreedataidx=0;
numholesdataidx=0;
while( numchanhit>0 ) numHits[chanlist[--numchanhit]] = 0;
};
inline
int THaSlotData::compressdataindex(int numidx) {
if (firstfreedataidx+numidx>=alloci){
if (((numholesdataidx/alloci)>0.5)&&(numholesdataidx>numidx)) {
UShort_t* tmp = new UShort_t[alloci];
firstfreedataidx=0;
for (UShort_t i=0; i<numchanhit; i++) {
UShort_t chan=chanlist[i];
for (UShort_t j=0; j<numHits[chan]; j++) {
tmp[firstfreedataidx+j]=dataindex[idxlist[chan]+j];
}
firstfreedataidx=firstfreedataidx+numMaxHits[chan];
}
delete [] dataindex; dataindex=tmp;
} else {
UShort_t old_alloci = alloci;
alloci *= 2;
UShort_t* tmp = new UShort_t[alloci];
memcpy(tmp,dataindex,old_alloci*sizeof(UShort_t));
delete [] dataindex; dataindex = tmp;
}
}
return 0;
};
#endif
Last change: Sat Nov 7 21:26:52 2009
Last generated: 2009-11-07 21:26
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.