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");
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 
Vector3DBase
Definition: Vector3DBase.h:8
edm::ESHandle::product
T const * product() const
Definition: ESHandle.h:86
CaloGenericDetId.h
EcalDetailedTimeRecHitProducer::simVertex_
edm::EDGetTokenT< edm::SimVertexContainer > simVertex_
Definition: EcalDetailedTimeRecHitProducer.h:42
EcalRecHit
Definition: EcalRecHit.h:15
EcalDetailedTimeRecHitProducer::m_geometry
const CaloGeometry * m_geometry
Definition: EcalDetailedTimeRecHitProducer.h:36
Handle.h
EcalRecHitSimpleAlgo.h
edm::SortedCollection< EcalRecHit >::const_iterator
std::vector< EcalRecHit >::const_iterator const_iterator
Definition: SortedCollection.h:80
SimVertex
Definition: SimVertex.h:5
EcalDetailedTimeRecHitProducer::~EcalDetailedTimeRecHitProducer
~EcalDetailedTimeRecHitProducer() override
Definition: EcalDetailedTimeRecHitProducer.cc:70
MessageLogger.h
EcalDetailedTimeRecHitProducer
Definition: EcalDetailedTimeRecHitProducer.h:26
edm::Handle::product
T const * product() const
Definition: Handle.h:70
ESHandle.h
EcalDetailedTimeRecHitProducer::deltaTimeOfFlight
double deltaTimeOfFlight(GlobalPoint &vertex, const DetId &detId, int layer) const
Definition: EcalDetailedTimeRecHitProducer.cc:207
EcalIntercalibConstants.h
reco::Vertex::z
double z() const
z coordinate
Definition: Vertex.h:120
CaloGeometryRecord
Definition: CaloGeometryRecord.h:30
edm
HLT enums.
Definition: AlignableModifier.h:19
EBDetId.h
EEDetId.h
edm::LogInfo
Definition: MessageLogger.h:254
cms::cuda::assert
assert(be >=bs)
edm::SortedCollection< EcalRecHit >
EcalUncalibratedRecHit.h
edm::SortedCollection::size
size_type size() const
Definition: SortedCollection.h:215
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:45
edm::Handle
Definition: AssociativeIterator.h:50
filterRecHits_cfi.EERecHits
EERecHits
Definition: filterRecHits_cfi.py:9
EcalRecHitCollections.h
EcalDetailedTimeRecHitProducer::recoVertex_
edm::EDGetTokenT< reco::VertexCollection > recoVertex_
Definition: EcalDetailedTimeRecHitProducer.h:41
DetId
Definition: DetId.h:17
EcalTimeDigi.h
MakerMacros.h
edm::EventSetup::get
T get() const
Definition: EventSetup.h:73
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
EcalDetailedTimeRecHitProducer.h
TruncatedPyramid.h
EcalLaserDbService.h
EcalDigiCollections.h
edm::ESHandle< CaloGeometry >
edm::Event::getByToken
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:528
GlobalPoint
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
Point3DBase< float, GlobalTag >
CaloGeometryRecord.h
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
EcalADCToGeVConstant.h
CaloSubdetectorGeometry.h
bphysicsOniaDQM_cfi.vertex
vertex
Definition: bphysicsOniaDQM_cfi.py:7
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:670
edm::ParameterSet
Definition: ParameterSet.h:36
CaloGeometry::getGeometry
std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id.
Definition: CaloGeometry.cc:60
EcalDetailedTimeRecHitProducer::EEDetailedTimeRecHitCollection_
std::string EEDetailedTimeRecHitCollection_
Definition: EcalDetailedTimeRecHitProducer.h:55
edm::SortedCollection::end
const_iterator end() const
Definition: SortedCollection.h:267
reco::Vertex::x
double x() const
x coordinate
Definition: Vertex.h:116
EcalADCToGeVConstantRcd.h
EcalDetailedTimeRecHitProducer::useMCTruthVertex_
bool useMCTruthVertex_
Definition: EcalDetailedTimeRecHitProducer.h:44
edm::Event::put
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:132
edm::EventSetup
Definition: EventSetup.h:57
EcalDetailedTimeRecHitProducer::EBRecHitCollection_
edm::EDGetTokenT< EBRecHitCollection > EBRecHitCollection_
Definition: EcalDetailedTimeRecHitProducer.h:38
CoreSimVertex::position
const math::XYZTLorentzVectorD & position() const
Definition: CoreSimVertex.h:21
get
#define get
EcalRecHit.h
EcalDetailedTimeRecHitProducer::EcalDetailedTimeRecHitProducer
EcalDetailedTimeRecHitProducer(const edm::ParameterSet &ps)
Definition: EcalDetailedTimeRecHitProducer.cc:43
EcalDetailedTimeRecHitProducer::produce
void produce(edm::Event &evt, const edm::EventSetup &es) override
Definition: EcalDetailedTimeRecHitProducer.cc:72
EcalDetailedTimeRecHitProducer::eeTimeLayer_
int eeTimeLayer_
Definition: EcalDetailedTimeRecHitProducer.h:47
PV3DBase::mag
T mag() const
Definition: PV3DBase.h:64
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
EcalDetailedTimeRecHitProducer::correctForVertexZPosition_
bool correctForVertexZPosition_
Definition: EcalDetailedTimeRecHitProducer.h:43
EcalLaserDbRecord.h
edm::SortedCollection::find
iterator find(key_type k)
Definition: SortedCollection.h:240
CaloCellGeometry.h
eostools.move
def move(src, dest)
Definition: eostools.py:511
reco::Vertex::y
double y() const
y coordinate
Definition: Vertex.h:118
EcalDetailedTimeRecHitProducer::ebTimeLayer_
int ebTimeLayer_
Definition: EcalDetailedTimeRecHitProducer.h:46
CaloGeometry.h
EcalDetailedTimeRecHitProducer::EERecHitCollection_
edm::EDGetTokenT< EERecHitCollection > EERecHitCollection_
Definition: EcalDetailedTimeRecHitProducer.h:39
EcalDetailedTimeRecHitProducer::ebTimeDigiCollection_
edm::EDGetTokenT< EcalTimeDigiCollection > ebTimeDigiCollection_
Definition: EcalDetailedTimeRecHitProducer.h:50
EcalDetailedTimeRecHitProducer::EBDetailedTimeRecHitCollection_
std::string EBDetailedTimeRecHitCollection_
Definition: EcalDetailedTimeRecHitProducer.h:54
edm::HandleBase::isValid
bool isValid() const
Definition: HandleBase.h:70
edm::Event
Definition: Event.h:73
EcalRecHit::setTime
void setTime(float time)
Definition: EcalRecHit.h:71
EcalIntercalibConstantsRcd.h
edm::InputTag
Definition: InputTag.h:15
reco::Vertex
Definition: Vertex.h:35
EcalDetailedTimeRecHitProducer::eeTimeDigiCollection_
edm::EDGetTokenT< EcalTimeDigiCollection > eeTimeDigiCollection_
Definition: EcalDetailedTimeRecHitProducer.h:52
filterRecHits_cfi.EBRecHits
EBRecHits
Definition: filterRecHits_cfi.py:8