// File: hrichunpackerraw99.cc // // Author: Walter Schoen // Last update by Walter Schoen: 99/12/17 17:29:47 // Last update by Thomas Eberl: 02/10/25 14:59:28 //*-- Modified : Tue Feb 15 18:50:45 CET 2005 martin.jurkovic@ph.tum.de // Event number is obtained from the event header // #include "hrichunpackerraw99.h" #include "hcategory.h" #include "hlocation.h" #include "hrichraw.h" #include "hevent.h" #include "heventheader.h" #include "hspectrometer.h" #include "hdetector.h" #include "hcategory.h" #include "hldsubevt.h" #include "hdebug.h" #include "hruntimedb.h" #include "TRandom.h" #include #include HRichUnpackerRaw99::HRichUnpackerRaw99(Int_t rId,Int_t strtEvt,Bool_t isPed,Bool_t verbose,Int_t iSloppyL, Bool_t swap_enabled) { richId = rId; startEvt=strtEvt; isPedestal=isPed; kverbose=verbose; iSloppyLevel=iSloppyL; //Introduced April 2003 to compensate for the cable swapping in sector 3 during nov01 beamtime. //Use only to analyze nov01 data!! perform_cable_swapping=swap_enabled; nSubEvtCntr = 0; nSecMisMatchCntr = 0; pRawCat=NULL; fEventNr = -1; if (startEvt !=0) cout<<"For SubEvtId "<getCurrentEvent()->getCategory(catRichRaw); if (!pRawCat) { pRawCat=gHades->getSetup()->getDetector("Rich") ->buildCategory(catRichRaw); if (!pRawCat) { return kFALSE; } else { gHades->getCurrentEvent()->addCategory(catRichRaw,pRawCat,"Rich"); } } initMappingPar(); return kTRUE; } void HRichUnpackerRaw99::initMappingPar(void){ HRuntimeDb* rtdb=gHades->getRuntimeDb(); pMapPar = rtdb->getContainer("RichMappingParameters"); } Int_t HRichUnpackerRaw99::getSubEvtId(void) const { return richId; } void HRichUnpackerRaw99::printDataWord(DataWord &addr,Int_t ch){ cout<<"*****************************************************************************"<getCol(getUpi(addr))<getRow(getUpi(addr))<isValidUpi(getUpi(addr))<=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) { 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); } } }else{ cout<<"SubEvtId "<