35 template <
class T>
T sqr(
T t) {
return t*
t;}
40 cfg.getParameter<
std::
string>(
"propagator"),
41 cfg.existsAs<double>(
"SeedMomentumForBOFF") ? cfg.getParameter<double>(
"SeedMomentumForBOFF") : 5.0)
48 if(comparitorName !=
"none") {
63 std::stringstream& ss,
64 std::vector<Quad>& quadV,
73 if(rejectAllQuads)
return 0;
75 bool applyDeltaPhiCuts=QuadCutPSet.
getParameter<
bool>(
"apply_DeltaPhiCuts");
76 bool ClusterShapeFiltering=QuadCutPSet.
getParameter<
bool>(
"apply_ClusterShapeFilter");
77 bool applyArbitration=QuadCutPSet.
getParameter<
bool>(
"apply_Arbitration");
78 bool applydzCAcut=QuadCutPSet.
getParameter<
bool>(
"apply_zCACut");
79 double CleaningmaxRadialDistance=QuadCutPSet.
getParameter<
double>(
"Cut_DeltaRho");
80 double BeamPipeRadiusCut=QuadCutPSet.
getParameter<
double>(
"Cut_BeamPipeRadius");
81 double CleaningMinLegPt = QuadCutPSet.
getParameter<
double>(
"Cut_minLegPt");
82 double maxLegPt = QuadCutPSet.
getParameter<
double>(
"Cut_maxLegPt");
83 double dzcut=QuadCutPSet.
getParameter<
double>(
"Cut_zCA");
85 double toleranceFactorOnDeltaPhiCuts=0.1;
91 if ( phits.
size() < 2)
return 0;
92 if ( mhits.
size() < 2)
return 0;
100 #ifdef mydebug_sguazz 101 std::cout <<
" --------------------------------------------------------------------------" <<
"\n";
102 std::cout <<
" Starting a hit quad fast reco " <<
"\n";
103 std::cout <<
" --------------------------------------------------------------------------" <<
"\n";
114 vHit[0]=ptth2->globalPosition();
115 vHit[1]=ptth1->globalPosition();
116 vHit[2]=mtth1->globalPosition();
117 vHit[3]=mtth2->globalPosition();
152 if(h1.x()*h1.x()+h1.y()*h1.y() < h2.x()*h2.x()+h2.y()*h2.y()){
161 if(h3.x()*h3.x()+h3.y()*h3.y() < h4.x()*h4.x()+h4.y()*h4.y()){
184 double kP=(P1.y()-P2.y())/(P1.x()-P2.x());
185 double dP=P1.y()-kP*P1.x();
187 double kM=(M1.y()-M2.y())/(M1.x()-M2.x());
188 double dM=M1.y()-kM*M1.x();
190 double IPx=(dM-dP)/(kP-kM);
191 double IPy=kP*IPx+dP;
193 IP.SetXYZ(IPx,IPy,0);
195 double IPrho=
std::sqrt(IP.x()*IP.x()+IP.y()*IP.y());
196 double P1rho2=P1.x()*P1.x()+P1.y()*P1.y();
197 double M1rho2=M1.x()*M1.x()+M1.y()*M1.y();
198 double maxIPrho2=IPrho+CleaningmaxRadialDistance; maxIPrho2*=maxIPrho2;
200 if( IPrho<BeamPipeRadiusCut || P1rho2>maxIPrho2 || M1rho2>maxIPrho2){
204 if(applyDeltaPhiCuts) {
206 kPI_ = std::atan(1.0)*4;
211 QuadMean.SetXYZ((M1.x()+M2.x()+P1.x()+P2.x())/4.,(M1.y()+M2.y()+P1.y()+P2.y())/4.,(M1.z()+M2.z()+P1.z()+P2.z())/4.);
215 double rMax=CleaningMinLegPt/(0.01*0.3*fBField);
216 double rMax_squared=rMax*
rMax;
223 if(rMax_squared*4. > Mx*Mx+My*My){
234 double d=My/2.-k*Mx/2.;
236 #ifdef mydebug_knuenz 242 double CsolutionPart1=-2*k*
d;
243 double CsolutionPart2=
std::sqrt(4*k*k*d*d-4*(1+k*k)*(d*d-rMax_squared));
244 double CsolutionPart3=2*(1+k*
k);
245 double Cx1=(CsolutionPart1+CsolutionPart2)/CsolutionPart3;
246 double Cx2=(CsolutionPart1-CsolutionPart2)/CsolutionPart3;
254 if(C1.x()*M1.y()-C1.y()*M1.x()<0){
264 #ifdef mydebug_knuenz 276 double Bx1=
std::sqrt(Mx*Mx+My*My/(1+k*k));
281 #ifdef mydebug_knuenz 289 if(M1.x()*B1.y()-M1.y()*B1.x()<0){
299 #ifdef mydebug_knuenz 310 #ifdef mydebug_knuenz 311 std::cout <<
"DeltaPhiMaxM1P1 " << DeltaPhiMaxM1P1 << std::endl;
313 std::cout <<
"rho P1: " <<
std::sqrt(P1.x()*P1.x()+P1.y()*P1.y()) <<
"phi P1: " << P1.Phi() << std::endl;
314 std::cout <<
"rho M1: " <<
std::sqrt(M1.x()*M1.x()+M1.y()*M1.y()) <<
"phi M1: " << M1.Phi() << std::endl;
319 double tol_DeltaPhiMaxM1P1=DeltaPhiMaxM1P1*toleranceFactorOnDeltaPhiCuts;
322 if(DeltaPhiManualM1P1>DeltaPhiMaxM1P1+tol_DeltaPhiMaxM1P1 || DeltaPhiManualM1P1<0-tol_DeltaPhiMaxM1P1){
335 double rM2_squared=M2.x()*M2.x()+M2.y()*M2.y();
336 if(rMax_squared*4. > rM2_squared){
339 double k=-C.x()/C.y();
340 double d=(rM2_squared-rMax_squared+C.x()*C.x()+C.y()*C.y())/(2*C.y());
342 double M2solutionPart1=-2*k*
d;
343 double M2solutionPart2=
std::sqrt(4*k*k*d*d-4*(1+k*k)*(d*d-rM2_squared));
344 double M2solutionPart3=2+2*k*
k;
345 double M2xMax1=(M2solutionPart1+M2solutionPart2)/M2solutionPart3;
346 double M2xMax2=(M2solutionPart1-M2solutionPart2)/M2solutionPart3;
347 double M2yMax1=k*M2xMax1+
d;
348 double M2yMax2=k*M2xMax2+
d;
354 if(M2MaxVec1.x()*M2MaxVec2.y()-M2MaxVec1.y()*M2MaxVec2.x()<0){
355 M2MaxVec.SetXYZ(M2xMax2,M2yMax2,0);
358 M2MaxVec.SetXYZ(M2xMax1,M2yMax1,0);
363 #ifdef mydebug_knuenz 364 std::cout <<
"C.x() " << C.x() << std::endl;
365 std::cout <<
"C.y() " << C.y() << std::endl;
366 std::cout <<
"M1.x() " << M1.x() << std::endl;
367 std::cout <<
"M1.y() " << M1.y() << std::endl;
368 std::cout <<
"M2.x() " << M2.x() << std::endl;
369 std::cout <<
"M2.y() " << M2.y() << std::endl;
372 std::cout <<
"M2xMax1 " << M2xMax1 << std::endl;
373 std::cout <<
"M2xMax2 " << M2xMax2 << std::endl;
374 std::cout <<
"M2yMax1 " << M2yMax1 << std::endl;
375 std::cout <<
"M2yMax2 " << M2yMax2 << std::endl;
376 std::cout <<
"M2xMax " << M2MaxVec.x() << std::endl;
377 std::cout <<
"M2yMax " << M2MaxVec.y() << std::endl;
378 std::cout <<
"rM2_squared " << rM2_squared << std::endl;
379 std::cout <<
"rMax " << rMax << std::endl;
380 std::cout <<
"DeltaPhiMaxM2 " << DeltaPhiMaxM2 << std::endl;
384 double tol_DeltaPhiMaxM2=DeltaPhiMaxM2*toleranceFactorOnDeltaPhiCuts;
387 if(DeltaPhiManualM2M1>DeltaPhiMaxM2+tol_DeltaPhiMaxM2 || DeltaPhiManualM2M1<0-tol_DeltaPhiMaxM2){
393 if(DeltaPhiManualP1P2>DeltaPhiMaxM2+tol_DeltaPhiMaxM2 || DeltaPhiManualP1P2<0-tol_DeltaPhiMaxM2){
413 #ifdef mydebug_sguazz 417 double candPtPlus, candPtMinus;
421 if ( ! (nite &&
abs(nite) < 25 && nite != -1000 && nite != -2000) )
return 0;
426 #ifdef mydebug_sguazz 427 std::cout <<
" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" <<
"\n";
428 std::cout <<
" >>>>>>>>>>> Conv Cand: " <<
" Vertex X: " << candVtx.X() <<
" [cm] Y: " << candVtx.Y() <<
" [cm] pt+: " << candPtPlus<<
" [GeV] pt-: " << candPtMinus <<
" [GeV]; #its: " << nite <<
"\n";
432 double minLegPt = CleaningMinLegPt;
433 double maxRadialDistance = CleaningmaxRadialDistance;
437 if ( candPtPlus < minLegPt )
return 0;
438 if ( candPtMinus < minLegPt )
return 0;
440 if ( candPtPlus > maxLegPt )
return 0;
441 if ( candPtMinus > maxLegPt )
return 0;
445 double maxr2 = (maxRadialDistance + cr); maxr2*=maxr2;
446 if (h2.Perp2() > maxr2)
return 0;
447 if (h3.Perp2() > maxr2)
return 0;
458 if(ClusterShapeFiltering){
469 GlobalPoint vertexPos(candVtx.x(),candVtx.y(),candVtx.z());
474 FastHelix phelix(ptth2->globalPosition(), mtth1->globalPosition(), vertexPos, nomField,&*bfield, vertexPos);
475 pkine = phelix.stateAtVertex();
476 FastHelix mhelix(mtth2->globalPosition(), mtth1->globalPosition(), vertexPos, nomField,&*bfield, vertexPos);
477 mkine = mhelix.stateAtVertex();
485 double quadPhotCotTheta = 0.;
487 simpleGetSlope(ptth2, ptth1, mtth1, mtth2, region, quadPhotCotTheta, quadZ0);
489 double quadPhotPhi = (candVtx-vPhotVertex).
Phi();
493 candVtx.SetZ(
std::sqrt(candVtx.Perp2())*quadPhotCotTheta+quadZ0);
494 GlobalPoint convVtxGlobalPoint(candVtx.X(),candVtx.Y(),candVtx.Z());
502 thisQuad.
x = candVtx.X();
503 thisQuad.y = candVtx.Y();
504 thisQuad.z = candVtx.Z();
505 thisQuad.ptPlus = candPtPlus;
506 thisQuad.ptMinus = candPtMinus;
507 thisQuad.cot = quadPhotCotTheta;
513 FastHelix helixPlus(ptth2->globalPosition(), ptth1->globalPosition(), convVtxGlobalPoint, nomField,&*bfield, convVtxGlobalPoint);
516 GlobalVector(candPtPlus*
cos(quadPhotPhi),candPtPlus*
sin(quadPhotPhi),candPtPlus*quadPhotCotTheta),
518 & kinePlus.magneticField()
523 FastHelix helixMinus(mtth2->globalPosition(), mtth1->globalPosition(), convVtxGlobalPoint, nomField,&*bfield, convVtxGlobalPoint);
526 GlobalVector(candPtMinus*
cos(quadPhotPhi),candPtMinus*
sin(quadPhotPhi),candPtMinus*quadPhotCotTheta),
528 & kineMinus.magneticField()
531 float sinThetaPlus =
sin(kinePlus.momentum().theta());
532 float sinThetaMinus =
sin(kineMinus.momentum().theta());
548 if ( vError > 15. ) vError = 1.;
550 << vgPhotVertex.
x() <<
" " << vgPhotVertex.
y() <<
" " << vgPhotVertex.
z() <<
" " << vError <<
" " 555 << candVtx.X() <<
" " << candVtx.Y() <<
" " << candVtx.Z() <<
" " 556 << fittedPrimaryVertex.X() <<
" " << fittedPrimaryVertex.Y() <<
" " << fittedPrimaryVertex.Z() <<
" " 559 << nite <<
" " <<
chi2 <<
"\n";
561 #ifdef mydebug_sguazz 562 std::cout <<
" >>>>> Hit quad fast reco done >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" <<
"\n";
564 std::cout <<
"[SeedForPhotonConversionFromQuadruplets]\n ptth1 " ;
565 detid=ptth1->geographicalId().rawId();
567 std::cout <<
" \t " << detid <<
" " << ptth1->localPosition() <<
" " << ptth1->globalPosition() ;
568 detid=ptth2->geographicalId().rawId();
571 std::cout <<
" \t " << detid <<
" " << ptth2->localPosition() <<
" " << ptth2->globalPosition()
572 <<
"\nhelix momentum " << kinePlus.momentum() <<
" pt " << kinePlus.momentum().perp() <<
" radius " << 1/kinePlus.transverseCurvature() <<
" q " << kinePlus.charge();
574 detid=mtth1->geographicalId().rawId();
575 std::cout <<
" \t " << detid <<
" " << mtth1->localPosition() <<
" " << mtth1->globalPosition() ;
577 detid=mtth2->geographicalId().rawId();
579 std::cout <<
" \t " << detid <<
" " << mtth2->localPosition() <<
" " << mtth2->globalPosition()
580 <<
"\nhelix momentum " << kineMinus.momentum() <<
" pt " << kineMinus.momentum().perp() <<
" radius " << 1/kineMinus.transverseCurvature() <<
" q " << kineMinus.charge();
581 std::cout <<
"\n <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" <<
"\n";
586 bool buildSeedBoolPos =
buildSeedBool(seedCollection,phits,ftsPlus,es,applydzCAcut,region, dzcut);
587 bool buildSeedBoolNeg =
buildSeedBool(seedCollection,mhits,ftsMinus,es,applydzCAcut,region, dzcut);
591 if( buildSeedBoolPos && buildSeedBoolNeg ){
592 buildSeed(seedCollection,phits,ftsPlus,es,
false,region);
593 buildSeed(seedCollection,mhits,ftsMinus,es,
false,region);
605 const float cotTheta)
const 615 bool isBOFF = (0==nomField);
618 FastHelix helix(tth2->globalPosition(), tth1->globalPosition(), vertexPos, nomField,&*bfield, vertexPos);
619 kine = helix.stateAtVertex();
624 GlobalVector(kine.momentum().x(),kine.momentum().y(),kine.momentum().perp()*cotTheta),
626 & kine.magneticField()
637 (*pss) <<
"[SeedForPhotonConversionFromQuadruplets] initialKinematic tth1 " ;
638 detid=tth1->geographicalId().rawId();
640 (*pss) <<
" \t " << detid <<
" " << tth1->localPosition() <<
" " << tth1->globalPosition() ;
641 detid= tth2->geographicalId().rawId();
642 (*pss) <<
" \n\t tth2 ";
644 (*pss) <<
" \t " << detid <<
" " << tth2->localPosition() <<
" " << tth2->globalPosition()
663 float sinTheta)
const 668 sqr(vertexBounds.
y()), 0, 0,
669 sqr(vertexBounds.
z())
678 float sin2th =
sqr(sinTheta);
681 float zErr = vertexErr.
czz();
682 float transverseErr = vertexErr.
cxx();
683 C[3][3] = transverseErr;
684 C[4][4] = zErr*sin2th + transverseErr*(1-sin2th);
715 for (
unsigned int iHit = 0; iHit < hits.
size() && iHit<2; iHit++) {
725 updatedState = updator.
update(state, *newtth);
730 (*pss) <<
"\n[SeedForPhotonConversionFromQuadruplets] hit " << iHit;
737 if(!hit)
return nullptr;
744 return &seedCollection.back();
774 cloner = (*builder).cloner();
785 for (
unsigned int iHit = 0; iHit < hits.
size() && iHit<2; iHit++) {
786 hit = hits[iHit]->hit();
802 updatedState = updator.
update(state, *newtth);
818 double EstMomGamLength=
std::sqrt(EstMomGam.x()*EstMomGam.x()+EstMomGam.y()*EstMomGam.y()+EstMomGam.z()*EstMomGam.z());
819 math::XYZVector EstMomGamNorm(EstMomGam.x()/EstMomGamLength,EstMomGam.y()/EstMomGamLength,EstMomGam.z()/EstMomGamLength);
837 for (
int i =0;
i<6;++
i)
838 for (
int j =0;j<6;++j)
839 aCovarianceMatrix(
i, j) = 1
e-4;
843 const FreeTrajectoryState stateForProjectionToBeamLine(myGlobalTrajectoryParameter,myCartesianError);
851 double CovMatEntry=0.;
853 for (
int i=0;
i<3;++
i) {
854 cov(
i,
i) = CovMatEntry;
858 reco::BeamSpot myBeamSpot(BeamSpotPoint, 0.,0.,0.,0., cov,BeamType_);
901 #ifdef mydebug_knuenz 905 if(std::fabs(zCA)>dzcut)
return false;
936 (*pss) <<
"\n" << s <<
"\t";
937 for(
size_t i=0;
i<2;++
i)
938 (*
pss) << std::setw (60) << d[
i] << std::setw(1) <<
" | ";
943 (*pss) <<
"\n" << s <<
"\t";
944 for(
size_t i=0;
i<2;++
i)
945 (*
pss) << std::setw (60) << d[
i] << std::setw(1) <<
" | ";
950 (*pss) <<
"\n" << s <<
"\t";
951 for(
size_t i=0;
i<2;++
i)
952 (*
pss) << std::setw(20) << d[
i] <<
" r " << d[
i].
perp() <<
" phi " << d[
i].
phi() <<
" | ";
957 (*pss) <<
"\n" << s <<
"\n";
959 (*
pss) << std::setw(20) << d[
i] <<
" r " << d[
i].
perp() <<
" phi " << d[
i].
phi() <<
"\n";
972 for (
int i = 0;
i < n - j;
i++) {
991 for (
int i = 0;
i < n - j;
i++) {
1006 double x[5],
y[5], e2y[5];
1011 x[0] = ohit->globalPosition().perp();
1012 y[0] = ohit->globalPosition().z();
1015 x[1] = nohit->globalPosition().perp();
1016 y[1] = nohit->globalPosition().z();
1019 x[2] = nihit->globalPosition().perp();
1020 y[2] = nihit->globalPosition().z();
1023 x[3] = ihit->globalPosition().perp();
1024 y[3] = ihit->globalPosition().z();
1031 if ( vError > 15. ) vError = 1.;
1032 e2y[4] =
sqr(vError);
1053 double sqrProjFactor =
sqr((hit->globalPosition().z()-region.
origin().
z())/(hit->globalPosition().perp()-region.
origin().
perp()));
1054 return (hit->globalPositionError().czz()+sqrProjFactor*hit->globalPositionError().rerr(hit->globalPosition()));
1060 BOOST_FOREACH(
Quad quad, quadV )
1062 double dx = thisQuad.
x-quad.
x;
1063 double dy = thisQuad.
y-quad.
y;
1081 if (
sqrt(dx*dx+dy*dy)<1. &&
1090 quadV.push_back(thisQuad);
1097 double kTWOPI = 2.*
kPI_;
1098 double DeltaPhiMan=v1.Phi()-v2.Phi();
1099 while (DeltaPhiMan >=
kPI_) DeltaPhiMan -= kTWOPI;
1100 while (DeltaPhiMan < -
kPI_) DeltaPhiMan += kTWOPI;
float originRBound() const
bounds the particle vertex in the transverse plane
math::Error< dimension >::type CovarianceMatrix
T getParameter(std::string const &) const
static const int cotTheta_Max
CurvilinearTrajectoryError initialError(const GlobalVector &vertexBounds, float ptMin, float sinTheta) const
const TrajectorySeed * trajectorySeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &phits, const SeedingHitSet &mhits, const TrackingRegion ®ion, const edm::Event &ev, const edm::EventSetup &es, std::stringstream &ss, std::vector< Quad > &quadV, edm::ParameterSet &QuadCutPSet)
bool buildSeedBool(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits, const FreeTrajectoryState &fts, const edm::EventSetup &es, bool apply_dzCut, const TrackingRegion ®ion, double dzcut) const
std::pair< ALIstring, ALIstring > pss
GlobalPoint const & origin() const
def create(alignables, pedeDump, additionalData, outputFile, config)
double DeltaPhiManual(const math::XYZVector &v1, const math::XYZVector &v2)
void stupidPrint(std::string s, float *d)
int nominalValue() const
The nominal field value for this map in kGauss.
void bubbleReverseSortVsPhi(GlobalPoint arr[], int n, GlobalPoint vtx)
~SeedForPhotonConversionFromQuadruplets()
Sin< T >::type sin(const T &t)
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
Geom::Phi< T > phi() const
Global3DPoint GlobalPoint
GlobalPoint globalPosition() const
math::XYZPoint Point
point in the space
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
void bubbleSortVsPhi(GlobalPoint arr[], int n, GlobalPoint vtx)
int ConversionCandidate(math::XYZVector &, double &, double &)
uint32_t rawId() const
get the raw id
float transverseCurvature() const
double simpleGetSlope(const SeedingHitSet::ConstRecHitPointer &ohit, const SeedingHitSet::ConstRecHitPointer &nohit, const SeedingHitSet::ConstRecHitPointer &ihit, const SeedingHitSet::ConstRecHitPointer &nihit, const TrackingRegion ®ion, double &cotTheta, double &z0)
BaseTrackerRecHit const * ConstRecHitPointer
TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TrackingRecHit &) const
GlobalTrajectoryParameters initialKinematic(const SeedingHitSet &hits, const GlobalPoint &vertexPos, const edm::EventSetup &es, const float cotTheta) 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)
std::unique_ptr< SeedComparitor > theComparitor
BaseTrackerRecHit const * hit() const final
GlobalVector momentum() const
virtual TrackingRecHit * clone() const =0
Cos< T >::type cos(const T &t)
Abs< T >::type abs(const T &t)
void print(std::stringstream &ss, const SiStripCluster &clus)
virtual LocalPoint localPosition() const final
bool checkHit(const TrajectoryStateOnSurface &, const SeedingHitSet::ConstRecHitPointer &hit, const edm::EventSetup &es) const
static const std::string B
virtual LocalPoint localPosition() const =0
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
const TrajectorySeed * buildSeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits, const FreeTrajectoryState &fts, const edm::EventSetup &es, bool apply_dzCut, const TrackingRegion ®ion) const
float originZBound() const
bounds the particle vertex in the longitudinal plane
FTS const & trackStateAtPCA() const
GlobalPoint position() const
double deltaPhi(double phi1, double phi2)
Vector3DBase unit() const
GlobalPoint position() const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
float ptMin() const
minimal pt of interest
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
std::vector< std::vector< double > > tmp
GlobalVector globalMomentum() const
double getSqrEffectiveErrorOnZ(const SeedingHitSet::ConstRecHitPointer &hit, const TrackingRegion ®ion)
bool similarQuadExist(Quad &thisQuad, std::vector< Quad > &quadV)
std::string thePropagatorLabel
unsigned int size() const
const MagneticField & magneticField() const
DetId geographicalId() const
TrackCharge charge() const
SeedingHitSet::RecHitPointer refitHit(SeedingHitSet::ConstRecHitPointer hit, const TrajectoryStateOnSurface &state) const
T const * product() const
T get(const Candidate &c)
Global3DVector GlobalVector
SeedForPhotonConversionFromQuadruplets(const edm::ParameterSet &cfg, edm::ConsumesCollector &iC, const edm::ParameterSet &SeedComparitorPSet)
const TrackerGeomDet * idToDet(DetId) const