#include "Stntuple/obj/TStnSiStrip.hh" #include "TClass.h" #include #include using std::min; using std::max; ClassImp(TStnSiStrip) TStnSiStrip::TStnSiStrip() : fStrip(0), fADC(0), fPed(0), fNoise(0), fDNoise(0), fStatus(0), fPack_NumChgPed(0), fPack_OBSP(0), fPack_Noise(0), fPack_DNoise(0), fPack_Status(0), fDigiCode(0), fStreamGeometryInfo(false), fLocal(0.0), fGlobal(0.0,0.0,0.0) { fOBSP[0]=fOBSP[1]=fOBSP[2]=-1; Class()->IgnoreTObjectStreamer(true); } TStnSiStrip::~TStnSiStrip() {} void TStnSiStrip::Streamer(TBuffer &R__b) { if (R__b.IsReading()) { Version_t R__v = R__b.ReadVersion(); R__b.ReadFastArray(&fPack_NumChgPed,2); R__b.ReadFastArray(&fPack_Noise,3); R__b >> fDigiCode; Unpack(); if (fStreamGeometryInfo && R__v > 1) { fGlobal.Streamer(R__b); R__b >> fLocal; } } else { R__b.WriteVersion(TStnSiStrip::IsA()); Pack(); R__b.WriteFastArray(&fPack_NumChgPed,2); R__b.WriteFastArray(&fPack_Noise,3); R__b << fDigiCode; if (fStreamGeometryInfo) { fGlobal.Streamer(R__b); R__b << fLocal; } } } void TStnSiStrip::Pack() { fPack_NumChgPed = (fStrip & 0x3ff) << 0; // Bits 0-9 fPack_NumChgPed |= ( min(max(int((min(max(fADC,-15.0F),240.75F)+15.0)*4.0+0.5),0),1023) ) << 10; fPack_NumChgPed |= ( min(max(int((min(max(fPed,-15.0F),240.75F)+15.0)*4.0+0.5),0),1023) ) << 20; fPack_OBSP=0; int i=0; int n=0; while (i<3 && fOBSP[i]>=0) { n++; // Number of mothers fPack_OBSP |= min(fOBSP[i],1023) << i*10; i++; } fPack_OBSP |= n << 30; fPack_Noise = min(max(int(min(max(fNoise,0.0F), 15.9375F)*16.0+0.5),0),255); fPack_DNoise = min(max(int(min(max(fDNoise,0.0F),15.9375F)*16.0+0.5),0),255); fPack_Status = fStatus & 0xff; if (fStreamGeometryInfo) fDigiCode |= 0x8000; } void TStnSiStrip::Unpack() { fStrip = (fPack_NumChgPed >> 0) & 0x3ff; fADC = ((fPack_NumChgPed >> 10) & 0x3ff)/4.0 - 15.0; fPed = ((fPack_NumChgPed >> 20) & 0x3ff)/4.0 - 15.0; fNoise = fPack_Noise/16.0; fDNoise = fPack_DNoise/16.0; fStatus = fPack_Status; fOBSP[0]=fOBSP[1]=fOBSP[2]=-1; int n = (fPack_OBSP >> 30) & 0x3; for (int i=0; i> i*10) & 0x3ff; } fStreamGeometryInfo = fDigiCode & 0x8000; fDigiCode &= 0x7fff; // Mask off the highest unused bit. } void TStnSiStrip::Print(Option_t* opt) const { std::cout << "Strip " << fStrip << ", ADC " << fADC << ", Ped " << fPed << ", Noise " << fNoise << ", DNoise " << fDNoise << ", fStatus " << fStatus << ", DigiCode " << fDigiCode; int i=0; while (fOBSP[i]>=0 && i<3) { std::cout << ", fOBSP[" << i << "]=" << fOBSP[i]; i++; } std::cout << std::endl; }