CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
PreshowerPhiClusterProducer.cc
Go to the documentation of this file.
41 
42 #include <fstream>
43 #include <memory>
44 #include <vector>
45 
47 public:
49 
51 
53 
54  void produce(edm::Event& evt, const edm::EventSetup& es) override;
55  void set(const edm::EventSetup& es);
56 
57 private:
58  int nEvt_; // internal counter of events
59 
60  //clustering parameters:
61  edm::EDGetTokenT<EcalRecHitCollection> preshHitToken_; // name of module/plugin/producer
62  // producing hits
64 
65  // name out output collections
68 
69  // association parameters:
70  std::string assocSClusterCollection_; // name of super cluster output collection
71 
83  double mip_;
84  double gamma0_;
85  double gamma1_;
86  double gamma2_;
87  double gamma3_;
88  double alpha0_;
89  double alpha1_;
90  double alpha2_;
91  double alpha3_;
92  double aEta_[4];
93  double bEta_[4];
94 
95  double etThresh_;
96 
97  PreshowerPhiClusterAlgo* presh_algo; // algorithm doing the real work
98  // The set of used DetID's
99  //std::set<DetId> used_strips;
100 
103 };
104 
107 
108 using namespace edm;
109 using namespace std;
110 
112  // use configuration file to setup input/output collection names
113  preshHitToken_ = consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("preshRecHitProducer"));
114 
115  // Name of a SuperClusterCollection to make associations:
116  endcapSClusterToken_ =
117  consumes<reco::SuperClusterCollection>(ps.getParameter<edm::InputTag>("endcapSClusterProducer"));
118 
119  esGainToken_ = esConsumes<ESGain, ESGainRcd>();
120  esMIPToGeVToken_ = esConsumes<ESMIPToGeVConstant, ESMIPToGeVConstantRcd>();
121  esEEInterCalibToken_ = esConsumes<ESEEIntercalibConstants, ESEEIntercalibConstantsRcd>();
122  esMissingECalibToken_ = esConsumes<ESMissingEnergyCalibration, ESMissingEnergyCalibrationRcd>();
123  esChannelStatusToken_ = esConsumes<ESChannelStatus, ESChannelStatusRcd>();
124  caloGeometryToken_ = esConsumes<CaloGeometry, CaloGeometryRecord>();
125 
126  // Output collections:
127  preshClusterCollectionX_ = ps.getParameter<std::string>("preshClusterCollectionX");
128  preshClusterCollectionY_ = ps.getParameter<std::string>("preshClusterCollectionY");
129 
130  assocSClusterCollection_ = ps.getParameter<std::string>("assocSClusterCollection");
131 
132  produces<reco::PreshowerClusterCollection>(preshClusterCollectionX_);
133  produces<reco::PreshowerClusterCollection>(preshClusterCollectionY_);
134  produces<reco::SuperClusterCollection>(assocSClusterCollection_);
135 
136  float esStripECut = ps.getParameter<double>("esStripEnergyCut");
137  esPhiClusterDeltaEta_ = ps.getParameter<double>("esPhiClusterDeltaEta");
138  esPhiClusterDeltaPhi_ = ps.getParameter<double>("esPhiClusterDeltaPhi");
139 
140  etThresh_ = ps.getParameter<double>("etThresh");
141 
142  presh_algo = new PreshowerPhiClusterAlgo(esStripECut);
143 }
144 
146 
150 
151  // get the ECAL geometry:
152  edm::ESHandle<CaloGeometry> geoHandle = es.getHandle(caloGeometryToken_);
153 
154  // retrieve ES-EE intercalibration constants and channel status
155  set(es);
156  const ESChannelStatus* channelStatus = esChannelStatus_.product();
157 
158  const CaloSubdetectorGeometry* geometry_p = (geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalPreshower));
159 
160  // create unique_ptr to a PreshowerClusterCollection
161  auto clusters_p1 = std::make_unique<reco::PreshowerClusterCollection>();
162  auto clusters_p2 = std::make_unique<reco::PreshowerClusterCollection>();
163  // create new collection of corrected super clusters
164  auto superclusters_p = std::make_unique<reco::SuperClusterCollection>();
165 
166  // fetch the product (pSuperClusters)
167  evt.getByToken(endcapSClusterToken_, pSuperClusters);
168  const reco::SuperClusterCollection* SClusts = pSuperClusters.product();
169 
170  // fetch the product (RecHits)
171  evt.getByToken(preshHitToken_, pRecHits);
172  // pointer to the object in the product
173  const EcalRecHitCollection* rechits = pRecHits.product(); // EcalRecHitCollection hit_collection = *rhcHandle;
174 
175  LogTrace("EcalClusters") << "PreshowerPhiClusterProducerInfo: ### Total # of preshower RecHits: " << rechits->size();
176 
177  // make the map of rechits:
178  std::map<DetId, EcalRecHit> rechits_map;
180  for (it = rechits->begin(); it != rechits->end(); it++) {
181  // remove bad ES rechits
182  if (it->recoFlag() == 1 || it->recoFlag() == 14 || (it->recoFlag() <= 10 && it->recoFlag() >= 5))
183  continue;
184  //Make the map of DetID, EcalRecHit pairs
185  rechits_map.insert(std::make_pair(it->id(), *it));
186  }
187  // The set of used DetID's for a given event:
188  std::set<DetId> used_strips;
189  used_strips.clear();
190  LogTrace("EcalClusters") << "PreshowerPhiClusterProducerInfo: ### rechits_map of size " << rechits_map.size()
191  << " was created!";
192 
193  reco::PreshowerClusterCollection clusters1, clusters2; // output collection of corrected PCs
194  reco::SuperClusterCollection new_SC; // output collection of corrected SCs
195 
196  //make cycle over super clusters
197  reco::SuperClusterCollection::const_iterator it_super;
198  int isc = 0;
199  for (it_super = SClusts->begin(); it_super != SClusts->end(); ++it_super) {
200  float e1 = 0;
201  float e2 = 0;
202  float deltaE = 0;
203 
205  ++isc;
206  LogTrace("EcalClusters") << " superE = " << it_super->energy() << " superETA = " << it_super->eta()
207  << " superPHI = " << it_super->phi();
208 
209  //cout<<"=== new SC ==="<<endl;
210  //cout<<"superE = "<<it_super->energy()<<" superETA = "<<it_super->eta()<<" superPHI = "<<it_super->phi()<<endl;
211 
212  int nBC = 0;
213  int condP1 = 1; // 0: dead channel; 1: active channel
214  int condP2 = 1;
215  float maxDeltaPhi = 0;
216  float minDeltaPhi = 0;
217  float refPhi = 0;
218 
219  reco::CaloCluster_iterator bc_iter = it_super->clustersBegin();
220  for (; bc_iter != it_super->clustersEnd(); ++bc_iter) {
221  if (nBC == 0) {
222  refPhi = (*bc_iter)->phi();
223  } else {
224  if (reco::deltaPhi((*bc_iter)->phi(), refPhi) > 0 && reco::deltaPhi((*bc_iter)->phi(), refPhi) > maxDeltaPhi)
225  maxDeltaPhi = reco::deltaPhi((*bc_iter)->phi(), refPhi);
226  if (reco::deltaPhi((*bc_iter)->phi(), refPhi) < 0 && reco::deltaPhi((*bc_iter)->phi(), refPhi) < minDeltaPhi)
227  minDeltaPhi = reco::deltaPhi((*bc_iter)->phi(), refPhi);
228  //cout<<"delta phi : "<<reco::deltaPhi((*bc_iter)->phi(), refPhi)<<endl;
229  }
230  //cout<<"BC : "<<nBC<<" "<<(*bc_iter)->energy()<<" "<<(*bc_iter)->eta()<<" "<<(*bc_iter)->phi()<<endl;
231  nBC++;
232  }
233  maxDeltaPhi += esPhiClusterDeltaPhi_;
234  minDeltaPhi -= esPhiClusterDeltaPhi_;
235 
236  nBC = 0;
237  for (bc_iter = it_super->clustersBegin(); bc_iter != it_super->clustersEnd(); ++bc_iter) {
238  if (geometry_p) {
239  // Get strip position at intersection point of the line EE - Vertex:
240  double X = (*bc_iter)->x();
241  double Y = (*bc_iter)->y();
242  double Z = (*bc_iter)->z();
243  const GlobalPoint point(X, Y, Z);
244 
245  DetId tmp1 = (dynamic_cast<const EcalPreshowerGeometry*>(geometry_p))->getClosestCellInPlane(point, 1);
246  DetId tmp2 = (dynamic_cast<const EcalPreshowerGeometry*>(geometry_p))->getClosestCellInPlane(point, 2);
247  ESDetId strip1 = (tmp1 == DetId(0)) ? ESDetId(0) : ESDetId(tmp1);
248  ESDetId strip2 = (tmp2 == DetId(0)) ? ESDetId(0) : ESDetId(tmp2);
249 
250  if (nBC == 0) {
251  if (strip1 != ESDetId(0) && strip2 != ESDetId(0)) {
252  ESChannelStatusMap::const_iterator status_p1 = channelStatus->getMap().find(strip1);
253  ESChannelStatusMap::const_iterator status_p2 = channelStatus->getMap().find(strip2);
254  if (status_p1->getStatusCode() == 1)
255  condP1 = 0;
256  if (status_p2->getStatusCode() == 1)
257  condP2 = 0;
258  } else if (strip1 == ESDetId(0)) {
259  condP1 = 0;
260  } else if (strip2 == ESDetId(0)) {
261  condP2 = 0;
262  }
263 
264  //cout<<"starting cluster : "<<maxDeltaPhi<<" "<<minDeltaPhi<<" "<<esPhiClusterDeltaEta_<<endl;
265  //cout<<"do plane 1 === "<<strip1.zside()<<" "<<strip1.plane()<<" "<<strip1.six()<<" "<<strip1.siy()<<" "<<strip1.strip()<<endl;
266  // Get a vector of ES clusters (found by the PreshSeeded algorithm) associated with a given EE basic cluster.
267  reco::PreshowerCluster cl1 = presh_algo->makeOneCluster(
268  strip1, &used_strips, &rechits_map, geometry_p, esPhiClusterDeltaEta_, minDeltaPhi, maxDeltaPhi);
269  cl1.setBCRef(*bc_iter);
270  clusters1.push_back(cl1);
271  e1 += cl1.energy();
272 
273  //cout<<"do plane 2 === "<<strip2.zside()<<" "<<strip2.plane()<<" "<<strip2.six()<<" "<<strip2.siy()<<" "<<strip2.strip()<<endl;
274  reco::PreshowerCluster cl2 = presh_algo->makeOneCluster(
275  strip2, &used_strips, &rechits_map, geometry_p, esPhiClusterDeltaEta_, minDeltaPhi, maxDeltaPhi);
276  cl2.setBCRef(*bc_iter);
277  clusters2.push_back(cl2);
278  e2 += cl2.energy();
279  }
280  }
281 
282  new_BC.push_back(*bc_iter);
283  nBC++;
284  } // end of cycle over BCs
285 
286  LogTrace("EcalClusters") << " For SC #" << isc - 1 << ", containing " << it_super->clustersSize()
287  << " basic clusters, PreshowerPhiClusterAlgo made " << clusters1.size()
288  << " in X plane and " << clusters2.size() << " in Y plane "
289  << " preshower clusters ";
290 
291  // update energy of the SuperCluster
292  if (e1 + e2 > 1.0e-10) {
293  e1 = e1 / mip_; // GeV to #MIPs
294  e2 = e2 / mip_;
295 
296  if (condP1 == 1 && condP2 == 1) {
297  deltaE = gamma0_ * (e1 + alpha0_ * e2);
298  } else if (condP1 == 1 && condP2 == 0) {
299  deltaE = gamma1_ * (e1 + alpha1_ * e2);
300  } else if (condP1 == 0 && condP2 == 1) {
301  deltaE = gamma2_ * (e1 + alpha2_ * e2);
302  } else if (condP1 == 0 && condP2 == 0) {
303  deltaE = gamma3_ * (e1 + alpha3_ * e2);
304  }
305  }
306 
307  //corrected Energy
308  float E = it_super->energy() + deltaE;
309 
310  LogTrace("EcalClusters") << " Creating corrected SC ";
311 
312  reco::SuperCluster sc(E, it_super->position(), it_super->seed(), new_BC, deltaE);
313  sc.setPreshowerEnergyPlane1(e1 * mip_);
314  sc.setPreshowerEnergyPlane2(e2 * mip_);
315  if (condP1 == 1 && condP2 == 1)
316  sc.setPreshowerPlanesStatus(0);
317  else if (condP1 == 1 && condP2 == 0)
318  sc.setPreshowerPlanesStatus(1);
319  else if (condP1 == 0 && condP2 == 1)
320  sc.setPreshowerPlanesStatus(2);
321  else if (condP1 == 0 && condP2 == 0)
322  sc.setPreshowerPlanesStatus(3);
323 
324  if (etThresh_ > 0) { // calling postion().theta can be expensive
325  if (sc.energy() * sin(sc.position().theta()) > etThresh_)
326  new_SC.push_back(sc);
327  } else {
328  new_SC.push_back(sc);
329  }
330 
331  } // end of cycle over SCs
332 
333  // copy the preshower clusters into collections and put in the Event:
334  clusters_p1->assign(clusters1.begin(), clusters1.end());
335  clusters_p2->assign(clusters2.begin(), clusters2.end());
336  // put collection of preshower clusters to the event
337  evt.put(std::move(clusters_p1), preshClusterCollectionX_);
338  evt.put(std::move(clusters_p2), preshClusterCollectionY_);
339  LogTrace("EcalClusters") << "Preshower clusters added to the event";
340 
341  // put collection of corrected super clusters to the event
342  superclusters_p->assign(new_SC.begin(), new_SC.end());
343  evt.put(std::move(superclusters_p), assocSClusterCollection_);
344  LogTrace("EcalClusters") << "Corrected SClusters added to the event";
345 }
346 
348  esgain_ = es.getHandle(esGainToken_);
349  const ESGain* gain = esgain_.product();
350 
351  double ESGain = gain->getESGain();
352 
353  esMIPToGeV_ = es.getHandle(esMIPToGeVToken_);
354  const ESMIPToGeVConstant* mipToGeV = esMIPToGeV_.product();
355 
356  mip_ = (ESGain == 1) ? mipToGeV->getESValueLow() : mipToGeV->getESValueHigh();
357 
358  esChannelStatus_ = es.getHandle(esChannelStatusToken_);
359 
360  esEEInterCalib_ = es.getHandle(esEEInterCalibToken_);
361  const ESEEIntercalibConstants* esEEInterCalib = esEEInterCalib_.product();
362 
363  // both planes work
364  gamma0_ = (ESGain == 1) ? 0.02 : esEEInterCalib->getGammaHigh0();
365  alpha0_ = (ESGain == 1) ? esEEInterCalib->getAlphaLow0() : esEEInterCalib->getAlphaHigh0();
366 
367  // only first plane works
368  gamma1_ = (ESGain == 1) ? (0.02 * esEEInterCalib->getGammaLow1()) : esEEInterCalib->getGammaHigh1();
369  alpha1_ = (ESGain == 1) ? esEEInterCalib->getAlphaLow1() : esEEInterCalib->getAlphaHigh1();
370 
371  // only second plane works
372  gamma2_ = (ESGain == 1) ? (0.02 * esEEInterCalib->getGammaLow2()) : esEEInterCalib->getGammaHigh2();
373  alpha2_ = (ESGain == 1) ? esEEInterCalib->getAlphaLow2() : esEEInterCalib->getAlphaHigh2();
374 
375  // both planes do not work
376  gamma3_ = (ESGain == 1) ? 0.02 : esEEInterCalib->getGammaHigh3();
377  alpha3_ = (ESGain == 1) ? esEEInterCalib->getAlphaLow3() : esEEInterCalib->getAlphaHigh3();
378 
379  esMissingECalib_ = es.getHandle(esMissingECalibToken_);
380  const ESMissingEnergyCalibration* esMissingECalib = esMissingECalib_.product();
381 
382  // |eta| < 1.9
383  aEta_[0] = esMissingECalib->getConstAEta0();
384  bEta_[0] = esMissingECalib->getConstBEta0();
385 
386  // 1.9 < |eta| < 2.1
387  aEta_[1] = esMissingECalib->getConstAEta1();
388  bEta_[1] = esMissingECalib->getConstBEta1();
389 
390  // 2.1 < |eta| < 2.3
391  aEta_[2] = esMissingECalib->getConstAEta2();
392  bEta_[2] = esMissingECalib->getConstBEta2();
393 
394  // 2.3 < |eta| < 2.5
395  aEta_[3] = esMissingECalib->getConstAEta3();
396  bEta_[3] = esMissingECalib->getConstBEta3();
397 }
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryToken_
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
edm::ESGetToken< ESChannelStatus, ESChannelStatusRcd > esChannelStatusToken_
PreshowerPhiClusterAlgo * presh_algo
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
Definition: ESGain.h:7
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void push_back(Ptr< T > const &iPtr)
Definition: PtrVector.h:149
const self & getMap() const
float getESValueLow() const
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
edm::ESGetToken< ESGain, ESGainRcd > esGainToken_
std::vector< EcalRecHit >::const_iterator const_iterator
#define X(str)
Definition: MuonsGrabber.cc:38
void set(const edm::EventSetup &es)
edm::ESGetToken< ESMissingEnergyCalibration, ESMissingEnergyCalibrationRcd > esMissingECalibToken_
#define LogTrace(id)
edm::ESHandle< ESMIPToGeVConstant > esMIPToGeV_
edm::ESHandle< ESMissingEnergyCalibration > esMissingECalib_
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
edm::ESGetToken< ESEEIntercalibConstants, ESEEIntercalibConstantsRcd > esEEInterCalibToken_
void setBCRef(const CaloClusterPtr &r)
DetIds of component RecHits – now inherited from CaloCluster.
def move
Definition: eostools.py:511
const_iterator find(uint32_t rawId) const
edm::ESHandle< ESEEIntercalibConstants > esEEInterCalib_
std::vector< PreshowerCluster > PreshowerClusterCollection
collection of PreshowerCluster objects
double energy() const
cluster energy
Definition: CaloCluster.h:149
edm::ESHandle< ESChannelStatus > esChannelStatus_
const_iterator end() const
void produce(edm::Event &evt, const edm::EventSetup &es) override
Definition: DetId.h:17
T const * product() const
Definition: Handle.h:70
float getESGain() const
Definition: ESGain.h:13
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::vector< Item >::const_iterator const_iterator
edm::EDGetTokenT< reco::SuperClusterCollection > endcapSClusterToken_
size_type size() const
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:157
float getESValueHigh() const
edm::EDGetTokenT< EcalRecHitCollection > preshHitToken_
edm::ESGetToken< ESMIPToGeVConstant, ESMIPToGeVConstantRcd > esMIPToGeVToken_
void setPreshowerEnergyPlane1(double preshowerEnergy1)
Definition: SuperCluster.h:71
PreshowerPhiClusterProducer(const edm::ParameterSet &ps)
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
const_iterator begin() const