CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SeedFromGenericPairOrTriplet.cc
Go to the documentation of this file.
13 
15  const TrackerGeometry* geom,
16  const TransientTrackingRecHitBuilder* builder,
19  const std::vector<int>& charges,
20  bool momFromPSet,
21  double errorRescaling):theMagfield(mf), theTracker(geom), theBuilder(builder), thePropagatorAlong(propagatorAlong), thePropagatorOpposite(propagatorOpposite), theSetMomentum(momFromPSet), theCharges(charges), theErrorRescaling(errorRescaling){}
22 
23 
24 std::vector<TrajectorySeed*> SeedFromGenericPairOrTriplet::seed(const SeedingHitSet& hits,
26  const NavigationDirection& seedDir,
27  const edm::EventSetup& iSetup){
28  std::vector<TrajectorySeed*> seeds;
29  if (hits.size() == 3) {
30  if(!theSetMomentum){
31  TrajectorySeed* seed = seedFromTriplet(hits, dir, seedDir, iSetup);
32  if (seed) seeds.push_back(seed);
33  } else {
34  for (std::vector<int>::const_iterator iCh = theCharges.begin(); iCh != theCharges.end(); iCh++){
35  TrajectorySeed* seed = seedFromTriplet(hits, dir, seedDir, iSetup, *iCh);
36  if(seed) seeds.push_back(seed);
37  }
38  }
39 
40  } else if (hits.size() == 2){
41  if(!theSetMomentum){
42  TrajectorySeed* seed = seedFromPair(hits, dir, seedDir);
43  if (seed) seeds.push_back(seed);
44  } else {
45  for (std::vector<int>::const_iterator iCh = theCharges.begin(); iCh != theCharges.end(); iCh++){
46  TrajectorySeed* seed = seedFromPair(hits, dir, seedDir, *iCh);
47  if (seed) seeds.push_back(seed);
48  }
49  }
50  } else {
51  throw cms::Exception("CombinatorialSeedGeneratorForCosmics") << " Wrong number of hits in Set: "
52  << hits.size() << ", should be 2 or 3 ";
53  }
54  return seeds;
55 }
56 
59  const NavigationDirection& seedDir,
60  const edm::EventSetup& iSetup, int charge) const{
61  if (hits.size() != 3) {
62  throw cms::Exception("CombinatorialSeedGeneratorForCosmics") <<
63  "call to SeedFromGenericPairOrTriplet::seedFromTriplet with " << hits.size() << " hits ";
64  }
65 
66  const TrackingRecHit* innerHit = hits[0]->hit();
67  const TrackingRecHit* middleHit = hits[1]->hit();
68  const TrackingRecHit* outerHit = hits[2]->hit();
69  GlobalPoint inner = theTracker->idToDet(innerHit->geographicalId() )->surface().toGlobal(innerHit->localPosition() );
70  GlobalPoint middle = theTracker->idToDet(middleHit->geographicalId())->surface().toGlobal(middleHit->localPosition());
71  GlobalPoint outer = theTracker->idToDet(outerHit->geographicalId() )->surface().toGlobal(outerHit->localPosition() );
72  if (theSetMomentum){
73  LogDebug("SeedFromGenericPairOrTriplet") <<
74  "Using the following hits: outer(r, phi, theta) " << outerHit->geographicalId().subdetId()<< " (" << outer.perp()
75  << ", " << outer.phi()
76  << "," << outer.theta()
77  << ") " << middleHit->geographicalId().subdetId() << " middle ("
78  << middle.perp() << ", "
79  << middle.phi() << ","
80  << middle.theta() << ") "
81  <<innerHit->geographicalId().subdetId() <<" inner ("
82  << inner.perp()
83  << ", " << inner.phi()
84  << "," << inner.theta() <<") "
85  << " (x, y, z) outer ("
86  << inner.x() << ", "
87  << inner.y() << ", "
88  << inner.z() << ") middle ("
89  << middle.x() << ", "
90  << middle.y() << ", "
91  << middle.z() << ")";
92  SeedingHitSet newSet;
93  if (seedDir == outsideIn){
94  newSet.add(hits[1]);
95  newSet.add(hits[2]);
96  } else {
97  newSet.add(hits[0]);
98  newSet.add(hits[1]);
99  }
100  if (!qualityFilter(hits)) return 0;
101  TrajectorySeed* seed = seedFromPair(newSet, dir, seedDir, charge);
102  return seed;
103 
104  }
105  GlobalPoint* firstPoint = 0;
106  GlobalPoint* secondPoint = 0;
107  GlobalPoint* thirdPoint = 0;
108  int momentumSign = 1;
109  //const TrackingRecHit* firstHit = 0;
110  //const TrackingRecHit* secondHit = 0;
111  //choose the prop dir and hit order accordingly to where the seed is made
112  std::vector<const TrackingRecHit*> trHits;
113  if (seedDir == outsideIn){
114  LogDebug("SeedFromGenericPairOrTriplet")
115  << "Seed from outsideIn alongMomentum OR insideOut oppositeToMomentum";
116  firstPoint = &outer;
117  secondPoint = &middle;
118  thirdPoint = &inner;
119  trHits.push_back(outerHit);
120  trHits.push_back(middleHit);
121  //firstHit = outerHit;
122  //secondHit = middleHit;
123  } else {
124  LogDebug("SeedFromGenericPairOrTriplet")
125  << "Seed from outsideIn oppositeToMomentum OR insideOut alongMomentum";
126  firstPoint = &inner;
127  secondPoint = &middle;
128  thirdPoint = &outer;
129  trHits.push_back(innerHit);
130  trHits.push_back(middleHit);
131  //firstHit = innerHit;
132  //secondHit = middleHit;
133  }
134  if (dir == oppositeToMomentum) momentumSign = -1;
135  FastHelix helix(*thirdPoint, *secondPoint, *firstPoint, iSetup);
136  FreeTrajectoryState originalStartingState = helix.stateAtVertex();
137  LogDebug("SeedFromGenericPairOrTriplet") << "originalStartingState " << originalStartingState;
138  /*GlobalTrajectoryParameters originalPar = originalStartingState.parameters();
139  GlobalTrajectoryParameters newPar = GlobalTrajectoryParameters(originalPar.position(),
140  momentumSign*originalPar.momentum(),
141  originalPar.charge(),
142  &originalPar.magneticField());
143  */
144 
145  /*FastCircle helix(*thirdPoint, *secondPoint, *firstPoint);
146  GlobalTrajectoryParameters newPar = GlobalTrajectoryParameters(*secondPoint,
147  momentumSign*originalPar.momentum(),
148  originalPar.charge(),
149  &originalPar.magneticField());*/
150  //FreeTrajectoryState* startingState = new FreeTrajectoryState(newPar, initialError(trHits[0]));//trHits[1]));
151  if (!qualityFilter(momentumSign*originalStartingState.momentum())) return 0;
152  //TrajectorySeed* seed = buildSeed(startingState, trHits, dir);
153  TrajectorySeed* seed = buildSeed(momentumSign*originalStartingState.momentum(),originalStartingState.charge(), trHits, dir);
154  return seed;
155 }
156 
158  const PropagationDirection& dir,
159  const NavigationDirection& seedDir, int charge) const{
160  if (hits.size() != 2) {
161  throw cms::Exception("CombinatorialSeedGeneratorForCosmics") <<
162  "call to SeedFromGenericPairOrTriplet::seedFromPair with " << hits.size() << " hits ";
163  }
164  const TrackingRecHit* innerHit = hits[0]->hit();
165  const TrackingRecHit* outerHit = hits[1]->hit();
166  GlobalPoint inner = theTracker->idToDet(innerHit->geographicalId() )->surface().toGlobal(innerHit->localPosition() );
167  GlobalPoint outer = theTracker->idToDet(outerHit->geographicalId() )->surface().toGlobal(outerHit->localPosition() );
168  LogDebug("SeedFromGenericPairOrTriplet") <<
169  "Using the following hits: outer(r, phi, theta) (" << outer.perp()
170  << ", " << outer.phi()
171  << "," << outer.theta()
172  <<") inner ("
173  << inner.perp()
174  << ", " << inner.phi()
175  << "," << inner.theta() <<")";
176  GlobalPoint* firstPoint = 0;
177  GlobalPoint* secondPoint = 0;
178  int momentumSign = 1;
179  //const TrackingRecHit* firstHit = 0;
180  //const TrackingRecHit* secondHit = 0;
181  std::vector<const TrackingRecHit*> trHits;
182  //choose the prop dir and hit order accordingly to where the seed is made
183  if (seedDir == outsideIn){
184  LogDebug("SeedFromGenericPairOrTriplet")
185  << "Seed from outsideIn alongMomentum OR insideOut oppositeToMomentum";
186  firstPoint = &outer;
187  secondPoint = &inner;
188  //firstHit = outerHit;
189  //secondHit = innerHit;
190  trHits.push_back(outerHit);
191  trHits.push_back(innerHit);
192  } else {
193  LogDebug("SeedFromGenericPairOrTriplet")
194  << "Seed from outsideIn oppositeToMomentum OR insideOut alongMomentum";
195  firstPoint = &inner;
196  secondPoint = &outer;
197  momentumSign = -1;
198  //firstHit = innerHit;
199  //secondHit = outerHit;
200  trHits.push_back(innerHit);
201  trHits.push_back(outerHit);
202  }
203  if (dir == oppositeToMomentum) momentumSign = -1;
204  GlobalVector momentum = momentumSign*theP*(*secondPoint-*firstPoint).unit();
205  /*GlobalTrajectoryParameters gtp(*firstPoint,
206  momentum,
207  charge,
208  &(*theMagfield));*/
209  //FreeTrajectoryState* startingState = new FreeTrajectoryState(gtp,initialError(trHits[0]));//trHits[1]));
210  //if (!qualityFilter(startingState, hits)) return 0;
211  //TrajectorySeed* seed = buildSeed(startingState, firstHit, dir);
212  //TrajectorySeed* seed = buildSeed(startingState, trHits, dir);
213  TrajectorySeed* seed = buildSeed(momentum, charge, trHits, dir);
214  return seed;
215 }
216 
217 
219  int charge,
220  //const TrackingRecHit* firsthit,
221  std::vector<const TrackingRecHit*>& trHits,
222  const PropagationDirection& dir) const {
224  if (dir == oppositeToMomentum) propagator = thePropagatorOpposite;
225 
226  //debug
227  GlobalPoint first = theTracker->idToDet(trHits[0]->geographicalId() )->surface().toGlobal(trHits[0]->localPosition() );
228  GlobalPoint second = theTracker->idToDet(trHits[1]->geographicalId() )->surface().toGlobal(trHits[1]->localPosition() );
229  LogDebug("SeedFromGenericPairOrTriplet") <<
230  "Using the following hits: first(r, phi, theta) (" << first.perp()
231  << ", " << first.phi()
232  << "," << first.theta()
233  <<") second ("
234  << second.perp()
235  << ", " << second.phi()
236  << "," << second.theta() <<")";
237  //build an initial trajectory state with big errors,
238  //then update it with the first hit
240  LocalVector lmom = transHit->surface()->toLocal(momentum);
241  LocalTrajectoryParameters ltp(charge/momentum.mag(),
242  lmom.x()/lmom.z(),lmom.y()/lmom.z(),
243  transHit->localPosition().x(),
244  transHit->localPosition().y(),
245  lmom.z()>0.?1.:-1.);
246 
247  LocalTrajectoryError lte(100.,100.,
248  (1.+(lmom.x()/lmom.z())*(lmom.x()/lmom.z())),
249  (1.+(lmom.y()/lmom.z())*(lmom.y()/lmom.z())),
250  1./momentum.mag());
251 
252  TrajectoryStateOnSurface initialState(ltp,lte,*transHit->surface(),&(*theMagfield));
254  TrajectoryStateOnSurface startingState = updator.update(initialState,*transHit);
255 
257 
258  //TrajectoryStateOnSurface seedTSOS(*startingState, *plane);
259  const TrajectoryStateOnSurface propTSOS = propagator->propagate(startingState,*(transHit2->surface()));
260  if (!propTSOS.isValid()){
261  LogDebug("SeedFromGenericPairOrTriplet") << "first propagation failed";
262  return 0;
263  }
264  TrajectoryStateOnSurface seedTSOS = updator.update(propTSOS, *transHit2);
265  if (!seedTSOS.isValid()){
266  LogDebug("SeedFromGenericPairOrTriplet") << "first update failed";
267  return 0;
268  }
269  LogDebug("SeedFromGenericPairOrTriplet") << "starting TSOS " << seedTSOS ;
271  PTrajectoryStateOnDet *PTraj=
272  theTransformer.persistentState(seedTSOS, trHits[1]->geographicalId().rawId());
274  //build the transientTrackingRecHit for the starting hit, then call the method clone to rematch if needed
275  std::vector<const TrackingRecHit*>::const_iterator ihits;
276  for (ihits = trHits.begin(); ihits != trHits.end(); ihits++){
277  seed_hits.push_back((*ihits)->clone());
278  }
279  TrajectorySeed* seed = new TrajectorySeed(*PTraj,seed_hits,dir);
280  delete PTraj;
281  return seed;
282 }
283 /*
284 CurvilinearTrajectoryError SeedFromGenericPairOrTriplet::initialError(const TrackingRecHit* rechit) {
285  TransientTrackingRecHit::RecHitPointer transHit = theBuilder->build(rechit);
286  //AlgebraicSymMatrix C(5,1);
287  AlgebraicSymMatrix55 C = AlgebraicMatrixID();
288  //C*=0.1;
289  if (theSetMomentum){
290  C(0,0)=1/theP;
291  C(3,3)=transHit->globalPositionError().cxx();
292  C(4,4)=transHit->globalPositionError().czz();
293 
294  //C[0][0]=1/theP;
295  //C[3][3]=transHit->globalPositionError().cxx();
296  //C[4][4]=transHit->globalPositionError().czz();
297  } else {
298  float zErr = transHit->globalPositionError().czz();
299  float transverseErr = transHit->globalPositionError().cxx(); // assume equal cxx cyy
300  C(3,3) = transverseErr;
301  C(4,4) = zErr;
302  //C[3][3] = transverseErr;
303  //C[4][4] = zErr;
304  }
305 
306  return CurvilinearTrajectoryError(C);
307 }
308 */
310  //if we are setting the momentum with the PSet we look for aligned hits
311  if (theSetMomentum){
312  if (hits.size()==3){
313  std::vector<GlobalPoint> gPoints;
314  unsigned int nHits = hits.size();
315  for (unsigned int iHit = 0; iHit < nHits; ++iHit) gPoints.push_back(hits[iHit]->globalPosition());
316  unsigned int subid=(*hits[0]).geographicalId().subdetId();
317  if(subid == StripSubdetector::TEC || subid == StripSubdetector::TID){
318  LogDebug("SeedFromGenericPairOrTriplet")
319  << "In the endcaps we cannot decide if hits are aligned with only phi and z";
320  return true;
321  }
322  FastCircle circle(gPoints[0],
323  gPoints[1],
324  gPoints[2]);
325  if (circle.rho() < 500 && circle.rho() != 0) {
326  LogDebug("SeedFromGenericPairOrTriplet") <<
327  "Seed qualityFilter rejected because rho = " << circle.rho();
328  return false;
329  }
330 
331  }
332  }
333  return true;
334 }
335 
337  if (!theSetMomentum){
338  if (momentum.perp() < theP) return false;
339  }
340  return true;
341 }
#define LogDebug(id)
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:78
FTS stateAtVertex() const
Definition: FastHelix.cc:7
T perp() const
Definition: PV3DBase.h:66
void update(const LocalTrajectoryParameters &p, const Surface &aSurface, const MagneticField *field, const SurfaceSide side=SurfaceSideDefinition::atCenterOfSurface)
TrajectorySeed * seedFromPair(const SeedingHitSet &hits, const PropagationDirection &dir, const NavigationDirection &seedDir, int charge=-1) const
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
Geom::Phi< T > phi() const
Definition: PV3DBase.h:63
T y() const
Definition: PV3DBase.h:57
PropagationDirection
TrackCharge charge() const
double charge(const std::vector< uint8_t > &Ampls)
double rho() const
Definition: FastCircle.h:54
Geom::Theta< T > theta() const
Definition: PV3DBase.h:69
U second(std::pair< T, U > const &p)
void push_back(D *&d)
Definition: OwnVector.h:288
T mag() const
Definition: PV3DBase.h:61
const TransientTrackingRecHitBuilder * theBuilder
string unit
Definition: csvLumiCalc.py:46
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
T z() const
Definition: PV3DBase.h:58
TrajectorySeed * seedFromTriplet(const SeedingHitSet &hits, const PropagationDirection &dir, const NavigationDirection &seedDir, const edm::EventSetup &iSetup, int charge=-1) const
PTrajectoryStateOnDet * persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid) const
bool first
Definition: L1TdeRCT.cc:79
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:39
virtual const GeomDet * idToDet(DetId) const
GlobalVector momentum() const
TrajectorySeed * buildSeed(const GlobalVector &momentum, int charge, std::vector< const TrackingRecHit * > &trHits, const PropagationDirection &dir) const
virtual TrajectoryStateOnSurface propagate(const FreeTrajectoryState &, const Surface &) const
Definition: Propagator.cc:9
std::vector< TrajectorySeed * > seed(const SeedingHitSet &hits, const PropagationDirection &dir, const NavigationDirection &seedDir, const edm::EventSetup &iSetup)
SeedFromGenericPairOrTriplet(const MagneticField *mf, const TrackerGeometry *geom, const TransientTrackingRecHitBuilder *builder, const Propagator *propagatorAlong, const Propagator *propagatorOpposite, const std::vector< int > &charges, bool momFromPSet, double errorRescaling)
bool qualityFilter(const SeedingHitSet &hits) const
unsigned int size() const
Definition: SeedingHitSet.h:14
void add(TransientTrackingRecHit::ConstRecHitPointer pHit)
Definition: SeedingHitSet.h:15
DetId geographicalId() const
dbl *** dir
Definition: mlp_gen.cc:35
T x() const
Definition: PV3DBase.h:56
virtual LocalPoint localPosition() const =0
virtual const BoundPlane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37