Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Monitor conversion tracks in tracking validation #12909

Merged
merged 3 commits into from
Jan 16, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"

#include "DataFormats/Common/interface/EDProductfwd.h"
#include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
#include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"

class TrackingParticleConversionSelector: public edm::stream::EDProducer<> {
public:
TrackingParticleConversionSelector(const edm::ParameterSet& iConfig);

static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);

virtual void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;

private:
edm::EDGetTokenT<TrackingParticleCollection> tpToken_;
};


TrackingParticleConversionSelector::TrackingParticleConversionSelector(const edm::ParameterSet& iConfig):
tpToken_(consumes<TrackingParticleCollection>(iConfig.getParameter<edm::InputTag>("src")))
{
produces<TrackingParticleCollection>();
}

void TrackingParticleConversionSelector::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.add<edm::InputTag>("src", edm::InputTag("mix", "MergedTrackTruth"));
descriptions.add("trackingParticleConversionSelector", desc);
}

void TrackingParticleConversionSelector::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
edm::Handle<TrackingParticleCollection> h_tps;
iEvent.getByToken(tpToken_, h_tps);

// Copy TPs because currently we can't process RefVectors of TPs in downstream
auto ret = std::make_unique<TrackingParticleCollection>();

// Logic is similar to Validation/RecoEgamma/plugins/PhotonValidator.cc
// and RecoEgamma/EgammaMCTools/src/PhotonMCTruthFinder.cc,
// but implemented purely in terms of TrackingParticles (simpler and works for pileup too)
for(const auto& tp: *h_tps) {
if(tp.pdgId() == 22) {
for(const auto& vertRef: tp.decayVertices()) {
for(const auto& tpRef: vertRef->daughterTracks()) {
if(std::abs(tpRef->pdgId()) == 11) {
ret->push_back(*tpRef);
}
}
}
}
}

iEvent.put(std::move(ret));
}

DEFINE_FWK_MODULE(TrackingParticleConversionSelector);
2 changes: 1 addition & 1 deletion Validation/Configuration/python/postValidation_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
)

postValidation_trackingOnly = cms.Sequence(
postProcessorTrackSequence
postProcessorTrackSequenceTrackingOnly
+ postProcessorVertex
)

Expand Down
11 changes: 9 additions & 2 deletions Validation/RecoTrack/python/PostProcessorTracker_cfi.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import FWCore.ParameterSet.Config as cms

