CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
SETMuonSeedProducer.cc
Go to the documentation of this file.
1 
6 
14 
17 
19 
26 #include "TMath.h"
27 
28 using namespace edm;
29 using namespace std;
30 
32  : theSeedFinder(parameterSet), theBeamSpotTag(parameterSet.getParameter<edm::InputTag>("beamSpotTag")) {
33  edm::ConsumesCollector iC = consumesCollector();
34  thePatternRecognition = new SETPatternRecognition(parameterSet, iC);
35 
36  const string metname = "Muon|RecoMuon|SETMuonSeedSeed";
37  //std::cout<<" The SET SEED producer started."<<std::endl;
38 
39  ParameterSet serviceParameters = parameterSet.getParameter<ParameterSet>("ServiceParameters");
40  theService = new MuonServiceProxy(serviceParameters, consumesCollector());
42  theSeedFinder.setServiceProxy(theService);
43  // Parameter set for the Builder
44  ParameterSet trajectoryBuilderParameters = parameterSet.getParameter<ParameterSet>("SETTrajBuilderParameters");
45 
46  LogTrace(metname) << "constructor called" << endl;
47 
48  apply_prePruning = trajectoryBuilderParameters.getParameter<bool>("Apply_prePruning");
49 
50  useSegmentsInTrajectory = trajectoryBuilderParameters.getParameter<bool>("UseSegmentsInTrajectory");
51 
52  // The inward-outward fitter (starts from seed state)
53  ParameterSet filterPSet = trajectoryBuilderParameters.getParameter<ParameterSet>("FilterParameters");
54  filterPSet.addUntrackedParameter("UseSegmentsInTrajectory", useSegmentsInTrajectory);
55  theFilter = new SETFilter(filterPSet, theService);
56 
57  //----
58 
59  beamspotToken = consumes<reco::BeamSpot>(theBeamSpotTag);
60  produces<TrajectorySeedCollection>();
61 }
62 
64  LogTrace("Muon|RecoMuon|SETMuonSeedProducer") << "SETMuonSeedProducer destructor called" << endl;
65 
66  if (theFilter)
67  delete theFilter;
68  if (theService)
69  delete theService;
71  delete thePatternRecognition;
72 }
73 
75  //std::cout<<" start producing..."<<std::endl;
76  const string metname = "Muon|RecoMuon|SETMuonSeedSeed";
77 
79 
80  //Get the CSC Geometry :
81  theService->update(eventSetup);
82 
83  auto output = std::make_unique<TrajectorySeedCollection>();
84 
86 
87  setEvent(event);
88 
90  edm::Handle<reco::BeamSpot> beamSpotHandle;
91  event.getByToken(beamspotToken, beamSpotHandle);
92  if (beamSpotHandle.isValid()) {
93  beamSpot = *beamSpotHandle;
94 
95  } else {
96  edm::LogInfo("MuonSeedGenerator") << "No beam spot available from EventSetup \n";
97  }
98 
99  // make it a vector so we can subtract it from position vectors
100  GlobalVector gv(beamSpot.x0(), beamSpot.y0(), beamSpot.z0());
102 
103  bool fwFitFailed = true;
104 
105  std::vector<SeedCandidate> seedCandidates_AllChosen;
106  std::vector<MuonRecHitContainer> MuonRecHitContainer_clusters;
107  //---- this is "clustering"; later a trajectory can not use hits from different clusters
108  thePatternRecognition->produce(event, eventSetup, MuonRecHitContainer_clusters);
109 
110  //std::cout<<"We have formed "<<MuonRecHitContainer_clusters.size()<<" clusters"<<std::endl;
111  //---- for each cluster,
112  for (unsigned int cluster = 0; cluster < MuonRecHitContainer_clusters.size(); ++cluster) {
113  //std::cout<<" This is cluster number : "<<cluster<<std::endl;
114  std::vector<SeedCandidate> seedCandidates_inCluster;
115  //---- group hits in detector layers (if in same layer); the idea is that
116  //---- some hits could not belong to a track simultaneously - these will be in a
117  //---- group; two hits from one and the same group will not go to the same track
118  std::vector<MuonRecHitContainer> MuonRecHitContainer_perLayer =
119  theSeedFinder.sortByLayer(MuonRecHitContainer_clusters[cluster]);
120  //---- Add protection against huge memory consumption
121  //---- Delete busy layers if needed (due to combinatorics)
122  theSeedFinder.limitCombinatorics(MuonRecHitContainer_perLayer);
123  //---- build all possible combinations (valid sets)
124  std::vector<MuonRecHitContainer> allValidSets = theSeedFinder.findAllValidSets(MuonRecHitContainer_perLayer);
125  if (apply_prePruning) {
126  //---- remove "wild" segments from the combination
127  theSeedFinder.validSetsPrePruning(allValidSets);
128  }
129 
130  //---- build the appropriate output: seedCandidates_inCluster
131  //---- if too many (?) valid sets in a cluster - skip it
132  if (allValidSets.size() < 500) { // hardcoded - remove it
133  seedCandidates_inCluster = theSeedFinder.fillSeedCandidates(allValidSets);
134  }
135  //---- find the best valid combinations using simple (no propagation errors) chi2-fit
136  //std::cout<<" Found "<<seedCandidates_inCluster.size()<<" valid sets in the current cluster."<<std::endl;
137  if (!seedCandidates_inCluster.empty()) {
138  //---- this is the forward fitter (segments); choose which of the SETs in a cluster to be considered further
139  std::vector<SeedCandidate> bestSets_inCluster;
140  fwFitFailed = !(filter()->fwfit_SET(seedCandidates_inCluster, bestSets_inCluster));
141 
142  //---- has the fit failed? continue to the next cluster instead of returning the empty trajectoryContainer and stop the loop IBL 080903
143  if (fwFitFailed) {
144  //std::cout<<" fwfit_SET failed!"<<std::endl;
145  continue;
146  }
147  for (unsigned int iSet = 0; iSet < bestSets_inCluster.size(); ++iSet) {
148  seedCandidates_AllChosen.push_back(bestSets_inCluster[iSet]);
149  }
150  }
151  }
152  //---- loop over all the SETs candidates
153  for (unsigned int iMuon = 0; iMuon < seedCandidates_AllChosen.size(); ++iMuon) {
154  //std::cout<<" chosen iMuon = "<<iMuon<<std::endl;
155  Trajectory::DataContainer finalCandidate;
156  SeedCandidate* aFinalSet = &(seedCandidates_AllChosen[iMuon]);
157  fwFitFailed = !(filter()->buildTrajectoryMeasurements(aFinalSet, finalCandidate));
158  if (fwFitFailed) {
159  //std::cout<<" buildTrajectoryMeasurements failed!"<<std::endl;
160  continue;
161  }
162  //---- are there measurements (or detLayers) used at all?
163  if (!filter()->layers().empty())
164  LogTrace(metname) << debug.dumpLayer(filter()->lastDetLayer());
165  else {
166  continue;
167  }
168  //std::cout<<" chambers used - all : "<<filter()->getTotalChamberUsed()<<", DT : "<<filter()->getDTChamberUsed()<<
169  //", CSC : "<<filter()->getCSCChamberUsed()<<", RPC : "<<filter()->getRPCChamberUsed()<<std::endl;
170  //---- ask for some "reasonable" conditions to build a STA muon;
171  //---- (totalChambers >= 2, dtChambers + cscChambers >0)
172  if (filter()->goodState()) {
174  TrajectoryStateOnSurface firstTSOS;
175  bool conversionPassed = false;
177  //---- transforms set of segment measurements to a set of rechit measurements
178  conversionPassed = filter()->transform(finalCandidate, hitContainer, firstTSOS);
179  } else {
180  //---- transforms set of segment measurements to a set of segment measurements
181  conversionPassed = filter()->transformLight(finalCandidate, hitContainer, firstTSOS);
182  }
183  if (conversionPassed && !finalCandidate.empty() && !hitContainer.empty()) {
184  //---- doesn't work...
185  //output->push_back( theSeedFinder.makeSeed(firstTSOS, hitContainer) );
186 
187  edm::OwnVector<TrackingRecHit> recHitsContainer;
188  for (unsigned int iHit = 0; iHit < hitContainer.size(); ++iHit) {
189  recHitsContainer.push_back(hitContainer.at(iHit)->hit()->clone());
190  }
193  dir = alongMomentum; // why forward (for rechits) later?
194  }
195 
196  PTrajectoryStateOnDet seedTSOS =
197  trajectoryStateTransform::persistentState(firstTSOS, hitContainer.at(0)->geographicalId().rawId());
198  TrajectorySeed seed(seedTSOS, recHitsContainer, dir);
199 
200  //MuonPatternRecoDumper debug;
201  //std::cout<<" firstTSOS (not IP) = "<<debug.dumpTSOS(firstTSOS)<<std::endl;
202  //std::cout<<" hits(from range) = "<<range.second-range.first<<" hits (from size) = "<<hitContainer.size()<<std::endl;
203  //for(unsigned int iRH=0;iRH<hitContainer.size();++iRH){
204  //std::cout<<" RH = "<<iRH+1<<" globPos = "<<hitContainer.at(iRH)->globalPosition()<<std::endl;
205  //}
206  output->push_back(seed);
207  } else {
208  //std::cout<<" Transformation from TrajectoryMeasurements to RecHitContainer faild - skip "<<std::endl;
209  continue;
210  }
211  } else {
212  //std::cout<<" Not enough (as defined) measurements to build trajectory - skip"<<std::endl;
213  continue;
214  }
215  }
216  event.put(std::move(output));
217  theFilter->reset();
218 }
219 
220 //
void setServiceProxy(MuonServiceProxy *service)
Definition: SETSeedFinder.h:29
SETSeedFinder theSeedFinder
void setBeamSpot(const GlobalVector &gv)
bool transform(Trajectory::DataContainer &measurements_segments, TransientTrackingRecHit::ConstRecHitContainer &hitContainer, TrajectoryStateOnSurface &firstTSOS)
transforms &quot;segment trajectory&quot; to &quot;rechit container&quot;
Definition: SETFilter.cc:158
double z0() const
z coordinate
Definition: BeamSpot.h:65
bool transformLight(Trajectory::DataContainer &measurements_segments, TransientTrackingRecHit::ConstRecHitContainer &hitContainer, TrajectoryStateOnSurface &firstTSOS)
transforms &quot;segment trajectory&quot; to &quot;segment container&quot;
Definition: SETFilter.cc:207
edm::EDGetTokenT< reco::BeamSpot > beamspotToken
std::string dumpLayer(const DetLayer *layer) const
const std::string metname
void reset()
Definition: SETFilter.cc:62
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
bool buildTrajectoryMeasurements(SeedCandidate *validSegmentsSet, Trajectory::DataContainer &finalCandidate)
from SeedCandidate to DataContainer only
Definition: SETFilter.cc:124
PropagationDirection
std::vector< MuonRecHitContainer > sortByLayer(MuonRecHitContainer &cluster) const
SETMuonSeedProducer(const edm::ParameterSet &)
Constructor with Parameter set.
#define LogTrace(id)
void push_back(D *&d)
Definition: OwnVector.h:326
~SETMuonSeedProducer() override
Destructor.
std::vector< const DetLayer * > layers() const
return the layer used for the refit
Definition: SETFilter.h:100
std::vector< TrajectoryMeasurement > DataContainer
Definition: Trajectory.h:40
bool fwfit_SET(std::vector< SeedCandidate > &validSegmentsSet_in, std::vector< SeedCandidate > &validSegmentsSet_out)
Perform the SET inner-outward fitting.
Definition: SETFilter.cc:89
edm::InputTag theBeamSpotTag
ParameterSet const & parameterSet(StableProvenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:11
def move
Definition: eostools.py:511
SETPatternRecognition * thePatternRecognition
void setServiceProxy(MuonServiceProxy *service)
bool isValid() const
Definition: HandleBase.h:70
std::vector< ConstRecHitPointer > ConstRecHitContainer
void limitCombinatorics(std::vector< MuonRecHitContainer > &MuonRecHitContainer_perLayer)
Log< level::Info, false > LogInfo
#define debug
Definition: HDRShower.cc:19
void setEvent(const edm::Event &)
void addUntrackedParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:192
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::vector< MuonRecHitContainer > findAllValidSets(const std::vector< MuonRecHitContainer > &MuonRecHitContainer_perLayer)
MuonServiceProxy * theService
void validSetsPrePruning(std::vector< MuonRecHitContainer > &allValidSets)
double y0() const
y coordinate
Definition: BeamSpot.h:63
std::vector< SeedCandidate > fillSeedCandidates(std::vector< MuonRecHitContainer > &allValidSets)
SETFilter * filter() const
pre-filter
void produce(edm::Event &, const edm::EventSetup &) override
void produce(const edm::Event &event, const edm::EventSetup &eSetup, std::vector< MuonRecHitContainer > &result) override
virtual void setEvent(const edm::Event &event)
Pass the Event to the algo at each event.
Definition: SETFilter.cc:60
double x0() const
x coordinate
Definition: BeamSpot.h:61