FairRoot/PandaRoot
PndDiscWriteoutBuffer.cxx
Go to the documentation of this file.
1 //-------------------------------------------------------------------------
2 // Author: Oliver Merle (Oliver.Merle@exp2.physik.uni-giessen.de)
3 // Changes: Mustafa Schmidt (Mustafa.A.Schmidt@physik.uni-giessen.de)
4 // Date: 30.11.2015
5 // Description: Customization of FairRoot Write out buffer
6 // for time-based simulations
7 //-------------------------------------------------------------------------
8 
9 
10 #include <PndDiscWriteoutBuffer.h>
11 
12 #include <TROOT.h>
13 
14 #include <stdexcept>
15 
16 
18 
19 
21  : FairWriteoutBuffer()
22 {
23 #ifdef RRTTI
24  buffer = (TBuffer*)gROOT->ProcessLine("new TBufferFile(TBuffer::kWrite,10000);");
25  if(!buffer) throw std::runtime_error(std::string("WriteoutBuffer::AddNewDataToTClonesArray: cannot allocate buffer."));
26 #endif
27 }
28 
29 
31  : FairWriteoutBuffer(branchName, "PndDiscDigitizedHit", folderName, persistance)
32 {
33 #ifdef RRTTI
34  buffer = (TBuffer*)gROOT->ProcessLine("new TBufferFile(TBuffer::kWrite,10000);");
35  if(!buffer) throw std::runtime_error(std::string("WriteoutBuffer::AddNewDataToTClonesArray: cannot allocate buffer."));
36 #endif
37 }
38 
39 
41 #ifdef RRTTI
42  delete buffer;
43 #endif
44 }
45 
46 
47 // TODO: move this to functor
48 std::vector<std::pair<double, FairTimeStamp*> > PndDiscWriteoutBuffer::Modify(std::pair<double, FairTimeStamp*> oldData, std::pair<double, FairTimeStamp*> newData)
49 {
50  std::vector<std::pair<double, FairTimeStamp*> > result;
51  if( oldData.first >= newData.second->GetTimeStamp() ) {
52  result.push_back(oldData);
53  }
54  else {
55  oldData.first = -1;
56  result.push_back(oldData);
57  result.push_back(newData);
58  }
59  return result;
60 }
61 
62 
63 #ifdef FWB_USE_INHERITANCE
64 // The interface is not needed anymore and can go back to
65 // FairWriteoutBuffer:
67 {
68  FairRootManager* ioman = FairRootManager::Instance();
69  TClonesArray* myArray = ioman->GetTClonesArray(fBranchName);
70 
71 #ifndef RRTTI
72  if (fVerbose > 1) std::cout << "Data Inserted: " << *(PndDiscDigitizedHit*)(data) << std::endl;
73  new ((*myArray)[myArray->GetEntries()]) PndDiscDigitizedHit(*(PndDiscDigitizedHit*)(data));
74  //data->Delete();
75 #else
76  // Get metadata, check types
77  TClass * class_meta = myArray->GetClass();
78  if( data->IsA() != class_meta ) { // Check that types are compatible:
79  data->IsA()->Dump();
80  class_meta->Dump();
81  throw std::runtime_error(std::string("WriteoutBuffer::AddNewDataToTClonesArray: wrong object type."));
82  }
83 
84  // create a new object in TClonesArray via default ctor:
85  TObject* new_instance = myArray->New(myArray->GetEntries());
86 
87  // and copy object contents to new one using the streamer:
88 
89  // store object in created buffer
90  buffer->SetWriteMode();
91  buffer->ResetMap();
92  buffer->SetBufferOffset(0);
93  buffer->MapObject(data);
94  ((TObject*)data)->Streamer(*buffer);
95 
96  // read back content to new object
97  buffer->SetReadMode();
98  buffer->ResetMap();
99  buffer->SetBufferOffset(0);
100  buffer->MapObject(new_instance);
101  new_instance->Streamer(*buffer);
102 
103  // Reset some bits
104  new_instance->ResetBit(kIsReferenced);
105  new_instance->ResetBit(kCanDelete);
106 
107  // data is serialized and not needed anymore (buffer specific, could be moved):
108  data->Delete();
109 #endif
110 }
111 
112 
113 double PndDiscWriteoutBuffer::FindTimeForData(FairTimeStamp* data)
114 {
115 #ifndef RRTTI
116  std::map<PndDiscDigitizedHit, double>::iterator it;
117  PndDiscDigitizedHit myData = *(PndDiscDigitizedHit*)data;
118  it = fData_map.find(myData);
119  if (it == fData_map.end())
120  return -1.;
121  else
122  return it->second;
123 #else
124  DataMap_t::iterator it = fData_map.find(data);
125  if(it == fData_map.end())
126  return -1.;
127  else
128  return it->second;
129 #endif
130 }
131 
132 
133 void PndDiscWriteoutBuffer::FillDataMap(FairTimeStamp* data, double activeTime)
134 {
135 #ifndef RRTTI
136  PndDiscDigitizedHit myData = *(PndDiscDigitizedHit*)data;
137  fData_map[myData] = activeTime;
138 #else
139  fData_map[data] = activeTime;
140 #endif
141 }
142 
143 
145 {
146 #ifndef RRTTI
147  PndDiscDigitizedHit myData = *(PndDiscDigitizedHit*)data;
148  if (fData_map.find(myData) != fData_map.end())
149  fData_map.erase(fData_map.find(myData));
150 #else
151  DataMap_t::iterator it = fData_map.find(data);
152  if(it != fData_map.end()) fData_map.erase(it);
153 #endif
154 }
155 #endif
int fVerbose
Definition: poormantracks.C:24
virtual void FillDataMap(FairTimeStamp *data, double activeTime)
virtual double FindTimeForData(FairTimeStamp *data)
virtual std::vector< std::pair< double, FairTimeStamp * > > Modify(std::pair< double, FairTimeStamp * > oldData, std::pair< double, FairTimeStamp * > newData)
std::map< PndDiscDigitizedHit, double > fData_map
ClassImp(PndAnaContFact)
virtual void EraseDataFromDataMap(FairTimeStamp *data)
virtual void AddNewDataToTClonesArray(FairTimeStamp *)