Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
EventPlaneReco.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file EventPlaneReco.cc
1 #include "EventPlaneReco.h"
2 
3 #include "Eventplaneinfo.h"
4 #include "EventplaneinfoMap.h"
5 #include "EventplaneinfoMapv1.h"
6 #include "Eventplaneinfov1.h"
7 
8 #include <calobase/TowerInfo.h>
9 #include <calobase/TowerInfoContainer.h>
10 #include <calobase/TowerInfoDefs.h>
11 
12 #include <epd/EpdGeom.h>
13 
14 #include <mbd/MbdGeom.h>
15 #include <mbd/MbdOut.h>
16 #include <mbd/MbdPmtContainer.h>
17 #include <mbd/MbdPmtHit.h>
18 
19 #include <cdbobjects/CDBHistos.h>
20 
22 #include <fun4all/SubsysReco.h> // for SubsysReco
23 
24 #include <phool/PHCompositeNode.h>
25 #include <phool/PHIODataNode.h>
26 #include <phool/PHNode.h> // for PHNode
27 #include <phool/PHNodeIterator.h>
28 #include <phool/PHObject.h> // for PHObject
29 #include <phool/getClass.h>
30 #include <phool/phool.h> // for PHWHERE
31 
32 #include <array> // for array
33 #include <cfloat>
34 #include <cmath>
35 #include <cstdlib> // for exit
36 #include <iostream>
37 #include <set> // for _Rb_tree_const_iterator
38 #include <utility> // for pair
39 #include <vector> // for vector
40 #include <TProfile.h>
41 
42 
44  : SubsysReco(name)
45  , OutFileName("eventplane_correction_histograms")
46 {
47 
48  mbd_e_south = 0.;
49  mbd_e_north = 0.;
50  mbdQ = 0.;
51  tmp_south_psi.resize(m_MaxOrder);
52  tmp_north_psi.resize(m_MaxOrder);
53  shift_north.resize(m_MaxOrder);
54  shift_south.resize(m_MaxOrder);
55  south_q.resize(m_MaxOrder);
56  north_q.resize(m_MaxOrder);
59 
60  for (auto &vec : south_q)
61  {
62  vec.resize(2);
63  }
64 
65  for (auto &vec : north_q)
66  {
67  vec.resize(2);
68  }
69 
70  for (auto &vec : south_q_subtract)
71  {
72  vec.resize(2);
73  }
74 
75  for (auto &vec : north_q_subtract)
76  {
77  vec.resize(2);
78  }
79 
80 }
81 
83 {
84 
85  OutFileName = Form("eventplane_correction_histograms_run_%d.root", m_runNo);
86 
87  //-----------------------------------load calibration histograms-----------------------------------------//
88  CDBHistos *cdbhistosIn = new CDBHistos(OutFileName);
89  cdbhistosIn->LoadCalibrations();
90 
91 
92  // Get recentering histograms
93  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
94  {
95  if(!(cdbhistosIn->getHisto(Form("tprof_mean_cos_south_mbd_order_%d",order))))
96  {
97  tprof_mean_cos_south_mbd_input[order - 1] = NULL;
98  tprof_mean_sin_south_mbd_input[order - 1] = NULL;
99  tprof_mean_cos_north_mbd_input[order - 1] = NULL;
100  tprof_mean_sin_north_mbd_input[order - 1] = NULL;
101  }
102  else
103  {
104  tprof_mean_cos_south_mbd_input[order - 1] = dynamic_cast<TProfile *> (cdbhistosIn->getHisto(Form("tprof_mean_cos_south_mbd_order_%d",order)));
105  tprof_mean_sin_south_mbd_input[order - 1] = dynamic_cast<TProfile *> (cdbhistosIn->getHisto(Form("tprof_mean_sin_south_mbd_order_%d",order)));
106  tprof_mean_cos_north_mbd_input[order - 1] = dynamic_cast<TProfile *> (cdbhistosIn->getHisto(Form("tprof_mean_cos_north_mbd_order_%d",order)));
107  tprof_mean_sin_north_mbd_input[order - 1] = dynamic_cast<TProfile *> (cdbhistosIn->getHisto(Form("tprof_mean_sin_north_mbd_order_%d",order)));
108  }
109  }
110 
111  // Get shifting histograms
112  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
113  {
114  for ( int p = 0; p < _imax; p++ )
115  {
116  if(!(cdbhistosIn->getHisto(Form("tprof_cos_north_mbd_shift_order_%d_%d",order,p))))
117  {
118  tprof_cos_north_mbd_shift_input[order - 1][p] = NULL;
119  tprof_sin_north_mbd_shift_input[order - 1][p] = NULL;
120  tprof_cos_south_mbd_shift_input[order - 1][p] = NULL;
121  tprof_sin_south_mbd_shift_input[order - 1][p] = NULL;
122  }
123  else
124  {
125  tprof_cos_north_mbd_shift_input[order - 1][p] = dynamic_cast<TProfile *> (cdbhistosIn->getHisto(Form("tprof_cos_north_mbd_shift_order_%d_%d",order,p)));
126  tprof_sin_north_mbd_shift_input[order - 1][p] = dynamic_cast<TProfile *> (cdbhistosIn->getHisto(Form("tprof_sin_north_mbd_shift_order_%d_%d",order,p)));
127  tprof_cos_south_mbd_shift_input[order - 1][p] = dynamic_cast<TProfile *> (cdbhistosIn->getHisto(Form("tprof_cos_south_mbd_shift_order_%d_%d",order,p)));
128  tprof_sin_south_mbd_shift_input[order - 1][p] = dynamic_cast<TProfile *> (cdbhistosIn->getHisto(Form("tprof_sin_south_mbd_shift_order_%d_%d",order,p)));
129  }
130  }
131  }
132 
133  cdbhistosIn->Print();
134 
135  //-----------------------------------create correction histograms-----------------------------------------//
136 
138 
139  // Create and register recentering histograms
140  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
141  {
142  tprof_mean_cos_south_mbd[order - 1] = new TProfile(Form("tprof_mean_cos_south_mbd_order_%d", order), "", 125*4, 0, 2500, -1e10, 1e10);
143  tprof_mean_sin_south_mbd[order - 1] = new TProfile(Form("tprof_mean_sin_south_mbd_order_%d", order), "", 125*4, 0, 2500, -1e10, 1e10);
144  tprof_mean_cos_north_mbd[order - 1] = new TProfile(Form("tprof_mean_cos_north_mbd_order_%d", order), "", 125*4, 0, 2500, -1e10, 1e10);
145  tprof_mean_sin_north_mbd[order - 1] = new TProfile(Form("tprof_mean_sin_north_mbd_order_%d", order), "", 125*4, 0, 2500, -1e10, 1e10);
146 
151 
152  }
153 
154  // Create and register shifting histograms
155  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
156  {
157  // Request that recentering histograms already exists before creating
158  if(cdbhistosIn->getHisto(Form("tprof_mean_cos_south_mbd_order_%d",order)))
159  {
160 
161  for ( int p = 0; p < _imax; p++ )
162  {
163  tprof_cos_north_mbd_shift[order - 1][p] = new TProfile(Form("tprof_cos_north_mbd_shift_order_%d_%d",order,p), "", 125*4, 0, 2500, -1e10, 1e10);
164  tprof_sin_north_mbd_shift[order - 1][p] = new TProfile(Form("tprof_sin_north_mbd_shift_order_%d_%d",order,p), "", 125*4, 0, 2500, -1e10, 1e10);
165  tprof_cos_south_mbd_shift[order - 1][p] = new TProfile(Form("tprof_cos_south_mbd_shift_order_%d_%d",order,p), "", 125*4, 0, 2500, -1e10, 1e10);
166  tprof_sin_south_mbd_shift[order - 1][p] = new TProfile(Form("tprof_sin_south_mbd_shift_order_%d_%d",order,p), "", 125*4, 0, 2500, -1e10, 1e10);
167 
172  }
173  }
174 
175  }
176 
177 
178  return CreateNodes(topNode);
179 
180 }
181 
183 {
184  if (Verbosity() > 0)
185  {
186  std::cout << "======================= EventPlaneReco::InitRun() =======================" << std::endl;
187  std::cout << "===========================================================================" << std::endl;
188  }
189 
190  return CreateNodes(topNode);
191 }
192 
194 {
195 
196  if (Verbosity() > 1)
197  {
198  std::cout << "EventPlaneReco::process_event -- entered" << std::endl;
199  }
200 
201  //---------------------------------
202  // Get Objects off of the Node Tree
203  //---------------------------------
204  EventplaneinfoMap *epmap = findNode::getClass<EventplaneinfoMap>(topNode, "EventplaneinfoMap");
205  if (!epmap)
206  {
207  std::cout << PHWHERE << "::ERROR - cannot find EventplaneinfoMap" << std::endl;
208  exit(-1);
209  }
210 
211  if (_sepdEpReco)
212  {
213  ResetMe();
214  TowerInfoContainer *epd_towerinfo = findNode::getClass<TowerInfoContainer>(topNode, "TOWERINFO_CALIB_EPD");
215  if (!epd_towerinfo)
216  {
217  std::cout << PHWHERE << "::ERROR - cannot find TOWERINFO_CALIB_EPD" << std::endl;
218  exit(-1);
219  }
220  EpdGeom *_epdgeom = findNode::getClass<EpdGeom>(topNode, "TOWERGEOM_EPD");
221  if (!_epdgeom)
222  {
223  std::cout << PHWHERE << "::ERROR - cannot find TOWERGEOM_EPD" << std::endl;
224  exit(-1);
225  }
226 
227  if (epd_towerinfo)
228  {
229  if (Verbosity())
230  {
231  std::cout << "EventPlaneReco::process_event - epd_towerinfo" << std::endl;
232  }
233 
234  unsigned int ntowers = epd_towerinfo->size();
235  for (unsigned int ch = 0; ch < ntowers; ch++)
236  {
237  TowerInfo *_tower = epd_towerinfo->get_tower_at_channel(ch);
238  unsigned int key = TowerInfoDefs::encode_epd(ch);
239  float epd_e = _tower->get_energy();
240  if (epd_e < 0.5)
241  {
242  continue;
243  }
244  float tile_phi = _epdgeom->get_phi(key);
245  int arm = TowerInfoDefs::get_epd_arm(key);
246  float truncated_e = (epd_e < _epd_e) ? epd_e : _epd_e;
247  if (arm == 0)
248  {
249  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
250  {
251  double Cosine = cos(tile_phi * (double) order);
252  double Sine = sin(tile_phi * (double) order);
253  south_q[order - 1][0] += truncated_e * Cosine; // south Qn,x
254  south_q[order - 1][1] += truncated_e * Sine; // south Qn,y
255  }
256  }
257  else if (arm == 1)
258  {
259  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
260  {
261  double Cosine = cos(tile_phi * (double) order);
262  double Sine = sin(tile_phi * (double) order);
263  north_q[order - 1][0] += truncated_e * Cosine; // north Qn,x
264  north_q[order - 1][1] += truncated_e * Sine; // north Qn,y
265  }
266  }
267  }
268  }
269  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
270  {
271  south_Qvec.emplace_back(south_q[order - 1][0], south_q[order - 1][1]);
272  north_Qvec.emplace_back(north_q[order - 1][0], north_q[order - 1][1]);
273  }
274 
275  if (epd_towerinfo)
276  {
277  Eventplaneinfo *sepds = new Eventplaneinfov1();
278  sepds->set_qvector(south_Qvec);
279  epmap->insert(sepds, EventplaneinfoMap::sEPDS);
280 
281  Eventplaneinfo *sepdn = new Eventplaneinfov1();
282  sepdn->set_qvector(north_Qvec);
283  epmap->insert(sepdn, EventplaneinfoMap::sEPDN);
284 
285  if (Verbosity() > 1)
286  {
287  sepds->identify();
288  sepdn->identify();
289  }
290  }
291 
292  ResetMe();
293  }
294 
295  if (_mbdEpReco)
296  {
297  ResetMe();
298  MbdPmtContainer *mbdpmts = findNode::getClass<MbdPmtContainer>(topNode, "MbdPmtContainer");
299  if (!mbdpmts)
300  {
301  std::cout << PHWHERE << "::ERROR - cannot find MbdPmtContainer" << std::endl;
302  exit(-1);
303  }
304 
305  MbdGeom *mbdgeom = findNode::getClass<MbdGeom>(topNode, "MbdGeom");
306  if (!mbdgeom)
307  {
308  std::cout << PHWHERE << "::ERROR - cannot find MbdGeom" << std::endl;
309  exit(-1);
310  }
311 
312 
313  if (mbdpmts)
314  {
315  if (Verbosity())
316  {
317  std::cout << "EventPlaneReco::process_event - mbdpmts" << std::endl;
318  }
319 
320  mbd_e_south = 0.;
321  mbd_e_north = 0.;
322  mbdQ = 0.;
323 
324  for (int ipmt = 0; ipmt < mbdpmts->get_npmt(); ipmt++)
325  {
326  float mbd_q = mbdpmts->get_pmt(ipmt)->get_q();
327  mbdQ += mbd_q;
328  }
329 
330  for (int ipmt = 0; ipmt < mbdpmts->get_npmt(); ipmt++)
331  {
332  float mbd_q = mbdpmts->get_pmt(ipmt)->get_q();
333  float phi = mbdgeom->get_phi(ipmt);
334  int arm = mbdgeom->get_arm(ipmt);
335 
336  if(mbdQ < _mbd_e) continue;
337 
338  if (arm == 0)
339  {
340  mbd_e_south += mbd_q;
341  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
342  {
343  double Cosine = cos(phi * (double) order);
344  double Sine = sin(phi * (double) order);
345  south_q[order - 1][0] += mbd_q * Cosine; // south Qn,x
346  south_q[order - 1][1] += mbd_q * Sine; // south Qn,y
347  }
348  }
349  else if (arm == 1)
350  {
351  mbd_e_north += mbd_q;
352  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
353  {
354  double Cosine = cos(phi * (double) order);
355  double Sine = sin(phi * (double) order);
356  north_q[order - 1][0] += mbd_q * Cosine; // north Qn,x
357  north_q[order - 1][1] += mbd_q * Sine; // north Qn,y
358  }
359  }
360  }
361  }
362 
363  // Filled during first run
364  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
365  {
366  // Fill recentering histograms by order
367  tprof_mean_cos_south_mbd[order - 1]->Fill(mbd_e_south,south_q[order - 1][0]/mbd_e_south);
368  tprof_mean_sin_south_mbd[order - 1]->Fill(mbd_e_south,south_q[order - 1][1]/mbd_e_south);
369  tprof_mean_cos_north_mbd[order - 1]->Fill(mbd_e_north,north_q[order - 1][0]/mbd_e_north);
370  tprof_mean_sin_north_mbd[order - 1]->Fill(mbd_e_north,north_q[order - 1][1]/mbd_e_north);
371  }
372 
373 
374  // Get recentering histograms and do recentering
375  // Recentering: subtract Qn,x and Qn,y values averaged over all events
376  // Recentering histogram should be available on second run
377  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
378  {
379  if (tprof_mean_cos_south_mbd_input[order-1]) //check if recentering histograms exist
380  {
381  // south
382  int bin_south = tprof_mean_cos_south_mbd_input[order - 1]->FindBin(mbd_e_south);
383  double event_ave_cos_south = tprof_mean_cos_south_mbd_input[order - 1]->GetBinContent(bin_south);
384  double event_ave_sin_south = tprof_mean_sin_south_mbd_input[order - 1]->GetBinContent(bin_south);
385  south_q_subtract[order - 1][0] = mbd_e_south*event_ave_cos_south;
386  south_q_subtract[order - 1][1] = mbd_e_south*event_ave_sin_south;
387  south_q[order - 1][0] -= south_q_subtract[order - 1][0];
388  south_q[order - 1][1] -= south_q_subtract[order - 1][1];
389 
390  // north
391  int bin_north = tprof_mean_cos_north_mbd_input[order - 1]->FindBin(mbd_e_north);
392  double event_ave_cos_north = tprof_mean_cos_north_mbd_input[order - 1]->GetBinContent(bin_north);
393  double event_ave_sin_north = tprof_mean_sin_north_mbd_input[order - 1]->GetBinContent(bin_north);
394  north_q_subtract[order - 1][0] = mbd_e_north*event_ave_cos_north;
395  north_q_subtract[order - 1][1] = mbd_e_north*event_ave_sin_north;
396  north_q[order - 1][0] -= north_q_subtract[order - 1][0];
397  north_q[order - 1][1] -= north_q_subtract[order - 1][1];
398  }
399  }
400 
401 
402 
403  // Higher order harmonics might still be present after recentering, so do event-by-event shifting of the planes
404  // First get temp psi_n. Important to start with recentered planes, so ask for recentered histograms
405  Eventplaneinfo *epinfo = new Eventplaneinfov1();
406  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
407  {
408  if(tprof_mean_cos_south_mbd_input[order-1]) // if present, Qs are recentered
409  {
410  tmp_south_psi[order - 1] = epinfo->GetPsi(south_q[order - 1][0], south_q[order - 1][1], order);
411  tmp_north_psi[order - 1] = epinfo->GetPsi(north_q[order - 1][0], north_q[order - 1][1], order);
412  }
413  else
414  {
415  tmp_south_psi[order - 1] = NAN;
416  tmp_north_psi[order - 1] = NAN;
417  }
418 
419  }
420 
421 
422  // Filled during second run
423  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
424  {
425  if( tprof_mean_cos_south_mbd_input[order-1]) // if present, Qs are recentered
426  {
427  // Fill shifting histograms by order and terms
428  for ( int p = 0; p < _imax; p++ )
429  {
430  double terms = p+1.0;
431  double tmp = (double)(order*terms);
432 
433  tprof_cos_south_mbd_shift[order - 1][p]->Fill(mbd_e_south, cos(tmp*tmp_south_psi[order - 1])); // <cos(i*n*psi_n)>
434  tprof_sin_south_mbd_shift[order - 1][p]->Fill(mbd_e_south, sin(tmp*tmp_south_psi[order - 1])); // <sin(i*n*psi_n)>
435  tprof_cos_north_mbd_shift[order - 1][p]->Fill(mbd_e_north, cos(tmp*tmp_north_psi[order - 1])); // <cos(i*n*psi_n)>
436  tprof_sin_north_mbd_shift[order - 1][p]->Fill(mbd_e_north, sin(tmp*tmp_north_psi[order - 1])); // <sin(i*n*psi_n)>
437 
438  }
439  }
440  }
441 
442  // Get shifting histograms and calculate shift
443  // This was filled at the end of the second run
444  // In third run, shifting histograms should be available
445  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
446  {
447  for ( int p = 0; p < _imax; p++ )
448  {
449  if (tprof_cos_south_mbd_shift_input[order-1][p]) // check if shifting histograms exist
450  {
451  double terms = p+1.0;
452  double tmp = (double)(order*terms);
453  double prefactor = 2.0/terms;
454 
455  int bin_north = tprof_cos_north_mbd_shift_input[order - 1][p]->FindBin(mbd_e_north);
456  int bin_south = tprof_cos_south_mbd_shift_input[order - 1][p]->FindBin(mbd_e_south);
457 
458  // Equation (6) of arxiv:nucl-ex/9805001
459  // i = terms; n = order; i*n = tmp
460  // (2 * i ) * <cos(i*n*psi_n)> * sin(i*n*psi_n) - <sin(i*n*psi_n)> * cos(i*n*psi_n)
461 
462  // north
463  shift_north[order - 1] += prefactor*(tprof_cos_north_mbd_shift_input[order - 1][p]->GetBinContent(bin_north) * sin(tmp*tmp_north_psi[order-1]) - tprof_sin_north_mbd_shift_input[order - 1][p]->GetBinContent(bin_north) * cos(tmp*tmp_north_psi[order-1]));
464 
465  // south
466  shift_south[order - 1] += prefactor*(tprof_cos_south_mbd_shift_input[order - 1][p]->GetBinContent(bin_south) * sin(tmp*tmp_south_psi[order-1]) - tprof_sin_south_mbd_shift_input[order - 1][p]->GetBinContent(bin_south) * cos(tmp*tmp_south_psi[order-1]));
467 
468  }
469  }
470  }
471 
472  // n * deltapsi_n = (2 * i ) * <cos(i*n*psi_n)> * sin(i*n*psi_n) - <sin(i*n*psi_n)> * cos(i*n*psi_n)
473  // Divide out n
474  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
475  {
476  shift_north[order - 1] /= order;
477  shift_south[order - 1] /= order;
478  }
479 
480 
481  // Now add shift to psi_n to flatten it
482  // Verify that this is done only in third run by asking for shifting hists
483  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
484  {
486  {
487  tmp_south_psi[order - 1] += shift_south[order - 1];
488  tmp_north_psi[order - 1] += shift_north[order - 1];
489  }
490  }
491 
492 
493 
494  //-------------------------------- store all MBD eventplane information ---------------------------------//
495  for (unsigned int order = 1; order < m_MaxOrder + 1; order++)
496  {
497  south_Qvec.emplace_back(south_q[order - 1][0], south_q[order - 1][1]);
498  north_Qvec.emplace_back(north_q[order - 1][0], north_q[order - 1][1]);
499  }
500 
501 
502  if (mbdpmts)
503  {
504  Eventplaneinfo *mbds = new Eventplaneinfov1();
505  mbds->set_qvector(south_Qvec);
507  epmap->insert(mbds, EventplaneinfoMap::MBDS);
508 
509  Eventplaneinfo *mbdn = new Eventplaneinfov1();
510  mbdn->set_qvector(north_Qvec);
512  epmap->insert(mbdn, EventplaneinfoMap::MBDN);
513 
514  if (Verbosity() > 1)
515  {
516  mbds->identify();
517  mbdn->identify();
518  }
519  }
520 
521  ResetMe();
522  }
523 
524  if (Verbosity())
525  {
526  epmap->identify();
527  }
528 
530 }
531 
533 {
534  PHNodeIterator iter(topNode);
535 
536  PHCompositeNode *dstNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
537  if (!dstNode)
538  {
539  std::cout << PHWHERE << "DST Node missing, doing nothing." << std::endl;
541  }
542 
543  PHCompositeNode *globalNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "GLOBAL"));
544  if (!globalNode)
545  {
546  globalNode = new PHCompositeNode("GLOBAL");
547  dstNode->addNode(globalNode);
548  }
549 
550  EventplaneinfoMap *eps = findNode::getClass<EventplaneinfoMap>(topNode, "EventplaneinfoMap");
551  if (!eps)
552  {
553  eps = new EventplaneinfoMapv1();
554  PHIODataNode<PHObject> *EpMapNode = new PHIODataNode<PHObject>(eps, "EventplaneinfoMap", "PHObject");
555  globalNode->addNode(EpMapNode);
556  }
558 }
559 
561 {
562  for (auto &vec : south_q)
563  {
564  std::fill(vec.begin(), vec.end(), 0.);
565  }
566 
567  for (auto &vec : north_q)
568  {
569  std::fill(vec.begin(), vec.end(), 0.);
570  }
571 
572  for (auto &vec : south_q_subtract)
573  {
574  std::fill(vec.begin(), vec.end(), 0.);
575  }
576 
577  for (auto &vec : north_q_subtract)
578  {
579  std::fill(vec.begin(), vec.end(), 0.);
580  }
581 
582  std::fill(shift_north.begin(), shift_north.end(), 0.);
583  std::fill(shift_south.begin(), shift_south.end(), 0.);
584 
585  std::fill(tmp_south_psi.begin(), tmp_south_psi.end(), NAN);
586  std::fill(tmp_north_psi.begin(), tmp_north_psi.end(), NAN);
587 
588  south_Qvec.clear();
589  north_Qvec.clear();
590 
591 }
592 
594 {
596  delete cdbhistosOut;
597  std::cout << " EventPlaneReco::End() " << std::endl;
599 }