CMS 3D CMS Logo

MuonSeedTrack.cc
Go to the documentation of this file.
1 
12 
14 
17 
19 
24 
28 
29 using namespace reco;
30 using namespace edm;
31 using namespace std;
32 
34 
35 //
36 // constructors
37 //
39  // service parameters
40  ParameterSet serviceParameters = pset.getParameter<ParameterSet>("ServiceParameters");
41  theService = new MuonServiceProxy(serviceParameters);
42 
43  ParameterSet updatorPar = pset.getParameter<ParameterSet>("MuonUpdatorAtVertexParameters");
44  //theSeedPropagatorName = updatorPar.getParameter<string>("Propagator");
45  theSeedsLabel = pset.getParameter<InputTag>("MuonSeed");
46  theSeedsToken = consumes<TrajectorySeedCollection>(theSeedsLabel);
47  theUpdatorAtVtx = new MuonUpdatorAtVertex(updatorPar, theService);
48 
49  theAllowNoVtxFlag = pset.getUntrackedParameter<bool>("AllowNoVertex", false);
50 
51  //register products
52  setAlias(pset.getParameter<std::string>("@module_label"));
53  produces<reco::TrackCollection>().setBranchAlias(theAlias + "Tracks");
54 }
55 
56 //
57 // destructor
58 //
60  if (theService)
61  delete theService;
62  if (theUpdatorAtVtx)
63  delete theUpdatorAtVtx;
64 }
65 
66 //
67 // member functions
68 //
69 
74  using namespace edm;
75 
76  // Update the services
77  theService->update(eventSetup);
78 
79  // the track collectios; they will be loaded in the event
80  unique_ptr<reco::TrackCollection> trackCollection(new reco::TrackCollection());
81  // ... and its reference into the event
82  reco::TrackRefProd trackCollectionRefProd = event.getRefBeforePut<reco::TrackCollection>();
83 
85  event.getByToken(theSeedsToken, seeds);
86 
87  for (TrajectorySeedCollection::const_iterator iSeed = seeds->begin(); iSeed != seeds->end(); iSeed++) {
88  pair<bool, reco::Track> resultOfTrackExtrapAtPCA = buildTrackAtPCA(*iSeed);
89  if (!resultOfTrackExtrapAtPCA.first)
90  continue;
91  // take the "bare" track at PCA
92  reco::Track& track = resultOfTrackExtrapAtPCA.second;
93  // fill the TrackCollection
94  trackCollection->push_back(track);
95  }
96 
97  event.put(std::move(trackCollection));
98 }
99 
104 
109 
114  // Get the Trajectory State on Det (persistent version of a TSOS) from the seed
115  PTrajectoryStateOnDet pTSOD = seed.startingState();
116 
117  // Transform it in a TrajectoryStateOnSurface
118 
119  DetId seedDetId(pTSOD.detId());
120 
121  const GeomDet* gdet = theService->trackingGeometry()->idToDet(seedDetId);
122 
123  TrajectoryStateOnSurface initialState =
124  trajectoryStateTransform::transientState(pTSOD, &(gdet->surface()), &*theService->magneticField());
125 
126  /*
127  // Get the layer on which the seed relies
128  const DetLayer *initialLayer = theService->detLayerGeometry()->idToLayer( seedDetId );
129 
130  PropagationDirection detLayerOrder = oppositeToMomentum;
131 
132  // ask for compatible layers
133  vector<const DetLayer*> detLayers;
134  detLayers = initialLayer->compatibleLayers( *initialState.freeState(),detLayerOrder);
135 
136  TrajectoryStateOnSurface result = initialState;
137  if(detLayers.size()){
138  const DetLayer* finalLayer = detLayers.back();
139  const TrajectoryStateOnSurface propagatedState = theService->propagator(theSeedPropagatorName)->propagate(initialState, finalLayer->surface());
140  if(propagatedState.isValid())
141  result = propagatedState;
142  }
143 
144  return result;
145  */
146 
147  return initialState;
148 }
149 
154 pair<bool, reco::Track> MuonSeedTrack::buildTrackAtPCA(const TrajectorySeed& seed) const {
155  const string metname = "MuonSeedTrack";
156 
158 
159  TSOS seedTSOS = getSeedTSOS(seed);
160  // This is needed to extrapolate the tsos at vertex
161  LogTrace(metname) << "Propagate to PCA...";
162  pair<bool, FreeTrajectoryState> extrapolationResult = theUpdatorAtVtx->propagateToNominalLine(seedTSOS);
163  FreeTrajectoryState ftsAtVtx;
164 
165  if (extrapolationResult.first) {
166  ftsAtVtx = extrapolationResult.second;
167  } else {
168  if (TrackerBounds::isInside(seedTSOS.globalPosition())) {
169  LogWarning(metname) << "Track in the Tracker: taking the innermost state instead of the state at PCA";
170  ftsAtVtx = *seedTSOS.freeState();
171  } else {
172  if (theAllowNoVtxFlag) {
173  LogWarning(metname) << "Propagation to PCA failed, taking the innermost state instead of the state at PCA";
174  ftsAtVtx = *seedTSOS.freeState();
175  } else {
176  LogWarning(metname) << "Stand Alone track: this track will be rejected";
177  return pair<bool, reco::Track>(false, reco::Track());
178  }
179  }
180  }
181 
182  LogTrace(metname) << "TSOS after the extrapolation at vtx";
183  LogTrace(metname) << debug.dumpFTS(ftsAtVtx);
184 
185  GlobalPoint pca = ftsAtVtx.position();
186  math::XYZPoint persistentPCA(pca.x(), pca.y(), pca.z());
187  GlobalVector p = ftsAtVtx.momentum();
188  math::XYZVector persistentMomentum(p.x(), p.y(), p.z());
189 
190  double dummyNDOF = 1.0;
191  //double ndof = computeNDOF(seed);
192  double dummyChi2 = 1.0;
193 
195  dummyChi2, dummyNDOF, persistentPCA, persistentMomentum, ftsAtVtx.charge(), ftsAtVtx.curvilinearError());
196 
197  return pair<bool, reco::Track>(true, track);
198 }
199 
203 double MuonSeedTrack::computeNDOF(const TrajectorySeed& trajectory) const {
204  const string metname = "MuonSeedTrack";
205 
206  BasicTrajectorySeed::const_iterator recHits1 = (trajectory.recHits().first);
207  BasicTrajectorySeed::const_iterator recHits2 = (trajectory.recHits().second);
208 
209  double ndof = 0.;
210 
211  if ((*recHits1).isValid())
212  ndof += (*recHits1).dimension();
213  if ((*recHits2).isValid())
214  ndof += (*recHits2).dimension();
215 
216  //const Trajectory::RecHitContainer transRecHits = trajectory.recHits();
217  //for(Trajectory::RecHitContainer::const_iterator rechit = transRecHits.begin();
218  // rechit != transRecHits.end(); ++rechit)
219  //if ((*rechit)->isValid()) ndof += (*rechit)->dimension();
220 
221  // FIXME! in case of Boff is dof - 4
222  return max(ndof - 5., 0.);
223 }
~MuonSeedTrack() override
destructor
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
TrajectoryStateOnSurface TSOS
static bool isInside(const GlobalPoint &)
const std::string metname
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
T y() const
Definition: PV3DBase.h:60
GlobalPoint globalPosition() const
TrackCharge charge() const
double computeNDOF(const TrajectorySeed &) const
compute the TrajectorySeed&#39;s degree of freedom
const CurvilinearTrajectoryError & curvilinearError() const
std::string dumpFTS(const FreeTrajectoryState &fts) const
recHitContainer::const_iterator const_iterator
FreeTrajectoryState const * freeState(bool withErrors=true) const
T z() const
Definition: PV3DBase.h:61
std::pair< bool, reco::Track > buildTrackAtPCA(const TrajectorySeed &) const
Build a track at the PCA WITHOUT any vertex constriant.
unsigned int detId() const
GlobalVector momentum() const
#define LogTrace(id)
Definition: DetId.h:17
GlobalPoint position() const
PTrajectoryStateOnDet const & startingState() const
#define debug
Definition: HDRShower.cc:19
TrajectoryStateOnSurface transientState(const PTrajectoryStateOnDet &ts, const Surface *surface, const MagneticField *field)
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
TrajectoryStateOnSurface getSeedTSOS(const TrajectorySeed &seed) const
get the TrajectorySeed&#39;s TrajectoryStateOnSurface
range recHits() const
fixed size matrix
HLT enums.
void endJob() override
post-job
MuonSeedTrack(const edm::ParameterSet &)
constructor with config
void produce(edm::Event &, const edm::EventSetup &) override
construct proto-tracks
T x() const
Definition: PV3DBase.h:59
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
void beginJob() override
pre-job booking