CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Reconstruction_AftMix_cff.py
Go to the documentation of this file.
1 #############################
2 # This cfg configures the part of reconstruction
3 # in FastSim to be done after event mixing
4 # FastSim mixes tracker information on reconstruction level,
5 # so tracks are recontructed before mixing.
6 # At present, only the generalTrack collection, produced with iterative tracking is mixed.
7 #############################
8 
9 import FWCore.ParameterSet.Config as cms
10 from FWCore.ParameterSet.SequenceTypes import _SequenceCollection
11 
12 # import standard reconstruction
13 # apply modifications before doing the actual import at the end
15 
16 # list of modules to be deleted
17 _mod2del = []
18 
19 ##########################################
20 # offlineBeamSpot is reconstructed before mixing
21 ##########################################
22 _mod2del.append(_reco.offlineBeamSpot)
23 _reco.globalreco.remove(_reco.offlineBeamSpot) # temporary removing this by hand, cause the usual removal (see end of this file) doesn't seem work
24 
25 ###########################################
26 # no castor, zdc, Totem RP in FastSim
27 ###########################################
28 _reco.localreco.remove(_reco.castorreco)
29 _reco.globalreco.remove(_reco.CastorFullReco)
30 _reco.hcalLocalRecoSequence.remove(_reco.zdcreco)
31 _reco.localreco.remove(_reco.totemRPLocalReconstruction)
32 _reco.localreco.remove(_reco.ctppsDiamondLocalReconstruction)
33 
34 ##########################################
35 # Calo rechits
36 ##########################################
37 # not commisoned and not relevant in FastSim (?):
38 _reco.reducedEcalRecHitsSequence.remove(_reco.seldigis)
39 _reco.ecalRecHitSequence.remove(_reco.ecalCompactTrigPrim)
40 _reco.ecalRecHitSequence.remove(_reco.ecalTPSkim)
41 
42 # no flags for bad channels in FastSim
43 _reco.ecalRecHit.killDeadChannels = False
44 _reco.ecalRecHit.recoverEBFE = False
45 _reco.ecalRecHit.recoverEEFE = False
46 _reco.ecalUncalibRecHitSequence.remove(_reco.ecalDetIdToBeRecovered)
47 
48 ##########################################
49 # Changes to tracking sequences
50 ##########################################
51 # modules to be removed
52 _mod2del = _reco.trackingGlobalReco.expandAndClone()._seq._collection
53 _mod2del.append(_reco.trackingGlobalReco)
54 _mod2del.extend(_reco.recopixelvertexing.expandAndClone()._seq._collection)
55 _mod2del.append(_reco.MeasurementTrackerEventPreSplitting)
56 # actually we want to keep a few modules that we need to run (again) after mixing)
57 for _entry in [_reco.firstStepPrimaryVertices,_reco.ak4CaloJetsForTrk,_reco.caloTowerForTrk,_reco.trackExtrapolator]:
58  while _entry in _mod2del:
59  _mod2del.remove(_entry)
60 
61 # remove tracking sequences from main reco sequences
62 _reco.localreco.remove(_reco.trackerlocalreco)
63 _reco.globalreco.remove(_reco.siPixelClusterShapeCachePreSplitting)
64 _reco.globalreco.remove(_reco.trackingGlobalReco)
65 
66 # we need a replacment for the firstStepPrimaryVertices
67 # that includes tracker information of signal and pile up
68 # after mixing there is no such thing as initialStepTracks,
69 # so we replace the input collection for firstStepPrimaryVertices with generalTracks
70 _reco.firstStepPrimaryVertices.TrackLabel = "generalTracks"
71 
72 # insert the few tracking modules to be run after mixing back in the globalreco sequence
73 #for _entry in reversed([trackExtrapolator,caloTowerForTrk,firstStepPrimaryVertices,ak4CaloJetsForTrk])
74 _reco.globalreco.insert(0,_reco.trackExtrapolator+_reco.caloTowerForTrk+_reco.firstStepPrimaryVertices+_reco.ak4CaloJetsForTrk)
75 
76 # FastSim doesn't use Runge Kute for propagation
77 # the following propagators are not used in FastSim, but just to be sure...
78 _reco.KFFitterForRefitOutsideIn.Propagator = 'SmartPropagatorAny'
79 _reco.KFSmootherForRefitOutsideIn.Propagator = 'SmartPropagator'
80 
81 # replace the standard ecal-driven seeds with the FastSim emulated ones
82 import FastSimulation.Tracking.ElectronSeeds_cff
83 _reco.newCombinedSeeds = FastSimulation.Tracking.ElectronSeeds_cff.newCombinedSeeds
84 _reco.globalreco.insert(0,_reco.newCombinedSeeds)
85 
86 ##########################################
87 # FastSim changes to electron reconstruction
88 ##########################################
89 # tracker driven electron seeds depend on the generalTracks trajectory collection
90 # However, in FastSim jobs, trajectories are only available for the 'before mixing' track collections
91 # Therefore we let the seeds depend on the 'before mixing' generalTracks collection
92 # TODO: investigate whether the dependence on trajectories can be avoided
93 import FastSimulation.Tracking.ElectronSeedTrackRefFix_cfi
94 _trackerDrivenElectronSeeds = FastSimulation.Tracking.ElectronSeedTrackRefFix_cfi.fixedTrackerDrivenElectronSeeds.clone()
95 _reco.electronSeeds.replace(_reco.trackerDrivenElectronSeeds,_reco.trackerDrivenElectronSeeds+_trackerDrivenElectronSeeds)
96 _reco.trackerDrivenElectronSeedsTmp = _reco.trackerDrivenElectronSeeds
97 _reco.trackerDrivenElectronSeedsTmp.TkColList = cms.VInputTag(cms.InputTag("generalTracksBeforeMixing"))
98 _reco.trackerDrivenElectronSeeds = _trackerDrivenElectronSeeds
99 _reco.trackerDrivenElectronSeeds.seedCollection.setModuleLabel("trackerDrivenElectronSeedsTmp")
100 _reco.trackerDrivenElectronSeeds.idCollection.setModuleLabel("trackerDrivenElectronSeedsTmp")
101 
102 # replace the ECAL driven electron track candidates with the FastSim emulated ones
104 _reco.fastElectronCkfTrackCandidates = FastSimulation.Tracking.electronCkfTrackCandidates_cff.electronCkfTrackCandidates.clone()
105 _reco.electronGsfTracking.replace(_reco.electronCkfTrackCandidates,_reco.fastElectronCkfTrackCandidates)
106 _reco.electronGsfTracks.src = "fastElectronCkfTrackCandidates"
107 
108 # FastSim has no template fit on tracker hits
109 _reco.electronGsfTracks.TTRHBuilder = "WithoutRefit"
110 
111 # the conversion producer depends on trajectories
112 # so we feed it with the 'before mixing' track colletion
113 _reco.generalConversionTrackProducer.TrackProducer = 'generalTracksBeforeMixing'
114 
115 # then we need to fix the track references, so that they point to the final track collection, after mixing
116 import FastSimulation.Tracking.ConversionTrackRefFix_cfi
117 _conversionTrackRefFix = FastSimulation.Tracking.ConversionTrackRefFix_cfi.fixedConversionTracks.clone(
118  src = cms.InputTag("generalConversionTrackProducerTmp"))
119 _reco.conversionTrackSequenceNoEcalSeeded.replace(_reco.generalConversionTrackProducer,_reco.generalConversionTrackProducer+_conversionTrackRefFix)
120 _reco.generalConversionTrackProducerTmp = _reco.generalConversionTrackProducer
121 _reco.generalConversionTrackProducer = _conversionTrackRefFix
122 
123 # this might be historical: not sure why we do this
124 _reco.egammaGlobalReco.replace(_reco.conversionTrackSequence,_reco.conversionTrackSequenceNoEcalSeeded)
125 _reco.allConversions.src = 'gsfGeneralConversionTrackMerger'
126 # TODO: revisit converions in FastSim
127 
128 # not commisoned and not relevant in FastSim (?):
129 _reco.egammaHighLevelRecoPrePF.remove(_reco.uncleanedOnlyElectronSequence)
130 
131 # not commisoned and not relevant in FastSim (?):
132 _reco.egammareco.remove(_reco.conversionSequence)
133 _reco.egammaHighLevelRecoPrePF.remove(_reco.conversionSequence)
134 
135 ##########################################
136 # FastSim changes to muon reconstruction
137 ##########################################
138 # not commisoned and not relevant in FastSim (?):
139 _reco.globalreco.remove(_reco.muoncosmicreco)
140 _reco.highlevelreco.remove(_reco.cosmicDCTracksSeq)
141 _reco.highlevelreco.remove(_reco.muoncosmichighlevelreco)
142 _reco.muons.FillCosmicsIdMap = False
143 
144 # not commisoned and not relevant in FastSim (?):
145 _reco.globalmuontracking.remove(_reco.displacedGlobalMuonTracking)
146 _reco.standalonemuontracking.remove(_reco.displacedMuonSeeds)
147 _reco.standalonemuontracking.remove(_reco.displacedStandAloneMuons)
148 
149 # not commisoned and not relevant in FastSim (?):
150 _reco.muonGlobalReco.remove(_reco.muonreco_with_SET)
151 
152 # not commisoned and not relevant in FastSim (?):
153 _reco.muonGlobalReco.remove(_reco.muonSelectionTypeSequence)
154 _reco.muons.FillSelectorMaps = False
155 
156 # FastSim has no template fit on tracker hits
157 _reco.globalMuons.GLBTrajBuilderParameters.GlbRefitterParameters.TrackerRecHitBuilder = 'WithoutRefit'
158 _reco.globalMuons.GLBTrajBuilderParameters.TrackerRecHitBuilder = 'WithoutRefit'
159 _reco.globalMuons.GLBTrajBuilderParameters.TrackTransformer.TrackerRecHitBuilder = 'WithoutRefit'
160 _reco.tevMuons.RefitterParameters.TrackerRecHitBuilder = 'WithoutRefit'
161 
162 # FastSim doesn't use Runge Kute for propagation
163 _reco.globalMuons.GLBTrajBuilderParameters.GlbRefitterParameters.Propagator = 'SmartPropagatorAny'
164 _reco.globalMuons.GLBTrajBuilderParameters.GlobalMuonTrackMatcher.Propagator = 'SmartPropagator'
165 _reco.globalMuons.GLBTrajBuilderParameters.TrackTransformer.Propagator = 'SmartPropagatorAny'
166 _reco.GlbMuKFFitter.Propagator = "SmartPropagatorAny"
167 _reco.GlobalMuonRefitter.Propagator = "SmartPropagatorAny"
168 _reco.KFSmootherForMuonTrackLoader.Propagator = "SmartPropagatorAny"
169 _reco.KFSmootherForRefitInsideOut.Propagator = "SmartPropagatorAny"
170 _reco.KFFitterForRefitInsideOut.Propagator = "SmartPropagatorAny"
171 _reco.tevMuons.RefitterParameters.Propagator = "SmartPropagatorAny"
172 
173 ##########################################
174 # FastSim changes to jet/met reconstruction
175 ##########################################
176 # CSCHaloData depends on cosmic muons, not available in fastsim
177 _reco.BeamHaloId.remove(_reco.CSCHaloData)
178 # GlobalHaloData and BeamHaloSummary depend on CSCHaloData
179 _reco.BeamHaloId.remove(_reco.GlobalHaloData)
180 _reco.BeamHaloId.remove(_reco.BeamHaloSummary)
181 
182 ############################################
183 # deleting modules to avoid clashes with part of reconstruction run before mixing
184 ############################################
185 for _entry in _mod2del:
186  for _key,_value in _reco.__dict__.items():
187  _index = -1
188  if isinstance(_value,cms.Sequence):
189  try:
190  _index = _value.index(_entry)
191  except:
192  pass
193  if _index >= 0:
194  _value.remove(_entry)
195  # removing the last item does not work, and changes the properties of the sequence
196  # so, we detect this changed behaviour and add the sequence to the list of items to be deleted
197  # this is buggy
198  if not isinstance(_value._seq,_SequenceCollection):
199  _mod2del.append(_value)
200 
201 # and delete
202 for _entry in _mod2del:
203  for _key,_value in _reco.__dict__.items():
204  if _entry == _value:
205  delattr(_reco,_key)
206 
207 ############################################
208 # the actual import
209 ############################################
211