CMS 3D CMS Logo

EcalDetailedTimeRecHitProducer.cc
Go to the documentation of this file.
1 
15 
18 
20 
21 #include <iostream>
22 #include <cmath>
23 #include <vector>
24 
31 
39 
40 #include "CLHEP/Units/GlobalPhysicalConstants.h"
41 #include "CLHEP/Units/GlobalSystemOfUnits.h"
42 
44  EBRecHitCollection_ = consumes<EBRecHitCollection>(ps.getParameter<edm::InputTag>("EBRecHitCollection"));
45  EERecHitCollection_ = consumes<EERecHitCollection>(ps.getParameter<edm::InputTag>("EERecHitCollection"));
46 
47  ebTimeDigiCollection_ = consumes<EcalTimeDigiCollection>(ps.getParameter<edm::InputTag>("EBTimeDigiCollection"));
48  eeTimeDigiCollection_ = consumes<EcalTimeDigiCollection>(ps.getParameter<edm::InputTag>("EETimeDigiCollection"));
49 
50  EBDetailedTimeRecHitCollection_ = ps.getParameter<std::string>("EBDetailedTimeRecHitCollection");
51  EEDetailedTimeRecHitCollection_ = ps.getParameter<std::string>("EEDetailedTimeRecHitCollection");
52 
53  correctForVertexZPosition_ = ps.getParameter<bool>("correctForVertexZPosition");
54  useMCTruthVertex_ = ps.getParameter<bool>("useMCTruthVertex");
55  if (correctForVertexZPosition_) {
56  if (not useMCTruthVertex_) {
57  recoVertex_ = consumes<reco::VertexCollection>(ps.getParameter<edm::InputTag>("recoVertex"));
58  } else {
59  simVertex_ = consumes<edm::SimVertexContainer>(ps.getParameter<edm::InputTag>("simVertex"));
60  }
61  }
62 
63  ebTimeLayer_ = ps.getParameter<int>("EBTimeLayer");
64  eeTimeLayer_ = ps.getParameter<int>("EETimeLayer");
65 
66  produces<EBRecHitCollection>(EBDetailedTimeRecHitCollection_);
67  produces<EERecHitCollection>(EEDetailedTimeRecHitCollection_);
68 }
69 
71 
73  using namespace edm;
74  using namespace reco;
75 
77  es.get<CaloGeometryRecord>().get(hGeometry);
78 
79  m_geometry = hGeometry.product();
80 
81  Handle<EBRecHitCollection> pEBRecHits;
82  Handle<EERecHitCollection> pEERecHits;
83 
84  const EBRecHitCollection* EBRecHits = nullptr;
85  const EERecHitCollection* EERecHits = nullptr;
86 
87  evt.getByToken(EBRecHitCollection_, pEBRecHits);
88  if (pEBRecHits.isValid()) {
89  EBRecHits = pEBRecHits.product(); // get a ptr to the product
90 #ifdef DEBUG
91  LogDebug("EcalRecHitDebug") << "total # EB rechits to be re-calibrated: " << EBRecHits->size();
92 #endif
93  }
94 
95  evt.getByToken(EERecHitCollection_, pEERecHits);
96  if (pEERecHits.isValid()) {
97  EERecHits = pEERecHits.product(); // get a ptr to the product
98 #ifdef DEBUG
99  LogDebug("EcalRecHitDebug") << "total # EE uncalibrated rechits to be re-calibrated: " << EERecHits->size();
100 #endif
101  }
102 
103  Handle<EcalTimeDigiCollection> pEBTimeDigis;
104  Handle<EcalTimeDigiCollection> pEETimeDigis;
105 
106  const EcalTimeDigiCollection* ebTimeDigis = nullptr;
107  const EcalTimeDigiCollection* eeTimeDigis = nullptr;
108 
109  evt.getByToken(ebTimeDigiCollection_, pEBTimeDigis);
110  //evt.getByToken( digiProducer_, pEBTimeDigis);
111  if (pEBTimeDigis.isValid()) {
112  ebTimeDigis = pEBTimeDigis.product(); // get a ptr to the produc
113  edm::LogInfo("EcalDetailedTimeRecHitInfo") << "total # ebTimeDigis: " << ebTimeDigis->size();
114  }
115 
116  evt.getByToken(eeTimeDigiCollection_, pEETimeDigis);
117  //evt.getByToken( digiProducer_, pEETimeDigis);
118  if (pEETimeDigis.isValid()) {
119  eeTimeDigis = pEETimeDigis.product(); // get a ptr to the product
120  edm::LogInfo("EcalDetailedTimeRecHitInfo") << "total # eeTimeDigis: " << eeTimeDigis->size();
121  }
122  // collection of rechits to put in the event
123  std::unique_ptr<EBRecHitCollection> EBDetailedTimeRecHits(new EBRecHitCollection);
124  std::unique_ptr<EERecHitCollection> EEDetailedTimeRecHits(new EERecHitCollection);
125 
126  std::unique_ptr<GlobalPoint> vertex;
127 
129  if (!useMCTruthVertex_) {
130  //Get the first reco vertex
131  // get primary vertices
132 
133  edm::Handle<VertexCollection> VertexHandle;
134  evt.getByToken(recoVertex_, VertexHandle);
135 
136  if (VertexHandle.isValid()) {
137  if (!(*VertexHandle).empty()) //at least 1 vertex
138  {
139  const reco::Vertex* myVertex = &(*VertexHandle)[0];
140  vertex.reset(new GlobalPoint(myVertex->x(), myVertex->y(), myVertex->z()));
141  }
142  }
143 
144  } else {
145  edm::Handle<SimVertexContainer> VertexHandle;
146  evt.getByToken(simVertex_, VertexHandle);
147 
148  if (VertexHandle.isValid()) {
149  if (!(*VertexHandle).empty()) //at least 1 vertex
150  {
151  assert((*VertexHandle)[0].vertexId() == 0);
152  const SimVertex* myVertex = &(*VertexHandle)[0];
153  vertex.reset(new GlobalPoint(myVertex->position().x(), myVertex->position().y(), myVertex->position().z()));
154  }
155  }
156  }
157  }
158 
159  if (EBRecHits && ebTimeDigis) {
160  // loop over uncalibrated rechits to make calibrated ones
161  for (EBRecHitCollection::const_iterator it = EBRecHits->begin(); it != EBRecHits->end(); ++it) {
162  EcalRecHit aHit((*it));
163  EcalTimeDigiCollection::const_iterator timeDigi = ebTimeDigis->find((*it).id());
164  if (timeDigi != ebTimeDigis->end()) {
165  if (timeDigi->sampleOfInterest() >= 0) {
166  float myTime = (*timeDigi)[timeDigi->sampleOfInterest()];
167  //Vertex corrected ToF
168  if (vertex) {
169  aHit.setTime(myTime + deltaTimeOfFlight(*vertex, (*it).id(), ebTimeLayer_));
170  } else
171  //Uncorrected ToF
172  aHit.setTime(myTime);
173  }
174  }
175  // leave standard time if no timeDigi is associated (e.g. noise recHits)
176  EBDetailedTimeRecHits->push_back(aHit);
177  }
178  }
179 
180  if (EERecHits && eeTimeDigis) {
181  // loop over uncalibrated rechits to make calibrated ones
182  for (EERecHitCollection::const_iterator it = EERecHits->begin(); it != EERecHits->end(); ++it) {
183  EcalRecHit aHit(*it);
184  EcalTimeDigiCollection::const_iterator timeDigi = eeTimeDigis->find((*it).id());
185  if (timeDigi != eeTimeDigis->end()) {
186  if (timeDigi->sampleOfInterest() >= 0) {
187  float myTime = (*timeDigi)[timeDigi->sampleOfInterest()];
188  //Vertex corrected ToF
189  if (vertex) {
190  aHit.setTime(myTime + deltaTimeOfFlight(*vertex, (*it).id(), eeTimeLayer_));
191  } else
192  //Uncorrected ToF
193  aHit.setTime(myTime);
194  }
195  }
196  EEDetailedTimeRecHits->push_back(aHit);
197  }
198  }
199  // put the collection of recunstructed hits in the event
200  LogInfo("EcalDetailedTimeRecHitInfo") << "total # EB rechits: " << EBDetailedTimeRecHits->size();
201  LogInfo("EcalDetailedTimeRecHitInfo") << "total # EE rechits: " << EEDetailedTimeRecHits->size();
202 
203  evt.put(std::move(EBDetailedTimeRecHits), EBDetailedTimeRecHitCollection_);
204  evt.put(std::move(EEDetailedTimeRecHits), EEDetailedTimeRecHitCollection_);
205 }
206 
208  auto cellGeometry(m_geometry->getGeometry(detId));
209  assert(nullptr != cellGeometry);
210  GlobalPoint layerPos =
211  cellGeometry->getPosition(double(layer) + 0.5); //depth in mm in the middle of the layer position
212  GlobalVector tofVector = layerPos - vertex;
213  return (layerPos.mag() * cm - tofVector.mag() * cm) / (float)c_light;
214 }
215 
#define LogDebug(id)
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
double y() const
y coordinate
Definition: Vertex.h:117
edm::EDGetTokenT< EcalTimeDigiCollection > eeTimeDigiCollection_
#define nullptr
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
std::vector< EcalRecHit >::const_iterator const_iterator
edm::EDGetTokenT< EcalTimeDigiCollection > ebTimeDigiCollection_
void setTime(float time)
Definition: EcalRecHit.h:71
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
T mag() const
Definition: PV3DBase.h:64
edm::EDGetTokenT< reco::VertexCollection > recoVertex_
double z() const
z coordinate
Definition: Vertex.h:119
const math::XYZTLorentzVectorD & position() const
Definition: CoreSimVertex.h:21
bool isValid() const
Definition: HandleBase.h:70
const_iterator end() const
EcalDetailedTimeRecHitProducer(const edm::ParameterSet &ps)
Definition: DetId.h:17
double x() const
x coordinate
Definition: Vertex.h:115
T const * product() const
Definition: Handle.h:69
edm::EDGetTokenT< EBRecHitCollection > EBRecHitCollection_
iterator find(key_type k)
fixed size matrix
HLT enums.
size_type size() const
double deltaTimeOfFlight(GlobalPoint &vertex, const DetId &detId, int layer) const
T get() const
Definition: EventSetup.h:73
edm::EDGetTokenT< edm::SimVertexContainer > simVertex_
std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id.
Definition: CaloGeometry.cc:60
edm::EDGetTokenT< EERecHitCollection > EERecHitCollection_
T const * product() const
Definition: ESHandle.h:86
def move(src, dest)
Definition: eostools.py:511
void produce(edm::Event &evt, const edm::EventSetup &es) override
const_iterator begin() const