test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
41 
42 #include "CLHEP/Units/GlobalPhysicalConstants.h"
43 #include "CLHEP/Units/GlobalSystemOfUnits.h"
44 
46  m_geometry(0)
47 {
48  EBRecHitCollection_ = consumes<EBRecHitCollection>( ps.getParameter<edm::InputTag>("EBRecHitCollection") );
49  EERecHitCollection_ = consumes<EERecHitCollection>( ps.getParameter<edm::InputTag>("EERecHitCollection") );
50 
51  ebTimeDigiCollection_ = consumes<EcalTimeDigiCollection>( ps.getParameter<edm::InputTag>("EBTimeDigiCollection") );
52  eeTimeDigiCollection_ = consumes<EcalTimeDigiCollection>( ps.getParameter<edm::InputTag>("EETimeDigiCollection") );
53 
54  EBDetailedTimeRecHitCollection_ = ps.getParameter<std::string>("EBDetailedTimeRecHitCollection");
55  EEDetailedTimeRecHitCollection_ = ps.getParameter<std::string>("EEDetailedTimeRecHitCollection");
56 
57  correctForVertexZPosition_ = ps.getParameter<bool>("correctForVertexZPosition");
58  useMCTruthVertex_ = ps.getParameter<bool>("useMCTruthVertex");
59  recoVertex_ = consumes<reco::VertexCollection>( ps.getParameter<edm::InputTag>("recoVertex") );
60  simVertex_ = consumes<edm::SimVertexContainer>( ps.getParameter<edm::InputTag>("simVertex") );
61 
62  ebTimeLayer_ = ps.getParameter<int>("EBTimeLayer");
63  eeTimeLayer_ = ps.getParameter<int>("EETimeLayer");
64 
65  produces< EBRecHitCollection >(EBDetailedTimeRecHitCollection_);
66  produces< EERecHitCollection >(EEDetailedTimeRecHitCollection_);
67 }
68 
70 }
71 
72 
74 {
75  using namespace edm;
76  using namespace reco;
77 
78  edm::ESHandle<CaloGeometry> hGeometry ;
79  es.get<CaloGeometryRecord>().get( hGeometry ) ;
80 
81  m_geometry = &*hGeometry;
82 
85 
86  const EBRecHitCollection* EBRecHits = 0;
87  const EERecHitCollection* EERecHits = 0;
88 
89  evt.getByToken( EBRecHitCollection_, pEBRecHits);
90  if ( pEBRecHits.isValid() ) {
91  EBRecHits = pEBRecHits.product(); // get a ptr to the product
92 #ifdef DEBUG
93  LogDebug("EcalRecHitDebug") << "total # EB rechits to be re-calibrated: " << EBRecHits->size();
94 #endif
95  }
96 
97  evt.getByToken( EERecHitCollection_, pEERecHits);
98  if ( pEERecHits.isValid() ) {
99  EERecHits = pEERecHits.product(); // get a ptr to the product
100 #ifdef DEBUG
101  LogDebug("EcalRecHitDebug") << "total # EE uncalibrated rechits to be re-calibrated: " << EERecHits->size();
102 #endif
103  }
104 
107 
108  const EcalTimeDigiCollection* ebTimeDigis =0;
109  const EcalTimeDigiCollection* eeTimeDigis =0;
110 
111  evt.getByToken( ebTimeDigiCollection_, pEBTimeDigis);
112  //evt.getByToken( digiProducer_, pEBTimeDigis);
113  if ( pEBTimeDigis.isValid() ) {
114  ebTimeDigis = pEBTimeDigis.product(); // get a ptr to the produc
115  edm::LogInfo("EcalDetailedTimeRecHitInfo") << "total # ebTimeDigis: " << ebTimeDigis->size() ;
116  }
117 
118  evt.getByToken( eeTimeDigiCollection_, pEETimeDigis);
119  //evt.getByToken( digiProducer_, pEETimeDigis);
120  if ( pEETimeDigis.isValid() ) {
121  eeTimeDigis = pEETimeDigis.product(); // get a ptr to the product
122  edm::LogInfo("EcalDetailedTimeRecHitInfo") << "total # eeTimeDigis: " << eeTimeDigis->size() ;
123  }
124  // collection of rechits to put in the event
125  std::unique_ptr< EBRecHitCollection > EBDetailedTimeRecHits( new EBRecHitCollection );
126  std::unique_ptr< EERecHitCollection > EEDetailedTimeRecHits( new EERecHitCollection );
127 
128  std::unique_ptr<GlobalPoint> vertex;
129 
131  {
132  if (!useMCTruthVertex_)
133  {
134  //Get the first reco vertex
135  // get primary vertices
136 
137  edm::Handle<VertexCollection> VertexHandle;
138  evt.getByToken(recoVertex_, VertexHandle);
139 
140  if ( VertexHandle.isValid() )
141  {
142  if ((*VertexHandle).size()>0) //at least 1 vertex
143  {
144  const reco::Vertex* myVertex= &(*VertexHandle)[0];
145  vertex.reset( new GlobalPoint(myVertex->x(),myVertex->y(),myVertex->z()) );
146  }
147  }
148 
149  }
150  else
151  {
152  edm::Handle<SimVertexContainer> VertexHandle;
153  evt.getByToken(simVertex_, VertexHandle);
154 
155  if ( VertexHandle.isValid() )
156  {
157  if ((*VertexHandle).size()>0) //at least 1 vertex
158  {
159  assert ((*VertexHandle)[0].vertexId() == 0);
160  const SimVertex* myVertex= &(*VertexHandle)[0];
161  vertex.reset( new GlobalPoint(myVertex->position().x(),myVertex->position().y(),myVertex->position().z()) );
162  }
163  }
164 
165  }
166  }
167 
168  if (EBRecHits && ebTimeDigis) {
169  // loop over uncalibrated rechits to make calibrated ones
170  for(EBRecHitCollection::const_iterator it = EBRecHits->begin(); it != EBRecHits->end(); ++it) {
171  EcalRecHit aHit( (*it) );
172  EcalTimeDigiCollection::const_iterator timeDigi=ebTimeDigis->find((*it).id());
173  if (timeDigi!=ebTimeDigis->end())
174  {
175  if (timeDigi->sampleOfInterest()>=0)
176  {
177  float myTime=(*timeDigi)[timeDigi->sampleOfInterest()];
178  //Vertex corrected ToF
179  if (vertex)
180  {
181  aHit.setTime(myTime+deltaTimeOfFlight(*vertex,(*it).id(),ebTimeLayer_));
182  }
183  else
184  //Uncorrected ToF
185  aHit.setTime(myTime);
186  }
187  }
188  // leave standard time if no timeDigi is associated (e.g. noise recHits)
189  EBDetailedTimeRecHits->push_back( aHit );
190  }
191  }
192 
193  if (EERecHits && eeTimeDigis)
194  {
195  // loop over uncalibrated rechits to make calibrated ones
197  it != EERecHits->end(); ++it) {
198 
199  EcalRecHit aHit( *it );
200  EcalTimeDigiCollection::const_iterator timeDigi=eeTimeDigis->find((*it).id());
201  if (timeDigi!=eeTimeDigis->end())
202  {
203  if (timeDigi->sampleOfInterest()>=0)
204  {
205  float myTime=(*timeDigi)[timeDigi->sampleOfInterest()];
206  //Vertex corrected ToF
207  if (vertex)
208  {
209  aHit.setTime(myTime+deltaTimeOfFlight(*vertex,(*it).id(),eeTimeLayer_));
210  }
211  else
212  //Uncorrected ToF
213  aHit.setTime(myTime);
214  }
215  }
216  EEDetailedTimeRecHits->push_back( aHit );
217  }
218  }
219  // put the collection of recunstructed hits in the event
220  LogInfo("EcalDetailedTimeRecHitInfo") << "total # EB rechits: " << EBDetailedTimeRecHits->size();
221  LogInfo("EcalDetailedTimeRecHitInfo") << "total # EE rechits: " << EEDetailedTimeRecHits->size();
222 
223  evt.put( std::move(EBDetailedTimeRecHits), EBDetailedTimeRecHitCollection_ );
224  evt.put( std::move(EEDetailedTimeRecHits), EEDetailedTimeRecHitCollection_ );
225 
226 }
227 
228 double EcalDetailedTimeRecHitProducer::deltaTimeOfFlight( GlobalPoint& vertex, const DetId& detId , int layer) const
229 {
230  const CaloCellGeometry* cellGeometry ( m_geometry->getGeometry( detId ) ) ;
231  assert( 0 != cellGeometry ) ;
232  GlobalPoint layerPos = (dynamic_cast<const TruncatedPyramid*>(cellGeometry))->getPosition( double(layer)+0.5 ); //depth in mm in the middle of the layer position
233  GlobalVector tofVector = layerPos-vertex;
234  return (layerPos.mag()*cm-tofVector.mag()*cm)/(float)c_light ;
235 }
236 
#define LogDebug(id)
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
double y() const
y coordinate
Definition: Vertex.h:113
edm::EDGetTokenT< EcalTimeDigiCollection > eeTimeDigiCollection_
assert(m_qm.get())
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
T mag() const
Definition: PV3DBase.h:67
edm::EDGetTokenT< reco::VertexCollection > recoVertex_
def move
Definition: eostools.py:510
double z() const
z coordinate
Definition: Vertex.h:115
const math::XYZTLorentzVectorD & position() const
Definition: CoreSimVertex.h:26
bool isValid() const
Definition: HandleBase.h:75
EcalDetailedTimeRecHitProducer(const edm::ParameterSet &ps)
Definition: DetId.h:18
double x() const
x coordinate
Definition: Vertex.h:111
const T & get() const
Definition: EventSetup.h:56
A base class to handle the particular shape of Ecal Xtals. Taken from ORCA Calorimetry Code...
edm::EDGetTokenT< EBRecHitCollection > EBRecHitCollection_
double deltaTimeOfFlight(GlobalPoint &vertex, const DetId &detId, int layer) const
const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id.
Definition: CaloGeometry.cc:78
edm::EDGetTokenT< edm::SimVertexContainer > simVertex_
edm::EDGetTokenT< EERecHitCollection > EERecHitCollection_
virtual void produce(edm::Event &evt, const edm::EventSetup &es)