postProcessorTrack = cms.EDAnalyzer("DQMGenericClient",
subDirs = cms.untracked.vstring("Tracking/Track/*", "Tracking/TrackFromPV/*", "Tracking/TrackFromPVAllTP/*", "Tracking/TrackAllTPEffic/*", "Tracking/TrackSeeding/*", "Tracking/TrackBuilding/*"),
subDirs = cms.untracked.vstring("Tracking/Track/*", "Tracking/TrackFromPV/*", "Tracking/TrackFromPVAllTP/*", "Tracking/TrackAllTPEffic/*", "Tracking/TrackConversion/*"),
efficiency = cms.vstring(
"effic 'Efficiency vs #eta' num_assoc(simToReco)_eta num_simul_eta",
"efficPt 'Efficiency vs p_{T}' num_assoc(simToReco)_pT num_simul_pT",
Expand Down Expand Up @@ -159,7 +159,7 @@
)

postProcessorTrackSummary = cms.EDAnalyzer("DQMGenericClient",
subDirs = cms.untracked.vstring("Tracking/Track", "Tracking/TrackFromPV", "Tracking/TrackFromPVAllTP", "Tracking/TrackAllTPEffic", "Tracking/TrackSeeding", "Tracking/TrackBuilding"),
subDirs = cms.untracked.vstring("Tracking/Track", "Tracking/TrackFromPV", "Tracking/TrackFromPVAllTP", "Tracking/TrackAllTPEffic", "Tracking/TrackConversion"),
efficiency = cms.vstring(
"effic_vs_coll 'Efficiency vs track collection' num_assoc(simToReco)_coll num_simul_coll",
"effic_vs_coll_allPt 'Efficiency vs track collection' num_assoc(simToReco)_coll_allPt num_simul_coll_allPt",
Expand All @@ -171,3 +171,10 @@
)

postProcessorTrackSequence = cms.Sequence(postProcessorTrack+postProcessorTrackSummary)

postProcessorTrackTrackingOnly = postProcessorTrack.clone()
postProcessorTrackTrackingOnly.subDirs.extend(["Tracking/TrackSeeding/*", "Tracking/TrackBuilding/*"])
postProcessorTrackSummaryTrackingOnly = postProcessorTrackSummary.clone()
postProcessorTrackSummaryTrackingOnly.subDirs.extend(["Tracking/TrackSeeding", "Tracking/TrackBuilding"])

postProcessorTrackSequenceTrackingOnly = cms.Sequence(postProcessorTrackTrackingOnly+postProcessorTrackSummaryTrackingOnly)
65 changes: 58 additions & 7 deletions Validation/RecoTrack/python/TrackValidation_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from SimTracker.TrackerHitAssociation.clusterTpAssociationProducer_cfi import *
from SimTracker.VertexAssociation.VertexAssociatorByPositionAndTracks_cfi import *
from PhysicsTools.RecoAlgos.trackingParticleSelector_cfi import trackingParticleSelector as _trackingParticleSelector
from CommonTools.RecoAlgos.trackingParticleConversionSelector_cfi import trackingParticleConversionSelector as _trackingParticleConversionSelector
from CommonTools.RecoAlgos.sortedPrimaryVertices_cfi import sortedPrimaryVertices as _sortedPrimaryVertices
from CommonTools.RecoAlgos.recoChargedRefCandidateToTrackRefProducer_cfi import recoChargedRefCandidateToTrackRefProducer as _recoChargedRefCandidateToTrackRefProducer

Expand Down Expand Up @@ -204,6 +205,17 @@ def _addSeedToTrackProducers():
tracksValidationSelectorsFromPV.insert(0, generalTracksFromPV)


## Select conversion TrackingParticles, and define the corresponding associator
# (do not use associations because the collections of interest are not subsets of each other)
trackingParticlesConversion = _trackingParticleConversionSelector.clone()
tpClusterProducerConversion = tpClusterProducer.clone(
trackingParticleSrc = "trackingParticlesConversion",
)
quickTrackAssociatorByHitsConversion = quickTrackAssociatorByHits.clone(
cluster2TPSrc = "tpClusterProducerConversion"
)


## MTV instances
trackValidator = Validation.RecoTrack.MultiTrackValidator_cfi.multiTrackValidator.clone()
trackValidator.label = ["generalTracks", _generalTracksHp] + _selectorsByAlgo + _selectorsByAlgoHp + [
Expand Down Expand Up @@ -264,6 +276,30 @@ def _addSeedToTrackProducers():
trackValidatorAllTPEffic.histoProducerAlgoBlock.TpSelectorForEfficiencyVsVTXR.signalOnly = False
trackValidatorAllTPEffic.histoProducerAlgoBlock.TpSelectorForEfficiencyVsVTXZ.signalOnly = False

# For conversions
trackValidatorConversion = trackValidator.clone(
dirName = "Tracking/TrackConversion/",
label = [
"convStepTracks",
"conversionStepTracks",
"ckfInOutTracksFromConversions",
"ckfOutInTracksFromConversions",
],
label_tp_effic = "trackingParticlesConversion",
label_tp_fake = "trackingParticlesConversion",
associators = ["quickTrackAssociatorByHitsConversion"],
UseAssociators = True,
doSimPlots = True,
dodEdxPlots = False,
doPVAssociationPlots = False,
calculateDrSingleCollection = False,
)
# relax lip and tip
for n in ["Eta", "Phi", "Pt", "VTXR", "VTXZ"]:
pset = getattr(trackValidatorConversion.histoProducerAlgoBlock, "TpSelectorForEfficiencyVs"+n)
pset.lip = trackValidatorConversion.lipTP.value()
pset.tip = trackValidatorConversion.tipTP.value()


# the track selectors
tracksValidationSelectors = cms.Sequence(
Expand All @@ -287,26 +323,34 @@ def _addSeedToTrackProducers():
trackingParticleRecoTrackAsssociationSignal
)

if eras.fastSim.isChosen():
tracksValidationTruth.remove(tpClusterProducer)
tracksValidationTruthSignal.remove(tpClusterProducerSignal)

tracksValidationTruthConversion = cms.Sequence(
trackingParticlesConversion +
tpClusterProducerConversion +
quickTrackAssociatorByHitsConversion
)

tracksPreValidation = cms.Sequence(
tracksValidationSelectors +
tracksValidationSelectorsFromPV +
tracksValidationTruth +
tracksValidationTruthSignal
tracksValidationTruthSignal +
tracksValidationTruthConversion
)

tracksValidation = cms.Sequence(
tracksPreValidation +
trackValidator +
trackValidatorFromPV +
trackValidatorFromPVAllTP +
trackValidatorAllTPEffic
trackValidatorAllTPEffic +
trackValidatorConversion
)

if eras.fastSim.isChosen():
tracksValidationTruth.remove(tpClusterProducer)
tracksValidationTruthSignal.remove(tpClusterProducerSignal)
tracksPreValidation.remove(tracksValidationTruthConversion)
tracksValidation.remove(trackValidatorConversion)

### Then define stuff for standalone mode (i.e. MTV with RECO+DIGI input)

Expand All @@ -330,6 +374,8 @@ def _addSeedToTrackProducers():
)
for _label in ["cutsRecoTracksBtvLike", "cutsRecoTracksAK4PFJets"]:
trackValidatorAllTPEfficStandalone.label.remove(_label)
trackValidatorConversionStandalone = trackValidatorConversion.clone()
trackValidatorConversionStandalone.label.remove("convStepTracks")

# sequences
tracksValidationSelectorsStandalone = cms.Sequence(
Expand All @@ -341,7 +387,8 @@ def _addSeedToTrackProducers():
trackValidatorStandalone +
trackValidatorFromPVStandalone +
trackValidatorFromPVAllTPStandalone +
trackValidatorAllTPEfficStandalone
trackValidatorAllTPEfficStandalone +
trackValidatorConversionStandalone
)
tracksValidationStandalone = cms.Sequence(
ak4PFL1FastL2L3CorrectorChain +
Expand Down Expand Up @@ -375,6 +422,9 @@ def _addSeedToTrackProducers():
doSeedPlots = True,
)

trackValidatorConversionTrackingOnly = trackValidatorConversion.clone()
trackValidatorConversionTrackingOnly.label.remove("ckfInOutTracksFromConversions")
trackValidatorConversionTrackingOnly.label.remove("ckfOutInTracksFromConversions")

# sequences
tracksPreValidationTrackingOnly = tracksPreValidation.copy()
Expand All @@ -386,6 +436,7 @@ def _addSeedToTrackProducers():
trackValidatorSeedingTrackingOnly +
trackValidatorBuildingTrackingOnly
)
trackValidatorsTrackingOnly.replace(trackValidatorConversionStandalone, trackValidatorConversionTrackingOnly)

tracksValidationTrackingOnly = cms.Sequence(
tracksPreValidationTrackingOnly +
Expand Down