CMS 3D CMS Logo

SeedForPhotonConversionFromQuadruplets.cc
Go to the documentation of this file.
2 
3 #include "Conv4HitsReco2.h"
4 
19 //ClusterShapeIncludes
29 
30 //#define mydebug_knuenz
31 //#define mydebug_sguazz
32 //#define quadDispLine
33 template <class T>
34 T sqr(T t) {
35  return t * t;
36 }
37 
41  iC,
43  cfg.getParameter<std::string>("propagator"),
44  cfg.existsAs<double>("SeedMomentumForBOFF") ? cfg.getParameter<double>("SeedMomentumForBOFF") : 5.0) {}
45 
49  const std::string& propagator,
50  double seedMomentumForBOFF)
51  : theBfieldToken(iC.esConsumes()),
52  theTTRHBuilderToken(iC.esConsumes(edm::ESInputTag("", "WithTrackAngle"))), // FIXME: add to config
53  theTrackerToken(iC.esConsumes()),
54  thePropagatorToken(iC.esConsumes(edm::ESInputTag("", propagator))),
55  theBOFFMomentum(seedMomentumForBOFF) {
56  std::string comparitorName = SeedComparitorPSet.getParameter<std::string>("ComponentName");
57  if (comparitorName != "none") {
58  theComparitor = SeedComparitorFactory::get()->create(comparitorName, SeedComparitorPSet, iC);
59  }
60 }
61 
63 
65  const SeedingHitSet& phits,
66  const SeedingHitSet& mhits,
67  const TrackingRegion& region,
68  const edm::Event& ev,
69  const edm::EventSetup& es,
70  std::stringstream& ss,
71  std::vector<Quad>& quadV,
74 
75  bool rejectAllQuads = QuadCutPSet.getParameter<bool>("rejectAllQuads");
76  if (rejectAllQuads)
77  return nullptr;
78 
79  bool applyDeltaPhiCuts = QuadCutPSet.getParameter<bool>("apply_DeltaPhiCuts");
80  bool ClusterShapeFiltering = QuadCutPSet.getParameter<bool>("apply_ClusterShapeFilter");
81  bool applyArbitration = QuadCutPSet.getParameter<bool>("apply_Arbitration");
82  bool applydzCAcut = QuadCutPSet.getParameter<bool>("apply_zCACut");
83  double CleaningmaxRadialDistance = QuadCutPSet.getParameter<double>("Cut_DeltaRho"); //cm
84  double BeamPipeRadiusCut = QuadCutPSet.getParameter<double>("Cut_BeamPipeRadius"); //cm
85  double CleaningMinLegPt = QuadCutPSet.getParameter<double>("Cut_minLegPt"); //GeV
86  double maxLegPt = QuadCutPSet.getParameter<double>("Cut_maxLegPt"); //GeV
87  double dzcut = QuadCutPSet.getParameter<double>("Cut_zCA"); //cm
88 
89  double toleranceFactorOnDeltaPhiCuts = 0.1;
90 
91  // return 0; //FIXME, remove this line to make the code working.
92 
93  pss = &ss;
94 
95  if (phits.size() < 2)
96  return nullptr;
97  if (mhits.size() < 2)
98  return nullptr;
99 
100  //PUT HERE THE QUADRUPLET ALGORITHM, AND IN CASE USE THE METHODS ALREADY DEVELOPED, ADAPTING THEM
101 
102  //
103  // Rozzo ma efficace (per ora)
104  //
105 
106 #ifdef mydebug_sguazz
107  std::cout << " --------------------------------------------------------------------------"
108  << "\n";
109  std::cout << " Starting a hit quad fast reco "
110  << "\n";
111  std::cout << " --------------------------------------------------------------------------"
112  << "\n";
113 #endif
114 
115  //
116  // Let's build the 4 hits
119  SeedingHitSet::ConstRecHitPointer mtth1 = mhits[0];
120  SeedingHitSet::ConstRecHitPointer mtth2 = mhits[1];
121 
122  GlobalPoint vHit[4];
123  vHit[0] = ptth2->globalPosition();
124  vHit[1] = ptth1->globalPosition();
125  vHit[2] = mtth1->globalPosition();
126  vHit[3] = mtth2->globalPosition();
127 
128  //Photon source vertex primary vertex
129  const GlobalPoint& vgPhotVertex = region.origin();
130  math::XYZVector vPhotVertex(vgPhotVertex.x(), vgPhotVertex.y(), vgPhotVertex.z());
131 
132  math::XYZVector h1(vHit[0].x(), vHit[0].y(), vHit[0].z());
133  math::XYZVector h2(vHit[1].x(), vHit[1].y(), vHit[1].z());
134  math::XYZVector h3(vHit[2].x(), vHit[2].y(), vHit[2].z());
135  math::XYZVector h4(vHit[3].x(), vHit[3].y(), vHit[3].z());
136 
137  // At this point implement cleaning cuts before building the seed:::
138 
139  /*
140  Notes:
141 
142 h1, h2: positron
143 h3, h4: electron
144 
145 P1, P2: positron, ordered with radius
146 M1, M2: electron, ordered with radius
147 
148 Evan's notation:
149 V1=P1
150 V2=M1
151 V3=P2
152 V4=M2
153 
154 */
155 
156  math::XYZVector P1;
157  math::XYZVector P2;
158  math::XYZVector M1;
159  math::XYZVector M2;
160 
161  if (h1.x() * h1.x() + h1.y() * h1.y() < h2.x() * h2.x() + h2.y() * h2.y()) {
162  P1 = h1;
163  P2 = h2;
164  } else {
165  P1 = h2;
166  P2 = h1;
167  }
168 
169  if (h3.x() * h3.x() + h3.y() * h3.y() < h4.x() * h4.x() + h4.y() * h4.y()) {
170  M1 = h3;
171  M2 = h4;
172  } else {
173  M1 = h4;
174  M2 = h3;
175  }
176 
178  // Intersection-point:::
180  /*
181 Calculate the intersection point of the lines P2-P1 and M2-M1.
182 If this point is in the beam pipe, or if the distance of this
183 point to the layer of the most inner hit of the seed is less
184 than CleaningmaxRadialDistance cm, the combination is rejected.
185 */
186 
187  math::XYZVector IP(0, 0, 0);
188 
189  //Line1:
190  double kP = (P1.y() - P2.y()) / (P1.x() - P2.x());
191  double dP = P1.y() - kP * P1.x();
192  //Line2:
193  double kM = (M1.y() - M2.y()) / (M1.x() - M2.x());
194  double dM = M1.y() - kM * M1.x();
195  //Intersection:
196  double IPx = (dM - dP) / (kP - kM);
197  double IPy = kP * IPx + dP;
198 
199  IP.SetXYZ(IPx, IPy, 0);
200 
201  double IPrho = std::sqrt(IP.x() * IP.x() + IP.y() * IP.y());
202  double P1rho2 = P1.x() * P1.x() + P1.y() * P1.y();
203  double M1rho2 = M1.x() * M1.x() + M1.y() * M1.y();
204  double maxIPrho2 = IPrho + CleaningmaxRadialDistance;
205  maxIPrho2 *= maxIPrho2;
206 
207  if (IPrho < BeamPipeRadiusCut || P1rho2 > maxIPrho2 || M1rho2 > maxIPrho2) {
208  return nullptr;
209  }
210 
211  if (applyDeltaPhiCuts) {
212  kPI_ = std::atan(1.0) * 4;
213 
214  const auto& bfield = es.getData(theBfieldToken);
215  math::XYZVector QuadMean(0, 0, 0);
216  QuadMean.SetXYZ((M1.x() + M2.x() + P1.x() + P2.x()) / 4.,
217  (M1.y() + M2.y() + P1.y() + P2.y()) / 4.,
218  (M1.z() + M2.z() + P1.z() + P2.z()) / 4.);
219 
220  double fBField = bfield.inTesla(GlobalPoint(QuadMean.x(), QuadMean.y(), QuadMean.z())).z();
221 
222  double rMax = CleaningMinLegPt / (0.01 * 0.3 * fBField);
223  double rMax_squared = rMax * rMax;
224  double Mx = M1.x();
225  double My = M1.y();
226 
227  math::XYZVector B(0, 0, 0);
228  math::XYZVector C(0, 0, 0);
229 
230  if (rMax_squared * 4. > Mx * Mx + My * My) {
232  // Cleaning P1 points:::
234 
235  //Cx, Cy = Coordinates of circle center
236  //C_=line that contains the circle center
237 
238  //C_=k*x+d
239  double k = -Mx / My;
240  double d = My / 2. - k * Mx / 2.;
241 
242 #ifdef mydebug_knuenz
243  std::cout << "k" << k << std::endl;
244  std::cout << "d" << d << std::endl;
245 #endif
246 
247  //Cx1,2 and Cy1,2 are the two points that have a distance of rMax to 0,0
248  double CsolutionPart1 = -2 * k * d;
249  double CsolutionPart2 = std::sqrt(4 * k * k * d * d - 4 * (1 + k * k) * (d * d - rMax_squared));
250  double CsolutionPart3 = 2 * (1 + k * k);
251  double Cx1 = (CsolutionPart1 + CsolutionPart2) / CsolutionPart3;
252  double Cx2 = (CsolutionPart1 - CsolutionPart2) / CsolutionPart3;
253  double Cy1 = k * Cx1 + d;
254  double Cy2 = k * Cx2 + d;
255 
256  // Decide between solutions: phi(C) > phi(P)
257  double Cx, Cy;
258  math::XYZVector C1(Cx1, Cy1, 0);
259  if (C1.x() * M1.y() - C1.y() * M1.x() < 0) {
260  Cx = Cx1;
261  Cy = Cy1;
262  } else {
263  Cx = Cx2;
264  Cy = Cy2;
265  }
266  C.SetXYZ(Cx, Cy, 0);
267 
268 #ifdef mydebug_knuenz
269  std::cout << "Cx1" << Cx1 << std::endl;
270  std::cout << "Cx2" << Cx2 << std::endl;
271  std::cout << "Cy1" << Cy1 << std::endl;
272  std::cout << "Cy2" << Cy2 << std::endl;
273  std::cout << "Cx" << Cx << std::endl;
274  std::cout << "Cy" << Cy << std::endl;
275 #endif
276 
277  // Find Tangent at 0,0 to minPtCircle and point (Bx,By) on the first layer which bisects the allowed angle
278  k = -Cx / Cy;
279  d = 0;
280  double Bx1 = std::sqrt(Mx * Mx + My * My / (1 + k * k));
281  double Bx2 = -Bx1;
282  double By1 = k * Bx1 + d;
283  double By2 = k * Bx2 + d;
284 
285 #ifdef mydebug_knuenz
286  std::cout << "k" << k << std::endl;
287  std::cout << "d" << d << std::endl;
288 #endif
289 
290  // Decide between solutions: phi(B) < phi(P)
291  double Bx, By;
292  math::XYZVector B1(Bx1, By1, 0);
293  if (M1.x() * B1.y() - M1.y() * B1.x() < 0) {
294  Bx = Bx1;
295  By = By1;
296  } else {
297  Bx = Bx2;
298  By = By2;
299  }
300  B.SetXYZ(Bx, By, 0);
301 
302 #ifdef mydebug_knuenz
303  std::cout << "Bx1" << Bx1 << std::endl;
304  std::cout << "Bx2" << Bx2 << std::endl;
305  std::cout << "By1" << By1 << std::endl;
306  std::cout << "By2" << By2 << std::endl;
307  std::cout << "Bx" << Bx << std::endl;
308  std::cout << "By" << By << std::endl;
309 #endif
310 
311  double DeltaPhiMaxM1P1 = DeltaPhiManual(M1, B) * 2;
312 
313 #ifdef mydebug_knuenz
314  std::cout << "DeltaPhiMaxM1P1 " << DeltaPhiMaxM1P1 << std::endl;
315  std::cout << "M1.DeltaPhi(P1) " << DeltaPhiManual(M1, P1) << std::endl;
316  std::cout << "rho P1: " << std::sqrt(P1.x() * P1.x() + P1.y() * P1.y()) << "phi P1: " << P1.Phi() << std::endl;
317  std::cout << "rho M1: " << std::sqrt(M1.x() * M1.x() + M1.y() * M1.y()) << "phi M1: " << M1.Phi() << std::endl;
318 #endif
319 
320  //Finally Cut on DeltaPhi of P1 and M1
321 
322  double tol_DeltaPhiMaxM1P1 = DeltaPhiMaxM1P1 * toleranceFactorOnDeltaPhiCuts;
323  double DeltaPhiManualM1P1 = DeltaPhiManual(M1, P1);
324 
325  if (DeltaPhiManualM1P1 > DeltaPhiMaxM1P1 + tol_DeltaPhiMaxM1P1 || DeltaPhiManualM1P1 < 0 - tol_DeltaPhiMaxM1P1) {
326  return nullptr;
327  }
328 
329  } //if rMax > rLayerM1
330 
332  // Cleaning M2 points:::
334 
335  // if(B.DeltaPhi(P1)>0){//normal algo (with minPt circle)
336 
337  double rM2_squared = M2.x() * M2.x() + M2.y() * M2.y();
338  if (rMax_squared * 4. > rM2_squared) { //if minPt circle is smaller than 2*M2-layer radius, algo makes no sense
339 
340  //Chordales equation (line containing the two intersection points of the two circles)
341  double k = -C.x() / C.y();
342  double d = (rM2_squared - rMax_squared + C.x() * C.x() + C.y() * C.y()) / (2 * C.y());
343 
344  double M2solutionPart1 = -2 * k * d;
345  double M2solutionPart2 = std::sqrt(4 * k * k * d * d - 4 * (1 + k * k) * (d * d - rM2_squared));
346  double M2solutionPart3 = 2 + 2 * k * k;
347  double M2xMax1 = (M2solutionPart1 + M2solutionPart2) / M2solutionPart3;
348  double M2xMax2 = (M2solutionPart1 - M2solutionPart2) / M2solutionPart3;
349  double M2yMax1 = k * M2xMax1 + d;
350  double M2yMax2 = k * M2xMax2 + d;
351 
352  //double M2xMax,M2yMax;
353  math::XYZVector M2MaxVec1(M2xMax1, M2yMax1, 0);
354  math::XYZVector M2MaxVec2(M2xMax2, M2yMax2, 0);
355  math::XYZVector M2MaxVec(0, 0, 0);
356  if (M2MaxVec1.x() * M2MaxVec2.y() - M2MaxVec1.y() * M2MaxVec2.x() < 0) {
357  M2MaxVec.SetXYZ(M2xMax2, M2yMax2, 0);
358  } else {
359  M2MaxVec.SetXYZ(M2xMax1, M2yMax1, 0);
360  }
361 
362  double DeltaPhiMaxM2 = DeltaPhiManual(M2MaxVec, M1);
363 
364 #ifdef mydebug_knuenz
365  std::cout << "C.x() " << C.x() << std::endl;
366  std::cout << "C.y() " << C.y() << std::endl;
367  std::cout << "M1.x() " << M1.x() << std::endl;
368  std::cout << "M1.y() " << M1.y() << std::endl;
369  std::cout << "M2.x() " << M2.x() << std::endl;
370  std::cout << "M2.y() " << M2.y() << std::endl;
371  std::cout << "k " << k << std::endl;
372  std::cout << "d " << d << std::endl;
373  std::cout << "M2xMax1 " << M2xMax1 << std::endl;
374  std::cout << "M2xMax2 " << M2xMax2 << std::endl;
375  std::cout << "M2yMax1 " << M2yMax1 << std::endl;
376  std::cout << "M2yMax2 " << M2yMax2 << std::endl;
377  std::cout << "M2xMax " << M2MaxVec.x() << std::endl;
378  std::cout << "M2yMax " << M2MaxVec.y() << std::endl;
379  std::cout << "rM2_squared " << rM2_squared << std::endl;
380  std::cout << "rMax " << rMax << std::endl;
381  std::cout << "DeltaPhiMaxM2 " << DeltaPhiMaxM2 << std::endl;
382 #endif
383 
384  double tol_DeltaPhiMaxM2 = DeltaPhiMaxM2 * toleranceFactorOnDeltaPhiCuts;
385  double DeltaPhiManualM2M1 = DeltaPhiManual(M2, M1);
386 
387  if (DeltaPhiManualM2M1 > DeltaPhiMaxM2 + tol_DeltaPhiMaxM2 || DeltaPhiManualM2M1 < 0 - tol_DeltaPhiMaxM2) {
388  return nullptr;
389  }
390 
391  //Using the lazy solution for P2: DeltaPhiMaxP2=DeltaPhiMaxM2
392  double DeltaPhiManualP1P2 = DeltaPhiManual(P1, P2);
393  if (DeltaPhiManualP1P2 > DeltaPhiMaxM2 + tol_DeltaPhiMaxM2 || DeltaPhiManualP1P2 < 0 - tol_DeltaPhiMaxM2) {
394  return nullptr;
395  }
396  }
397  }
398 
399  // }
400 
401  // if(B.DeltaPhi(P1)<0){//different algo (without minPt circle)
402 
403  // }
404 
405  // End of pre-seed cleaning
406 
407  Conv4HitsReco2 quad(vPhotVertex, h1, h2, h3, h4);
408  quad.SetMaxNumberOfIterations(100);
409 #ifdef mydebug_sguazz
410  quad.Dump();
411 #endif
412  math::XYZVector candVtx;
413  double candPtPlus, candPtMinus;
414  //double rPlus, rMinus;
415  int nite = quad.ConversionCandidate(candVtx, candPtPlus, candPtMinus);
416 
417  if (!(nite && abs(nite) < 25 && nite != -1000 && nite != -2000))
418  return nullptr;
419 
420  // math::XYZVector plusCenter = quad.GetPlusCenter(rPlus);
421  // math::XYZVector minusCenter = quad.GetMinusCenter(rMinus);
422 
423 #ifdef mydebug_sguazz
424  std::cout << " >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
425  << "\n";
426  std::cout << " >>>>>>>>>>> Conv Cand: "
427  << " Vertex X: " << candVtx.X() << " [cm] Y: " << candVtx.Y() << " [cm] pt+: " << candPtPlus
428  << " [GeV] pt-: " << candPtMinus << " [GeV]; #its: " << nite << "\n";
429 #endif
430 
431  //Add here cuts
432  double minLegPt = CleaningMinLegPt;
433  double maxRadialDistance = CleaningmaxRadialDistance;
434 
435  //
436  // Cut on leg's transverse momenta
437  if (candPtPlus < minLegPt)
438  return nullptr;
439  if (candPtMinus < minLegPt)
440  return nullptr;
441  //
442  if (candPtPlus > maxLegPt)
443  return nullptr;
444  if (candPtMinus > maxLegPt)
445  return nullptr;
446  //
447  // Cut on radial distance between estimated conversion vertex and inner hits
448  double cr = std::sqrt(candVtx.Perp2());
449  double maxr2 = (maxRadialDistance + cr);
450  maxr2 *= maxr2;
451  if (h2.Perp2() > maxr2)
452  return nullptr;
453  if (h3.Perp2() > maxr2)
454  return nullptr;
455 
456  // At this point implement cleaning cuts after building the seed
457 
458  //ClusterShapeFilter_knuenz:::
459  const auto& bfield = es.getData(theBfieldToken);
460  float nomField = bfield.nominalValue();
461 
462  if (ClusterShapeFiltering) {
463  if (theComparitor)
464  theComparitor->init(ev, es);
465 
468 
469  // SeedingHitSet::ConstRecHitPointer ptth1 = phits[0]; // (never used???)
471  SeedingHitSet::ConstRecHitPointer mtth1 = mhits[0];
472  SeedingHitSet::ConstRecHitPointer mtth2 = mhits[1];
473 
474  GlobalPoint vertexPos(candVtx.x(), candVtx.y(), candVtx.z());
475 
476  float ptMinReg = 0.1;
477  GlobalTrackingRegion region(ptMinReg, vertexPos, 0, 0, true);
478 
479  FastHelix phelix(ptth2->globalPosition(), mtth1->globalPosition(), vertexPos, nomField, &bfield, vertexPos);
480  pkine = phelix.stateAtVertex();
481  FastHelix mhelix(mtth2->globalPosition(), mtth1->globalPosition(), vertexPos, nomField, &bfield, vertexPos);
482  mkine = mhelix.stateAtVertex();
483 
484  if (theComparitor && !theComparitor->compatible(phits, pkine, phelix)) {
485  return nullptr;
486  }
487  if (theComparitor && !theComparitor->compatible(mhits, mkine, mhelix)) {
488  return nullptr;
489  }
490  }
491 
492  //Do a very simple fit to estimate the slope
493  double quadPhotCotTheta = 0.;
494  double quadZ0 = 0.;
495  simpleGetSlope(ptth2, ptth1, mtth1, mtth2, region, quadPhotCotTheta, quadZ0);
496 
497  double quadPhotPhi = (candVtx - vPhotVertex).Phi();
498 
499  math::XYZVector fittedPrimaryVertex(vgPhotVertex.x(), vgPhotVertex.y(), quadZ0);
500 
501  candVtx.SetZ(std::sqrt(candVtx.Perp2()) * quadPhotCotTheta + quadZ0);
502  GlobalPoint convVtxGlobalPoint(candVtx.X(), candVtx.Y(), candVtx.Z());
503 
504  //
505  // Comparing new quad with old quad
506  //
507  //Arbitration
508 
509  Quad thisQuad;
510  thisQuad.x = candVtx.X();
511  thisQuad.y = candVtx.Y();
512  thisQuad.z = candVtx.Z();
513  thisQuad.ptPlus = candPtPlus;
514  thisQuad.ptMinus = candPtMinus;
515  thisQuad.cot = quadPhotCotTheta;
516  if (similarQuadExist(thisQuad, quadV) && applyArbitration)
517  return nullptr;
518 
519  // not able to get the mag field... doing the dirty way
520  //
521  // Plus
522  FastHelix helixPlus(
523  ptth2->globalPosition(), ptth1->globalPosition(), convVtxGlobalPoint, nomField, &bfield, convVtxGlobalPoint);
524  GlobalTrajectoryParameters kinePlus = helixPlus.stateAtVertex();
525  kinePlus = GlobalTrajectoryParameters(
526  convVtxGlobalPoint,
527  GlobalVector(candPtPlus * cos(quadPhotPhi), candPtPlus * sin(quadPhotPhi), candPtPlus * quadPhotCotTheta),
528  1, //1
529  &kinePlus.magneticField());
530 
531  //
532  // Minus
533  FastHelix helixMinus(
534  mtth2->globalPosition(), mtth1->globalPosition(), convVtxGlobalPoint, nomField, &bfield, convVtxGlobalPoint);
535  GlobalTrajectoryParameters kineMinus = helixMinus.stateAtVertex();
536  kineMinus = GlobalTrajectoryParameters(
537  convVtxGlobalPoint,
538  GlobalVector(candPtMinus * cos(quadPhotPhi), candPtMinus * sin(quadPhotPhi), candPtMinus * quadPhotCotTheta),
539  -1, //-1
540  &kineMinus.magneticField());
541 
542  float sinThetaPlus = sin(kinePlus.momentum().theta());
543  float sinThetaMinus = sin(kineMinus.momentum().theta());
544  float ptmin = region.ptMin();
545  //vertexBounds da region
546  GlobalVector vertexBounds(region.originRBound(), region.originRBound(), region.originZBound());
547 
548  CurvilinearTrajectoryError errorPlus = initialError(vertexBounds, ptmin, sinThetaPlus);
549  CurvilinearTrajectoryError errorMinus = initialError(vertexBounds, ptmin, sinThetaMinus);
550  FreeTrajectoryState ftsPlus(kinePlus, errorPlus);
551  FreeTrajectoryState ftsMinus(kineMinus, errorMinus);
552 
553  //FIXME: here probably you want to go in parallel with phits and mhits
554  //NB: the seedCollection is filled (the important thing) the return of the last TrajectorySeed is not used, but is needed
555  //to maintain the inheritance
556 
557 #ifdef quadDispLine
558  double vError = region.originZBound();
559  if (vError > 15.)
560  vError = 1.;
561  std::cout << "QuadDispLine " << vgPhotVertex.x() << " " << vgPhotVertex.y() << " " << vgPhotVertex.z() << " "
562  << vError << " " << vHit[0].x() << " " << vHit[0].y() << " " << vHit[0].z() << " "
563  << sqrt(getSqrEffectiveErrorOnZ(ptth2, region)) << " " << vHit[1].x() << " " << vHit[1].y() << " "
564  << vHit[1].z() << " " << sqrt(getSqrEffectiveErrorOnZ(ptth1, region)) << " " << vHit[2].x() << " "
565  << vHit[2].y() << " " << vHit[2].z() << " " << sqrt(getSqrEffectiveErrorOnZ(mtth1, region)) << " "
566  << vHit[3].x() << " " << vHit[3].y() << " " << vHit[3].z() << " "
567  << sqrt(getSqrEffectiveErrorOnZ(mtth2, region)) << " " << candVtx.X() << " " << candVtx.Y() << " "
568  << candVtx.Z() << " " << fittedPrimaryVertex.X() << " " << fittedPrimaryVertex.Y() << " "
569  << fittedPrimaryVertex.Z()
570  << " "
571  // << candPtPlus << " " << rPlus << " " << plusCenter.X() << " " << plusCenter.Y() << " "
572  // << candPtMinus << " " << rMinus << " " << minusCenter.X() << " " << minusCenter.Y() << " "
573  << nite << " " << chi2 << "\n";
574 #endif
575 #ifdef mydebug_sguazz
576  std::cout << " >>>>> Hit quad fast reco done >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
577  << "\n";
578  uint32_t detid;
579  std::cout << "[SeedForPhotonConversionFromQuadruplets]\n ptth1 ";
580  detid = ptth1->geographicalId().rawId();
581  // po.print(std::cout , detid );
582  std::cout << " \t " << detid << " " << ptth1->localPosition() << " " << ptth1->globalPosition();
583  detid = ptth2->geographicalId().rawId();
584  std::cout << " \n\t ptth2 ";
585  // po.print(std::cout , detid );
586  std::cout << " \t " << detid << " " << ptth2->localPosition() << " " << ptth2->globalPosition() << "\nhelix momentum "
587  << kinePlus.momentum() << " pt " << kinePlus.momentum().perp() << " radius "
588  << 1 / kinePlus.transverseCurvature() << " q " << kinePlus.charge();
589  std::cout << " \n\t mtth1 ";
590  detid = mtth1->geographicalId().rawId();
591  std::cout << " \t " << detid << " " << mtth1->localPosition() << " " << mtth1->globalPosition();
592  std::cout << " \n\t mtth2 ";
593  detid = mtth2->geographicalId().rawId();
594  // po.print(std::cout , detid );
595  std::cout << " \t " << detid << " " << mtth2->localPosition() << " " << mtth2->globalPosition() << "\nhelix momentum "
596  << kineMinus.momentum() << " pt " << kineMinus.momentum().perp() << " radius "
597  << 1 / kineMinus.transverseCurvature() << " q " << kineMinus.charge();
598  std::cout << "\n <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
599  << "\n";
600 #endif
601 
602  // get cloner
603  auto builder = static_cast<TkTransientTrackingRecHitBuilder const*>(&es.getData(theTTRHBuilderToken));
604  cloner = (*builder).cloner();
605 
606  bool buildSeedBoolPos = buildSeedBool(seedCollection, phits, ftsPlus, es, applydzCAcut, region, dzcut);
607  bool buildSeedBoolNeg = buildSeedBool(seedCollection, mhits, ftsMinus, es, applydzCAcut, region, dzcut);
608 
609  if (buildSeedBoolPos && buildSeedBoolNeg) {
610  buildSeed(seedCollection, phits, ftsPlus, es, false, region);
611  buildSeed(seedCollection, mhits, ftsMinus, es, false, region);
612  }
613 
614  return nullptr;
615 }
616 
618  const GlobalPoint& vertexPos,
619  const edm::EventSetup& es,
620  const float cotTheta) const {
622 
625 
626  const auto& bfield = es.getData(theBfieldToken);
627  float nomField = bfield.nominalValue();
628  bool isBOFF = (0 == nomField);
629 
630  FastHelix helix(tth2->globalPosition(), tth1->globalPosition(), vertexPos, nomField, &bfield, vertexPos);
631  kine = helix.stateAtVertex();
632 
633  //force the pz/pt equal to the measured one
634  if (fabs(cotTheta) < cotTheta_Max)
636  kine.position(),
637  GlobalVector(kine.momentum().x(), kine.momentum().y(), kine.momentum().perp() * cotTheta),
638  kine.charge(),
639  &kine.magneticField());
640  else
642  kine.position(),
643  GlobalVector(kine.momentum().x(), kine.momentum().y(), kine.momentum().perp() * cotTheta_Max),
644  kine.charge(),
645  &kine.magneticField());
646 
647 #ifdef mydebug_seed
648  uint32_t detid;
649  (*pss) << "[SeedForPhotonConversionFromQuadruplets] initialKinematic tth1 ";
650  detid = tth1->geographicalId().rawId();
651  po.print(*pss, detid);
652  (*pss) << " \t " << detid << " " << tth1->localPosition() << " " << tth1->globalPosition();
653  detid = tth2->geographicalId().rawId();
654  (*pss) << " \n\t tth2 ";
655  po.print(*pss, detid);
656  (*pss) << " \t " << detid << " " << tth2->localPosition() << " " << tth2->globalPosition() << "\nhelix momentum "
657  << kine.momentum() << " pt " << kine.momentum().perp() << " radius " << 1 / kine.transverseCurvature();
658 #endif
659 
660  if (isBOFF && (theBOFFMomentum > 0)) {
661  kine =
662  GlobalTrajectoryParameters(kine.position(), kine.momentum().unit() * theBOFFMomentum, kine.charge(), &bfield);
663  }
664  return kine;
665 }
666 
668  float ptMin,
669  float sinTheta) const {
670  // Set initial uncertainty on track parameters, using only P.V. constraint and no hit
671  // information.
672  GlobalError vertexErr(sqr(vertexBounds.x()), 0, sqr(vertexBounds.y()), 0, 0, sqr(vertexBounds.z()));
673 
674  AlgebraicSymMatrix55 C = ROOT::Math::SMatrixIdentity();
675 
676  // FIXME: minC00. Prevent apriori uncertainty in 1/P from being too small,
677  // to avoid instabilities.
678  // N.B. This parameter needs optimising ...
679  float sin2th = sqr(sinTheta);
680  float minC00 = 1.0;
681  C[0][0] = std::max(sin2th / sqr(ptMin), minC00);
682  float zErr = vertexErr.czz();
683  float transverseErr = vertexErr.cxx(); // assume equal cxx cyy
684  C[3][3] = transverseErr;
685  C[4][4] = zErr * sin2th + transverseErr * (1 - sin2th);
686 
688 }
689 
691  const SeedingHitSet& hits,
692  const FreeTrajectoryState& fts,
693  const edm::EventSetup& es,
694  bool apply_dzCut,
695  const TrackingRegion& region) const {
696  // get tracker
697  const auto& tracker = es.getData(theTrackerToken);
698 
699  // get propagator
701 
702  // get updator
704 
705  // Now update initial state track using information from seed hits.
706 
707  TrajectoryStateOnSurface updatedState;
709 
710  const TrackingRecHit* hit = nullptr;
711  for (unsigned int iHit = 0; iHit < hits.size() && iHit < 2; iHit++) {
712  hit = hits[iHit];
714  (iHit == 0) ? propagator->propagate(fts, tracker.idToDet(hit->geographicalId())->surface())
715  : propagator->propagate(updatedState, tracker.idToDet(hit->geographicalId())->surface());
716 
718 
720 
721  updatedState = updator.update(state, *newtth);
722 
723  seedHits.push_back(newtth);
724 #ifdef mydebug_seed
725  uint32_t detid = hit->geographicalId().rawId();
726  (*pss) << "\n[SeedForPhotonConversionFromQuadruplets] hit " << iHit;
727  po.print(*pss, detid);
728  (*pss) << " " << detid << "\t lp " << hit->localPosition() << " tth " << tth->localPosition() << " newtth "
729  << newtth->localPosition() << " state " << state.globalMomentum().perp();
730 #endif
731  }
732 
733  if (!hit)
734  return nullptr;
735 
736  PTrajectoryStateOnDet const& PTraj =
737  trajectoryStateTransform::persistentState(updatedState, hit->geographicalId().rawId());
738 
739  seedCollection.push_back(TrajectorySeed(PTraj, seedHits, alongMomentum));
740  return &seedCollection.back();
741 }
742 
744  const SeedingHitSet& hits,
745  const FreeTrajectoryState& fts,
746  const edm::EventSetup& es,
747  bool apply_dzCut,
748  const TrackingRegion& region,
749  double dzcut) const {
750  // get tracker
751  const auto& tracker = es.getData(theTrackerToken);
752 
753  // get propagator
755 
756  // get updator
758 
759  // Now update initial state track using information from seed hits.
760 
761  TrajectoryStateOnSurface updatedState;
763 
764  const TrackingRecHit* hit = nullptr;
765  for (unsigned int iHit = 0; iHit < hits.size() && iHit < 2; iHit++) {
766  hit = hits[iHit]->hit();
768  (iHit == 0) ? propagator->propagate(fts, tracker.idToDet(hit->geographicalId())->surface())
769  : propagator->propagate(updatedState, tracker.idToDet(hit->geographicalId())->surface());
770  if (!state.isValid()) {
771  return false;
772  }
773 
775 
777 
778  if (!checkHit(state, newtth, es)) {
779  return false;
780  }
781 
782  updatedState = updator.update(state, *newtth);
783  if (!updatedState.isValid()) {
784  return false;
785  }
786 
787  seedHits.push_back(newtth->hit()->clone());
788  }
789 
790  if (apply_dzCut) {
792 
793  double zCA;
794 
795  math::XYZVector EstMomGam(
796  updatedState.globalMomentum().x(), updatedState.globalMomentum().y(), updatedState.globalMomentum().z());
797  math::XYZVector EstPosGam(
798  updatedState.globalPosition().x(), updatedState.globalPosition().y(), updatedState.globalPosition().z());
799 
800  double EstMomGamLength =
801  std::sqrt(EstMomGam.x() * EstMomGam.x() + EstMomGam.y() * EstMomGam.y() + EstMomGam.z() * EstMomGam.z());
802  math::XYZVector EstMomGamNorm(
803  EstMomGam.x() / EstMomGamLength, EstMomGam.y() / EstMomGamLength, EstMomGam.z() / EstMomGamLength);
804 
805  //Calculate dz of point of closest approach of the two lines (WA approach) -> cut on dz
806 
807  const GlobalPoint EstPosGamGlobalPoint(
808  updatedState.globalPosition().x(), updatedState.globalPosition().y(), updatedState.globalPosition().z());
809  const GlobalVector EstMomGamGlobalVector(
810  updatedState.globalMomentum().x(), updatedState.globalMomentum().y(), updatedState.globalMomentum().z());
811 
812  const MagneticField* magField = &es.getData(theBfieldToken);
813  TrackCharge qCharge = 0;
814 
815  const GlobalTrajectoryParameters myGlobalTrajectoryParameter(
816  EstPosGamGlobalPoint, EstMomGamGlobalVector, qCharge, magField);
817 
818  AlgebraicSymMatrix66 aCovarianceMatrix;
819 
820  for (int i = 0; i < 6; ++i)
821  for (int j = 0; j < 6; ++j)
822  aCovarianceMatrix(i, j) = 1e-4;
823 
824  CartesianTrajectoryError myCartesianError(aCovarianceMatrix);
825 
826  const FreeTrajectoryState stateForProjectionToBeamLine(myGlobalTrajectoryParameter, myCartesianError);
827 
828  const GlobalPoint BeamSpotGlobalPoint(0, 0, 0);
829 
830  const reco::BeamSpot::Point BeamSpotPoint(region.origin().x(), region.origin().y(), region.origin().z());
831 
832  TSCBLBuilderNoMaterial tscblBuilder;
833 
834  double CovMatEntry = 0.;
836  for (int i = 0; i < 3; ++i) {
837  cov(i, i) = CovMatEntry;
838  }
840 
841  reco::BeamSpot myBeamSpot(BeamSpotPoint, 0., 0., 0., 0., cov, BeamType_);
842 
843  TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(stateForProjectionToBeamLine, myBeamSpot);
844  if (tscbl.isValid() == false) {
845  zCA = 0;
846  } else {
847  GlobalPoint v = tscbl.trackStateAtPCA().position(); // Position of closest approach to BS
848  zCA = v.z();
849  }
850 
851  /* //Calculate dz of point of closest approach of the two lines -> cut on dz
852 
853  double newX,newY,newR;
854  double Rbuff=std::sqrt(EstPosGam.x()*EstPosGam.x()+EstPosGam.y()*EstPosGam.y());
855  double deltas,s,sbuff;
856  double rMin=1e9;
857 
858  double InitXp=EstPosGam.x()+1*EstMomGamNorm.x();
859  double InitXm=EstPosGam.x()-1*EstMomGamNorm.x();
860  double InitYp=EstPosGam.y()+1*EstMomGamNorm.y();
861  double InitYm=EstPosGam.y()-1*EstMomGamNorm.y();
862 
863  if(InitXp*InitXp+InitYp*InitYp < InitXm*InitXm+InitYm*InitYm) {s=5; deltas=5;}
864  else {s=-5; deltas=-5;}
865 
866  int nTurns=0;
867  int nIterZ=0;
868  for (int i_dz=0;i_dz<1000;i_dz++){
869  newX=EstPosGam.x()+s*EstMomGamNorm.x();
870  newY=EstPosGam.y()+s*EstMomGamNorm.y();
871  newR=std::sqrt(newX*newX+newY*newY);
872  if(newR>Rbuff) {deltas=-1*deltas/10;nTurns++;}
873  else {Rbuff=newR;}
874  if(newR<rMin) {rMin=newR; sbuff=s;}
875  s=s+deltas;
876  nIterZ++;
877  if(nTurns>1) break;
878  }
879 
880  zCA=EstPosGam.z()+sbuff*EstMomGamNorm.z();
881 */
882 
883 #ifdef mydebug_knuenz
884  std::cout << "zCA: " << zCA << std::endl;
885 #endif
886 
887  if (std::fabs(zCA) > dzcut)
888  return false;
889  }
890 
891  return true;
892 }
893 
896  //const TransientTrackingRecHit* a= hit.get();
897  //return const_cast<TransientTrackingRecHit*> (a);
898  //This was modified otherwise the rechit will have just the local x component and local y=0
899  // To understand how to modify for pixels
900 
901  //const TSiStripRecHit2DLocalPos* b = dynamic_cast<const TSiStripRecHit2DLocalPos*>(a);
902  //return const_cast<TSiStripRecHit2DLocalPos*>(b);
904 }
905 
906 //
907 // Below: stupid utils method by sguazz
908 //
909 //
911  (*pss) << "\n" << s << "\t";
912  for (size_t i = 0; i < 2; ++i)
913  (*pss) << std::setw(60) << d[i] << std::setw(1) << " | ";
914 }
915 
917  (*pss) << "\n" << s << "\t";
918  for (size_t i = 0; i < 2; ++i)
919  (*pss) << std::setw(60) << d[i] << std::setw(1) << " | ";
920 }
921 
923  (*pss) << "\n" << s << "\t";
924  for (size_t i = 0; i < 2; ++i)
925  (*pss) << std::setw(20) << d[i] << " r " << d[i].perp() << " phi " << d[i].phi() << " | ";
926 }
927 
929  (*pss) << "\n" << s << "\n";
930  for (int i = 0; i < n; ++i)
931  (*pss) << std::setw(20) << d[i] << " r " << d[i].perp() << " phi " << d[i].phi() << "\n";
932 }
933 
935 
937  bool swapped = true;
938  int j = 0;
940  while (swapped) {
941  swapped = false;
942  j++;
943  for (int i = 0; i < n - j; i++) {
944  if (reco::deltaPhi((arr[i] - vtx).barePhi(), (arr[i + 1] - vtx).barePhi()) > 0.) {
945  tmp = arr[i];
946  arr[i] = arr[i + 1];
947  arr[i + 1] = tmp;
948  swapped = true;
949  }
950  }
951  }
952 }
953 
955  bool swapped = true;
956  int j = 0;
958  while (swapped) {
959  swapped = false;
960  j++;
961  for (int i = 0; i < n - j; i++) {
962  if (reco::deltaPhi((arr[i] - vtx).barePhi(), (arr[i + 1] - vtx).barePhi()) < 0.) {
963  tmp = arr[i];
964  arr[i] = arr[i + 1];
965  arr[i + 1] = tmp;
966  swapped = true;
967  }
968  }
969  }
970 }
971 
976  const TrackingRegion& region,
977  double& cotTheta,
978  double& z0) {
979  double x[5], y[5], e2y[5];
980 
981  //The fit is done filling x with r values, y with z values of the four hits and the vertex
982  //
983  //Hits
984  x[0] = ohit->globalPosition().perp();
985  y[0] = ohit->globalPosition().z();
986  e2y[0] = getSqrEffectiveErrorOnZ(ohit, region);
987  //
988  x[1] = nohit->globalPosition().perp();
989  y[1] = nohit->globalPosition().z();
990  e2y[1] = getSqrEffectiveErrorOnZ(nohit, region);
991  //
992  x[2] = nihit->globalPosition().perp();
993  y[2] = nihit->globalPosition().z();
994  e2y[2] = getSqrEffectiveErrorOnZ(nihit, region);
995  //
996  x[3] = ihit->globalPosition().perp();
997  y[3] = ihit->globalPosition().z();
998  e2y[3] = getSqrEffectiveErrorOnZ(ihit, region);
999  //
1000  //Vertex
1001  x[4] = region.origin().perp();
1002  y[4] = region.origin().z();
1003  double vError = region.originZBound();
1004  if (vError > 15.)
1005  vError = 1.;
1006  e2y[4] = sqr(vError);
1007 
1008  double e2z0;
1009  double chi2 = verySimpleFit(5, x, y, e2y, z0, e2z0, cotTheta);
1010 
1011  return chi2;
1012 }
1013 
1015  int size, double* ax, double* ay, double* e2y, double& p0, double& e2p0, double& p1) {
1016  //#include "verySimpleFit.icc"
1017  return 0;
1018 }
1019 
1021  const TrackingRegion& region) {
1022  //
1023  //Fit-wise the effective error on Z is the sum in quadrature of the error on Z
1024  //and the error on R correctly projected by using hit-vertex direction
1025 
1026  double sqrProjFactor =
1027  sqr((hit->globalPosition().z() - region.origin().z()) / (hit->globalPosition().perp() - region.origin().perp()));
1028  return (hit->globalPositionError().czz() + sqrProjFactor * hit->globalPositionError().rerr(hit->globalPosition()));
1029 }
1030 
1031 bool SeedForPhotonConversionFromQuadruplets::similarQuadExist(Quad& thisQuad, std::vector<Quad>& quadV) {
1032  for (auto const& quad : quadV) {
1033  double dx = thisQuad.x - quad.x;
1034  double dy = thisQuad.y - quad.y;
1035  //double dz = abs(thisQuad.z-quad.z);
1036  //std::cout<<"thisQuad.x="<<thisQuad.x<<" "<<"quad.x="<<quad.x<<" "<<"thisQuad.y="<<thisQuad.y<<" "<<"quad.y="<<quad.y<<" "<<"thisQuad.z"<<thisQuad.z<<" "<<"quad.z="<<quad.z<<" "<<"thisQuad.ptPlus"<<thisQuad.ptPlus<<" "<<"quad.ptPlus="<<quad.ptPlus<<" "<<"thisQuad.ptMinus="<<thisQuad.ptMinus<<" "<<"quad.ptMinus="<<quad.ptMinus<<" "<<"thisQuad.cot="<<thisQuad.cot<<" "<<"quad.cot="<<quad.cot<<std::endl; //ValDebug
1037  //std::cout<<"x1-x2="<<dx<<"y1-y2="<<dy<<"dx*dx+dy*dy="<<dx*dx+dy*dy<<std::endl; //ValDebug
1038  //std::cout<<"thisQuad.ptPlus-quad.ptPlus="<<thisQuad.ptPlus-quad.ptPlus<<"abs(thisQuad.ptPlus-quad.ptPlus)="<<abs(thisQuad.ptPlus-quad.ptPlus)<<std::endl; //ValDebug
1039  //std::cout <<sqrt(dx*dx+dy*dy)<<" <1? "<<dz<<" <3? "<<abs(thisQuad.ptPlus-quad.ptPlus)<<" <0.5? "<<abs(thisQuad.ptMinus-quad.ptMinus)<<" <0.5? "<<abs(thisQuad.cot-quad.cot)<<" <0.3? "<<std::endl; //ValDebug
1040  //if ( sqrt(dx*dx+dy*dy)<1.)
1041  // std::cout <<sqrt(dx*dx+dy*dy)<<" <1? "<<dz<<" <3? "<<abs(thisQuad.ptPlus-quad.ptPlus)<<" <"<<0.5*quad.ptPlus<<"? "<<abs(thisQuad.ptMinus-quad.ptMinus)<<" <"<<0.5*quad.ptMinus<<"? "<<abs(thisQuad.cot-quad.cot)<<" <"<<0.3*quad.cot<<"? "<<std::endl; //ValDebug
1042  // ( sqrt(dx*dx+dy*dy)<1. &&
1043  //z<3. &&
1044  //bs(thisQuad.ptPlus-quad.ptPlus)<0.5*quad.ptPlus &&
1045  //bs(thisQuad.ptMinus-quad.ptMinus)<0.5*quad.ptMinus &&
1046  //bs(thisQuad.cot-quad.cot)<0.3*quad.cot
1047  //
1048  // {
1049  // //std::cout<<"Seed rejected due to arbitration"<<std::endl;
1050  // return true;
1051  // }
1052  if (sqrt(dx * dx + dy * dy) < 1. && fabs(thisQuad.ptPlus - quad.ptPlus) < 0.5 * quad.ptPlus &&
1053  fabs(thisQuad.ptMinus - quad.ptMinus) < 0.5 * quad.ptMinus) {
1054  //std::cout<<"Seed rejected due to arbitration"<<std::endl;
1055  return true;
1056  }
1057  }
1058  quadV.push_back(thisQuad);
1059  return false;
1060 }
1061 
1063  double kTWOPI = 2. * kPI_;
1064  double DeltaPhiMan = v1.Phi() - v2.Phi();
1065  while (DeltaPhiMan >= kPI_)
1066  DeltaPhiMan -= kTWOPI;
1067  while (DeltaPhiMan < -kPI_)
1068  DeltaPhiMan += kTWOPI;
1069 
1070  return DeltaPhiMan;
1071 }
size
Write out results.
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
math::Error< dimension >::type CovarianceMatrix
Definition: BeamSpot.h:29
GlobalTrajectoryParameters initialKinematic(const SeedingHitSet &hits, const GlobalPoint &vertexPos, const edm::EventSetup &es, const float cotTheta) const
BeamType
beam spot flags
Definition: BeamSpot.h:24
bool buildSeedBool(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits, const FreeTrajectoryState &fts, const edm::EventSetup &es, bool apply_dzCut, const TrackingRegion &region, double dzcut) const
const TrajectorySeed * trajectorySeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &phits, const SeedingHitSet &mhits, const TrackingRegion &region, const edm::Event &ev, const edm::EventSetup &es, std::stringstream &ss, std::vector< Quad > &quadV, edm::ParameterSet &QuadCutPSet)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
CurvilinearTrajectoryError initialError(const GlobalVector &vertexBounds, float ptMin, float sinTheta) const
T perp() const
Definition: PV3DBase.h:69
std::pair< ALIstring, ALIstring > pss
Definition: Fit.h:25
Definition: APVGainStruct.h:7
double DeltaPhiManual(const math::XYZVector &v1, const math::XYZVector &v2)
T z() const
Definition: PV3DBase.h:61
void bubbleReverseSortVsPhi(GlobalPoint arr[], int n, GlobalPoint vtx)
double ptMinus
Definition: Quad.h:9
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
BaseTrackerRecHit const * hit() const final
constexpr float ptMin
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:27
double ptPlus
Definition: Quad.h:8
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > theBfieldToken
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > theTrackerToken
void bubbleSortVsPhi(GlobalPoint arr[], int n, GlobalPoint vtx)
edm::ESGetToken< Propagator, TrackingComponentsRecord > thePropagatorToken
int ConversionCandidate(math::XYZVector &, double &, double &)
GlobalPoint position() const
int TrackCharge
Definition: TrackCharge.h:4
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
void push_back(D *&d)
Definition: OwnVector.h:326
double simpleGetSlope(const SeedingHitSet::ConstRecHitPointer &ohit, const SeedingHitSet::ConstRecHitPointer &nohit, const SeedingHitSet::ConstRecHitPointer &ihit, const SeedingHitSet::ConstRecHitPointer &nihit, const TrackingRegion &region, double &cotTheta, double &z0)
BaseTrackerRecHit const * ConstRecHitPointer
Definition: SeedingHitSet.h:14
const TrajectorySeed * buildSeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits, const FreeTrajectoryState &fts, const edm::EventSetup &es, bool apply_dzCut, const TrackingRegion &region) const
GlobalPoint globalPosition() const
double verySimpleFit(int size, double *ax, double *ay, double *e2y, double &p0, double &e2p0, double &p1)
std::vector< TrajectorySeed > TrajectorySeedCollection
void SetMaxNumberOfIterations(int val)
double x
Definition: Quad.h:5
T sqrt(T t)
Definition: SSEVec.h:19
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
unsigned int size() const
Definition: SeedingHitSet.h:52
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
SeedingHitSet::RecHitPointer refitHit(SeedingHitSet::ConstRecHitPointer hit, const TrajectoryStateOnSurface &state) const
void print(std::stringstream &ss, const SiStripCluster &clus)
bool getData(T &iHolder) const
Definition: EventSetup.h:122
d
Definition: ztail.py:151
bool checkHit(const TrajectoryStateOnSurface &, const SeedingHitSet::ConstRecHitPointer &hit, const edm::EventSetup &es) const
virtual TrackingRecHit * clone() const =0
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
const MagneticField & magneticField() const
GlobalVector globalMomentum() const
double y
Definition: Quad.h:6
T barePhi() const
double ptmin
Definition: HydjetWrapper.h:84
edm::ESGetToken< TransientTrackingRecHitBuilder, TransientRecHitRecord > theTTRHBuilderToken
HLT enums.
double getSqrEffectiveErrorOnZ(const SeedingHitSet::ConstRecHitPointer &hit, const TrackingRegion &region)
LocalPoint localPosition() const override
bool similarQuadExist(Quad &thisQuad, std::vector< Quad > &quadV)
Vector3DBase unit() const
Definition: Vector3DBase.h:54
#define get
Definition: Quad.h:4
tmp
align.sh
Definition: createJobs.py:716
long double T
Global3DVector GlobalVector
Definition: GlobalVector.h:10
SeedForPhotonConversionFromQuadruplets(const edm::ParameterSet &cfg, edm::ConsumesCollector &iC, const edm::ParameterSet &SeedComparitorPSet)
caConstants::TupleMultiplicity const *__restrict__ HitsOnGPU const *__restrict__ tindex_type *__restrict__ double *__restrict__ phits