CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CentralityProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: CentralityProducer
4 // Class: CentralityProducer
5 //
13 //
14 // Original Author: Yetkin Yilmaz, Young Soo Park
15 // Created: Wed Jun 11 15:31:41 CEST 2008
16 // $Id: CentralityProducer.cc,v 1.29 2010/10/27 12:25:22 yilmaz Exp $
17 //
18 //
19 
20 
21 // system include files
22 #include <memory>
23 #include <iostream>
24 
25 // user include files
30 
35 
37 
49 
55 
56 using namespace std;
57 
58 //
59 // class declaration
60 //
61 namespace reco{
62 
64  public:
65  explicit CentralityProducer(const edm::ParameterSet&);
67 
68  private:
69  virtual void beginJob() ;
70  virtual bool filter(edm::Event&, const edm::EventSetup&);
71  virtual void endJob() ;
72 
73  // ----------member data ---------------------------
74 
75  bool recoLevel_;
76 
77  bool doFilter_;
86  bool reuseAny_;
88 
90 
92  double trackPtCut_;
93  double trackEtaCut_;
94 
105 
107 
110 
113 
114 };
115 
116 //
117 // constants, enums and typedefs
118 //
119 
120 
121 //
122 // static data member definitions
123 //
124 
125 //
126 // constructors and destructor
127 //
128  CentralityProducer::CentralityProducer(const edm::ParameterSet& iConfig) :
129  trackGeo_(0),
130  caloGeo_(0)
131 {
132  //register your products
133  doFilter_ = iConfig.getParameter<bool>("doFilter");
134  produceHFhits_ = iConfig.getParameter<bool>("produceHFhits");
135  produceHFtowers_ = iConfig.getParameter<bool>("produceHFtowers");
136  produceBasicClusters_ = iConfig.getParameter<bool>("produceBasicClusters");
137  produceEcalhits_ = iConfig.getParameter<bool>("produceEcalhits");
138  produceZDChits_ = iConfig.getParameter<bool>("produceZDChits");
139  produceETmidRap_ = iConfig.getParameter<bool>("produceETmidRapidity");
140  producePixelhits_ = iConfig.getParameter<bool>("producePixelhits");
141  produceTracks_ = iConfig.getParameter<bool>("produceTracks");
142  producePixelTracks_ = iConfig.getParameter<bool>("producePixelTracks");
143 
144  midRapidityRange_ = iConfig.getParameter<double>("midRapidityRange");
145  trackPtCut_ = iConfig.getParameter<double>("trackPtCut");
146  trackEtaCut_ = iConfig.getParameter<double>("trackEtaCut");
147 
148  if(produceHFhits_) srcHFhits_ = iConfig.getParameter<edm::InputTag>("srcHFhits");
149  if(produceHFtowers_ || produceETmidRap_) srcTowers_ = iConfig.getParameter<edm::InputTag>("srcTowers");
150 
151  if(produceEcalhits_){
152  srcEBhits_ = iConfig.getParameter<edm::InputTag>("srcEBhits");
153  srcEEhits_ = iConfig.getParameter<edm::InputTag>("srcEEhits");
154  }
155  if(produceBasicClusters_){
156  srcBasicClustersEE_ = iConfig.getParameter<edm::InputTag>("srcBasicClustersEE");
157  srcBasicClustersEB_ = iConfig.getParameter<edm::InputTag>("srcBasicClustersEB");
158  }
159  if(produceZDChits_) srcZDChits_ = iConfig.getParameter<edm::InputTag>("srcZDChits");
160  if(producePixelhits_){
161  srcPixelhits_ = iConfig.getParameter<edm::InputTag>("srcPixelhits");
162  doPixelCut_ = iConfig.getParameter<bool>("doPixelCut");
163  }
164  if(produceTracks_) srcTracks_ = iConfig.getParameter<edm::InputTag>("srcTracks");
165  if(producePixelTracks_) srcPixelTracks_ = iConfig.getParameter<edm::InputTag>("srcPixelTracks");
166 
167  reuseAny_ = !produceHFhits_ || !produceHFtowers_ || !produceBasicClusters_ || !produceEcalhits_ || !produceZDChits_;
168  if(reuseAny_) reuseTag_ = iConfig.getParameter<edm::InputTag>("srcReUse");
169 
170  useQuality_ = iConfig.getParameter<bool>("UseQuality");
171  trackQuality_ = TrackBase::qualityByName(iConfig.getParameter<std::string>("TrackQuality"));
172 
173  produces<reco::Centrality>();
174 
175 }
176 
177 
179 {
180 
181  // do anything here that needs to be done at desctruction time
182  // (e.g. close files, deallocate resources etc.)
183 
184 }
185 
186 
187 //
188 // member functions
189 //
190 
191 // ------------ method called to produce the data ------------
192 bool
194 {
195  using namespace edm;
196  using namespace reco;
197 
198  if(!trackGeo_ && doPixelCut_){
200  iSetup.get<TrackerDigiGeometryRecord>().get(tGeo);
201  trackGeo_ = tGeo.product();
202  }
203 
204  if(!caloGeo_ && 0){
206  iSetup.get<CaloGeometryRecord>().get(cGeo);
207  caloGeo_ = cGeo.product();
208  }
209 
210  std::auto_ptr<Centrality> creco(new Centrality());
211  Handle<Centrality> inputCentrality;
212 
213  if(reuseAny_) iEvent.getByLabel(reuseTag_,inputCentrality);
214 
215  if(produceHFhits_){
216  creco->etHFhitSumPlus_ = 0;
217  creco->etHFhitSumMinus_ = 0;
218 
220  iEvent.getByLabel(srcHFhits_,hits);
221  for( size_t ihit = 0; ihit<hits->size(); ++ ihit){
222  const HFRecHit & rechit = (*hits)[ ihit ];
223  if(rechit.id().ieta() > 0 )
224  creco->etHFhitSumPlus_ += rechit.energy();
225  if(rechit.id().ieta() < 0)
226  creco->etHFhitSumMinus_ += rechit.energy();
227  }
228  }else{
229  creco->etHFhitSumMinus_ = inputCentrality->EtHFhitSumMinus();
230  creco->etHFhitSumPlus_ = inputCentrality->EtHFhitSumPlus();
231  }
232 
234  creco->etHFtowerSumPlus_ = 0;
235  creco->etHFtowerSumMinus_ = 0;
236  creco->etMidRapiditySum_ = 0;
237 
239 
240  iEvent.getByLabel(srcTowers_,towers);
241 
242  for( size_t i = 0; i<towers->size(); ++ i){
243  const CaloTower & tower = (*towers)[ i ];
244  double eta = tower.eta();
245  bool isHF = tower.ietaAbs() > 29;
246  if(produceHFtowers_){
247  if(isHF && eta > 0){
248  creco->etHFtowerSumPlus_ += tower.pt();
249  }
250  if(isHF && eta < 0){
251  creco->etHFtowerSumMinus_ += tower.pt();
252  }
253  }else{
254  creco->etHFtowerSumMinus_ = inputCentrality->EtHFtowerSumMinus();
255  creco->etHFtowerSumPlus_ = inputCentrality->EtHFtowerSumPlus();
256  }
257  if(produceETmidRap_){
258  if(fabs(eta) < midRapidityRange_) creco->etMidRapiditySum_ += tower.pt()/(midRapidityRange_*2.);
259  }else creco->etMidRapiditySum_ = inputCentrality->EtMidRapiditySum();
260  }
261  }else{
262  creco->etHFtowerSumMinus_ = inputCentrality->EtHFtowerSumMinus();
263  creco->etHFtowerSumPlus_ = inputCentrality->EtHFtowerSumPlus();
264  creco->etMidRapiditySum_ = inputCentrality->EtMidRapiditySum();
265  }
266 
268  creco->etEESumPlus_ = 0;
269  creco->etEESumMinus_ = 0;
270  creco->etEBSum_ = 0;
271 
273  iEvent.getByLabel(srcBasicClustersEE_, clusters);
274  for( size_t i = 0; i<clusters->size(); ++ i){
275  const BasicCluster & cluster = (*clusters)[ i ];
276  double eta = cluster.eta();
277  double tg = cluster.position().rho()/cluster.position().r();
278  double et = cluster.energy()*tg;
279  if(eta > 0)
280  creco->etEESumPlus_ += et;
281  if(eta < 0)
282  creco->etEESumMinus_ += et;
283  }
284 
285  iEvent.getByLabel(srcBasicClustersEB_, clusters);
286  for( size_t i = 0; i<clusters->size(); ++ i){
287  const BasicCluster & cluster = (*clusters)[ i ];
288  double tg = cluster.position().rho()/cluster.position().r();
289  double et = cluster.energy()*tg;
290  creco->etEBSum_ += et;
291  }
292  }else{
293  creco->etEESumMinus_ = inputCentrality->EtEESumMinus();
294  creco->etEESumPlus_ = inputCentrality->EtEESumPlus();
295  creco->etEBSum_ = inputCentrality->EtEBSum();
296  }
297 
298  if(producePixelhits_){
299  creco->pixelMultiplicity_ = 0;
300  const SiPixelRecHitCollection* rechits;
302  iEvent.getByLabel(srcPixelhits_,rchts);
303  rechits = rchts.product();
304  int nPixel =0 ;
305  for (SiPixelRecHitCollection::const_iterator it = rechits->begin(); it!=rechits->end();it++)
306  {
308  DetId detId = DetId(hits.detId());
309  SiPixelRecHitCollection::const_iterator recHitMatch = rechits->find(detId);
310  const SiPixelRecHitCollection::DetSet recHitRange = *recHitMatch;
311  for ( SiPixelRecHitCollection::DetSet::const_iterator recHitIterator = recHitRange.begin();
312  recHitIterator != recHitRange.end(); ++recHitIterator) {
313  // add selection if needed, now all hits.
314  if(doPixelCut_){
315  const SiPixelRecHit * recHit = &(*recHitIterator);
316  const PixelGeomDetUnit* pixelLayer = dynamic_cast<const PixelGeomDetUnit*> (trackGeo_->idToDet(recHit->geographicalId()));
317  GlobalPoint gpos = pixelLayer->toGlobal(recHit->localPosition());
318  math::XYZVector rechitPos(gpos.x(),gpos.y(),gpos.z());
319  double abeta = fabs(rechitPos.eta());
320  int clusterSize = recHit->cluster()->size();
321  if ( abeta < 0.5 && clusterSize < 1) continue;
322  if ( abeta > 0.5 && abeta < 1 && clusterSize < 2) continue;
323  if ( abeta > 1. && abeta < 1.5 && clusterSize < 3) continue;
324  if ( abeta > 1.5 && abeta < 2. && clusterSize < 4) continue;
325  if ( abeta > 2. && abeta < 2.5 && clusterSize < 6) continue;
326  if ( abeta > 2.5 && abeta < 5 && clusterSize < 9) continue;
327  }
328  nPixel++;
329  }
330  }
331  creco->pixelMultiplicity_ = nPixel;
332  }else{
333  creco->pixelMultiplicity_ = inputCentrality->multiplicityPixel();
334  }
335 
336  if(produceTracks_){
338  iEvent.getByLabel(srcTracks_,tracks);
339  int nTracks = 0;
340 
341  double trackCounter = 0;
342  double trackCounterEta = 0;
343  double trackCounterEtaPt = 0;
344 
345  for(unsigned int i = 0 ; i < tracks->size(); ++i){
346  const Track& track = (*tracks)[i];
347  if(useQuality_ && !track.quality(trackQuality_)) continue;
348  nTracks++;
349 
350  if( track.pt() > trackPtCut_) trackCounter++;
351  if(fabs(track.eta())<trackEtaCut_) {
352  trackCounterEta++;
353  if (track.pt() > trackPtCut_) trackCounterEtaPt++;
354  }
355  }
356 
357  creco->trackMultiplicity_ = nTracks;
358  creco->ntracksPtCut_ = trackCounter;
359  creco->ntracksEtaCut_ = trackCounterEta;
360  creco->ntracksEtaPtCut_ = trackCounterEtaPt;
361 
362  }else{
363  creco->trackMultiplicity_ = inputCentrality->Ntracks();
364  creco->ntracksPtCut_= inputCentrality->NtracksPtCut();
365  creco->ntracksEtaCut_= inputCentrality->NtracksEtaCut();
366  creco->ntracksEtaPtCut_= inputCentrality->NtracksEtaPtCut();
367  }
368 
371  iEvent.getByLabel(srcPixelTracks_,pixeltracks);
372  int nPixelTracks = pixeltracks->size();
373  creco->nPixelTracks_ = nPixelTracks;
374  }
375  else{
376  creco->nPixelTracks_ = inputCentrality->NpixelTracks();
377  }
378 
379  if(produceZDChits_){
380  creco->zdcSumPlus_ = 0;
381  creco->zdcSumMinus_ = 0;
382 
384  bool zdcAvailable = iEvent.getByLabel(srcZDChits_,hits);
385  if(zdcAvailable){
386  for( size_t ihit = 0; ihit<hits->size(); ++ ihit){
387  const ZDCRecHit & rechit = (*hits)[ ihit ];
388  if(rechit.id().zside() > 0 )
389  creco->zdcSumPlus_ += rechit.energy();
390  if(rechit.id().zside() < 0)
391  creco->zdcSumMinus_ += rechit.energy();
392  }
393  }else{
394  creco->zdcSumPlus_ = -9;
395  creco->zdcSumMinus_ = -9;
396  }
397  }else{
398  creco->zdcSumMinus_ = inputCentrality->zdcSumMinus();
399  creco->zdcSumPlus_ = inputCentrality->zdcSumPlus();
400  }
401 
402  iEvent.put(creco);
403  return true;
404 }
405 
406 // ------------ method called once each job just before starting event loop ------------
407 void
409 {
410 }
411 
412 // ------------ method called once each job just after ending the event loop ------------
413 void
415 }
416 }
417 
418 //define this as a plug-in
reco::TrackBase::TrackQuality trackQuality_
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
const_iterator begin() const
TrackQuality
track quality
Definition: TrackBase.h:94
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
int zside() const
get the z-side of the cell (1/-1)
Definition: HcalZDCDetId.h:36
const_iterator find(id_type i) const
T eta() const
virtual double eta() const
momentum pseudorapidity
virtual LocalPoint localPosition() const
void beginJob()
Definition: Breakpoints.cc:15
const CaloGeometry * caloGeo_
int iEvent
Definition: GenABIO.cc:243
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:140
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:84
float energy() const
Definition: CaloRecHit.h:19
virtual bool filter(edm::Event &, const edm::EventSetup &)
double pt() const
track transverse momentum
Definition: TrackBase.h:130
int ieta() const
get the cell ieta
Definition: HcalDetId.h:38
const_iterator end() const
virtual const GeomDet * idToDet(DetId) const
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:359
DEFINE_FWK_MODULE(CosmicTrackingParticleSelector)
Definition: DetId.h:20
static TrackQuality qualityByName(const std::string &name)
Definition: TrackBase.cc:46
bool isHF(int etabin, int depth)
tuple filter
USE THIS FOR SKIMMED TRACKS process.p = cms.Path(process.hltLevel1GTSeed*process.skimming*process.offlineBeamSpot*process.TrackRefitter2) OTHERWISE USE THIS.
Definition: align_tpl.py:86
tuple tracks
Definition: testEve_cfg.py:39
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
virtual double pt() const
transverse momentum
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
id_type detId() const
Definition: DetSetNew.h:72
T const * product() const
Definition: Handle.h:74
bool quality(const TrackQuality) const
Track quality.
Definition: TrackBase.h:348
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::GlobalCoordinateSystemTag > GlobalPoint
point in global coordinate system
Definition: Point3D.h:18
int ietaAbs() const
Definition: CaloTower.h:155
iterator end()
Definition: DetSetNew.h:59
const TrackerGeometry * trackGeo_
HcalZDCDetId id() const
get the id
Definition: ZDCRecHit.h:21
HcalDetId id() const
get the id
Definition: HFRecHit.h:21
DetId geographicalId() const
ClusterRef const & cluster() const
Definition: SiPixelRecHit.h:42
Our base class.
Definition: SiPixelRecHit.h:27
iterator begin()
Definition: DetSetNew.h:56