/* * File: CbmMicroSliceMergerTask.tpl * Author: winckler * * Created on May 22, 2014, 9:08 PM */ template CbmMicroSliceMergerTask::CbmMicroSliceMergerTask() : fMaxMicroSliceNumber(0), fTimeSliceIndex(0), fMaxComponentNumber(0), fMicroSliceIndex(0), fComponentIndex(0), fTSReady(false), fMSIndexSync(false), fDataConverterTask(new CbmDataConverterTask()), findex_sts(0), findex_much(0), fMSCounter_sts(0), fMSCounter_much(0), fDigiVector() { } template CbmMicroSliceMergerTask::~CbmMicroSliceMergerTask() { if(fDataConverterTask) { delete fDataConverterTask; fDataConverterTask=NULL; } } template InitStatus CbmMicroSliceMergerTask::Init() { // temporary : component are input link and not detector id, but for the moment // we use it here as component = detector id fFlesTimeSlices.append_component(fMaxMicroSliceNumber, fTimeSliceIndex);// component c=0 -> empty fFlesTimeSlices.append_component(fMaxMicroSliceNumber, fTimeSliceIndex);// component c=1 -> empty fFlesTimeSlices.append_component(fMaxMicroSliceNumber, fTimeSliceIndex);// component c=2 -> sts fFlesTimeSlices.append_component(fMaxMicroSliceNumber, fTimeSliceIndex);// component c=3 -> empty fFlesTimeSlices.append_component(fMaxMicroSliceNumber, fTimeSliceIndex);// component c=4 -> empty // detector list in CbmDetectorList.h //kREF,0 // Reference plane //kMVD,1 // Micro-Vertex Detector //kSTS,2 // Silicon Tracking System //kRICH,3 // Ring-Imaging Cherenkov Detector //kMUCH,4 // Muon detetcion system //kTRD,5 // Transition Radiation Detector //kTOF, // Time-of-flight Detector //kECAL, // EM-Calorimeter //kPSD, // Projectile spectator detector //kSTT, // Straw Tube Tracker (obsolete) //kFHODO, // Fibre Hodoskope (for beam tests) //kTutDet, // Dummy for tutorials //kNOFDETS // Number of elements (e.g. for loops) return kSUCCESS; } template void InitFlesTimeSlice(uint64_t num_microslices, uint64_t index = UINT64_MAX) { } template void CbmMicroSliceMergerTask::Exec(Option_t* opt) { fTSReady=false; //prepare boost input archive std::string msgStr( static_cast(fPayload->GetData()), fPayload->GetSize() ); std::istringstream ibuffer(msgStr); TPayloadIn InputArchive(ibuffer); try { InputArchive >> fDigiVector;// get input Archive } catch (boost::archive::archive_exception e) { MQLOG(ERROR) << e.what(); } MQLOG(INFO) << "---------------------------------------"; fles::MicrosliceDescriptor desc; std::vector MSliceData; uint64_t RelativeIndex=0; uint16_t eqid=0;// component (input link) uint16_t sysid=100; uint32_t ContentSize=0; // Merge Microslices into timeslices for (unsigned int i = 0; i < fDigiVector.size(); ++i) { CbmMicroSlice MSlice=fDigiVector[i]; desc=MSlice.GetHeader(); sysid=desc.sys_id; if(sysid==kSTS) { findex_sts=desc.idx; RelativeIndex=fMSCounter_sts; fMSCounter_sts++; } if(sysid==kMUCH) { findex_much=desc.idx; RelativeIndex=fMSCounter_much; fMSCounter_much++; } eqid=desc.eq_id; ContentSize=desc.size; MSliceData=MSlice.GetData(); fFlesTimeSlices.append_microslice(eqid, RelativeIndex, desc, MSliceData.data()); //MQLOG(INFO) << "MSliceData.size() = "<Rebuild(outputSize); std::memcpy(fPayload->GetData(), obuffer.str().c_str(), outputSize); } } template bool CbmMicroSliceMergerTask::MsgReadyToSend() { return fTSReady; }