CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
43 
45 
47  public:
50 
51  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
52 
53  private:
54  virtual void beginJob() override;
55  virtual void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
56  virtual void endJob() override;
57 
58  // ----------member data ---------------------------
63  double cutRecoToSim_;
68 
69 };
70 
71 //
72 // constants, enums and typedefs
73 //
74 
75 
76 //
77 // static data member definitions
78 //
79 
80 //
81 // constructors and destructor
82 //
84  qualitySimToReco_( iConfig.getParameter<double>( "Quality_SimToReco" ) ),
85  puritySimToReco_( iConfig.getParameter<double>( "Purity_SimToReco" ) ),
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  // Set up the parameter set for the hit associator
103  //
104  hitAssociatorParameters_.addParameter<bool>( "associatePixel", iConfig.getParameter<bool>("associatePixel") );
105  hitAssociatorParameters_.addParameter<bool>( "associateStrip", iConfig.getParameter<bool>("associateStrip") );
106  // This is the important one, it stops the hit associator searching through the list of sim hits.
107  // I only want to use the hit associator methods that work on the hit IDs (i.e. the uint32_t trackId
108  // and the EncodedEventId eventId) so I'm not interested in matching that to the PSimHit objects.
109  hitAssociatorParameters_.addParameter<bool>("associateRecoTracks",true);
110 
112 
113  //
114  // Do some checks on whether UseGrouped or UseSplitting have been set. They're not used
115  // unlike the standard TrackAssociatorByHits so show a warning.
116  //
117  bool useGrouped, useSplitting;
118  if( iConfig.exists("UseGrouped") ) useGrouped=iConfig.getParameter<bool>("UseGrouped");
119  else useGrouped=true;
120 
121  if( iConfig.exists("UseSplitting") ) useSplitting=iConfig.getParameter<bool>("UseSplitting");
122  else useSplitting=true;
123 
124  // This associator works as though both UseGrouped and UseSplitting were set to true, so show a
125  // warning if this isn't the case.
126  if( !(useGrouped && useSplitting) )
127  {
128  LogDebug("QuickTrackAssociatorByHitsImpl") << "UseGrouped and/or UseSplitting has been set to false, but this associator ignores that setting.";
129  }
130 
131  //register your products
132  produces<reco::TrackToTrackingParticleAssociator>();
133 
135  cluster2TPToken_ = consumes<ClusterTPAssociationList>(iConfig.getParameter < edm::InputTag > ("cluster2TPSrc"));
136  }
137 
138 }
139 
140 
142 {
143 
144  // do anything here that needs to be done at desctruction time
145  // (e.g. close files, deallocate resources etc.)
146 
147 }
148 
149 
150 //
151 // member functions
152 //
153 
154 // ------------ method called to produce the data ------------
155 void
157 {
158  using namespace edm;
159 
160  std::shared_ptr<ClusterTPAssociationList> clusterAssoc;
161  std::shared_ptr<TrackerHitAssociator> trackAssoc;
163  edm::Handle<ClusterTPAssociationList> clusterAssocHandle;
164  iEvent.getByToken(cluster2TPToken_,clusterAssocHandle);
165 
166  if(clusterAssocHandle.isValid()) {
167  clusterAssoc = std::make_shared<ClusterTPAssociationList>(*clusterAssocHandle);
168 
169  //make sure it is properly sorted
170  std::sort(clusterAssoc->begin(),clusterAssoc->end(),clusterTPAssociationListGreater);
171  } else {
172  edm::LogInfo( "TrackAssociator" ) << "ClusterTPAssociationList not found. Using DigiSimLink based associator";
173  }
174  }
175  if(not clusterAssoc) {
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_shared<TrackerHitAssociator>(iEvent, hitAssociatorParameters_);
179  }
180 
181  std::unique_ptr<reco::TrackToTrackingParticleAssociatorBaseImpl> impl(
183  std::move(clusterAssoc),
190 
191  std::unique_ptr<reco::TrackToTrackingParticleAssociator> toPut( new reco::TrackToTrackingParticleAssociator(std::move(impl)));
192  iEvent.put(std::move(toPut));
193 }
194 
195 // ------------ method called once each job just before starting event loop ------------
196 void
198 {
199 }
200 
201 // ------------ method called once each job just after ending the event loop ------------
202 void
204 }
205 
206 
207 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
208 void
210  //The following says we do not know what parameters are allowed so do no validation
211  // Please change this to state exactly what you do use, even if it is no parameters
213  desc.setUnknown();
214  descriptions.addDefault(desc);
215 }
216 
217 //define this as a plug-in
#define LogDebug(id)
T getParameter(std::string const &) const
std::vector< std::pair< OmniClusterRef, TrackingParticleRef > > ClusterTPAssociationList
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:449
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool exists(std::string const &parameterName) const
checks if a parameter exists
int iEvent
Definition: GenABIO.cc:230
void addDefault(ParameterSetDescription const &psetDescription)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
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
def move
Definition: eostools.py:508
edm::EDGetTokenT< ClusterTPAssociationList > cluster2TPToken_
bool isValid() const
Definition: HandleBase.h:75
bool clusterTPAssociationListGreater(std::pair< OmniClusterRef, TrackingParticleRef > i, std::pair< OmniClusterRef, TrackingParticleRef > j)
TrackToTrackingParticleAssociator that associates by hits a bit quicker than the normal TrackAssociat...
virtual void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
QuickTrackAssociatorByHitsImpl::SimToRecoDenomType simToRecoDenominator_
QuickTrackAssociatorByHitsImpl::ClusterTPAssociationList ClusterTPAssociationList