// File: hrichunpackercal99.cc // // Author: Walter Schoen // Last update by Walter Schoen: 99/12/17 17:29:47 // Last update by Thomas Eberl: 02/10/25 14:57:34 //*-- Modified : Tue Feb 15 18:50:45 CET 2005 martin.jurkovic@ph.tum.de // Event number is obtained from the event header // Modified by Michael Weber: // optional (default = kFALSE) HRichRaw category is filled (formerly known as HRichUnpackerRaw99) // #include "TRandom.h" #include "haddef.h" #include "hades.h" #include "hcategory.h" #include "hdebug.h" #include "hdetector.h" #include "hevent.h" #include "heventheader.h" #include "hldsubevt.h" #include "hparset.h" #include "hrichcal.h" #include "hrichcalpar.h" #include "hrichcalparcell.h" #include "hrichcalsim.h" #include "hrichdetector.h" #include "hrichmappingpar.h" #include "hrichraw.h" #include "hrichunpackercal99.h" #include "hrichutilfunc.h" #include "hruntimedb.h" #include "hspectrometer.h" #include "richdef.h" #include #include HRichUnpackerCal99::HRichUnpackerCal99(Int_t rId, Bool_t wrtRaw, Int_t strtEvt,Bool_t isPed,Bool_t verbose,Int_t iSloppyL, Bool_t swap_enabled) { richId = rId; writeRaw = wrtRaw; startEvt = strtEvt; isPedestal = isPed; kverbose = verbose; iSloppyLevel = iSloppyL; //Introduced April 2003 to compensate for cable swapping in readout electronics //Enable this flag only if you intend to analyze nov 01 data. perform_cable_swapping=swap_enabled; nSubEvtCntr = 0; nSecMisMatchCntr = 0; pRawCat=NULL; pCalCat=NULL; fEventNr = -1; if (startEvt !=0) cout<<"For SubEvtId "<getSetup() ->getDetector("Rich"); if( kTRUE == writeRaw) { pRawCat=gHades->getCurrentEvent()->getCategory(catRichRaw); if (!pRawCat) { pRawCat=pRichDet->buildCategory(catRichRaw); if (!pRawCat) { return kFALSE; } else { gHades->getCurrentEvent()->addCategory(catRichRaw,pRawCat,"Rich"); } } } pCalCat=gHades->getCurrentEvent()->getCategory(catRichCal); if (!pCalCat) { if(gHades->getEmbeddingMode()==0){ pCalCat=pRichDet->buildCategory(catRichCal); } else { pCalCat = pRichDet->buildMatrixCat("HRichCalSim",1); } if (!pCalCat) return kFALSE; else gHades->getCurrentEvent() ->addCategory(catRichCal, pCalCat, "Rich"); } initCalPar(); initMappingPar(); return kTRUE; } void HRichUnpackerCal99::initMappingPar(void){ HRuntimeDb* rtdb=gHades->getRuntimeDb(); pMapPar = rtdb->getContainer("RichMappingParameters"); } Int_t HRichUnpackerCal99::getSubEvtId(void) const { return richId; } void HRichUnpackerCal99::printDataWord(DataWord &addr,Int_t ch){ cout<<"*****************************************************************************"<getCol(getUpi(addr))<getRow(getUpi(addr))<isValidUpi(getUpi(addr))<getCol(getUpi(addr))); loc.setIndex(1,getMappingPar()->getRow(getUpi(addr))); loc.setIndex(0,addr.sector); printCalParCell(loc); cout<<"*****************************************************************************"<=0 && ch<1024){ if (addr.channel>=0 && addr.channel<64){ if (addr.modul>=0 && addr.modul<5){ if (addr.port>=0 && addr.port<8){ if (addr.controler >=0 && addr.controler<2){ if (addr.sector>=0 && addr.sector<6){ if (upi>=0 && upi<17464){//redundant if (getMappingPar()->isValidUpi(upi)){// if (getMappingPar()->getCol(upi)>0 && getMappingPar()->getCol(upi)<92){//redundant //cout<<"col: "<getCol(upi)<getRow(upi)>0 && getMappingPar()->getRow(upi)<90){//redundant //cout<<"row: "<getRow(upi)<getRow(upi) <<" is out of bounds [0;89]"<getCol(upi) <<" is out of bounds [0;91]"<isUnConnCh(upi))){ //TRUE //cout<<"not a valid upi"< FALSE nSubEvtCntr--; decision=kFALSE; }else{ //FALSE TRUE -> FALSE if (iSloppyLevel < 2 && debugOutput){ cout<<"SubEvtId "< FALSE if (iSloppyLevel < 2 && debugOutput){ cout<<"SubEvtId "<getCurrentEvent()->getHeader()->getEventSeqNumber(); if (fEventNr>=startEvt){ if (pSubEvt) { for (UInt_t i = 0; i < pSubEvt->getDataLen(); i++) { charge = pSubEvt->getData()[i] & 0x3FF; dataword.channel = (pSubEvt->getData()[i] >> 10) & 0x3F; dataword.modul = (pSubEvt->getData()[i] >> 16) & 0x7; dataword.port = (pSubEvt->getData()[i] >> 19) & 0x7; dataword.controler = (pSubEvt->getData()[i] >>22) & 0x1 ; dataword.sector = (pSubEvt->getData()[i] >>23) & 0x7; if (dataword.sector == SubEvtIdSec){ //check sector consistency if (testSubEvt(dataword,charge)){ //check if pad is valid loc.setOffset(getMappingPar()->getCol(getUpi(dataword))); loc.setIndex(1,getMappingPar()->getRow(getUpi(dataword))); loc.setIndex(0,dataword.sector); if (getMappingPar()->isReadOut(loc[2],loc[1])){ if (loc.getIndex(1) >= 0 && loc.getOffset() >= 0) { if( kTRUE == writeRaw) { HRichRaw* pCell = (HRichRaw*) pRawCat->getSlot(loc); if (pCell!=NULL) { // add a random nb [0;1] to account // for the cut-off in the ADC pCell=new(pCell) HRichRaw(charge+gRandom->Rndm()); pCell->setSector(loc[0]); pCell->setRow(loc[1]); pCell->setCol(loc[2]); pCell->setEventNr(fEventNr); } } HRichCalParCell *calparcell = NULL; HRichCal *pCalCell = NULL; calparcell = (HRichCalParCell*) ((HRichCalPar*)getCalPar()) ->getObject(loc); // subtract measured mean value and add a random nb // [0;1] to account for the cut-off in the ADC Float_t fCharge = charge * calparcell->getSlope() - calparcell->getOffset() + gRandom->Rndm(); if (fCharge > 0.0) { pCalCell = (HRichCal *)pCalCat->getSlot(loc); if (pCalCell != NULL) { if(gHades->getEmbeddingMode()==0){ pCalCell = new(pCalCell) HRichCal; } else { pCalCell = new(pCalCell) HRichCalSim; } pCalCell->setCharge(fCharge); pCalCell->setSector(loc[0]); pCalCell->setRow(loc[1]); pCalCell->setCol(loc[2]); pCalCell->setEventNr(fEventNr); } } } }else{ cout<<"SubEvtId "<getObject(loc); cout<<"SEC: "<getOffset()<<" SIGMA : "<< calparcell->getSigma()<<" SLOPE : "<getSlope()<< endl; } void HRichUnpackerCal99::initCalPar() { HRuntimeDb* rtdb=gHades->getRuntimeDb(); fCalPar = rtdb->getContainer("RichCalPar"); } ClassImp(HRichUnpackerCal99)