Skip to content

Commit

Permalink
- Update SingleLongTrackProducer: changes to run on ALCARECO and setC…
Browse files Browse the repository at this point in the history
…omments in fillDescriptions

- ShortenedTrackResolution: improve histogram titles
- implement unit tests
  • Loading branch information
mmusich committed Jan 17, 2024
1 parent 10b8a60 commit 35bf728
Show file tree
Hide file tree
Showing 6 changed files with 301 additions and 26 deletions.
11 changes: 10 additions & 1 deletion DQM/TrackingMonitorSource/plugins/ShortenedTrackResolution.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
// ROOT includes
#include "TLorentzVector.h"

// standard includes
#include <fmt/printf.h>

class ShortenedTrackResolution : public DQMEDAnalyzer {
public:
ShortenedTrackResolution(const edm::ParameterSet &);
Expand Down Expand Up @@ -67,7 +70,13 @@ void ShortenedTrackResolution::bookHistograms(DQMStore::IBooker &iBook,

for (int i = 0; i < int(hitsRemain_.size()); ++i) {
histsPtAll_.push_back(iBook.book1D(
"trackPt" + hitsRemain_[i] + "lAllPt", "Track p_{T} - " + hitsRemain_[i] + " layers", 41, 0.0, 2.0));
fmt::sprintf("trackPtRatio_%s", hitsRemain_[i]).c_str(),
fmt::sprintf("Short Track p_{T} / Full Track p_{T} - %s layers;p_{T}^{short}/p_{T}^{full};n. tracks",
hitsRemain_[i])
.c_str(),
101,
-0.05,
2.05));
}
}

Expand Down
1 change: 1 addition & 0 deletions DQM/TrackingMonitorSource/test/BuildFile.xml
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
<test name="testTrackingDATAMC" command="testTrackingDATAMC.sh"/>
<test name="testTrackingResolution" command="testTrackingResolution.sh"/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import FWCore.ParameterSet.Config as cms
import FWCore.ParameterSet.VarParsing as VarParsing

options = VarParsing.VarParsing()
options.register('maxEvents',
-1,
VarParsing.VarParsing.multiplicity.singleton,
VarParsing.VarParsing.varType.int,
"maximum events")
options.register('globalTag',
'125X_mcRun3_2022_design_v6',
VarParsing.VarParsing.multiplicity.singleton,
VarParsing.VarParsing.varType.string,
"conditions")
options.register('inputFile',
'step1_DQM_LayerRot_9p43e-6_fromRECO.root',
VarParsing.VarParsing.multiplicity.singleton,
VarParsing.VarParsing.varType.string,
"input file")
options.parseArguments()

from Configuration.Eras.Era_Run3_cff import Run3
process = cms.Process('HARVESTING',Run3)

# import of standard configurations
process.load('Configuration.StandardSequences.Services_cff')
process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi')
process.load('FWCore.MessageService.MessageLogger_cfi')
process.load('Configuration.EventContent.EventContent_cff')
process.load('SimGeneral.MixingModule.mixNoPU_cfi')
process.load('Configuration.StandardSequences.GeometryRecoDB_cff')
process.load('Configuration.StandardSequences.MagneticField_cff')
process.load('Configuration.StandardSequences.DQMSaverAtRunEnd_cff')
process.load('Configuration.StandardSequences.Harvesting_cff')
process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff')

process.maxEvents = cms.untracked.PSet(
input = cms.untracked.int32(options.maxEvents),
output = cms.optional.untracked.allowed(cms.int32,cms.PSet)
)

# Input source
process.source = cms.Source("DQMRootSource",
fileNames = cms.untracked.vstring('file:'+options.inputFile)
)

process.options = cms.untracked.PSet(
IgnoreCompletely = cms.untracked.vstring(),
Rethrow = cms.untracked.vstring('ProductNotFound'),
accelerators = cms.untracked.vstring('*'),
allowUnscheduled = cms.obsolete.untracked.bool,
canDeleteEarly = cms.untracked.vstring(),
deleteNonConsumedUnscheduledModules = cms.untracked.bool(True),
dumpOptions = cms.untracked.bool(False),
emptyRunLumiMode = cms.obsolete.untracked.string,
eventSetup = cms.untracked.PSet(
forceNumberOfConcurrentIOVs = cms.untracked.PSet(
allowAnyLabel_=cms.required.untracked.uint32
),
numberOfConcurrentIOVs = cms.untracked.uint32(0)
),
fileMode = cms.untracked.string('FULLMERGE'),
forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False),
makeTriggerResults = cms.obsolete.untracked.bool,
numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(0),
numberOfConcurrentRuns = cms.untracked.uint32(1),
numberOfStreams = cms.untracked.uint32(0),
numberOfThreads = cms.untracked.uint32(1),
printDependencies = cms.untracked.bool(False),
sizeOfStackForThreadsInKB = cms.optional.untracked.uint32,
throwIfIllegalParameter = cms.untracked.bool(True),
wantSummary = cms.untracked.bool(False)
)

