Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Prototype4DSTReader.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file Prototype4DSTReader.cc
1 // $Id: Prototype4DSTReader.cc,v 1.11 2015/01/06 02:52:07 jinhuang Exp $
2 
11 #include "Prototype4DSTReader.h"
12 
13 #include <calobase/RawTower.h> // for RawTower
14 #include <calobase/RawTowerContainer.h>
15 
16 #include <pdbcalbase/PdbParameterMap.h>
17 
18 #include <phparameter/PHParameters.h>
19 
20 #include <fun4all/PHTFileServer.h>
21 #include <fun4all/SubsysReco.h> // for SubsysReco
22 
23 #include <phool/getClass.h>
24 
25 #include <TClass.h> // for TClass
26 #include <TClonesArray.h> // for TClonesArray
27 #include <TObject.h> // for TObject
28 #include <TString.h> // for Form
29 #include <TTree.h>
30 
31 #include <cassert>
32 #include <iostream> // for operator<<, basic_ostream, endl
33 #include <limits>
34 #include <map>
35 #include <utility> // for pair
36 
37 class PHCompositeNode;
38 
39 using namespace std;
40 
42  : SubsysReco("Prototype4DSTReader")
43  , nblocks(0)
44  , _event(0)
45  , //
46  _out_file_name(filename)
47  , /*_file(nullptr), */ _T(nullptr)
48  , //
49  _tower_zero_sup(-10000000)
50 {
51 }
52 
54 {
55  cout << "Prototype4DSTReader::destructor - Clean ups" << endl;
56 
57  if (_T)
58  {
59  _T->ResetBranchAddresses();
60  }
61 
62  _records.clear();
63 }
64 
66 {
67  const static int arr_size = 100;
68 
69  if (_tower_postfix.size())
70  {
71  cout << "Prototype4DSTReader::Init - zero suppression for calorimeter "
72  "towers = "
73  << _tower_zero_sup << " GeV" << endl;
74  }
75  for (vector<string>::const_iterator it = _runinfo_list.begin();
76  it != _runinfo_list.end(); ++it)
77  {
78  const string &nodenam = *it;
79 
80  record rec;
81  rec._cnt = 0;
82  rec._name = nodenam;
83  rec._arr = nullptr;
84  rec._arr_ptr = nullptr;
85  rec._dvalue = 0;
87 
88  _records.push_back(rec);
89 
90  nblocks++;
91  }
92  for (vector<string>::const_iterator it = _eventinfo_list.begin();
93  it != _eventinfo_list.end(); ++it)
94  {
95  const string &nodenam = *it;
96 
97  record rec;
98  rec._cnt = 0;
99  rec._name = nodenam;
100  rec._arr = nullptr;
101  rec._arr_ptr = nullptr;
102  rec._dvalue = 0;
104 
105  _records.push_back(rec);
106 
107  nblocks++;
108  }
109 
110  for (vector<string>::const_iterator it = _tower_postfix.begin();
111  it != _tower_postfix.end(); ++it)
112  {
113  const char *class_name = RawTower_type::Class()->GetName();
114 
115  const string &nodenam = *it;
116 
117  string hname = Form("TOWER_%s", nodenam.c_str());
118  // _node_name.push_back(hname);
119  cout << "Prototype4DSTReader::Init - saving raw tower info from node: "
120  << hname << " - " << class_name << endl;
121 
122  record rec;
123  rec._cnt = 0;
124  rec._name = hname;
125  rec._arr = make_shared<TClonesArray>(class_name, arr_size);
126  rec._arr_ptr = rec._arr.get();
127  rec._dvalue = 0;
128  rec._type = record::typ_tower;
129 
130  _records.push_back(rec);
131 
132  nblocks++;
133  }
134 
135  for (vector<string>::const_iterator it = _towertemp_postfix.begin();
136  it != _towertemp_postfix.end(); ++it)
137  {
138  const string &nodenam = *it;
139  string hname = Form("TOWER_TEMPERATURE_%s", nodenam.c_str());
140 
141  cout << "Prototype4DSTReader::Init - saving average tower temperature info "
142  "from node: "
143  << hname << endl;
144 
145  record rec;
146  rec._cnt = 0;
147  rec._name = hname;
148  rec._arr = nullptr;
149  rec._arr_ptr = nullptr;
150  rec._dvalue = 0;
152 
153  _records.push_back(rec);
154 
155  nblocks++;
156  }
157  cout << "Prototype4DSTReader::Init - requested " << nblocks << " nodes"
158  << endl;
159 
160  build_tree();
161 
162  return 0;
163 }
164 
166 {
167  cout << "Prototype4DSTReader::build_tree - output to " << _out_file_name
168  << endl;
169 
170  static const int BUFFER_SIZE = 32000;
171 
172  // open TFile
173  PHTFileServer::get().open(_out_file_name, "RECREATE");
174 
175  _T = new TTree("T", "Prototype4DSTReader");
176 
177  nblocks = 0;
178  for (records_t::iterator it = _records.begin(); it != _records.end(); ++it)
179  {
180  record &rec = *it;
181 
182  cout << "Prototype4DSTReader::build_tree - Add " << rec._name << endl;
183 
184  if (rec._type == record::typ_runinfo)
185  {
186  const string name_cnt = rec._name;
187  const string name_cnt_desc = name_cnt + "/D";
188  _T->Branch(name_cnt.c_str(), &(rec._dvalue), name_cnt_desc.c_str(),
189  BUFFER_SIZE);
190  }
191  if (rec._type == record::typ_eventinfo)
192  {
193  const string name_cnt = rec._name;
194  const string name_cnt_desc = name_cnt + "/D";
195  _T->Branch(name_cnt.c_str(), &(rec._dvalue), name_cnt_desc.c_str(),
196  BUFFER_SIZE);
197  }
198  else if (rec._type == record::typ_tower)
199  {
200  const string name_cnt = "n_" + rec._name;
201  const string name_cnt_desc = name_cnt + "/I";
202  _T->Branch(name_cnt.c_str(), &(rec._cnt), name_cnt_desc.c_str(),
203  BUFFER_SIZE);
204  _T->Branch(rec._name.c_str(), &(rec._arr_ptr), BUFFER_SIZE, 99);
205  }
206  else if (rec._type == record::typ_towertemp)
207  {
208  const string name_cnt = rec._name + "_AVG";
209  const string name_cnt_desc = name_cnt + "/D";
210  _T->Branch(name_cnt.c_str(), &(rec._dvalue), name_cnt_desc.c_str(),
211  BUFFER_SIZE);
212  }
213 
214  nblocks++;
215  }
216 
217  cout << "Prototype4DSTReader::build_tree - added " << nblocks << " nodes"
218  << endl;
219 
220  _T->SetAutoSave(16000);
221 }
222 
224 {
225  // const double significand = _event / TMath::Power(10, (int)
226  // (log10(_event)));
227  //
228  // if (fmod(significand, 1.0) == 0 && significand <= 10)
229  // cout << "Prototype4DSTReader::process_event - " << _event << endl;
230  _event++;
231 
232  for (records_t::iterator it = _records.begin(); it != _records.end(); ++it)
233  {
234  record &rec = *it;
235 
236  rec._cnt = 0;
237 
238  if (rec._type == record::typ_hit)
239  {
240  assert(0);
241  } // if (rec._type == record::typ_hit)
242  else if (rec._type == record::typ_tower)
243  {
244  assert(rec._arr.get() == rec._arr_ptr);
245  assert(rec._arr.get());
246  rec._arr->Clear();
247 
248  if (Verbosity() >= 2)
249  cout << "Prototype4DSTReader::process_event - processing tower "
250  << rec._name << endl;
251 
252  RawTowerContainer *hits =
253  findNode::getClass<RawTowerContainer>(topNode, rec._name);
254  if (!hits)
255  {
256  if (_event < 2)
257  cout << "Prototype4DSTReader::process_event - Error - can not find "
258  "node "
259  << rec._name << endl;
260  }
261  else
262  {
263  RawTowerContainer::ConstRange hit_range = hits->getTowers();
264 
265  if (Verbosity() >= 2)
266  cout << "Prototype4DSTReader::process_event - processing "
267  << rec._name << " and received " << hits->size() << " tower hits"
268  << endl;
269 
270  for (RawTowerContainer::ConstIterator hit_iter = hit_range.first;
271  hit_iter != hit_range.second; hit_iter++)
272  {
273  RawTower *hit_raw = hit_iter->second;
274 
275  RawTower_type *hit = dynamic_cast<RawTower_type *>(hit_raw);
276  // RawTower * hit = hit_iter->second;
277 
278  assert(hit);
279 
280  if (hit->get_energy() < _tower_zero_sup)
281  {
282  if (Verbosity() >= 2)
283  cout << "Prototype4DSTReader::process_event - suppress low "
284  "energy tower hit "
285  << rec._name
286  << " @ ("
287  // << hit->get_thetaMin()
288  // << ", " << hit->get_phiMin()
289  << "), Energy = " << hit->get_energy() << endl;
290 
291  continue;
292  }
293 
294  new ((*(rec._arr.get()))[rec._cnt]) RawTower_type();
295 
296  if (Verbosity() >= 2)
297  cout << "Prototype4DSTReader::process_event - processing Tower hit "
298  << rec._name
299  << " @ ("
300  // << hit->get_thetaMin() << ", "
301  // << hit->get_phiMin()
302  << "), Energy = " << hit->get_energy() << " - "
303  << rec._arr.get()->At(rec._cnt)->ClassName() << endl;
304 
305  // rec._arr->Print();
306 
307  RawTower_type *new_hit =
308  dynamic_cast<RawTower_type *>(rec._arr.get()->At(rec._cnt));
309  assert(new_hit);
310 
311  *new_hit = (*hit);
312 
313  rec._cnt++;
314  }
315  } // if (!hits)
316  } // if (rec._type == record::typ_hit)
317  else if (rec._type == record::typ_towertemp)
318  {
319  if (Verbosity() >= 2)
320  cout << "Prototype4DSTReader::process_event - processing tower "
321  "temperature "
322  << rec._name << endl;
323 
324  RawTowerContainer *hits =
325  findNode::getClass<RawTowerContainer>(topNode, rec._name);
326  if (!hits)
327  {
328  if (_event < 2)
329  cout << "Prototype4DSTReader::process_event - Error - can not find "
330  "node "
331  << rec._name << endl;
332  }
333  else
334  {
335  RawTowerContainer::ConstRange hit_range = hits->getTowers();
336 
337  if (Verbosity() >= 2)
338  cout << "Prototype4DSTReader::process_event - processing "
339  << rec._name << " and received " << hits->size() << " tower hits"
340  << endl;
341 
342  rec._cnt = 0;
343 
344  for (RawTowerContainer::ConstIterator hit_iter = hit_range.first;
345  hit_iter != hit_range.second; hit_iter++)
346  {
347  RawTower *hit_raw = hit_iter->second;
348 
349  RawTowerT_type *hit = dynamic_cast<RawTowerT_type *>(hit_raw);
350  // RawTower * hit = hit_iter->second;
351 
352  assert(hit);
353 
354  rec._dvalue +=
356 
357  ++rec._cnt;
358  }
359 
360  rec._dvalue /= rec._cnt;
361  } // if (!hits)
362  } // if (rec._type == record::typ_hit)
363  else if (rec._type == record::typ_runinfo)
364  {
365  PdbParameterMap *info =
366  findNode::getClass<PdbParameterMap>(topNode, "RUN_INFO");
367 
368  assert(info);
369 
370  PHParameters run_info_copy("RunInfo");
371  run_info_copy.FillFrom(info);
372 
373  rec._dvalue = run_info_copy.get_double_param(rec._name);
374 
375  } //
376  else if (rec._type == record::typ_eventinfo)
377  {
378  PdbParameterMap *info =
379  findNode::getClass<PdbParameterMap>(topNode, "EVENT_INFO");
380 
381  assert(info);
382 
383  PHParameters event_info_copy("EVENT_INFO");
384  event_info_copy.FillFrom(info);
385 
386  rec._dvalue = numeric_limits<double>::quiet_NaN();
387 
388  if (event_info_copy.exist_double_param(rec._name))
389  rec._dvalue = event_info_copy.get_double_param(rec._name);
390 
391  } // if (rec._type == record::typ_hit)
392  else if (rec._type == record::typ_part)
393  {
394  assert(0);
395  } // if (rec._type == record::typ_part)
396  else if (rec._type == record::typ_vertex)
397  {
398  assert(0);
399  } // if (_load_all_particle)
400 
401  } // for (records_t::iterator it = _records.begin(); it != _records.end();
402  // ++it)
403 
404  if (_T)
405  _T->Fill();
406 
407  return 0;
408 } // for (records_t::iterator it = _records.begin(); it != _records.end();
409 // ++it)
410 
412 {
413  cout << "Prototype4DSTReader::End - Clean ups" << endl;
414 
415  if (_T)
416  {
418  _T->Write();
419  _T->ResetBranchAddresses();
420  }
421 
422  _records.clear();
423 
424  return 0;
425 }