From 26b88394d085d497c89e793a30702eb33f710cbc Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 28 Apr 2015 10:58:36 -0500 Subject: [PATCH 1/8] first checkin of ClusterCompatibility object and ClusterCompatibilityProducer class --- .../interface/ClusterCompatibility.h | 29 +++ .../HeavyIonEvent/src/ClusterCompatibility.cc | 16 ++ DataFormats/HeavyIonEvent/src/classes.h | 7 + DataFormats/HeavyIonEvent/src/classes_def.xml | 5 + .../plugins/ClusterCompatibilityProducer.cc | 199 ++++++++++++++++++ .../python/ClusterCompatibility_cfi.py | 9 + 6 files changed, 265 insertions(+) create mode 100644 DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h create mode 100644 DataFormats/HeavyIonEvent/src/ClusterCompatibility.cc create mode 100644 RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc create mode 100644 RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py diff --git a/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h b/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h new file mode 100644 index 0000000000000..6d27f0c5f2b72 --- /dev/null +++ b/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h @@ -0,0 +1,29 @@ +#ifndef DataFormats_ClusterCompatibility_h +#define DataFormats_ClusterCompatibility_h + +#include + +namespace reco { class ClusterCompatibility { +public: + + ClusterCompatibility(); + ClusterCompatibility(float z0, int nHit, float chi); + virtual ~ClusterCompatibility(); + + float z0() const { return z0_; } + int nHit() const { return nHit_; } + float chi() const { return chi_; } + +protected: + + float z0_; + int nHit_; + float chi_; + +}; + +typedef std::vector ClusterCompatibilityCollection; + +} + +#endif diff --git a/DataFormats/HeavyIonEvent/src/ClusterCompatibility.cc b/DataFormats/HeavyIonEvent/src/ClusterCompatibility.cc new file mode 100644 index 0000000000000..3ffdc904b0e7f --- /dev/null +++ b/DataFormats/HeavyIonEvent/src/ClusterCompatibility.cc @@ -0,0 +1,16 @@ +#include "DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h" +using namespace reco; + +ClusterCompatibility::ClusterCompatibility(float z0, int nHit, float chi): + z0_(z0), + nHit_(nHit), + chi_(chi) +{} + +ClusterCompatibility::ClusterCompatibility(): + z0_(0.), + nHit_(0), + chi_(0.) +{} + +ClusterCompatibility::~ClusterCompatibility() {} diff --git a/DataFormats/HeavyIonEvent/src/classes.h b/DataFormats/HeavyIonEvent/src/classes.h index f7393781df694..ad2fb1d829b4a 100644 --- a/DataFormats/HeavyIonEvent/src/classes.h +++ b/DataFormats/HeavyIonEvent/src/classes.h @@ -1,4 +1,5 @@ #include "DataFormats/HeavyIonEvent/interface/Centrality.h" +#include "DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h" #include "DataFormats/HeavyIonEvent/interface/EvtPlane.h" #include "DataFormats/HeavyIonEvent/interface/HeavyIon.h" #include "DataFormats/HeavyIonEvent/interface/VoronoiBackground.h" @@ -20,6 +21,12 @@ namespace DataFormats_HeavyIonEvent { reco::EvtPlaneCollection evcol; edm::Wrapper wevcol; + reco::ClusterCompatibility clus_compat; + edm::Wrapper w_clus_compat; + + reco::ClusterCompatibilityCollection clus_compat_col; + edm::Wrapper w_clus_compat_col; + reco::VoronoiBackground vor; edm::Wrapper wvor; diff --git a/DataFormats/HeavyIonEvent/src/classes_def.xml b/DataFormats/HeavyIonEvent/src/classes_def.xml index 3339db96c6222..34802fb265cd6 100644 --- a/DataFormats/HeavyIonEvent/src/classes_def.xml +++ b/DataFormats/HeavyIonEvent/src/classes_def.xml @@ -21,4 +21,9 @@ + + + + + diff --git a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc new file mode 100644 index 0000000000000..cc232b0b5bfb4 --- /dev/null +++ b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc @@ -0,0 +1,199 @@ +// +// Derived from HLTrigger/special/src/HLTPixelClusterShapeFilter.cc +// at version 7_5_0_pre3 +// +// Original Author (of Derivative Producer): Eric Appelt +// Created: Mon Apr 27, 2015 + +#include + +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/EDProducer.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "DataFormats/Common/interface/Handle.h" +#include "DataFormats/GeometryVector/interface/LocalPoint.h" +#include "DataFormats/GeometryVector/interface/GlobalPoint.h" +#include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h" +#include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" +#include "DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h" + +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" +#include "Geometry/CommonTopologies/interface/PixelTopology.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" +#include "Geometry/CommonDetUnit/interface/GeomDet.h" + + +// +// class declaration +// + +class ClusterCompatibilityProducer : public edm::EDProducer { + + public: + explicit ClusterCompatibilityProducer(const edm::ParameterSet&); + ~ClusterCompatibilityProducer(); + + private: + virtual void beginJob() override ; + virtual void produce(edm::Event&, const edm::EventSetup&) override; + virtual void endJob() override ; + + edm::EDGetTokenT inputToken_; + edm::InputTag inputTag_; // input tag identifying product containing pixel clusters + double minZ_; // beginning z-vertex position + double maxZ_; // end z-vertex position + double zStep_; // size of steps in z-vertex test + + struct VertexHit + { + float z; + float r; + float w; + }; + + reco::ClusterCompatibility getContainedHits(const std::vector &hits, double z0) const; + +}; + +ClusterCompatibilityProducer::ClusterCompatibilityProducer(const edm::ParameterSet& config): + inputTag_ (config.getParameter("inputTag")), + minZ_ (config.getParameter("minZ")), + maxZ_ (config.getParameter("maxZ")), + zStep_ (config.getParameter("zStep")) +{ + inputToken_ = consumes(inputTag_); + LogDebug("") << "Using the " << inputTag_ << " input collection"; + produces(); +} + +ClusterCompatibilityProducer::~ClusterCompatibilityProducer() {} + +void +ClusterCompatibilityProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) +{ + std::auto_ptr creco(new reco::ClusterCompatibilityCollection()); + + // get hold of products from Event + edm::Handle hRecHits; + iEvent.getByToken(inputToken_, hRecHits); + + // get tracker geometry + if (hRecHits.isValid()) { + edm::ESHandle trackerHandle; + iSetup.get().get(trackerHandle); + const TrackerGeometry *tgeo = trackerHandle.product(); + const SiPixelRecHitCollection *hits = hRecHits.product(); + + // loop over pixel rechits + int nPxlHits=0; + std::vector vhits; + for(SiPixelRecHitCollection::DataContainer::const_iterator hit = hits->data().begin(), + end = hits->data().end(); hit != end; ++hit) { + if (!hit->isValid()) + continue; + ++nPxlHits; + DetId id(hit->geographicalId()); + if(id.subdetId() != int(PixelSubdetector::PixelBarrel)) + continue; + const PixelGeomDetUnit *pgdu = static_cast(tgeo->idToDet(id)); + if (1) { + const PixelTopology *pixTopo = &(pgdu->specificTopology()); + std::vector pixels(hit->cluster()->pixels()); + bool pixelOnEdge = false; + for(std::vector::const_iterator pixel = pixels.begin(); + pixel != pixels.end(); ++pixel) { + int pixelX = pixel->x; + int pixelY = pixel->y; + if(pixTopo->isItEdgePixelInX(pixelX) || pixTopo->isItEdgePixelInY(pixelY)) { + pixelOnEdge = true; + break; + } + } + if (pixelOnEdge) + continue; + } + + LocalPoint lpos = LocalPoint(hit->localPosition().x(), + hit->localPosition().y(), + hit->localPosition().z()); + GlobalPoint gpos = pgdu->toGlobal(lpos); + VertexHit vh; + vh.z = gpos.z(); + vh.r = gpos.perp(); + vh.w = hit->cluster()->sizeY(); + vhits.push_back(vh); + } + + // get CompatibleHits for each z-position + // estimate best z-position from cluster lengths + double zest = 0.0; + reco::ClusterCompatibility chits; + int nhits = 0, nhits_max = 0; + double chi = 0.0, chi_max = 1e+9; + for(double z0 = minZ_; z0 <= maxZ_; z0 += zStep_) { + chits = getContainedHits(vhits, z0); + creco->push_back(chits); + nhits = chits.nHit(); + chi = chits.chi(); + if(nhits == 0) + continue; + if(nhits > nhits_max) { + chi_max = 1e+9; + nhits_max = nhits; + } + if(nhits >= nhits_max && chi < chi_max) { + chi_max = chi; + zest = z0; + } + } + + // make sure to also store best z-position +/- 10 cm + // if this is out of range + double zminus = zest - 10., zplus = zest + 10.; + if( zminus < minZ_ ) creco->push_back(getContainedHits(vhits, zminus)); + if( zplus > maxZ_ ) creco->push_back(getContainedHits(vhits, zplus)); + + } + iEvent.put(creco); + +} + + +reco::ClusterCompatibility ClusterCompatibilityProducer::getContainedHits(const std::vector &hits, double z0) const +{ + // Calculate number of hits contained in v-shaped window in cluster y-width vs. z-position. + int n = 0; + double chi = 0.; + + for(std::vector::const_iterator hit = hits.begin(); hit!= hits.end(); hit++) { + double p = 2 * fabs(hit->z - z0)/hit->r + 0.5; // FIXME <- this comment from the HLT filter, need + if(fabs(p - hit->w) <= 1.) { // to understand what it means + chi += fabs(p - hit->w); + n++; + } + } + return reco::ClusterCompatibility(z0, n, chi); +} + +// ------------ method called once each job just before starting event loop ------------ +void +ClusterCompatibilityProducer::beginJob() +{ +} + +// ------------ method called once each job just after ending the event loop ------------ +void +ClusterCompatibilityProducer::endJob() +{ +} + + +//define this as a plug-in +DEFINE_FWK_MODULE(ClusterCompatibilityProducer); diff --git a/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py b/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py new file mode 100644 index 0000000000000..5123d7ee8af9b --- /dev/null +++ b/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py @@ -0,0 +1,9 @@ +import FWCore.ParameterSet.Config as cms + +hiClusterCompatibility = cms.EDProducer("ClusterCompatibilityProducer", + inputTag = cms.InputTag( "hltSiPixelRecHits" ), + saveTags = cms.bool( False ), + minZ = cms.double(-20.0), + maxZ = cms.double(20.05), + zStep = cms.double(0.2) +) From 18c2ffc139ced7e89595fd53f310168766b1fa25 Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 28 Apr 2015 13:38:16 -0500 Subject: [PATCH 2/8] fix minor bugs, wrong input collection by default for HI --- .../HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc | 3 ++- RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc index cc232b0b5bfb4..d04b0e13e2cc4 100644 --- a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc +++ b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc @@ -5,7 +5,7 @@ // Original Author (of Derivative Producer): Eric Appelt // Created: Mon Apr 27, 2015 -#include +#include #include "FWCore/Framework/interface/Frameworkfwd.h" #include "FWCore/Framework/interface/EDProducer.h" @@ -168,6 +168,7 @@ ClusterCompatibilityProducer::produce(edm::Event& iEvent, const edm::EventSetup& reco::ClusterCompatibility ClusterCompatibilityProducer::getContainedHits(const std::vector &hits, double z0) const { + // Calculate number of hits contained in v-shaped window in cluster y-width vs. z-position. int n = 0; double chi = 0.; diff --git a/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py b/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py index 5123d7ee8af9b..9fbbe6ccc97e9 100644 --- a/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py +++ b/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py @@ -1,7 +1,7 @@ import FWCore.ParameterSet.Config as cms hiClusterCompatibility = cms.EDProducer("ClusterCompatibilityProducer", - inputTag = cms.InputTag( "hltSiPixelRecHits" ), + inputTag = cms.InputTag( "siPixelRecHits" ), saveTags = cms.bool( False ), minZ = cms.double(-20.0), maxZ = cms.double(20.05), From 16e9d4a0601ce30212f78b26eee8385d5d8fae5a Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 28 Apr 2015 14:16:45 -0500 Subject: [PATCH 3/8] dont try to find the best z position for the producer, just leave that to the filter. Extend default sweep from z=-40 to z=40. Add to HI RECO sequence. --- .../python/Reconstruction_HI_cff.py | 2 ++ .../plugins/ClusterCompatibilityProducer.cc | 31 ++----------------- .../python/ClusterCompatibility_cfi.py | 9 ------ .../python/HiClusterCompatibility_cfi.py | 0 4 files changed, 5 insertions(+), 37 deletions(-) delete mode 100644 RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py create mode 100644 RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py diff --git a/RecoHI/Configuration/python/Reconstruction_HI_cff.py b/RecoHI/Configuration/python/Reconstruction_HI_cff.py index a9fa0c9393414..89d485d747d60 100644 --- a/RecoHI/Configuration/python/Reconstruction_HI_cff.py +++ b/RecoHI/Configuration/python/Reconstruction_HI_cff.py @@ -22,6 +22,7 @@ # Heavy Ion Event Characterization from RecoHI.HiCentralityAlgos.HiCentrality_cfi import * +from RecoHI.HiCentralityAlgos.HiClusterCompatibility_cfi import * from RecoHI.HiEvtPlaneAlgos.HiEvtPlane_cfi import * # HCAL noise producer @@ -38,6 +39,7 @@ * hiEgammaSequence * hiParticleFlowReco * hiCentrality + * hiClusterCompatibility * hiEvtPlane * hcalnoise ) diff --git a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc index d04b0e13e2cc4..414dbd13dd0b5 100644 --- a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc +++ b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc @@ -131,34 +131,9 @@ ClusterCompatibilityProducer::produce(edm::Event& iEvent, const edm::EventSetup& vhits.push_back(vh); } - // get CompatibleHits for each z-position - // estimate best z-position from cluster lengths - double zest = 0.0; - reco::ClusterCompatibility chits; - int nhits = 0, nhits_max = 0; - double chi = 0.0, chi_max = 1e+9; - for(double z0 = minZ_; z0 <= maxZ_; z0 += zStep_) { - chits = getContainedHits(vhits, z0); - creco->push_back(chits); - nhits = chits.nHit(); - chi = chits.chi(); - if(nhits == 0) - continue; - if(nhits > nhits_max) { - chi_max = 1e+9; - nhits_max = nhits; - } - if(nhits >= nhits_max && chi < chi_max) { - chi_max = chi; - zest = z0; - } - } - - // make sure to also store best z-position +/- 10 cm - // if this is out of range - double zminus = zest - 10., zplus = zest + 10.; - if( zminus < minZ_ ) creco->push_back(getContainedHits(vhits, zminus)); - if( zplus > maxZ_ ) creco->push_back(getContainedHits(vhits, zplus)); + // produce ClusterCompatibility object for each z-position + for(double z0 = minZ_; z0 <= maxZ_; z0 += zStep_) + creco->push_back(getContainedHits(vhits, z0)); } iEvent.put(creco); diff --git a/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py b/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py deleted file mode 100644 index 9fbbe6ccc97e9..0000000000000 --- a/RecoHI/HiCentralityAlgos/python/ClusterCompatibility_cfi.py +++ /dev/null @@ -1,9 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -hiClusterCompatibility = cms.EDProducer("ClusterCompatibilityProducer", - inputTag = cms.InputTag( "siPixelRecHits" ), - saveTags = cms.bool( False ), - minZ = cms.double(-20.0), - maxZ = cms.double(20.05), - zStep = cms.double(0.2) -) diff --git a/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py b/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py new file mode 100644 index 0000000000000..e69de29bb2d1d From bde807698dbdf558aeba51895d266b9fb0978806 Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 28 Apr 2015 14:30:31 -0500 Subject: [PATCH 4/8] fix git renaming error --- .../python/HiClusterCompatibility_cfi.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py b/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py index e69de29bb2d1d..dfecc84225580 100644 --- a/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py +++ b/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py @@ -0,0 +1,9 @@ +import FWCore.ParameterSet.Config as cms + +hiClusterCompatibility = cms.EDProducer("ClusterCompatibilityProducer", + inputTag = cms.InputTag( "siPixelRecHits" ), + saveTags = cms.bool( False ), + minZ = cms.double(-40.0), + maxZ = cms.double(40.05), + zStep = cms.double(0.2) +) From a32f936361aafc409d4fabd00e6d19227aa8a8c2 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 29 Apr 2015 15:29:45 -0500 Subject: [PATCH 5/8] Reimplement ClusterCompatibility to include number of pixel clusters and avoid reliance on reco::Centrality object --- .../interface/ClusterCompatibility.h | 27 +++++++++------- .../HeavyIonEvent/src/ClusterCompatibility.cc | 20 ++++++------ DataFormats/HeavyIonEvent/src/classes.h | 3 -- DataFormats/HeavyIonEvent/src/classes_def.xml | 3 -- .../python/Reconstruction_HI_cff.py | 1 + .../plugins/ClusterCompatibilityProducer.cc | 32 ++++++++++++++----- 6 files changed, 52 insertions(+), 34 deletions(-) diff --git a/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h b/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h index 6d27f0c5f2b72..00ec0e821b0ff 100644 --- a/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h +++ b/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h @@ -7,23 +7,28 @@ namespace reco { class ClusterCompatibility { public: ClusterCompatibility(); - ClusterCompatibility(float z0, int nHit, float chi); virtual ~ClusterCompatibility(); - float z0() const { return z0_; } - int nHit() const { return nHit_; } - float chi() const { return chi_; } + int nValidPixelHits() const { return nValidPixelHits_; } + + int size() const { return z0_.size(); } + float z0(int i) const { return z0_[i]; } + int nHit(int i) const { return nHit_[i]; } + float chi(int i) const { return chi_[i]; } + + void append(float, int, float); + void setNValidPixelHits(int nPxl) { nValidPixelHits_ = nPxl; } protected: - - float z0_; - int nHit_; - float chi_; + -}; + int nValidPixelHits_; + + std::vector z0_; + std::vector nHit_; + std::vector chi_; -typedef std::vector ClusterCompatibilityCollection; +}; } - #endif diff --git a/DataFormats/HeavyIonEvent/src/ClusterCompatibility.cc b/DataFormats/HeavyIonEvent/src/ClusterCompatibility.cc index 3ffdc904b0e7f..47752e0443935 100644 --- a/DataFormats/HeavyIonEvent/src/ClusterCompatibility.cc +++ b/DataFormats/HeavyIonEvent/src/ClusterCompatibility.cc @@ -1,16 +1,18 @@ #include "DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h" using namespace reco; -ClusterCompatibility::ClusterCompatibility(float z0, int nHit, float chi): - z0_(z0), - nHit_(nHit), - chi_(chi) -{} - ClusterCompatibility::ClusterCompatibility(): - z0_(0.), - nHit_(0), - chi_(0.) + nValidPixelHits_(0), + z0_(), + nHit_(), + chi_() {} ClusterCompatibility::~ClusterCompatibility() {} + +void +ClusterCompatibility::append(float z0, int nHit, float chi) { + z0_.push_back(z0); + nHit_.push_back(nHit); + chi_.push_back(chi); +} diff --git a/DataFormats/HeavyIonEvent/src/classes.h b/DataFormats/HeavyIonEvent/src/classes.h index ad2fb1d829b4a..053911ef6d1a1 100644 --- a/DataFormats/HeavyIonEvent/src/classes.h +++ b/DataFormats/HeavyIonEvent/src/classes.h @@ -24,9 +24,6 @@ namespace DataFormats_HeavyIonEvent { reco::ClusterCompatibility clus_compat; edm::Wrapper w_clus_compat; - reco::ClusterCompatibilityCollection clus_compat_col; - edm::Wrapper w_clus_compat_col; - reco::VoronoiBackground vor; edm::Wrapper wvor; diff --git a/DataFormats/HeavyIonEvent/src/classes_def.xml b/DataFormats/HeavyIonEvent/src/classes_def.xml index 34802fb265cd6..78312f90d20d9 100644 --- a/DataFormats/HeavyIonEvent/src/classes_def.xml +++ b/DataFormats/HeavyIonEvent/src/classes_def.xml @@ -23,7 +23,4 @@ - - - diff --git a/RecoHI/Configuration/python/Reconstruction_HI_cff.py b/RecoHI/Configuration/python/Reconstruction_HI_cff.py index 89d485d747d60..90c4d79d2846c 100644 --- a/RecoHI/Configuration/python/Reconstruction_HI_cff.py +++ b/RecoHI/Configuration/python/Reconstruction_HI_cff.py @@ -53,6 +53,7 @@ * hiEgammaSequence * hiParticleFlowReco * hiCentrality + * hiClusterCompatibility * hiEvtPlane * hcalnoise ) diff --git a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc index 414dbd13dd0b5..6e2778eaa6b7c 100644 --- a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc +++ b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc @@ -58,7 +58,14 @@ class ClusterCompatibilityProducer : public edm::EDProducer { float w; }; - reco::ClusterCompatibility getContainedHits(const std::vector &hits, double z0) const; + struct ContainedHits + { + float z0; + int nHit; + float chi; + }; + + ContainedHits getContainedHits(const std::vector &hits, double z0) const; }; @@ -70,7 +77,7 @@ ClusterCompatibilityProducer::ClusterCompatibilityProducer(const edm::ParameterS { inputToken_ = consumes(inputTag_); LogDebug("") << "Using the " << inputTag_ << " input collection"; - produces(); + produces(); } ClusterCompatibilityProducer::~ClusterCompatibilityProducer() {} @@ -78,7 +85,7 @@ ClusterCompatibilityProducer::~ClusterCompatibilityProducer() {} void ClusterCompatibilityProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { - std::auto_ptr creco(new reco::ClusterCompatibilityCollection()); + std::auto_ptr creco(new reco::ClusterCompatibility()); // get hold of products from Event edm::Handle hRecHits; @@ -130,10 +137,15 @@ ClusterCompatibilityProducer::produce(edm::Event& iEvent, const edm::EventSetup& vh.w = hit->cluster()->sizeY(); vhits.push_back(vh); } + + creco->setNValidPixelHits(nPxlHits); - // produce ClusterCompatibility object for each z-position - for(double z0 = minZ_; z0 <= maxZ_; z0 += zStep_) - creco->push_back(getContainedHits(vhits, z0)); + // append cluster compatibility for each z-position + for(double z0 = minZ_; z0 <= maxZ_; z0 += zStep_) + { + ContainedHits c = getContainedHits(vhits, z0); + creco->append(c.z0, c.nHit, c.chi); + } } iEvent.put(creco); @@ -141,7 +153,7 @@ ClusterCompatibilityProducer::produce(edm::Event& iEvent, const edm::EventSetup& } -reco::ClusterCompatibility ClusterCompatibilityProducer::getContainedHits(const std::vector &hits, double z0) const +ClusterCompatibilityProducer::ContainedHits ClusterCompatibilityProducer::getContainedHits(const std::vector &hits, double z0) const { // Calculate number of hits contained in v-shaped window in cluster y-width vs. z-position. @@ -155,7 +167,11 @@ reco::ClusterCompatibility ClusterCompatibilityProducer::getContainedHits(const n++; } } - return reco::ClusterCompatibility(z0, n, chi); + ClusterCompatibilityProducer::ContainedHits output; + output.z0 = z0; + output.nHit = n; + output.chi = chi; + return output; } // ------------ method called once each job just before starting event loop ------------ From bedfcd09930f3f385f8608e6da9543a068e43c1f Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 5 May 2015 19:21:16 +0200 Subject: [PATCH 6/8] add to event content, remove unused parameter --- RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py | 1 - .../python/RecoHiCentrality_EventContent_cff.py | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py b/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py index dfecc84225580..f364958bbb04e 100644 --- a/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py +++ b/RecoHI/HiCentralityAlgos/python/HiClusterCompatibility_cfi.py @@ -2,7 +2,6 @@ hiClusterCompatibility = cms.EDProducer("ClusterCompatibilityProducer", inputTag = cms.InputTag( "siPixelRecHits" ), - saveTags = cms.bool( False ), minZ = cms.double(-40.0), maxZ = cms.double(40.05), zStep = cms.double(0.2) diff --git a/RecoHI/HiCentralityAlgos/python/RecoHiCentrality_EventContent_cff.py b/RecoHI/HiCentralityAlgos/python/RecoHiCentrality_EventContent_cff.py index af89a6b4ee73c..f11d92f5a580d 100644 --- a/RecoHI/HiCentralityAlgos/python/RecoHiCentrality_EventContent_cff.py +++ b/RecoHI/HiCentralityAlgos/python/RecoHiCentrality_EventContent_cff.py @@ -2,12 +2,15 @@ RecoHiCentralityFEVT = cms.PSet( outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*') + outputCommands = cms.untracked.vstring('keep recoClusterCompatibility*_hiClusterCompatibility_*_*') ) RecoHiCentralityRECO = cms.PSet( outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*') + outputCommands = cms.untracked.vstring('keep recoClusterCompatibility*_hiClusterCompatibility_*_*') ) RecoHiCentralityAOD = cms.PSet( outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*') + outputCommands = cms.untracked.vstring('keep recoClusterCompatibility*_hiClusterCompatibility_*_*') ) From 10dcd674f4a33bfaf0ca07f5d332d152c9411297 Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 5 May 2015 19:58:21 +0200 Subject: [PATCH 7/8] fix incorrect python syntax for EventContent --- .../python/RecoHiCentrality_EventContent_cff.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/RecoHI/HiCentralityAlgos/python/RecoHiCentrality_EventContent_cff.py b/RecoHI/HiCentralityAlgos/python/RecoHiCentrality_EventContent_cff.py index f11d92f5a580d..a08034d4d09ac 100644 --- a/RecoHI/HiCentralityAlgos/python/RecoHiCentrality_EventContent_cff.py +++ b/RecoHI/HiCentralityAlgos/python/RecoHiCentrality_EventContent_cff.py @@ -1,16 +1,16 @@ import FWCore.ParameterSet.Config as cms RecoHiCentralityFEVT = cms.PSet( - outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*') - outputCommands = cms.untracked.vstring('keep recoClusterCompatibility*_hiClusterCompatibility_*_*') + outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*', + 'keep recoClusterCompatibility*_hiClusterCompatibility_*_*') ) RecoHiCentralityRECO = cms.PSet( - outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*') - outputCommands = cms.untracked.vstring('keep recoClusterCompatibility*_hiClusterCompatibility_*_*') + outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*', + 'keep recoClusterCompatibility*_hiClusterCompatibility_*_*') ) RecoHiCentralityAOD = cms.PSet( - outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*') - outputCommands = cms.untracked.vstring('keep recoClusterCompatibility*_hiClusterCompatibility_*_*') + outputCommands = cms.untracked.vstring('keep recoCentrality*_hiCentrality_*_*', + 'keep recoClusterCompatibility*_hiClusterCompatibility_*_*') ) From 94eda2aed8f1cebe0f4a8c281001b0f26667dbe0 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 13 May 2015 23:03:25 +0200 Subject: [PATCH 8/8] Comment DataFormat variables for Doxygen, update ClusterCompatibilityProducer to edm::stream::EDProducer, improve comment formatting, remove spurious if(1) --- .../interface/ClusterCompatibility.h | 11 ++++ .../plugins/ClusterCompatibilityProducer.cc | 56 ++++++++----------- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h b/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h index 00ec0e821b0ff..6d2af04b0708f 100644 --- a/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h +++ b/DataFormats/HeavyIonEvent/interface/ClusterCompatibility.h @@ -9,11 +9,22 @@ namespace reco { class ClusterCompatibility { ClusterCompatibility(); virtual ~ClusterCompatibility(); + /// Number of valid pixel clusters int nValidPixelHits() const { return nValidPixelHits_; } + /// Number of vertex-position hypotheses tested int size() const { return z0_.size(); } + + /// Vertex z position for the i-th vertex-position hypothesis float z0(int i) const { return z0_[i]; } + + /// Number of compatible non-edge pixel-barrel clusters + /// for the i-th vertex-position hypothesis int nHit(int i) const { return nHit_[i]; } + + /// Sum of the difference between the expected and actual + /// width of all compatible non-edge pixel-barrel clusters + /// for the i-th vertex-position hypothesis float chi(int i) const { return chi_[i]; } void append(float, int, float); diff --git a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc index 6e2778eaa6b7c..ab61679c4bc50 100644 --- a/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc +++ b/RecoHI/HiCentralityAlgos/plugins/ClusterCompatibilityProducer.cc @@ -8,7 +8,7 @@ #include #include "FWCore/Framework/interface/Frameworkfwd.h" -#include "FWCore/Framework/interface/EDProducer.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/Framework/interface/ESHandle.h" @@ -34,16 +34,15 @@ // class declaration // -class ClusterCompatibilityProducer : public edm::EDProducer { +class ClusterCompatibilityProducer : public edm::stream::EDProducer<> { public: explicit ClusterCompatibilityProducer(const edm::ParameterSet&); ~ClusterCompatibilityProducer(); - private: - virtual void beginJob() override ; virtual void produce(edm::Event&, const edm::EventSetup&) override; - virtual void endJob() override ; + + private: edm::EDGetTokenT inputToken_; edm::InputTag inputTag_; // input tag identifying product containing pixel clusters @@ -110,22 +109,20 @@ ClusterCompatibilityProducer::produce(edm::Event& iEvent, const edm::EventSetup& if(id.subdetId() != int(PixelSubdetector::PixelBarrel)) continue; const PixelGeomDetUnit *pgdu = static_cast(tgeo->idToDet(id)); - if (1) { - const PixelTopology *pixTopo = &(pgdu->specificTopology()); - std::vector pixels(hit->cluster()->pixels()); - bool pixelOnEdge = false; - for(std::vector::const_iterator pixel = pixels.begin(); - pixel != pixels.end(); ++pixel) { - int pixelX = pixel->x; - int pixelY = pixel->y; - if(pixTopo->isItEdgePixelInX(pixelX) || pixTopo->isItEdgePixelInY(pixelY)) { - pixelOnEdge = true; - break; - } + const PixelTopology *pixTopo = &(pgdu->specificTopology()); + std::vector pixels(hit->cluster()->pixels()); + bool pixelOnEdge = false; + for(std::vector::const_iterator pixel = pixels.begin(); + pixel != pixels.end(); ++pixel) { + int pixelX = pixel->x; + int pixelY = pixel->y; + if(pixTopo->isItEdgePixelInX(pixelX) || pixTopo->isItEdgePixelInY(pixelY)) { + pixelOnEdge = true; + break; } - if (pixelOnEdge) - continue; } + if (pixelOnEdge) + continue; LocalPoint lpos = LocalPoint(hit->localPosition().x(), hit->localPosition().y(), @@ -161,8 +158,12 @@ ClusterCompatibilityProducer::ContainedHits ClusterCompatibilityProducer::getCon double chi = 0.; for(std::vector::const_iterator hit = hits.begin(); hit!= hits.end(); hit++) { - double p = 2 * fabs(hit->z - z0)/hit->r + 0.5; // FIXME <- this comment from the HLT filter, need - if(fabs(p - hit->w) <= 1.) { // to understand what it means + // the calculation of the predicted cluster width p was + // marked 'FIXME' in the HLTPixelClusterShapeFilter. It should + // be revisited but is retained as it was for compatibility with the + // older filter. + double p = 2 * fabs(hit->z - z0)/hit->r + 0.5; + if(fabs(p - hit->w) <= 1.) { chi += fabs(p - hit->w); n++; } @@ -174,18 +175,5 @@ ClusterCompatibilityProducer::ContainedHits ClusterCompatibilityProducer::getCon return output; } -// ------------ method called once each job just before starting event loop ------------ -void -ClusterCompatibilityProducer::beginJob() -{ -} - -// ------------ method called once each job just after ending the event loop ------------ -void -ClusterCompatibilityProducer::endJob() -{ -} - - //define this as a plug-in DEFINE_FWK_MODULE(ClusterCompatibilityProducer);