From b483be74db18e957f46b554031031d5b006d654c Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 13 Oct 2021 15:54:43 -0500 Subject: [PATCH] Initial implementation --- DataFormats/MuonReco/src/classes.h | 1 + DataFormats/MuonReco/src/classes_def.xml | 7 + .../MuonShowerProducer/plugins/BuildFile.xml | 8 + .../plugins/CSCRechitClusterProducer.cc | 221 ++++++++++++++++++ .../python/cscRechitCluster_cfi.py | 3 + 5 files changed, 240 insertions(+) create mode 100644 RecoMuon/MuonShowerProducer/plugins/BuildFile.xml create mode 100644 RecoMuon/MuonShowerProducer/plugins/CSCRechitClusterProducer.cc create mode 100644 RecoMuon/MuonShowerProducer/python/cscRechitCluster_cfi.py diff --git a/DataFormats/MuonReco/src/classes.h b/DataFormats/MuonReco/src/classes.h index a9b8eb5c5bb17..ef65bcea264e9 100644 --- a/DataFormats/MuonReco/src/classes.h +++ b/DataFormats/MuonReco/src/classes.h @@ -20,6 +20,7 @@ #include "DataFormats/MuonReco/interface/MuonQuality.h" #include "DataFormats/MuonReco/interface/MuonCosmicCompatibility.h" #include "DataFormats/MuonReco/interface/MuonShower.h" +#include "DataFormats/MuonReco/interface/MuonShowerRechitCluster.h" #include "DataFormats/MuonReco/interface/MuonToMuonMap.h" #include "DataFormats/TrackReco/interface/Track.h" #include "DataFormats/Common/interface/AssociationMap.h" diff --git a/DataFormats/MuonReco/src/classes_def.xml b/DataFormats/MuonReco/src/classes_def.xml index 1184cdbbd1e46..ac62d822ba7f5 100644 --- a/DataFormats/MuonReco/src/classes_def.xml +++ b/DataFormats/MuonReco/src/classes_def.xml @@ -164,6 +164,13 @@ initial version number of a class which has never been stored before. + + + + + + + diff --git a/RecoMuon/MuonShowerProducer/plugins/BuildFile.xml b/RecoMuon/MuonShowerProducer/plugins/BuildFile.xml new file mode 100644 index 0000000000000..764b1cc68ad01 --- /dev/null +++ b/RecoMuon/MuonShowerProducer/plugins/BuildFile.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/RecoMuon/MuonShowerProducer/plugins/CSCRechitClusterProducer.cc b/RecoMuon/MuonShowerProducer/plugins/CSCRechitClusterProducer.cc new file mode 100644 index 0000000000000..0697e34b20239 --- /dev/null +++ b/RecoMuon/MuonShowerProducer/plugins/CSCRechitClusterProducer.cc @@ -0,0 +1,221 @@ +// -*- C++ -*- +// +// Package: RecoMuon/MuonShowerProducer +// Class: MuonShowerProducer +// +/**\class MuonShowerProducer MuonShowerProducer.cc RecoMuon/MuonShowerProducer/plugins/MuonShowerProducer.cc + + Description: [one line class summary] + + Implementation: + [Notes on implementation] +*/ +// +// Original Author: Ka Hei Martin Kwok +// Created: Mon, 11 Oct 2021 19:52:09 GMT +// +// + + +// system include files +#include +#include + +// user include files +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/StreamID.h" + +#include "DataFormats/Common/interface/Ptr.h" +#include "DataFormats/Math/interface/deltaPhi.h" +#include +#include +#include "DataFormats/MuonReco/interface/MuonShowerRechitCluster.h" +#include "Geometry/CSCGeometry/interface/CSCGeometry.h" +#include "Geometry/Records/interface/MuonGeometryRecord.h" +#include "DataFormats/MuonDetId/interface/CSCDetId.h" + +#include "fastjet/JetDefinition.hh" +#include "fastjet/ClusterSequence.hh" +#include "fastjet/PseudoJet.hh" +// +// class declaration +// + +class CSCRechitClusterProducer : public edm::stream::EDProducer<> { + public: + explicit CSCRechitClusterProducer(const edm::ParameterSet&); + ~CSCRechitClusterProducer(); + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + + private: + virtual void produce(edm::Event&, const edm::EventSetup&) override; + edm::EDGetTokenT cscRechitInputToken_; + const edm::ESGetToken m_cscGeometryToken; + typedef std::vector MuonShowerRechitClusterCollection; + + // ----------member data --------------------------- + protected: + + std::vector > inputs_; + std::vector > getConstituents(const std::vector& fjConstituents); +}; + +// +// constants, enums and typedefs +// + +// +// static data member definitions +// + +// +// constructors and destructor +// +CSCRechitClusterProducer::CSCRechitClusterProducer(const edm::ParameterSet& iConfig) + : m_cscGeometryToken(esConsumes()) +{ + + cscRechitInputToken_ = consumes(edm::InputTag("csc2DRecHits")), + + produces(); + +} + + +CSCRechitClusterProducer::~CSCRechitClusterProducer(){ +} + + +// +// member functions +// + +// ------------ method called to produce the data ------------ +void +CSCRechitClusterProducer::produce(edm::Event& ev, const edm::EventSetup& iSetup) +{ + edm::ESHandle cscG; + cscG = iSetup.getHandle(m_cscGeometryToken); + + edm::Handle cscRechits; + + ev.getByToken(cscRechitInputToken_,cscRechits); + + std::vector fjInput; + + fastjet::JetDefinition jet_def(fastjet::cambridge_algorithm, 0.4); + + int nRecHits = cscRechits->size(); + CSCRecHit2DCollection::const_iterator recIt; + +// for (size_t i=0; i< cscRechits->size(); ++i) { +// inputs_.push_back( (*cscRechits)[i] ); +// } + for (recIt = cscRechits->begin(); recIt != cscRechits->end(); recIt++) { + auto cscRechit = (*recIt); + LocalPoint cscRecHitLocalPosition = cscRechit.localPosition(); + CSCDetId cscdetid = cscRechit.cscDetId(); + const CSCChamber* cscchamber = cscG->chamber(cscdetid); + if (cscchamber) { + GlobalPoint globalPosition = cscchamber->toGlobal(cscRecHitLocalPosition); + float x = globalPosition.x(); + float y = globalPosition.y(); + float z = globalPosition.z(); + //TODO: Find a way to construct edm::Ptr + //edm::Ptr ptr = edm::Ptr(&cscRechit); + //inputs_.push_back( ptr ); + fjInput.push_back(fastjet::PseudoJet( x, y, z, 1.0)); + fjInput.back().set_user_index(recIt-cscRechits->begin()); + } + } + fastjet::ClusterSequence clus_seq ( fjInput , jet_def); + + double ptmin = 0.0; + std::vector fjJets = fastjet::sorted_by_pt(clus_seq.inclusive_jets(ptmin)); + + auto CSCclusters = std::make_unique(fjJets.size()); + if (!fjJets.empty()){ + for (unsigned int ijet = 0; ijet < fjJets.size(); ++ijet) { + + // get the fastjet jet + const fastjet::PseudoJet& fjJet = fjJets[ijet]; + // get the constituents from fastjet + std::vector const& fjConstituents = fastjet::sorted_by_pt(fjJet.constituents()); + + std::vector > const& rechits = getConstituents(fjConstituents); + + //Derive cluster properties + float time=0;float eta=0;float phi=0; + float x=0;float y=0;float z=0; + int nME11_12 =0; + for (auto & rechit : rechits){ + + LocalPoint cscRecHitLocalPosition = (*rechit).localPosition(); + CSCDetId cscdetid = (*rechit).cscDetId(); + const CSCChamber* cscchamber = cscG->chamber(cscdetid()); + int endcap = CSCDetId::endcap(cscdetid) == 1 ? 1 : -1; + GlobalPoint globalPosition = cscchamber->toGlobal(cscRecHitLocalPosition); + x += globalPosition.x(); + y += globalPosition.y(); + z += globalPosition.z(); + + int chamber = endcap * (CSCDetId::station(cscdetid)*10 + CSCDetId::ring(cscdetid)); + if( abs(chamber)==11 || abs(chamber)==12) nME11_12++; + time+= (*rechit).tpeak() + (*rechit).wireTime(); + } + x = x/rechits.size(); + y = y/rechits.size(); + z = z/rechits.size(); + phi = std::atan(y/x); + if (x < 0.0){ + phi = M_PI + phi; + } + phi = deltaPhi(phi,0.0); + eta = asinhf( z / std::sqrt(x * x + y* y)); + time = time/(2*rechits.size()); + + reco::MuonShowerRechitCluster cls(eta,phi,x,y,z,time,rechits.size(),nME11_12); + //for (auto & rechit : rechits){ + // cls.addDaughter(rechit); + //} + + CSCclusters->push_back(cls); + } + } + ev.put(std::move(CSCclusters)); + +} + +std::vector > CSCRechitClusterProducer::getConstituents(const std::vector& fjConstituents) { + + std::vector> result; + result.reserve(fjConstituents.size() / 2); + for (unsigned int i = 0; i < fjConstituents.size(); i++) { + auto index = fjConstituents[i].user_index(); + if (index >= 0 && static_cast(index) < inputs_.size()) { + result.emplace_back(inputs_[index]); + } + } + return result; +} + +// ------------ method fills 'descriptions' with the allowed parameters for the module ------------ +void +CSCRechitClusterProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + //The following says we do not know what parameters are allowed so do no validation + // Please change this to state exactly what you do use, even if it is no parameters + edm::ParameterSetDescription desc; + desc.setUnknown(); + descriptions.addDefault(desc); +} + +//define this as a plug-in +DEFINE_FWK_MODULE(CSCRechitClusterProducer); diff --git a/RecoMuon/MuonShowerProducer/python/cscRechitCluster_cfi.py b/RecoMuon/MuonShowerProducer/python/cscRechitCluster_cfi.py new file mode 100644 index 0000000000000..3a823f60d2f2c --- /dev/null +++ b/RecoMuon/MuonShowerProducer/python/cscRechitCluster_cfi.py @@ -0,0 +1,3 @@ +import FWCore.ParameterSet.Config as cms + +cscRechitClusters = cms.EDProducer("CSCRechitClusterProducer")