Skip to content

Commit

Permalink
modification without touching the standard code
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaellopesdesa committed Jan 25, 2017
1 parent 9df170b commit c6cc8eb
Show file tree
Hide file tree
Showing 45 changed files with 2,002 additions and 568 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import FWCore.ParameterSet.Config as cms

gsFixedRefinedSuperClusters = cms.EDProducer("EGRefinedSCFixer",
orgRefinedSC = cms.InputTag("particleFlowEGamma", '', cms.InputTag.skipCurrentProcess()),
orgSC = cms.InputTag("particleFlowSuperClusterECAL", '', cms.InputTag.skipCurrentProcess()),
fixedSC = cms.InputTag("particleFlowSuperClusterECALGSFixed"),
fixedPFClusters = cms.InputTag("particleFlowClusterECALGSFixed"),
)
340 changes: 209 additions & 131 deletions RecoEcal/EgammaClusterProducers/src/EGRefinedSCFixer.cc

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@
#include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
#include "DataFormats/EcalDetId/interface/EcalSubdetector.h"

#include "Geometry/CaloTopology/interface/CaloTopology.h"
#include "Geometry/Records/interface/CaloTopologyRecord.h"

#include "RecoCaloTools/Navigation/interface/CaloNavigator.h"

#include "RecoEgamma/EgammaTools/interface/GainSwitchTools.h"
Expand All @@ -39,24 +36,27 @@ class GsfElectronCoreGSCrysFixer : public edm::stream::EDProducer<> {
virtual ~GsfElectronCoreGSCrysFixer(){}

void produce(edm::Event&, const edm::EventSetup& ) override;
void beginLuminosityBlock(edm::LuminosityBlock const&,
edm::EventSetup const&) override;


template<typename T>
void getToken(edm::EDGetTokenT<T>& token,const edm::ParameterSet& pset,const std::string& label){
token=consumes<T>(pset.getParameter<edm::InputTag>(label));
void getToken(edm::EDGetTokenT<T>& token,const edm::ParameterSet& pset,const std::string& label, const std::string& instance = ""){
auto tag(pset.getParameter<edm::InputTag>(label));
if (!instance.empty())
tag = edm::InputTag(tag.label(), instance, tag.process());

token = consumes<T>(tag);
}
private:
typedef edm::ValueMap<reco::SuperClusterRef> SCRefMap;

edm::EDGetTokenT<reco::GsfElectronCoreCollection> orgCoresToken_;
edm::EDGetTokenT<EcalRecHitCollection> ebRecHitsToken_;
edm::EDGetTokenT<edm::ValueMap<reco::SuperClusterRef> > oldRefinedSCToNewMapToken_;
edm::EDGetTokenT<edm::ValueMap<reco::SuperClusterRef> > oldSCToNewMapToken_;
const CaloTopology* topology_;

edm::EDGetTokenT<reco::SuperClusterCollection> refinedSCsToken_; // new
edm::EDGetTokenT<SCRefMap> refinedSCMapToken_; // new->old
edm::EDGetTokenT<reco::SuperClusterCollection> ebSCsToken_; // new
edm::EDGetTokenT<SCRefMap> ebSCMapToken_; // new->old
edm::EDGetTokenT<reco::SuperClusterCollection> eeSCsToken_; // new
edm::EDGetTokenT<SCRefMap> eeSCMapToken_; // new->old
};


namespace {
template<typename T> edm::Handle<T> getHandle(const edm::Event& iEvent,const edm::EDGetTokenT<T>& token){
edm::Handle<T> handle;
Expand All @@ -69,59 +69,59 @@ namespace {
GsfElectronCoreGSCrysFixer::GsfElectronCoreGSCrysFixer( const edm::ParameterSet & pset )
{
getToken(orgCoresToken_,pset,"orgCores");
getToken(ebRecHitsToken_,pset,"ebRecHits");
getToken(oldRefinedSCToNewMapToken_,pset,"oldRefinedSCToNewMap");
getToken(oldSCToNewMapToken_,pset,"oldSCToNewMap");
getToken(refinedSCsToken_, pset, "refinedSCs");
getToken(refinedSCMapToken_, pset, "refinedSCs");
getToken(ebSCsToken_, pset, "scs", "particleFlowSuperClusterECALBarrel");
getToken(ebSCMapToken_, pset, "refinedSCs", "parentSCsEB");
getToken(eeSCsToken_, pset, "scs", "particleFlowSuperClusterECALEndcapWithPreshower");
getToken(eeSCMapToken_, pset, "refinedSCs", "parentSCsEE");

produces<reco::GsfElectronCoreCollection >();
produces<edm::ValueMap<reco::SuperClusterRef> >("parentCores");
produces<SCRefMap>(); // new core to old SC
}


void GsfElectronCoreGSCrysFixer::produce( edm::Event & iEvent, const edm::EventSetup & iSetup )
void GsfElectronCoreGSCrysFixer::produce(edm::Event & iEvent, const edm::EventSetup &)
{
auto outCores = std::make_unique<reco::GsfElectronCoreCollection>();

auto eleCoresHandle = getHandle(iEvent,orgCoresToken_);
auto& ebRecHits = *getHandle(iEvent,ebRecHitsToken_);
auto& oldRefinedSCToNewMap = *getHandle(iEvent,oldRefinedSCToNewMapToken_);
auto& oldSCToNewMap = *getHandle(iEvent,oldSCToNewMapToken_);
auto refinedSCs(getHandle(iEvent, refinedSCsToken_));
auto& refinedSCMap(*getHandle(iEvent, refinedSCMapToken_));
auto ebSCs(getHandle(iEvent, ebSCsToken_));
auto& ebSCMap(*getHandle(iEvent, ebSCMapToken_));
auto eeSCs(getHandle(iEvent, eeSCsToken_));
auto& eeSCMap(*getHandle(iEvent, eeSCMapToken_));

std::vector<reco::SuperClusterRef> oldSCRefs;

std::vector<reco::SuperClusterRef> parentCores;

for(size_t coreNr=0;coreNr<eleCoresHandle->size();coreNr++){
reco::GsfElectronCoreRef coreRef(eleCoresHandle,coreNr);
const reco::GsfElectronCore& core = *coreRef;

//passing in the old refined supercluster
if(GainSwitchTools::hasEBGainSwitchIn5x5(*core.superCluster(),&ebRecHits,topology_)){
reco::GsfElectronCore newCore(core);
//these references may be null, lets see what happens!
//turns out the orginal ele may have null references, odd
if(core.superCluster().isNonnull()) newCore.setSuperCluster( oldRefinedSCToNewMap[core.superCluster()] );
if(core.parentSuperCluster().isNonnull()) newCore.setParentSuperCluster( oldSCToNewMap[core.parentSuperCluster()] );

outCores->push_back(newCore);
parentCores.push_back(coreRef->superCluster());
for (auto& inCore : *eleCoresHandle) {
outCores->emplace_back(inCore);
auto& outCore(outCores->back());

// NOTE: These mappings can result in NULL superclusters!
auto& oldRefinedSC(inCore.superCluster());
outCore.setSuperCluster(GainSwitchTools::findNewRef(oldRefinedSC, refinedSCs, refinedSCMap));

oldSCRefs.push_back(oldRefinedSC);

auto& parentSC(inCore.parentSuperCluster());
if (parentSC.isNonnull()) {
if (parentSC->seed()->seed().subdetId() == EcalBarrel)
outCore.setParentSuperCluster(GainSwitchTools::findNewRef(parentSC, ebSCs, ebSCMap));
else
outCore.setParentSuperCluster(GainSwitchTools::findNewRef(parentSC, eeSCs, eeSCMap));
}
}

auto outCoresHandle = iEvent.put(std::move(outCores));

std::unique_ptr<edm::ValueMap<reco::SuperClusterRef> > parentCoresValMap(new edm::ValueMap<reco::SuperClusterRef>());
typename edm::ValueMap<reco::SuperClusterRef>::Filler filler(*parentCoresValMap);
filler.insert(outCoresHandle, parentCores.begin(), parentCores.end());
filler.fill();
iEvent.put(std::move(parentCoresValMap),"parentCores");
}
auto newCoresHandle(iEvent.put(std::move(outCores)));

void GsfElectronCoreGSCrysFixer::beginLuminosityBlock(edm::LuminosityBlock const& lb,
edm::EventSetup const& es) {
edm::ESHandle<CaloTopology> caloTopo ;
es.get<CaloTopologyRecord>().get(caloTopo);
topology_ = caloTopo.product();
std::auto_ptr<SCRefMap> pRefMap(new SCRefMap);
SCRefMap::Filler refMapFiller(*pRefMap);
refMapFiller.insert(newCoresHandle, oldSCRefs.begin(), oldSCRefs.end());
refMapFiller.fill();
iEvent.put(pRefMap);
}


DEFINE_FWK_MODULE(GsfElectronCoreGSCrysFixer);
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,21 @@ class GsfElectronGSCrysFixer : public edm::stream::EDProducer<> {


template<typename T>
void getToken(edm::EDGetTokenT<T>& token,const edm::ParameterSet& pset,const std::string& label){
token=consumes<T>(pset.getParameter<edm::InputTag>(label));
void getToken(edm::EDGetTokenT<T>& token,const edm::ParameterSet& pset,const std::string& label, const std::string& instance = ""){
auto tag(pset.getParameter<edm::InputTag>(label));
if (!instance.empty())
tag = edm::InputTag(tag.label(), instance, tag.process());

token = consumes<T>(tag);
}
private:
edm::EDGetTokenT<reco::GsfElectronCollection> oldGsfElesToken_;
typedef edm::View<reco::GsfElectron> GsfElectronView;
typedef edm::ValueMap<reco::SuperClusterRef> SCRefMap;

edm::EDGetTokenT<GsfElectronView> oldGsfElesToken_;
edm::EDGetTokenT<reco::GsfElectronCoreCollection> newCoresToken_;
edm::EDGetTokenT<SCRefMap> newCoresToOldSCMapToken_;
edm::EDGetTokenT<EcalRecHitCollection> ebRecHitsToken_;
edm::EDGetTokenT<edm::ValueMap<reco::SuperClusterRef> > newCoresToOldCoresMapToken_;

const CaloTopology* topology_;
const CaloGeometry* geometry_;
Expand All @@ -73,15 +80,16 @@ namespace {
}
}



typedef edm::ValueMap<reco::GsfElectronRef> ElectronRefMap;
typedef edm::ValueMap<bool> BoolMap;

GsfElectronGSCrysFixer::GsfElectronGSCrysFixer( const edm::ParameterSet & pset )
{
getToken(newCoresToken_,pset,"newCores");
getToken(oldGsfElesToken_,pset,"oldEles");
getToken(newCoresToken_,pset,"newCores");
getToken(newCoresToOldSCMapToken_, pset, "newCores");
getToken(ebRecHitsToken_,pset,"ebRecHits");
getToken(newCoresToOldCoresMapToken_,pset,"newCoresToOldCoresMap");

//ripped wholesale from GEDGsfElectronFinalizer
if( pset.existsAs<edm::ParameterSet>("regressionConfig") ) {
Expand All @@ -97,21 +105,20 @@ GsfElectronGSCrysFixer::GsfElectronGSCrysFixer( const edm::ParameterSet & pset )
}

produces<reco::GsfElectronCollection >();
// new -> old
produces<ElectronRefMap>();
produces<BoolMap>();

}

namespace {

reco::GsfElectronCoreRef getNewCore(const reco::GsfElectronRef& oldEle,
reco::GsfElectronCoreRef getNewCore(reco::GsfElectron const& oldEle,
edm::Handle<reco::GsfElectronCoreCollection>& newCores,
edm::ValueMap<reco::SuperClusterRef> newToOldCoresMap)
edm::ValueMap<reco::SuperClusterRef> const& newToOldCoresMap)
{
for(size_t coreNr=0;coreNr<newCores->size();coreNr++){
reco::GsfElectronCoreRef coreRef(newCores,coreNr);
auto oldRef = newToOldCoresMap[coreRef];
if( oldRef.isNonnull() && oldRef==oldEle->superCluster()){
if( oldRef.isNonnull() && oldRef==oldEle.superCluster()){
return coreRef;
}
}
Expand All @@ -127,61 +134,47 @@ void GsfElectronGSCrysFixer::produce( edm::Event & iEvent, const edm::EventSetup
gedRegression_->setEvent(iEvent);
gedRegression_->setEventContent(iSetup);
}


auto elesHandle = getHandle(iEvent,oldGsfElesToken_);
auto& ebRecHits = *getHandle(iEvent,ebRecHitsToken_);
auto& newCoresToOldCoresMap = *getHandle(iEvent,newCoresToOldCoresMapToken_);
auto newCoresHandle = getHandle(iEvent,newCoresToken_);
auto newCoresToOldSCMap = *getHandle(iEvent, newCoresToOldSCMapToken_);

std::vector<reco::GsfElectronRef> oldElectrons;
std::vector<bool> isUpdated;

for(size_t eleNr=0;eleNr<elesHandle->size();eleNr++){
reco::GsfElectronRef eleRef(elesHandle,eleNr);
oldElectrons.emplace_back(eleRef);

reco::GsfElectronCoreRef newCoreRef = getNewCore(eleRef,newCoresHandle,newCoresToOldCoresMap);

if(newCoreRef.isNonnull()){ //okay we have to remake the electron
unsigned iE(0);
for (auto& oldEle : *elesHandle) {
auto&& refToBase(elesHandle->refAt(iE++));
oldElectrons.emplace_back(refToBase.id(), &oldEle, refToBase.key());

reco::GsfElectronCoreRef newCoreRef = getNewCore(oldEle,newCoresHandle,newCoresToOldSCMap);

outEles->emplace_back(oldEle,newCoreRef);
auto& newEle(outEles->back());

if (GainSwitchTools::hasEBGainSwitchIn5x5(*oldEle.superCluster(), &ebRecHits, topology_)) {

reco::GsfElectron newEle(*eleRef,newCoreRef);
reco::GsfElectron::ShowerShape full5x5ShowerShape = GainSwitchTools::redoEcalShowerShape<true>(newEle.full5x5_showerShape(),newEle.superCluster(),&ebRecHits,topology_,geometry_);
reco::GsfElectron::ShowerShape showerShape = GainSwitchTools::redoEcalShowerShape<false>(newEle.showerShape(),newEle.superCluster(),&ebRecHits,topology_,geometry_);
newEle.full5x5_setShowerShape(full5x5ShowerShape);
newEle.setShowerShape(showerShape);

float eNewSCOverEOldSC = newEle.superCluster()->energy()/eleRef->superCluster()->energy();
float eNewSCOverEOldSC = newEle.superCluster()->energy()/oldEle.superCluster()->energy();
GainSwitchTools::correctHadem(showerShape,eNewSCOverEOldSC,GainSwitchTools::ShowerShapeType::Fractions);
GainSwitchTools::correctHadem(full5x5ShowerShape,eNewSCOverEOldSC,GainSwitchTools::ShowerShapeType::Full5x5);

newEle.full5x5_setShowerShape(full5x5ShowerShape);
newEle.setShowerShape(showerShape);

if( gedRegression_ ) {
if( gedRegression_ )
gedRegression_->modifyObject(newEle);
}

// std::cout <<"made a new electron "<<newEle.ecalEnergy()<<" old "<<eleRef->ecalEnergy()<<std::endl;

outEles->push_back(newEle);
isUpdated.emplace_back(true);
}else{
outEles->push_back(*eleRef);
isUpdated.emplace_back(false);
}
}

auto&& newElectronsHandle(iEvent.put(std::move(outEles)));
std::unique_ptr<ElectronRefMap> pRefMap(new ElectronRefMap);

std::auto_ptr<ElectronRefMap> pRefMap(new ElectronRefMap);
ElectronRefMap::Filler refMapFiller(*pRefMap);
refMapFiller.insert(newElectronsHandle, oldElectrons.begin(), oldElectrons.end());
refMapFiller.fill();
iEvent.put(std::move(pRefMap));
std::unique_ptr<BoolMap> bRefMap(new BoolMap);
BoolMap::Filler boolMapFiller(*bRefMap);
boolMapFiller.insert(newElectronsHandle, isUpdated.begin(), isUpdated.end());
boolMapFiller.fill();
iEvent.put(std::move(bRefMap));

iEvent.put(pRefMap);
}

void GsfElectronGSCrysFixer::beginLuminosityBlock(edm::LuminosityBlock const& lb,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import FWCore.ParameterSet.Config as cms

gsFixedGsfElectronCores = cms.EDProducer("GsfElectronCoreGSCrysFixer",
orgCores=cms.InputTag("gedGsfElectronCores",processName=cms.InputTag.skipCurrentProcess()),
ebRecHits=cms.InputTag("reducedEcalRecHitsEB",processName=cms.InputTag.skipCurrentProcess()), ##ffs, weights dont have the gains switches set properly for some reason, doesnt matter, all we need this for is the gain so we can use orginal multifit
# ebRecHits=cms.InputTag("ecalWeightsRecHits","EcalRecHitsEB"), ##ffs, weights dont have the gains switches set properly for some reason
oldRefinedSCToNewMap=cms.InputTag("gsBrokenToGSFixedSuperClustersMap","refinedSCs"),
oldSCToNewMap=cms.InputTag("gsBrokenToGSFixedSuperClustersMap","parentSCs"),
orgCores=cms.InputTag("gedGsfElectronCores", '', cms.InputTag.skipCurrentProcess()),
refinedSCs = cms.InputTag('gsFixedRefinedSuperClusters'),
scs = cms.InputTag('particleFlowSuperClusterECALGSFixed'),
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@
from RecoEgamma.EgammaTools.regressionModifier_cfi import regressionModifier

gsFixedGsfElectrons = cms.EDProducer("GsfElectronGSCrysFixer",
newCores=cms.InputTag("gsFixedGsfElectronCores"),
oldEles=cms.InputTag("gedGsfElectrons",processName=cms.InputTag.skipCurrentProcess()),
ebRecHits=cms.InputTag("ecalMultiAndGSWeightRecHitEB"),
newCoresToOldCoresMap=cms.InputTag("gsFixedGsfElectronCores","parentCores"),
regressionConfig = regressionModifier.clone(rhoCollection=cms.InputTag("fixedGridRhoFastjetAllTmp")),


newCores=cms.InputTag("gsFixedGsfElectronCores"),
oldEles=cms.InputTag("gedGsfElectrons", '', cms.InputTag.skipCurrentProcess()),
ebRecHits=cms.InputTag("ecalMultiAndGSWeightRecHitEB"),
regressionConfig = regressionModifier.clone(rhoCollection=cms.InputTag("fixedGridRhoFastjetAllTmp")),
)
Loading

0 comments on commit c6cc8eb

Please sign in to comment.