# Other statements
from Configuration.AlCa.GlobalTag import GlobalTag
process.GlobalTag = GlobalTag(process.GlobalTag, options.globalTag, '')

process.dqmsave_step = cms.Path(process.DQMSaver)

# Schedule definition
process.schedule = cms.Schedule(process.alcaHarvesting,process.dqmsave_step)
from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask
associatePatAlgosToolsTask(process)

# Customisation from command line

# Add early deletion of temporary data products to reduce peak memory need
from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete
process = customiseEarlyDelete(process)
# End adding early deletion
157 changes: 157 additions & 0 deletions DQM/TrackingMonitorSource/test/testTrackResolution_cfg.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
import FWCore.ParameterSet.Config as cms
import FWCore.Utilities.FileUtils as FileUtils
from FWCore.ParameterSet.VarParsing import VarParsing

options = VarParsing('analysis')
options.register('inputTag',
'LayerRot_9p43e-6',
VarParsing.multiplicity.singleton,
VarParsing.varType.string,
"input tag")
options.register('inputFile',
'/store/relval/CMSSW_14_0_0_pre1/RelValZMM_14/GEN-SIM-RECO/133X_mcRun3_2023_realistic_v3-v1/2590000/586487a4-71be-4b23-b5a4-5662fab803c9.root',
VarParsing.multiplicity.singleton,
VarParsing.varType.string,
"input file")
options.register('isAlCaReco',
False,
VarParsing.multiplicity.singleton,
VarParsing.varType.bool,
"is alcareco input file?")
options.register('isUnitTest',
False,
VarParsing.multiplicity.singleton,
VarParsing.varType.bool,
"is this configuration run in unit test?")
options.parseArguments()

from Configuration.Eras.Era_Run3_cff import Run3
process = cms.Process("TrackingResolution", Run3)

#####################################################################
# import of standard configurations
#####################################################################
process.load('Configuration.StandardSequences.Services_cff')
process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi')
process.load('FWCore.MessageService.MessageLogger_cfi')
process.MessageLogger.cerr.FwkReport.reportEvery = (100 if options.isUnitTest else 100000)
process.load('Configuration.EventContent.EventContent_cff')
process.load('Configuration.StandardSequences.GeometryRecoDB_cff')
process.load('Configuration.StandardSequences.MagneticField_cff')
process.load('DQMOffline.Configuration.DQMOffline_cff')
process.load('Configuration.StandardSequences.EndOfProcess_cff')
process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff')

#####################################################################
## BeamSpot from database (i.e. GlobalTag), needed for Refitter
#####################################################################
process.load("RecoVertex.BeamSpotProducer.BeamSpot_cfi")

#####################################################################
# Load and Configure Measurement Tracker Event
#####################################################################
process.load("RecoTracker.MeasurementDet.MeasurementTrackerEventProducer_cfi")
if(options.isAlCaReco):
# customize MeasurementTrackerEvent for ALCARECO
process.MeasurementTrackerEvent.pixelClusterProducer = "ALCARECOTkAlDiMuon"
process.MeasurementTrackerEvent.stripClusterProducer = "ALCARECOTkAlDiMuon"
process.MeasurementTrackerEvent.inactivePixelDetectorLabels = cms.VInputTag()
process.MeasurementTrackerEvent.inactiveStripDetectorLabels = cms.VInputTag()

process.maxEvents = cms.untracked.PSet(
input = cms.untracked.int32(10 if options.isUnitTest else -1)
)

#####################################################################
# Input source
#####################################################################
#filelist = FileUtils.loadListFromFile("listOfFiles_idealMC_GEN-SIM-RECO.txt")
#filelist = FileUtils.loadListFromFile("listOfFiles_idealMC_TkAlDiMuonAndVertex.txt")
#readFiles = cms.untracked.vstring( *filelist)

readFiles = cms.untracked.vstring(options.inputFile)
process.source = cms.Source("PoolSource",fileNames = readFiles)

process.options = cms.untracked.PSet()

#####################################################################
# Output
#####################################################################
process.DQMoutput = cms.OutputModule("DQMRootOutputModule",
dataset = cms.untracked.PSet(
dataTier = cms.untracked.string('DQMIO'),
filterName = cms.untracked.string('')
),
fileName = cms.untracked.string('file:step1_DQM_'+options.inputTag+'_'+('fromALCA' if options.isAlCaReco else 'fromRECO' )+'.root'),
outputCommands = process.DQMEventContent.outputCommands,
splitLevel = cms.untracked.int32(0)
)

