35 template <
class T>
T sqr(
T t) {
return t*
t;}
43 std::stringstream& ss,
44 std::vector<Quad>& quadV,
53 bool rejectAllQuads=QuadCutPSet.
getParameter<
bool>(
"rejectAllQuads");
54 if(rejectAllQuads)
return 0;
56 bool applyDeltaPhiCuts=QuadCutPSet.
getParameter<
bool>(
"apply_DeltaPhiCuts");
57 bool ClusterShapeFiltering=QuadCutPSet.
getParameter<
bool>(
"apply_ClusterShapeFilter");
58 bool applyArbitration=QuadCutPSet.
getParameter<
bool>(
"apply_Arbitration");
59 bool applydzCAcut=QuadCutPSet.
getParameter<
bool>(
"apply_zCACut");
60 double CleaningmaxRadialDistance=QuadCutPSet.
getParameter<
double>(
"Cut_DeltaRho");
61 double BeamPipeRadiusCut=QuadCutPSet.
getParameter<
double>(
"Cut_BeamPipeRadius");
62 double CleaningMinLegPt = QuadCutPSet.
getParameter<
double>(
"Cut_minLegPt");
63 double maxLegPt = QuadCutPSet.
getParameter<
double>(
"Cut_maxLegPt");
64 double dzcut=QuadCutPSet.
getParameter<
double>(
"Cut_zCA");
66 double toleranceFactorOnDeltaPhiCuts=0.1;
72 if ( phits.
size() < 2)
return 0;
73 if ( mhits.
size() < 2)
return 0;
82 std::cout <<
" --------------------------------------------------------------------------" <<
"\n";
83 std::cout <<
" Starting a hit quad fast reco " <<
"\n";
84 std::cout <<
" --------------------------------------------------------------------------" <<
"\n";
95 vHit[0]=ptth2->globalPosition();
96 vHit[1]=ptth1->globalPosition();
97 vHit[2]=mtth1->globalPosition();
98 vHit[3]=mtth2->globalPosition();
133 if(h1.x()*h1.x()+h1.y()*h1.y() < h2.x()*h2.x()+h2.y()*h2.y()){
142 if(h3.x()*h3.x()+h3.y()*h3.y() < h4.x()*h4.x()+h4.y()*h4.y()){
165 double kP=(P1.y()-P2.y())/(P1.x()-P2.x());
166 double dP=P1.y()-kP*P1.x();
168 double kM=(M1.y()-M2.y())/(M1.x()-M2.x());
169 double dM=M1.y()-kM*M1.x();
171 double IPx=(dM-dP)/(kP-kM);
172 double IPy=kP*IPx+dP;
174 IP.SetXYZ(IPx,IPy,0);
176 double IPrho=
std::sqrt(IP.x()*IP.x()+IP.y()*IP.y());
177 double P1rho2=P1.x()*P1.x()+P1.y()*P1.y();
178 double M1rho2=M1.x()*M1.x()+M1.y()*M1.y();
179 double maxIPrho2=IPrho+CleaningmaxRadialDistance; maxIPrho2*=maxIPrho2;
181 if( IPrho<BeamPipeRadiusCut || P1rho2>maxIPrho2 || M1rho2>maxIPrho2){
185 if(applyDeltaPhiCuts) {
187 kPI_ = std::atan(1.0)*4;
192 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.);
194 double fBField = bfield->inTesla(
GlobalPoint(QuadMean.x(),QuadMean.y(),QuadMean.z())).z();
196 double rMax=CleaningMinLegPt/(0.01*0.3*fBField);
197 double rMax_squared=rMax*rMax;
204 if(rMax_squared*4. > Mx*Mx+My*My){
215 double d=My/2.-k*Mx/2.;
217 #ifdef mydebug_knuenz
223 double CsolutionPart1=-2*k*d;
224 double CsolutionPart2=
std::sqrt(4*k*k*d*d-4*(1+k*k)*(d*d-rMax_squared));
225 double CsolutionPart3=2*(1+k*
k);
226 double Cx1=(CsolutionPart1+CsolutionPart2)/CsolutionPart3;
227 double Cx2=(CsolutionPart1-CsolutionPart2)/CsolutionPart3;
235 if(C1.x()*M1.y()-C1.y()*M1.x()<0){
245 #ifdef mydebug_knuenz
257 double Bx1=
std::sqrt(Mx*Mx+My*My/(1+k*k));
262 #ifdef mydebug_knuenz
270 if(M1.x()*B1.y()-M1.y()*B1.x()<0){
280 #ifdef mydebug_knuenz
291 #ifdef mydebug_knuenz
292 std::cout <<
"DeltaPhiMaxM1P1 " << DeltaPhiMaxM1P1 << std::endl;
294 std::cout <<
"rho P1: " <<
std::sqrt(P1.x()*P1.x()+P1.y()*P1.y()) <<
"phi P1: " << P1.Phi() << std::endl;
295 std::cout <<
"rho M1: " <<
std::sqrt(M1.x()*M1.x()+M1.y()*M1.y()) <<
"phi M1: " << M1.Phi() << std::endl;
300 double tol_DeltaPhiMaxM1P1=DeltaPhiMaxM1P1*toleranceFactorOnDeltaPhiCuts;
303 if(DeltaPhiManualM1P1>DeltaPhiMaxM1P1+tol_DeltaPhiMaxM1P1 || DeltaPhiManualM1P1<0-tol_DeltaPhiMaxM1P1){
316 double rM2_squared=M2.x()*M2.x()+M2.y()*M2.y();
317 if(rMax_squared*4. > rM2_squared){
320 double k=-C.x()/C.y();
321 double d=(rM2_squared-rMax_squared+C.x()*C.x()+C.y()*C.y())/(2*C.y());
323 double M2solutionPart1=-2*k*d;
324 double M2solutionPart2=
std::sqrt(4*k*k*d*d-4*(1+k*k)*(d*d-rM2_squared));
325 double M2solutionPart3=2+2*k*
k;
326 double M2xMax1=(M2solutionPart1+M2solutionPart2)/M2solutionPart3;
327 double M2xMax2=(M2solutionPart1-M2solutionPart2)/M2solutionPart3;
328 double M2yMax1=k*M2xMax1+d;
329 double M2yMax2=k*M2xMax2+d;
335 if(M2MaxVec1.x()*M2MaxVec2.y()-M2MaxVec1.y()*M2MaxVec2.x()<0){
336 M2MaxVec.SetXYZ(M2xMax2,M2yMax2,0);
339 M2MaxVec.SetXYZ(M2xMax1,M2yMax1,0);
344 #ifdef mydebug_knuenz
345 std::cout <<
"C.x() " << C.x() << std::endl;
346 std::cout <<
"C.y() " << C.y() << std::endl;
347 std::cout <<
"M1.x() " << M1.x() << std::endl;
348 std::cout <<
"M1.y() " << M1.y() << std::endl;
349 std::cout <<
"M2.x() " << M2.x() << std::endl;
350 std::cout <<
"M2.y() " << M2.y() << std::endl;
353 std::cout <<
"M2xMax1 " << M2xMax1 << std::endl;
354 std::cout <<
"M2xMax2 " << M2xMax2 << std::endl;
355 std::cout <<
"M2yMax1 " << M2yMax1 << std::endl;
356 std::cout <<
"M2yMax2 " << M2yMax2 << std::endl;
357 std::cout <<
"M2xMax " << M2MaxVec.x() << std::endl;
358 std::cout <<
"M2yMax " << M2MaxVec.y() << std::endl;
359 std::cout <<
"rM2_squared " << rM2_squared << std::endl;
360 std::cout <<
"rMax " << rMax << std::endl;
361 std::cout <<
"DeltaPhiMaxM2 " << DeltaPhiMaxM2 << std::endl;
365 double tol_DeltaPhiMaxM2=DeltaPhiMaxM2*toleranceFactorOnDeltaPhiCuts;
368 if(DeltaPhiManualM2M1>DeltaPhiMaxM2+tol_DeltaPhiMaxM2 || DeltaPhiManualM2M1<0-tol_DeltaPhiMaxM2){
374 if(DeltaPhiManualP1P2>DeltaPhiMaxM2+tol_DeltaPhiMaxM2 || DeltaPhiManualP1P2<0-tol_DeltaPhiMaxM2){
394 #ifdef mydebug_sguazz
398 double candPtPlus, candPtMinus;
402 if ( ! (nite &&
abs(nite) < 25 && nite != -1000 && nite != -2000) )
return 0;
407 #ifdef mydebug_sguazz
408 std::cout <<
" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" <<
"\n";
409 std::cout <<
" >>>>>>>>>>> Conv Cand: " <<
" Vertex X: " << candVtx.X() <<
" [cm] Y: " << candVtx.Y() <<
" [cm] pt+: " << candPtPlus<<
" [GeV] pt-: " << candPtMinus <<
" [GeV]; #its: " << nite <<
"\n";
413 double minLegPt = CleaningMinLegPt;
414 double maxRadialDistance = CleaningmaxRadialDistance;
418 if ( candPtPlus < minLegPt )
return 0;
419 if ( candPtMinus < minLegPt )
return 0;
421 if ( candPtPlus > maxLegPt )
return 0;
422 if ( candPtMinus > maxLegPt )
return 0;
426 double maxr2 = (maxRadialDistance + cr); maxr2*=maxr2;
427 if (h2.Perp2() > maxr2)
return 0;
428 if (h3.Perp2() > maxr2)
return 0;
438 float nomField = bfield->nominalValue();
441 if(ClusterShapeFiltering){
442 if (theComparitor) theComparitor->init(es);
452 GlobalPoint vertexPos(candVtx.x(),candVtx.y(),candVtx.z());
457 FastHelix phelix(ptth2->globalPosition(), mtth1->globalPosition(), vertexPos, nomField,&*bfield, vertexPos);
458 pkine = phelix.stateAtVertex();
459 FastHelix mhelix(mtth2->globalPosition(), mtth1->globalPosition(), vertexPos, nomField,&*bfield, vertexPos);
460 mkine = mhelix.stateAtVertex();
462 if(theComparitor&&!theComparitor->compatible(phits, pkine, phelix, region)) {
return 0; }
463 if(theComparitor&&!theComparitor->compatible(mhits, mkine, mhelix, region)) {
return 0; }
468 double quadPhotCotTheta = 0.;
470 simpleGetSlope(ptth2, ptth1, mtth1, mtth2, region, quadPhotCotTheta, quadZ0);
472 double quadPhotPhi = (candVtx-vPhotVertex).
Phi();
476 candVtx.SetZ(
std::sqrt(candVtx.Perp2())*quadPhotCotTheta+quadZ0);
477 GlobalPoint convVtxGlobalPoint(candVtx.X(),candVtx.Y(),candVtx.Z());
485 thisQuad.
x = candVtx.X();
486 thisQuad.y = candVtx.Y();
487 thisQuad.z = candVtx.Z();
488 thisQuad.ptPlus = candPtPlus;
489 thisQuad.ptMinus = candPtMinus;
490 thisQuad.cot = quadPhotCotTheta;
496 FastHelix helixPlus(ptth2->globalPosition(), ptth1->globalPosition(), convVtxGlobalPoint, nomField,&*bfield, convVtxGlobalPoint);
499 GlobalVector(candPtPlus*
cos(quadPhotPhi),candPtPlus*
sin(quadPhotPhi),candPtPlus*quadPhotCotTheta),
501 & kinePlus.magneticField()
506 FastHelix helixMinus(mtth2->globalPosition(), mtth1->globalPosition(), convVtxGlobalPoint, nomField,&*bfield, convVtxGlobalPoint);
509 GlobalVector(candPtMinus*
cos(quadPhotPhi),candPtMinus*
sin(quadPhotPhi),candPtMinus*quadPhotCotTheta),
511 & kineMinus.magneticField()
514 float sinThetaPlus =
sin(kinePlus.momentum().theta());
515 float sinThetaMinus =
sin(kineMinus.momentum().theta());
531 if ( vError > 15. ) vError = 1.;
533 << vgPhotVertex.
x() <<
" " << vgPhotVertex.
y() <<
" " << vgPhotVertex.
z() <<
" " << vError <<
" "
538 << candVtx.X() <<
" " << candVtx.Y() <<
" " << candVtx.Z() <<
" "
539 << fittedPrimaryVertex.X() <<
" " << fittedPrimaryVertex.Y() <<
" " << fittedPrimaryVertex.Z() <<
" "
542 << nite <<
" " << chi2 <<
"\n";
544 #ifdef mydebug_sguazz
545 std::cout <<
" >>>>> Hit quad fast reco done >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" <<
"\n";
547 std::cout <<
"[SeedForPhotonConversionFromQuadruplets]\n ptth1 " ;
548 detid=ptth1->geographicalId().rawId();
550 std::cout <<
" \t " << detid <<
" " << ptth1->localPosition() <<
" " << ptth1->globalPosition() ;
551 detid=ptth2->geographicalId().rawId();
554 std::cout <<
" \t " << detid <<
" " << ptth2->localPosition() <<
" " << ptth2->globalPosition()
555 <<
"\nhelix momentum " << kinePlus.momentum() <<
" pt " << kinePlus.momentum().perp() <<
" radius " << 1/kinePlus.transverseCurvature() <<
" q " << kinePlus.charge();
557 detid=mtth1->geographicalId().rawId();
558 std::cout <<
" \t " << detid <<
" " << mtth1->localPosition() <<
" " << mtth1->globalPosition() ;
560 detid=mtth2->geographicalId().rawId();
562 std::cout <<
" \t " << detid <<
" " << mtth2->localPosition() <<
" " << mtth2->globalPosition()
563 <<
"\nhelix momentum " << kineMinus.momentum() <<
" pt " << kineMinus.momentum().perp() <<
" radius " << 1/kineMinus.transverseCurvature() <<
" q " << kineMinus.charge();
564 std::cout <<
"\n <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" <<
"\n";
569 bool buildSeedBoolPos =
buildSeedBool(seedCollection,phits,ftsPlus,es,applydzCAcut,region, dzcut);
570 bool buildSeedBoolNeg =
buildSeedBool(seedCollection,mhits,ftsMinus,es,applydzCAcut,region, dzcut);
574 if( buildSeedBoolPos && buildSeedBoolNeg ){
575 buildSeed(seedCollection,phits,ftsPlus,es,
false,region);
576 buildSeed(seedCollection,mhits,ftsMinus,es,
false,region);
588 const float cotTheta)
const
597 float nomField = bfield->nominalValue();
598 bool isBOFF = (0==nomField);
601 FastHelix helix(tth2->globalPosition(), tth1->globalPosition(), vertexPos, nomField,&*bfield, vertexPos);
602 kine = helix.stateAtVertex();
607 GlobalVector(kine.momentum().x(),kine.momentum().y(),kine.momentum().perp()*cotTheta),
609 & kine.magneticField()
620 (*pss) <<
"[SeedForPhotonConversionFromQuadruplets] initialKinematic tth1 " ;
621 detid=tth1->geographicalId().rawId();
623 (*pss) <<
" \t " << detid <<
" " << tth1->localPosition() <<
" " << tth1->globalPosition() ;
624 detid= tth2->geographicalId().rawId();
625 (*pss) <<
" \n\t tth2 ";
627 (*pss) <<
" \t " << detid <<
" " << tth2->localPosition() <<
" " << tth2->globalPosition()
646 float sinTheta)
const
651 sqr(vertexBounds.
y()), 0, 0,
652 sqr(vertexBounds.
z())
661 float sin2th =
sqr(sinTheta);
664 float zErr = vertexErr.
czz();
665 float transverseErr = vertexErr.
cxx();
666 C[3][3] = transverseErr;
667 C[4][4] = zErr*sin2th + transverseErr*(1-sin2th);
698 for (
unsigned int iHit = 0; iHit < hits.
size() && iHit<2; iHit++) {
699 hit = hits[iHit]->hit();
708 updatedState = updator.update(state, *newtth);
710 seedHits.
push_back(newtth->hit()->clone());
713 (*pss) <<
"\n[SeedForPhotonConversionFromQuadruplets] hit " << iHit;
716 <<
" tth " << tth->localPosition() <<
" newtth " << newtth->localPosition() <<
" state " << state.
globalMomentum().
perp();
725 return &seedCollection.back();
759 for (
unsigned int iHit = 0; iHit < hits.
size() && iHit<2; iHit++) {
760 hit = hits[iHit]->hit();
776 updatedState = updator.update(state, *newtth);
781 seedHits.
push_back(newtth->hit()->clone());
792 double EstMomGamLength=
std::sqrt(EstMomGam.x()*EstMomGam.x()+EstMomGam.y()*EstMomGam.y()+EstMomGam.z()*EstMomGam.z());
793 math::XYZVector EstMomGamNorm(EstMomGam.x()/EstMomGamLength,EstMomGam.y()/EstMomGamLength,EstMomGam.z()/EstMomGamLength);
811 for (
int i =0;
i<6;++
i)
812 for (
int j =0;
j<6;++
j)
813 aCovarianceMatrix(
i,
j) = 1
e-4;
817 const FreeTrajectoryState stateForProjectionToBeamLine(myGlobalTrajectoryParameter,myCartesianError);
825 double CovMatEntry=0.;
827 for (
int i=0;
i<3;++
i) {
828 cov(
i,
i) = CovMatEntry;
832 reco::BeamSpot myBeamSpot(BeamSpotPoint, 0.,0.,0.,0., cov,BeamType_);
875 #ifdef mydebug_knuenz
879 if(std::fabs(zCA)>dzcut)
return false;
901 return hit->clone(state);
910 (*pss) <<
"\n" << s <<
"\t";
911 for(
size_t i=0;
i<2;++
i)
912 (*
pss) << std::setw (60) << d[
i] << std::setw(1) <<
" | ";
917 (*pss) <<
"\n" << s <<
"\t";
918 for(
size_t i=0;
i<2;++
i)
919 (*
pss) << std::setw (60) << d[
i] << std::setw(1) <<
" | ";
924 (*pss) <<
"\n" << s <<
"\t";
925 for(
size_t i=0;
i<2;++
i)
926 (*
pss) << std::setw(20) << d[
i] <<
" r " << d[
i].
perp() <<
" phi " << d[
i].
phi() <<
" | ";
931 (*pss) <<
"\n" << s <<
"\n";
933 (*
pss) << std::setw(20) << d[
i] <<
" r " << d[
i].
perp() <<
" phi " << d[
i].
phi() <<
"\n";
946 for (
int i = 0;
i < n -
j;
i++) {
965 for (
int i = 0;
i < n -
j;
i++) {
980 double x[5],
y[5], e2y[5];
985 x[0] = ohit->globalPosition().perp();
986 y[0] = ohit->globalPosition().z();
989 x[1] = nohit->globalPosition().perp();
990 y[1] = nohit->globalPosition().z();
993 x[2] = nihit->globalPosition().perp();
994 y[2] = nihit->globalPosition().z();
997 x[3] = ihit->globalPosition().perp();
998 y[3] = ihit->globalPosition().z();
1005 if ( vError > 15. ) vError = 1.;
1006 e2y[4] =
sqr(vError);
1009 double chi2 =
verySimpleFit(5, x, y, e2y, z0, e2z0, cotTheta);
1027 double sqrProjFactor =
sqr((hit->globalPosition().z()-region.
origin().
z())/(hit->globalPosition().perp()-region.
origin().
perp()));
1028 return (hit->globalPositionError().czz()+sqrProjFactor*hit->globalPositionError().rerr(hit->globalPosition()));
1034 BOOST_FOREACH(
Quad quad, quadV )
1036 double dx = thisQuad.
x-quad.
x;
1037 double dy = thisQuad.
y-quad.
y;
1055 if (
sqrt(dx*dx+dy*dy)<1. &&
1064 quadV.push_back(thisQuad);
1071 double kTWOPI = 2.*
kPI_;
1072 double DeltaPhiMan=v1.Phi()-v2.Phi();
1073 while (DeltaPhiMan >=
kPI_) DeltaPhiMan -= kTWOPI;
1074 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
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
double DeltaPhiManual(const math::XYZVector &v1, const math::XYZVector &v2)
void stupidPrint(std::string s, float *d)
void bubbleReverseSortVsPhi(GlobalPoint arr[], int n, GlobalPoint vtx)
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
bool checkHit(const TrajectoryStateOnSurface &, const TransientTrackingRecHit::ConstRecHitPointer &hit, const edm::EventSetup &es) const
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 getSqrEffectiveErrorOnZ(const TransientTrackingRecHit::ConstRecHitPointer &hit, const TrackingRegion ®ion)
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
const T & max(const T &a, const T &b)
void SetMaxNumberOfIterations(int val)
GlobalVector momentum() const
Cos< T >::type cos(const T &t)
Abs< T >::type abs(const T &t)
void print(std::stringstream &ss, const SiStripCluster &clus)
TransientTrackingRecHit::RecHitPointer refitHit(const TransientTrackingRecHit::ConstRecHitPointer &hit, const TrajectoryStateOnSurface &state) const
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
virtual TrajectoryStateOnSurface propagate(const FreeTrajectoryState &, const Surface &) const
double simpleGetSlope(const TransientTrackingRecHit::ConstRecHitPointer &ohit, const TransientTrackingRecHit::ConstRecHitPointer &nohit, const TransientTrackingRecHit::ConstRecHitPointer &ihit, const TransientTrackingRecHit::ConstRecHitPointer &nihit, const TrackingRegion ®ion, double &cotTheta, double &z0)
double deltaPhi(double phi1, double phi2)
Vector3DBase unit() const
GlobalPoint position() const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
const TrajectorySeed * trajectorySeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &phits, const SeedingHitSet &mhits, const TrackingRegion ®ion, const edm::EventSetup &es, std::stringstream &ss, std::vector< Quad > &quadV, edm::ParameterSet &SeedComparitorPSet, edm::ParameterSet &QuadCutPSet)
float ptMin() const
minimal pt of interest
std::vector< std::vector< double > > tmp
GlobalVector globalMomentum() const
Square< F >::type sqr(const F &f)
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
virtual LocalPoint localPosition() const =0
tuple size
Write out results.
T get(const Candidate &c)
Global3DVector GlobalVector