/** @file CbmStsAnalogBuffer.h ** ** @date 13 May 2015 ** @author V. Friese ** ** Based on the example of PndSdsDigiPixelWriteoutBuffer **/ #include "CbmStsAnalogBuffer.h" ClassImp(CbmStsAnalogBuffer); using std::map; CbmStsAnalogBuffer::CbmStsAnalogBuffer() :FairWriteoutBuffer(), fDataMap() { // TODO Auto-generated constructor stub } CbmStsAnalogBuffer::CbmStsAnalogBuffer(TString branchName, TString folderName, Bool_t persistance) : FairWriteoutBuffer(branchName, "CbmStsSignal", folderName, persistance), fDataMap() { } CbmStsAnalogBuffer::~CbmStsAnalogBuffer() { // TODO Auto-generated destructor stub } std::vector > CbmStsAnalogBuffer::Modify(std::pair oldData, std::pair newData) { std::vector > result; // Convert to CbmStsSignal CbmStsSignal* oldSignal = dynamic_cast(oldData.second); CbmStsSignal* newSignal = dynamic_cast(newData.second); // LOG LOG(DEBUG4) << "AnalogBuffer::Modify" << FairLogger::endl; LOG(DEBUG4) << "Old data: address " << oldSignal->GetAddress() << ", time " << oldSignal->GetTime() << ", charge " << oldSignal->GetCharge() << ", active until " << oldData.first << FairLogger::endl; LOG(DEBUG4) << "New data: address " << newSignal->GetAddress() << ", time " << newSignal->GetTime() << ", charge " << newSignal->GetCharge() << ", active until " << newData.first << FairLogger::endl; // The result is only one data pair std::pair singleResult; // The channel active time is taken from the larger one of the two singleResult.first = ( newData.first > oldData.first ? newData.first : oldData.first); // The data object itself is the old data object. // TODO: Where is newData.second deleted? singleResult.second = oldData.second; // Time stamp is the earlier one of the two Double_t time = std::max(oldData.second->GetTimeStamp(), newData.second->GetTimeStamp()); // Charge is the sum of the two Double_t charge = oldSignal->GetCharge() + newSignal->GetCharge(); // Add the links of newData (n.b.: weight is charge) to oldData for (Int_t iLink = 0; iLink < newData.second->GetNLinks(); iLink++) singleResult.second->AddLink(newData.second->GetLink(iLink)); CbmStsSignal* resSignal = dynamic_cast(singleResult.second); resSignal->SetCharge(charge); LOG(DEBUG4) << "Result: address " << resSignal->GetAddress() << ", time " << resSignal->GetTime() << ", charge " << resSignal->GetCharge() << ", active until " << singleResult.first << FairLogger::endl; result.push_back(singleResult); return result; } void CbmStsAnalogBuffer::AddNewDataToTClonesArray(FairTimeStamp* data) { FairRootManager* ioman = FairRootManager::Instance(); if ( ! ioman ) { LOG(WARNING) << "No FairRootManager instance! " << FairLogger::endl; return; } TClonesArray* array = ioman->GetTClonesArray(fBranchName); if ( ! array ) { LOG(WARNING) << "Array " << fBranchName << " not present!" << FairLogger::endl; return; } CbmStsSignal* signal = dynamic_cast(data); LOG(DEBUG1) << "AnalogBuffer: Adding signal at address " << signal->GetAddress() << ", t = " << signal->GetTime() << " ns, charge = " << signal->GetCharge() << " to TClonesArray at index " << array->GetEntriesFast() << FairLogger::endl; new ((*array)[array->GetEntries()]) CbmStsSignal(*signal); } double CbmStsAnalogBuffer::FindTimeForData(FairTimeStamp* data) { map::iterator it; CbmStsSignal signal = *( dynamic_cast(data) ); it = fDataMap.find(signal); if (it == fDataMap.end()) return -1; return it->second; } void CbmStsAnalogBuffer::FillDataMap(FairTimeStamp* data, double activeTime) { CbmStsSignal signal = *( dynamic_cast(data) ); fDataMap[signal] = activeTime; } void CbmStsAnalogBuffer::EraseDataFromDataMap(FairTimeStamp* data) { CbmStsSignal signal = *( dynamic_cast(data) ); fDataMap.erase(signal); }