#####################################################################
# Other statements
#####################################################################
from Configuration.AlCa.GlobalTag import GlobalTag
#process.GlobalTag = GlobalTag(process.GlobalTag,"133X_mcRun3_2023_realistic_v3", '')
process.GlobalTag = GlobalTag(process.GlobalTag, "125X_mcRun3_2022_design_v6", '')
process.GlobalTag.toGet = cms.VPSet(cms.PSet(connect = cms.string("frontier://FrontierProd/CMS_CONDITIONS"),
record = cms.string('TrackerAlignmentRcd'),
tag = cms.string(options.inputTag)))

#####################################################################
# The DQM analysis sequence
#####################################################################
process.load("DQM.TrackingMonitorSource.shortTrackResolution_cff")
process.load("RecoTracker.TrackProducer.TrackRefitters_cff")
import RecoTracker.TrackProducer.TrackRefitters_cff
process.LongTracksRefit = process.TrackRefitter.clone(
src = 'SingleLongTrackProducer',
TrajectoryInEvent = True,
TTRHBuilder = "WithAngleAndTemplate",
NavigationSchool = ''
)

process.ShortTrackCandidates3.src = cms.InputTag("LongTracksRefit")
process.ShortTrackCandidates4.src = cms.InputTag("LongTracksRefit")
process.ShortTrackCandidates5.src = cms.InputTag("LongTracksRefit")
process.ShortTrackCandidates6.src = cms.InputTag("LongTracksRefit")
process.ShortTrackCandidates7.src = cms.InputTag("LongTracksRefit")
process.ShortTrackCandidates8.src = cms.InputTag("LongTracksRefit")

process.SingleLongTrackProducer.matchMuons = cms.InputTag("muons")
if(options.isAlCaReco):
process.SingleLongTrackProducer.requiredDr = cms.double(-9999.) # do not require any matchings
process.SingleLongTrackProducer.allTracks = cms.InputTag("ALCARECOTkAlDiMuon")

#####################################################################
# Path
#####################################################################
process.analysis_step = cms.Path(process.offlineBeamSpot *
process.MeasurementTrackerEvent *
process.SingleLongTrackProducer *
process.LongTracksRefit *
process.ShortTrackCandidates3 *
process.ShortTrackCandidates4 *
process.ShortTrackCandidates5 *
process.ShortTrackCandidates6 *
process.ShortTrackCandidates7 *
process.ShortTrackCandidates8 *
process.RefittedShortTracks3 *
process.RefittedShortTracks4 *
process.RefittedShortTracks5 *
process.RefittedShortTracks6 *
process.RefittedShortTracks7 *
process.RefittedShortTracks8 *
process.trackingResolution)

#####################################################################
# Path and EndPath definitions
#####################################################################
process.endjob_step = cms.EndPath(process.endOfProcess)
process.DQMoutput_step = cms.EndPath(process.DQMoutput)

process.schedule = cms.Schedule(process.analysis_step, process.endjob_step, process.DQMoutput_step)

###################################################################
# Set the process to run multi-threaded
###################################################################
process.options.numberOfThreads = 8
15 changes: 15 additions & 0 deletions DQM/TrackingMonitorSource/test/testTrackingResolution.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/bin/sh

function die { echo $1: status $2 ; exit $2; }

echo -e "TESTING step1 with RECO inputs ...\n\n"
cmsRun ${SCRAM_TEST_PATH}/testTrackResolution_cfg.py isUnitTest=True || die "Failure running testTrackResolution_cfg.py isUnitTest=True" $?

echo -e "TESTING step1 with ALCARECO inputs ...\n\n"
cmsRun ${SCRAM_TEST_PATH}/testTrackResolution_cfg.py isUnitTest=True isAlCaReco=True inputFile=/store/mc/Run3Winter23Reco/DYJetsToMuMu_M-50_TuneCP5_13p6TeV-madgraphMLM-pythia8/ALCARECO/TkAlDiMuonAndVertex-TRKDesignNoPU_AlcaRecoTRKMu_designGaussSigmaZ4cm_125X_mcRun3_2022_design_v6-v1/60000/93401af5-0da6-40ce-82e4-d5571c93dd97.root || die "Failure running testTrackResolution_cfg.py isUnitTest=True isAlCaReco=True" $?

echo -e "TESTING harvesting with RECO inputs ...\n\n"
cmsRun ${SCRAM_TEST_PATH}/testTrackResolutionHarvesting_cfg.py || die "Failure running testTrackResolutionHarvesting_cfg.py" $?

