// ------------------------------------------------------------------------- // FairRingSorter.cxx // Created on: Jul 30, 2010 // Author: stockman // ------------------------------------------------------------------------- #include "FairRingSorter.h" void FairRingSorter::AddElement(FairTimeStamp* digi, double timestamp) { FairTimeStamp* newElement = CreateElement(digi); if (timestamp < fLowerBoundPointer.second) { std::cout << "-E- Timestamp " << timestamp << " below lower bound " << fLowerBoundPointer.second << std::endl; newElement->Print(); return; } int index = CalcIndex(timestamp); if (timestamp >= fLowerBoundPointer.second + (2 * GetBufferSize())) { if (fVerbose > 0) { std::cout << "-I- FairRingSorterT::AddElement : Timestamp " << timestamp << " larger than 2 * bufferspace: " << fLowerBoundPointer.second + GetBufferSize() << " writing out " << index+1 << std::endl; } WriteOutAll(); SetLowerBound(timestamp); } else if (timestamp >= fLowerBoundPointer.second + GetBufferSize()) { if (fVerbose > 0) { std::cout << "-I- FairRingSorterT::AddElement :Timestamp " << timestamp << " larger than bufferspace: " << fLowerBoundPointer.second + GetBufferSize() << " writing out " << index+1 << std::endl; } WriteOutElements(index+1); SetLowerBound(timestamp); } fRingBuffer[index].insert(std::pair (timestamp, newElement)); } void FairRingSorter::SetLowerBound(double timestampOfHitToWrite) { int index = CalcIndex(timestampOfHitToWrite + fCellWidth); int cellValue = (int)(timestampOfHitToWrite / fCellWidth); fLowerBoundPointer.second = ((cellValue + 1) * fCellWidth) - GetBufferSize(); fLowerBoundPointer.first = index; if (fVerbose > 0) { std::cout << "-I- FairRingSorter::SetLowerBound " << index << " / " << fLowerBoundPointer.second << std::endl; } } void FairRingSorter::WriteOutElements(int index) { if (fLowerBoundPointer.first >= index) { for (int i = fLowerBoundPointer.first; i < fRingBuffer.size(); i++) { WriteOutElement(i); } for (int i = 0; i < index; i++) { WriteOutElement(i); } } else { for (int i = fLowerBoundPointer.first; i < index; i++) { WriteOutElement(i); } } if (fVerbose > 1) { std::cout << "-I- FairRingSorter::WriteOutElements: Size of Output-Array: " << fOutputData.size() << std::endl; for (int i = 0; i < fOutputData.size(); i++) { fOutputData[i]->Print(); std::cout << " | "; } std::cout << std::endl; } } void FairRingSorter::WriteOutElement(int index) { std::multimap* myDataField = &fRingBuffer.at(index); std::multimap::iterator it; if (!myDataField->empty()) { if (fVerbose > 1) { ; } std::cout << "-I- FairRingSorterT:WriteOutElement "; myDataField->begin()->second->Print(); std::cout << std::endl; for (it = myDataField->begin(); it != myDataField->end(); it++) { fOutputData.push_back(it->second); } myDataField->clear(); } } int FairRingSorter::CalcIndex(double val) { int index = (int)(val / fCellWidth); while (index >= fRingBuffer.size()) { index -= fRingBuffer.size(); } return index; } ClassImp(FairRingSorter);