CMS 3D CMS Logo

QuickTrackAssociatorByHitsProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SimTracker/TrackAssociatorProducers
4 // Class: QuickTrackAssociatorByHitsProducer
5 //
13 //
14 // Original Author: Christopher Jones
15 // Created: Mon, 05 Jan 2015 16:33:55 GMT
16 //
17 //
18 
19 
20 // system include files
21 #include <memory>
22 
23 // user include files
26 
29 
32 
36 
37 //
38 // class declaration
39 //
40 namespace {
41 }
42 
44  public:
47 
48  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
49 
50  private:
51  void beginJob() override;
52  void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
53  void endJob() override;
55 
56  // ----------member data ---------------------------
62  double cutRecoToSim_;
67 
68 };
69 
70 //
71 // constants, enums and typedefs
72 //
73 
74 
75 //
76 // static data member definitions
77 //
78 
79 //
80 // constructors and destructor
81 //
83  qualitySimToReco_( iConfig.getParameter<double>( "Quality_SimToReco" ) ),
84  puritySimToReco_( iConfig.getParameter<double>( "Purity_SimToReco" ) ),
85  pixelHitWeight_( iConfig.getParameter<double>( "PixelHitWeight" ) ),
86  cutRecoToSim_( iConfig.getParameter<double>( "Cut_RecoToSim" ) ),
87  threeHitTracksAreSpecial_( iConfig.getParameter<bool>( "ThreeHitTracksAreSpecial" ) ),
88  useClusterTPAssociation_( iConfig.getParameter<bool>( "useClusterTPAssociation" ) ),
89  absoluteNumberOfHits_( iConfig.getParameter<bool>( "AbsoluteNumberOfHits" ) )
90 {
91 
92  //
93  // Check whether the denominator when working out the percentage of shared hits should
94  // be the number of simulated hits or the number of reconstructed hits.
95  //
96  std::string denominatorString=iConfig.getParameter<std::string>("SimToRecoDenominator");
98  else if( denominatorString=="reco" ) simToRecoDenominator_=QuickTrackAssociatorByHitsImpl::denomreco;
99  else throw cms::Exception( "QuickTrackAssociatorByHitsImpl" ) << "SimToRecoDenominator not specified as sim or reco";
100 
101  //
102  // Do some checks on whether UseGrouped or UseSplitting have been set. They're not used
103  // unlike the standard TrackAssociatorByHits so show a warning.
104  //
105  bool useGrouped, useSplitting;
106  if( iConfig.exists("UseGrouped") ) useGrouped=iConfig.getParameter<bool>("UseGrouped");
107  else useGrouped=true;
108 
109  if( iConfig.exists("UseSplitting") ) useSplitting=iConfig.getParameter<bool>("UseSplitting");
110  else useSplitting=true;
111 
112  // This associator works as though both UseGrouped and UseSplitting were set to true, so show a
113  // warning if this isn't the case.
114  if( !(useGrouped && useSplitting) )
115  {
116  LogDebug("QuickTrackAssociatorByHitsImpl") << "UseGrouped and/or UseSplitting has been set to false, but this associator ignores that setting.";
117  }
118 
119  //register your products
120  produces<reco::TrackToTrackingParticleAssociator>();
121 
123  cluster2TPToken_ = consumes<ClusterTPAssociation>(iConfig.getParameter < edm::InputTag > ("cluster2TPSrc"));
124  }
125  else {
127  }
128 
129 }
130 
131 
133 {
134 
135  // do anything here that needs to be done at desctruction time
136  // (e.g. close files, deallocate resources etc.)
137 
138 }
139 
140 
141 //
142 // member functions
143 //
144 
145 // Set up the parameter set for the hit associator
148  edm::ParameterSet hitAssociatorParameters;
149  hitAssociatorParameters.addParameter<bool>( "associatePixel", iConfig.getParameter<bool>("associatePixel") );
150  hitAssociatorParameters.addParameter<bool>( "associateStrip", iConfig.getParameter<bool>("associateStrip") );
151  // This is the important one, it stops the hit associator searching through the list of sim hits.
152  // I only want to use the hit associator methods that work on the hit IDs (i.e. the uint32_t trackId
153  // and the EncodedEventId eventId) so I'm not interested in matching that to the PSimHit objects.
154  hitAssociatorParameters.addParameter<bool>("associateRecoTracks",true);
155  // add these new ones to allow redirection of inputs:
156  hitAssociatorParameters.addParameter<edm::InputTag>( "pixelSimLinkSrc", iConfig.getParameter<edm::InputTag>("pixelSimLinkSrc") );
157  hitAssociatorParameters.addParameter<edm::InputTag>( "stripSimLinkSrc", iConfig.getParameter<edm::InputTag>("stripSimLinkSrc") );
158 
159  return hitAssociatorParameters;
160 }
161 
162 // ------------ method called to produce the data ------------
163 void
165 {
166  using namespace edm;
167 
168  const ClusterTPAssociation *clusterAssoc = nullptr;
169  std::unique_ptr<TrackerHitAssociator> trackAssoc;
171  edm::Handle<ClusterTPAssociation> clusterAssocHandle;
172  iEvent.getByToken(cluster2TPToken_,clusterAssocHandle);
173  clusterAssoc = clusterAssocHandle.product();
174  }
175  else {
176  // If control got this far then either useClusterTPAssociation_ was false or getting the cluster
177  // to TrackingParticle association from the event failed. Either way I need to create a hit associator.
178  trackAssoc = std::make_unique<TrackerHitAssociator>(iEvent, trackerHitAssociatorConfig_);
179  }
180 
181  auto impl = std::make_unique<QuickTrackAssociatorByHitsImpl>(iEvent.productGetter(),
182  std::move(trackAssoc),
183  clusterAssoc,
191 
192  auto toPut = std::make_unique<reco::TrackToTrackingParticleAssociator>(std::move(impl));
193  iEvent.put(std::move(toPut));
194 }
195 
196 // ------------ method called once each job just before starting event loop ------------
197 void
199 {
200 }
201 
202 // ------------ method called once each job just after ending the event loop ------------
203 void
205 }
206 
207 
208 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
209 void
211  //The following says we do not know what parameters are allowed so do no validation
212  // Please change this to state exactly what you do use, even if it is no parameters
214  desc.setUnknown();
215  descriptions.addDefault(desc);
216 }
217 
218 //define this as a plug-in
#define LogDebug(id)
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
EDProductGetter const & productGetter() const
Definition: Event.cc:104
bool exists(std::string const &parameterName) const
checks if a parameter exists
edm::ParameterSet makeHitAssociatorParameters(const edm::ParameterSet &)
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
int iEvent
Definition: GenABIO.cc:230
void addDefault(ParameterSetDescription const &psetDescription)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:143
QuickTrackAssociatorByHitsImpl::SimToRecoDenomType simToRecoDenominator_
T const * product() const
Definition: Handle.h:81
edm::EDGetTokenT< ClusterTPAssociation > cluster2TPToken_
HLT enums.
def move(src, dest)
Definition: eostools.py:511