echo -e "TESTING harvesting with ALCARECO inputs ...\n\n"
cmsRun ${SCRAM_TEST_PATH}/testTrackResolutionHarvesting_cfg.py inputFile=step1_DQM_LayerRot_9p43e-6_fromALCA.root || die "Failure running testTrackResolutionHarvesting_cfg.py inputFile=step1_DQM_LayerRot_9p43e-6_fromALCA.root" $?
52 changes: 27 additions & 25 deletions RecoTracker/FinalTrackSelectors/plugins/SingleLongTrackProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ void SingleLongTrackProducer::produce(edm::Event &iEvent, const edm::EventSetup
}

const auto &muons = iEvent.getHandle(muonsToken);
if (!muons.isValid()) {
if (!muons.isValid() && matchInDr > 0.) {
edm::LogError("SingleLongTrackProducer")
<< "Input muon collection is not valid.\n Returning empty output track collection.";
iEvent.put(std::move(goodTracks), "");
Expand Down Expand Up @@ -108,21 +108,22 @@ void SingleLongTrackProducer::produce(edm::Event &iEvent, const edm::EventSetup

TLorentzVector pTrack(track.px(), track.py(), track.pz(), track.pt());

// Long track needs to be close to a good muon
for (const auto &m : *muons) {
if (m.isTrackerMuon()) {
tMuon++;
reco::Track matchedTrack = *(m.innerTrack());
TLorentzVector pMatched(matchedTrack.px(), matchedTrack.py(), matchedTrack.pz(), matchedTrack.pt());
// match to general track in deltaR
double dr = pTrack.DeltaR(pMatched);
if (dr < dRmin)
dRmin = dr;
// Long track needs to be close to a good muon (only if requested)
if (matchInDr > 0.) {
for (const auto &m : *muons) {
if (m.isTrackerMuon()) {
tMuon++;
reco::Track matchedTrack = *(m.innerTrack());
TLorentzVector pMatched(matchedTrack.px(), matchedTrack.py(), matchedTrack.pz(), matchedTrack.pt());
// match to general track in deltaR
double dr = pTrack.DeltaR(pMatched);
if (dr < dRmin)
dRmin = dr;
}
}
if (dRmin >= matchInDr)
continue;
}

if (dRmin >= matchInDr)
continue;
// do vertex consistency:
bool vertex_match = dxy < maxDxy && dz < maxDz;
if (!(vertex_match))
Expand Down Expand Up @@ -226,17 +227,18 @@ void SingleLongTrackProducer::produce(edm::Event &iEvent, const edm::EventSetup

void SingleLongTrackProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
edm::ParameterSetDescription desc;
desc.add<edm::InputTag>("allTracks", edm::InputTag("generalTracks"));
desc.add<edm::InputTag>("matchMuons", edm::InputTag("earlyMuons"));
desc.add<edm::InputTag>("PrimaryVertex", edm::InputTag("offlinePrimaryVertices"));
desc.add<int>("minNumberOfLayers", 10);
desc.add<double>("requiredDr", 0.01);
desc.add<bool>("onlyValidHits", true);
desc.add<bool>("debug", false);
desc.add<double>("minPt", 15.0);
desc.add<double>("maxEta", 2.2);
desc.add<double>("maxDxy", 0.02);
desc.add<double>("maxDz", 0.5);
desc.add<edm::InputTag>("allTracks", edm::InputTag("generalTracks"))->setComment("input track collection");
desc.add<edm::InputTag>("matchMuons", edm::InputTag("earlyMuons"))->setComment("input muon collection for matching");
desc.add<edm::InputTag>("PrimaryVertex", edm::InputTag("offlinePrimaryVertices"))
->setComment("input primary vertex collection");
desc.add<int>("minNumberOfLayers", 10)->setComment("minimum number of layers");
desc.add<double>("requiredDr", 0.01)->setComment("matching muons deltaR. If negative do not match");
desc.add<bool>("onlyValidHits", true)->setComment("use only valid hits");
desc.add<bool>("debug", false)->setComment("verbose?");
desc.add<double>("minPt", 15.0)->setComment("minimum pT");
desc.add<double>("maxEta", 2.2)->setComment("maximum pseudorapidity (absolute value)");
desc.add<double>("maxDxy", 0.02)->setComment("maximum transverse impact parameter");
desc.add<double>("maxDz", 0.5)->setComment("maximum longitudinal impact parameter");
descriptions.addWithDefaultLabel(desc);
}

Expand Down

0 comments on commit 35bf728

Please sign in to comment.