FairRoot/PandaRoot
PndWriteoutBuffer.cxx
Go to the documentation of this file.
1 /*
2  * PndWriteoutBuffer.cpp
3  *
4  * Created on: Jul 30, 2010
5  * Author: stockman
6  */
7 
8 #include "PndWriteoutBuffer.h"
9 #include "FairRootManager.h"
10 #include "PndSdsDigiPixel.h"
11 #include "PndSdsDigiStrip.h"
12 #include "TClonesArray.h"
13 #include <iostream>
14 
15  PndWriteoutBuffer::PndWriteoutBuffer(TString branchName, TString className, TString folderName, Bool_t persistance):
16  fBranchName(branchName), fClassName(className), fActivateBuffering(kTRUE), fVerbose(3)
17 {
18  FairRootManager::Instance()->Register(branchName, className, folderName, persistance);
19  if (fBranchName == "" || fClassName == "")
20  fTreeSave = false;
21  else
22  fTreeSave = true;
23 }
24 
26 {
27  FairRootManager* ioman = FairRootManager::Instance();
28  std::vector<FairTimeStamp*> data;
29  if (fActivateBuffering){
30  if (fVerbose > 0) std::cout << "-I- PndWriteoutBuffer::WriteOutData for time: " << time << std::endl;
31  data = GetRemoveOldData(time);
32  if (fTreeSave && data.size() > 0){
33  TClonesArray* myArray = ioman->GetTClonesArray(fBranchName);
34  if (!myArray)
35  std::cout << "-E- PndWriteoutBuffer::WriteOutData " << fBranchName << " array is not available!" << std::endl;
36  if (fVerbose > 0) std::cout << "-I- PndWriteoutBuffer::WriteOutData size: " << data.size() << std::endl;
37  for (int i = 0; i < data.size(); i++){
39  if (fVerbose > 1){
40  std::cout << i << " : ";
41  data[i]->Print();
42  std::cout << std::endl;
43  }
44  }
45  }
46  }
47  else{
48  ioman->GetTClonesArray(fBranchName);
49  }
50 }
51 
53 {
54  if (fDeadTime_map.size() > 0){
55  WriteOutData(fDeadTime_map.rbegin()->first + 1);
56  }
57 }
58 
59  std::vector<FairTimeStamp*> PndWriteoutBuffer::GetRemoveOldData(double time)
60 {
61  typedef std::multimap<double, FairTimeStamp*>::iterator DTMapIter;
62  std::vector<FairTimeStamp*> result;
63  for(DTMapIter it = fDeadTime_map.begin(); it != fDeadTime_map.lower_bound(time); it++){
64  if (fVerbose > 1) std::cout << "-I- GetRemoveOldData: DeadTime: " << it->first << " Data: " << it->second << std::endl;
65  result.push_back(it->second);
66  EraseDataFromDataMap(it->second);
67  }
68  fDeadTime_map.erase(fDeadTime_map.begin(), fDeadTime_map.lower_bound(time));
69  return result;
70 }
71 
72  std::vector<FairTimeStamp*> PndWriteoutBuffer::GetAllData()
73 {
74  return GetRemoveOldData(fDeadTime_map.rbegin()->first + 1);
75 }
76 
77 
78 
79  void PndWriteoutBuffer::FillNewData(FairTimeStamp* data, double activeTime)
80 {
81  if (fActivateBuffering){
82  typedef std::multimap<double, FairTimeStamp*>::iterator DTMapIter;
83  typedef std::map<FairTimeStamp, double>::iterator DataMapIter;
84 
85  double timeOfOldData = FindTimeForData(data);
86  if(timeOfOldData > -1){ //if an older active data object is already present
87  if (fVerbose > 1) std::cout << " OldData found! " << std::endl;
88  if (fVerbose > 1) std::cout << "New Data: " << activeTime << " : " << data << std::endl;
89  double currentdeadtime = timeOfOldData;
90  FairTimeStamp* oldData;
91  for (DTMapIter it = fDeadTime_map.lower_bound(currentdeadtime); it != fDeadTime_map.upper_bound(currentdeadtime); it++){
92  oldData = it->second;
93  if (fVerbose > 1) std::cout << "Check Data: " << it->first << " : " << oldData << std::endl;
94  if (oldData->equal(data)){
95  if (fVerbose > 1) std::cout << " oldData == data " << std::endl;
96  if (fVerbose > 1) std::cout << it->first << " : " << it->second << std::endl;
97  fDeadTime_map.erase(it);
98  EraseDataFromDataMap(oldData);
99  break;
100  }
101  }
102  std::vector<std::pair<double, FairTimeStamp*> > modifiedData = Modify(std::pair<double, FairTimeStamp*>(currentdeadtime, oldData), std::pair<double, FairTimeStamp*>(-1, data));
103  for (int i = 0; i < modifiedData.size(); i++){
104  FillNewData(modifiedData[i].second, modifiedData[i].first);
105  if (fVerbose > 1) std::cout << i << " :Modified Data: " << modifiedData[i].first << " : " << modifiedData[i].second << std::endl;
106  }
107  }
108  else{
109  if (fVerbose > 1){
110  std::cout << "-I- PndWriteoutBuffer::FillNewData Data Inserted: " << activeTime << " : ";
111  data->Print();
112  std::cout << std::endl;
113  }
114  fDeadTime_map.insert(std::pair<double, FairTimeStamp*>(activeTime, data));
115  FillDataMap(data, activeTime);
116  }
117  }
118  else{
120  }
121 }
122 
123 
virtual void FillDataMap(FairTimeStamp *data, double activeTime)=0
add a new element in the search buffer
int fVerbose
Definition: poormantracks.C:24
std::multimap< double, FairTimeStamp * > fDeadTime_map
virtual std::vector< FairTimeStamp * > GetRemoveOldData(double time)
Int_t i
Definition: run_full.C:25
virtual std::vector< std::pair< double, FairTimeStamp * > > Modify(std::pair< double, FairTimeStamp * > oldData, std::pair< double, FairTimeStamp * > newData)
virtual void EraseDataFromDataMap(FairTimeStamp *data)=0
delete the element from the search buffer (see PndSdsDigiPixelWriteoutBuffer)
virtual void FillNewData(FairTimeStamp *data, double activeTime)
virtual void WriteOutData(double time)
virtual void AddNewDataToTClonesArray(FairTimeStamp *data)=0
store the data from the FairTimeStamp pointer in a TClonesArray (you have to cast it to your type of ...
virtual double FindTimeForData(FairTimeStamp *data)=0
if the same data object (like a pad or a pixel) is already present in the buffer, the time of this ob...
virtual void WriteOutAllData()
ClassImp(PndAnaContFact)
A container class to store digi data during events.
virtual std::vector< FairTimeStamp * > GetAllData()