CMS 3D CMS Logo

EvtPlaneProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: EvtPlaneProducer
4 // Class: EvtPlaneProducer
5 //
13 //
14 // Original Author: Sergey Petrushanko
15 // Created: Fri Jul 11 10:05:00 2008
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 #include <iostream>
22 #include <ctime>
23 #include <cmath>
24 
25 // user include files
30 
35 
40 
43 
47 
53 #include <cstdlib>
59 
64 
67 
68 using namespace std;
69 using namespace hi;
70 
71 //
72 // class decleration
73 //
74 
75 namespace hi {
76  class GenPlane {
77  public:
78  GenPlane(string name, double etaminval1, double etamaxval1, double etaminval2, double etamaxval2, int orderval) {
79  epname = name;
80  etamin1 = etaminval1;
81  etamax1 = etamaxval1;
82  etamin2 = etaminval2;
83  etamax2 = etamaxval2;
84  sumsin = 0;
85  sumcos = 0;
86  sumsinNoWgt = 0;
87  sumcosNoWgt = 0;
88 
89  mult = 0;
90  order = (double)orderval;
91  }
92  ~GenPlane() { ; }
93  void addParticle(double w, double PtOrEt, double s, double c, double eta) {
94  if ((eta >= etamin1 && eta < etamax1) || (etamin2 != etamax2 && eta >= etamin2 && eta < etamax2)) {
95  sumsin += w * s;
96  sumcos += w * c;
97  sumsinNoWgt += s;
98  sumcosNoWgt += c;
99 
100  sumw += fabs(w);
101  sumw2 += w * w;
102  sumPtOrEt += PtOrEt;
103  sumPtOrEt2 += PtOrEt * PtOrEt;
104  ++mult;
105  }
106  }
107 
108  double getAngle(double &ang,
109  double &sv,
110  double &cv,
111  double &svNoWgt,
112  double &cvNoWgt,
113  double &w,
114  double &w2,
115  double &PtOrEt,
116  double &PtOrEt2,
117  uint &epmult) {
118  ang = -10;
119  sv = 0;
120  cv = 0;
121  sv = sumsin;
122  cv = sumcos;
123  svNoWgt = sumsinNoWgt;
124  cvNoWgt = sumcosNoWgt;
125  w = sumw;
126  w2 = sumw2;
127  PtOrEt = sumPtOrEt;
128  PtOrEt2 = sumPtOrEt2;
129  epmult = mult;
130  double q = sv * sv + cv * cv;
131  if (q > 0)
132  ang = atan2(sv, cv) / order;
133  return ang;
134  }
135  void reset() {
136  sumsin = 0;
137  sumcos = 0;
138  sumsinNoWgt = 0;
139  sumcosNoWgt = 0;
140  sumw = 0;
141  sumw2 = 0;
142  mult = 0;
143  sumPtOrEt = 0;
144  sumPtOrEt2 = 0;
145  }
146 
147  private:
148  string epname;
149  double etamin1;
150  double etamax1;
151 
152  double etamin2;
153  double etamax2;
154  double sumsin;
155  double sumcos;
156  double sumsinNoWgt;
157  double sumcosNoWgt;
159  double sumw;
160  double sumw2;
161  double sumPtOrEt;
162  double sumPtOrEt2;
163  double order;
164  };
165 } // namespace hi
166 
168 public:
169  explicit EvtPlaneProducer(const edm::ParameterSet &);
170  ~EvtPlaneProducer() override;
171 
172 private:
174 
175  void produce(edm::Event &, const edm::EventSetup &) override;
176 
177  // ----------member data ---------------------------
178 
182 
185 
189 
193 
197 
201 
204 
205  bool loadDB_;
206  double minet_;
207  double maxet_;
208  double minpt_;
209  double maxpt_;
210  double minvtx_;
211  double maxvtx_;
212  double dzerr_;
213  double chi2_;
216  double nCentBins_;
217  double caloCentRef_;
221 };
222 
224  : centralityVariable_(iConfig.getParameter<std::string>("centralityVariable")),
225  centralityBinTag_(iConfig.getParameter<edm::InputTag>("centralityBinTag")),
226  vertexTag_(iConfig.getParameter<edm::InputTag>("vertexTag")),
227  caloTag_(iConfig.getParameter<edm::InputTag>("caloTag")),
228  castorTag_(iConfig.getParameter<edm::InputTag>("castorTag")),
229  trackTag_(iConfig.getParameter<edm::InputTag>("trackTag")),
230  loadDB_(iConfig.getParameter<bool>("loadDB")),
231  minet_(iConfig.getParameter<double>("minet")),
232  maxet_(iConfig.getParameter<double>("maxet")),
233  minpt_(iConfig.getParameter<double>("minpt")),
234  maxpt_(iConfig.getParameter<double>("maxpt")),
235  minvtx_(iConfig.getParameter<double>("minvtx")),
236  maxvtx_(iConfig.getParameter<double>("maxvtx")),
237  dzerr_(iConfig.getParameter<double>("dzerr")),
238  chi2_(iConfig.getParameter<double>("chi2")),
239  FlatOrder_(iConfig.getParameter<int>("FlatOrder")),
240  NumFlatBins_(iConfig.getParameter<int>("NumFlatBins")),
241  caloCentRef_(iConfig.getParameter<double>("caloCentRef")),
242  caloCentRefWidth_(iConfig.getParameter<double>("caloCentRefWidth")),
243  CentBinCompression_(iConfig.getParameter<int>("CentBinCompression")) {
244  nCentBins_ = 200.;
245 
246  if (iConfig.exists("nonDefaultGlauberModel")) {
247  centralityMC_ = iConfig.getParameter<std::string>("nonDefaultGlauberModel");
248  }
250 
251  centralityBinToken = consumes<int>(centralityBinTag_);
252 
253  vertexToken = consumes<std::vector<reco::Vertex>>(vertexTag_);
254 
255  caloToken = consumes<CaloTowerCollection>(caloTag_);
256 
257  castorToken = consumes<std::vector<reco::CastorTower>>(castorTag_);
258 
259  trackToken = consumes<reco::TrackCollection>(trackTag_);
260 
261  produces<reco::EvtPlaneCollection>();
262  for (int i = 0; i < NumEPNames; i++) {
263  rp[i] = new GenPlane(EPNames[i], EPEtaMin1[i], EPEtaMax1[i], EPEtaMin2[i], EPEtaMax2[i], EPOrder[i]);
264  }
265  for (int i = 0; i < NumEPNames; i++) {
266  flat[i] = new HiEvtPlaneFlatten();
268  }
269 }
270 
272  // do anything here that needs to be done at desctruction time
273  // (e.g. close files, deallocate resources etc.)
274  for (int i = 0; i < NumEPNames; i++) {
275  delete flat[i];
276  }
277 }
278 
279 //
280 // member functions
281 //
282 
283 // ------------ method called to produce the data ------------
285  using namespace edm;
286  using namespace std;
287  using namespace reco;
288 
289  if (loadDB_ && (hiWatcher.check(iSetup) || hirpWatcher.check(iSetup))) {
290  //
291  //Get Size of Centrality Table
292  //
294  iSetup.get<HeavyIonRcd>().get(centralityLabel_, centDB_);
295  nCentBins_ = centDB_->m_table.size();
296  for (int i = 0; i < NumEPNames; i++) {
297  if (caloCentRef_ > 0) {
298  int minbin = (caloCentRef_ - caloCentRefWidth_ / 2.) * nCentBins_ / 100.;
299  int maxbin = (caloCentRef_ + caloCentRefWidth_ / 2.) * nCentBins_ / 100.;
300  minbin /= CentBinCompression_;
301  maxbin /= CentBinCompression_;
302  if (minbin > 0 && maxbin >= minbin) {
303  if (EPDet[i] == HF || EPDet[i] == Castor)
304  flat[i]->setCaloCentRefBins(minbin, maxbin);
305  }
306  }
307  }
308 
309  //
310  //Get flattening parameter file.
311  //
312  if (loadDB_) {
313  edm::ESHandle<RPFlatParams> flatparmsDB_;
314  iSetup.get<HeavyIonRPRcd>().get(flatparmsDB_);
315  LoadEPDB db(flatparmsDB_, flat);
316  if (!db.IsSuccess()) {
317  loadDB_ = kFALSE;
318  }
319  }
320 
321  } //rp record change
322 
323  //
324  //Get Centrality
325  //
326  int bin = 0;
327  if (loadDB_) {
328  edm::Handle<int> cbin_;
329  iEvent.getByToken(centralityBinToken, cbin_);
330  int cbin = *cbin_;
331  bin = cbin / CentBinCompression_;
332  }
333  //
334  //Get Vertex
335  //
336  int vs_sell = 0.;
337  float vzr_sell;
338  iEvent.getByToken(vertexToken, vertex_);
339  const reco::VertexCollection *vertices3 = nullptr;
340  if (vertex_.isValid()) {
341  vertices3 = vertex_.product();
342  vs_sell = vertices3->size();
343  }
344  if (vs_sell > 0) {
345  vzr_sell = vertices3->begin()->z();
346  } else
347  vzr_sell = -999.9;
348  //
349  for (int i = 0; i < NumEPNames; i++)
350  rp[i]->reset();
351  if (vzr_sell < minvtx_ or vzr_sell > maxvtx_)
352  return;
353 
354  //calorimetry part
355 
356  double tower_eta, tower_phi;
357  double tower_energyet, tower_energyet_e, tower_energyet_h;
358 
360 
361  if (caloCollection_.isValid()) {
363  tower_eta = j->eta();
364  tower_phi = j->phi();
365  tower_energyet_e = j->emEt();
366  tower_energyet_h = j->hadEt();
367  tower_energyet = tower_energyet_e + tower_energyet_h;
368  double minet = minet_;
369  double maxet = maxet_;
370  for (int i = 0; i < NumEPNames; i++) {
371  if (minet_ < 0)
372  minet = minTransverse[i];
373  if (maxet_ < 0)
374  maxet = maxTransverse[i];
375  if (tower_energyet < minet)
376  continue;
377  if (tower_energyet > maxet)
378  continue;
379  if (EPDet[i] == HF) {
380  double w = tower_energyet;
381  if (loadDB_)
382  w = tower_energyet * flat[i]->getEtScale(vzr_sell, bin);
383  if (EPOrder[i] == 1) {
384  if (MomConsWeight[i][0] == 'y' && loadDB_) {
385  w = flat[i]->getW(tower_energyet, vzr_sell, bin);
386  }
387  if (tower_eta < 0)
388  w = -w;
389  }
390  rp[i]->addParticle(w, tower_energyet, sin(EPOrder[i] * tower_phi), cos(EPOrder[i] * tower_phi), tower_eta);
391  }
392  }
393  }
394  }
395 
396  //Castor part
397 
399 
400  if (castorCollection_.isValid()) {
401  for (std::vector<reco::CastorTower>::const_iterator j = castorCollection_->begin(); j != castorCollection_->end();
402  j++) {
403  tower_eta = j->eta();
404  tower_phi = j->phi();
405  tower_energyet = j->et();
406  double minet = minet_;
407  double maxet = maxet_;
408  for (int i = 0; i < NumEPNames; i++) {
409  if (EPDet[i] == Castor) {
410  if (minet_ < 0)
411  minet = minTransverse[i];
412  if (maxet_ < 0)
413  maxet = maxTransverse[i];
414  if (tower_energyet < minet)
415  continue;
416  if (tower_energyet > maxet)
417  continue;
418  double w = tower_energyet;
419  if (EPOrder[i] == 1) {
420  if (MomConsWeight[i][0] == 'y' && loadDB_) {
421  w = flat[i]->getW(tower_energyet, vzr_sell, bin);
422  }
423  if (tower_eta < 0)
424  w = -w;
425  }
426  rp[i]->addParticle(w, tower_energyet, sin(EPOrder[i] * tower_phi), cos(EPOrder[i] * tower_phi), tower_eta);
427  }
428  }
429  }
430  }
431 
432  //Tracking part
433 
434  double track_eta;
435  double track_phi;
436  double track_pt;
437 
438  double vzErr2 = 0.0, vxyErr = 0.0;
439  math::XYZPoint vtxPoint(0.0, 0.0, 0.0);
440  if (vertex_.isValid() && !vertex_->empty()) {
441  vtxPoint = vertex_->begin()->position();
442  vzErr2 = (vertex_->begin()->zError()) * (vertex_->begin()->zError());
443  vxyErr = vertex_->begin()->xError() * vertex_->begin()->yError();
444  }
445 
447  if (trackCollection_.isValid()) {
448  for (reco::TrackCollection::const_iterator j = trackCollection_->begin(); j != trackCollection_->end(); j++) {
449  bool accepted = true;
450  bool isPixel = false;
451  // determine if the track is a pixel track
452  if (j->numberOfValidHits() < 7)
453  isPixel = true;
454 
455  // determine the vertex significance
456  double d0 = 0.0, dz = 0.0, d0sigma = 0.0, dzsigma = 0.0;
457  d0 = -1. * j->dxy(vtxPoint);
458  dz = j->dz(vtxPoint);
459  d0sigma = sqrt(j->d0Error() * j->d0Error() + vxyErr);
460  dzsigma = sqrt(j->dzError() * j->dzError() + vzErr2);
461 
462  // cuts for pixel tracks
463  if (isPixel) {
464  // dz significance cut
465  if (fabs(dz / dzsigma) > dzerr_)
466  accepted = false;
467  // chi2/ndof cut
468  if (j->normalizedChi2() > chi2_)
469  accepted = false;
470  }
471  // cuts for full tracks
472  if (!isPixel) {
473  // dz and d0 significance cuts
474  if (fabs(dz / dzsigma) > 3)
475  accepted = false;
476  if (fabs(d0 / d0sigma) > 3)
477  accepted = false;
478  // pt resolution cut
479  if (j->ptError() / j->pt() > 0.1)
480  accepted = false;
481  // number of valid hits cut
482  if (j->numberOfValidHits() < 12)
483  accepted = false;
484  }
485  if (accepted) {
486  track_eta = j->eta();
487  track_phi = j->phi();
488  track_pt = j->pt();
489  double minpt = minpt_;
490  double maxpt = maxpt_;
491  for (int i = 0; i < NumEPNames; i++) {
492  if (minpt_ < 0)
493  minpt = minTransverse[i];
494  if (maxpt_ < 0)
495  maxpt = maxTransverse[i];
496  if (track_pt < minpt)
497  continue;
498  if (track_pt > maxpt)
499  continue;
500  if (EPDet[i] == Tracker) {
501  double w = track_pt;
502  if (w > 2.5)
503  w = 2.0; //v2 starts decreasing above ~2.5 GeV/c
504  if (EPOrder[i] == 1) {
505  if (MomConsWeight[i][0] == 'y' && loadDB_) {
506  w = flat[i]->getW(track_pt, vzr_sell, bin);
507  }
508  if (track_eta < 0)
509  w = -w;
510  }
511  rp[i]->addParticle(w, track_pt, sin(EPOrder[i] * track_phi), cos(EPOrder[i] * track_phi), track_eta);
512  }
513  }
514  }
515  } //end for
516  }
517 
518  auto evtplaneOutput = std::make_unique<EvtPlaneCollection>();
519 
520  double ang = -10;
521  double sv = 0;
522  double cv = 0;
523  double svNoWgt = 0;
524  double cvNoWgt = 0;
525 
526  double wv = 0;
527  double wv2 = 0;
528  double pe = 0;
529  double pe2 = 0;
530  uint epmult = 0;
531 
532  for (int i = 0; i < NumEPNames; i++) {
533  rp[i]->getAngle(ang, sv, cv, svNoWgt, cvNoWgt, wv, wv2, pe, pe2, epmult);
534  evtplaneOutput->push_back(EvtPlane(i, 0, ang, sv, cv, wv, wv2, pe, pe2, epmult));
535  evtplaneOutput->back().addLevel(3, 0., svNoWgt, cvNoWgt);
536  }
537 
538  iEvent.put(std::move(evtplaneOutput));
539 }
540 
541 //define this as a plug-in
void init(int order, int nbins, std::string tag, int vord)
edm::InputTag centralityBinTag_
std::string centralityLabel_
T getParameter(std::string const &) const
const int EPOrder[]
const double EPEtaMin2[]
edm::Handle< CaloTowerCollection > caloCollection_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
std::vector< CBin > m_table
const int EPDet[]
common ppss p3p6s2 common epss epspn46 common const1 w2
Definition: inclppp.h:1
edm::Handle< reco::TrackCollection > trackCollection_
edm::InputTag caloTag_
const double w
Definition: UKUtility.cc:23
std::string centralityMC_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
bool IsSuccess()
Definition: LoadEPDB.h:114
edm::ESWatcher< HeavyIonRcd > hiWatcher
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::vector< CaloTower >::const_iterator const_iterator
bool exists(std::string const &parameterName) const
checks if a parameter exists
void setCaloCentRefBins(const int caloCentRefMinBin, const int caloCentRefMaxBin)
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
cv
Definition: cuy.py:364
edm::EDGetTokenT< int > centralityBinToken
edm::EDGetTokenT< std::vector< reco::CastorTower > > castorToken
const std::string EPNames[]
const double maxTransverse[]
void produce(edm::Event &, const edm::EventSetup &) override
double getEtScale(double vtx, int centbin) const
const double EPEtaMin1[]
edm::ESWatcher< HeavyIonRPRcd > hirpWatcher
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const std::string MomConsWeight[]
GenPlane * rp[NumEPNames]
T sqrt(T t)
Definition: SSEVec.h:19
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
HiEvtPlaneFlatten * flat[NumEPNames]
void addParticle(double w, double PtOrEt, double s, double c, double eta)
edm::EDGetTokenT< std::vector< reco::Vertex > > vertexToken
GenPlane(string name, double etaminval1, double etamaxval1, double etaminval2, double etamaxval2, int orderval)
edm::InputTag vertexTag_
EvtPlaneProducer(const edm::ParameterSet &)
bool isValid() const
Definition: HandleBase.h:70
edm::EDGetTokenT< reco::TrackCollection > trackToken
edm::Handle< std::vector< reco::CastorTower > > castorCollection_
std::string centralityVariable_
double getW(double pt, double vtx, int centbin) const
T const * product() const
Definition: Handle.h:69
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
bool accepted(std::vector< std::string_view > const &, std::string_view)
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:52
~EvtPlaneProducer() override
fixed size matrix
HLT enums.
T get() const
Definition: EventSetup.h:73
bool isPixel(HitType hitType)
const double EPEtaMax2[]
static const int NumEPNames
edm::EDGetTokenT< CaloTowerCollection > caloToken
double getAngle(double &ang, double &sv, double &cv, double &svNoWgt, double &cvNoWgt, double &w, double &w2, double &PtOrEt, double &PtOrEt2, uint &epmult)
void reset(double vett[256])
Definition: TPedValues.cc:11
edm::InputTag castorTag_
const double EPEtaMax1[]
def move(src, dest)
Definition: eostools.py:511
edm::Handle< std::vector< reco::Vertex > > vertex_
const double minTransverse[]
edm::InputTag trackTag_