44 cfg.existsAs<double>(
"SeedMomentumForBOFF") ?
cfg.getParameter<double>(
"SeedMomentumForBOFF") : 5.0) {}
50 double seedMomentumForBOFF)
55 theBOFFMomentum(seedMomentumForBOFF) {
57 if (comparitorName !=
"none") {
70 std::stringstream&
ss,
71 std::vector<Quad>& quadV,
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");
84 double BeamPipeRadiusCut =
QuadCutPSet.getParameter<
double>(
"Cut_BeamPipeRadius");
85 double CleaningMinLegPt =
QuadCutPSet.getParameter<
double>(
"Cut_minLegPt");
86 double maxLegPt =
QuadCutPSet.getParameter<
double>(
"Cut_maxLegPt");
87 double dzcut =
QuadCutPSet.getParameter<
double>(
"Cut_zCA");
89 double toleranceFactorOnDeltaPhiCuts = 0.1;
106 #ifdef mydebug_sguazz 107 std::cout <<
" --------------------------------------------------------------------------" 109 std::cout <<
" Starting a hit quad fast reco " 111 std::cout <<
" --------------------------------------------------------------------------" 123 vHit[0] = ptth2->globalPosition();
124 vHit[1] = ptth1->globalPosition();
125 vHit[2] = mtth1->globalPosition();
126 vHit[3] = mtth2->globalPosition();
161 if (h1.x() * h1.x() + h1.y() * h1.y() < h2.x() * h2.x() + h2.y() * h2.y()) {
169 if (h3.x() * h3.x() + h3.y() * h3.y() < h4.x() * h4.x() + h4.y() * h4.y()) {
190 double kP = (P1.y() - P2.y()) / (P1.x() - P2.x());
191 double dP = P1.y() - kP * P1.x();
193 double kM = (M1.y() - M2.y()) / (M1.x() - M2.x());
194 double dM = M1.y() - kM * M1.x();
196 double IPx = (dM - dP) / (kP - kM);
197 double IPy = kP * IPx + dP;
199 IP.SetXYZ(IPx, IPy, 0);
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;
207 if (IPrho < BeamPipeRadiusCut || P1rho2 > maxIPrho2 || M1rho2 > maxIPrho2) {
211 if (applyDeltaPhiCuts) {
212 kPI_ = std::atan(1.0) * 4;
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.);
220 double fBField = bfield.inTesla(
GlobalPoint(QuadMean.x(), QuadMean.y(), QuadMean.z())).z();
222 double rMax = CleaningMinLegPt / (0.01 * 0.3 * fBField);
230 if (rMax_squared * 4. > Mx * Mx + My * My) {
240 double d = My / 2. -
k * Mx / 2.;
242 #ifdef mydebug_knuenz 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;
259 if (C1.x() * M1.y() - C1.y() * M1.x() < 0) {
268 #ifdef mydebug_knuenz 280 double Bx1 =
std::sqrt(Mx * Mx + My * My / (1 +
k *
k));
282 double By1 =
k * Bx1 +
d;
283 double By2 =
k * Bx2 +
d;
285 #ifdef mydebug_knuenz 293 if (M1.x() * B1.y() - M1.y() * B1.x() < 0) {
302 #ifdef mydebug_knuenz 313 #ifdef mydebug_knuenz 314 std::cout <<
"DeltaPhiMaxM1P1 " << DeltaPhiMaxM1P1 << 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;
322 double tol_DeltaPhiMaxM1P1 = DeltaPhiMaxM1P1 * toleranceFactorOnDeltaPhiCuts;
325 if (DeltaPhiManualM1P1 > DeltaPhiMaxM1P1 + tol_DeltaPhiMaxM1P1 || DeltaPhiManualM1P1 < 0 - tol_DeltaPhiMaxM1P1) {
337 double rM2_squared = M2.x() * M2.x() + M2.y() * M2.y();
338 if (rMax_squared * 4. > rM2_squared) {
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());
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;
356 if (M2MaxVec1.x() * M2MaxVec2.y() - M2MaxVec1.y() * M2MaxVec2.x() < 0) {
357 M2MaxVec.SetXYZ(M2xMax2, M2yMax2, 0);
359 M2MaxVec.SetXYZ(M2xMax1, M2yMax1, 0);
364 #ifdef mydebug_knuenz 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;
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;
381 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) {
409 #ifdef mydebug_sguazz 413 double candPtPlus, candPtMinus;
417 if (!(nite &&
abs(nite) < 25 && nite != -1000 && nite != -2000))
423 #ifdef mydebug_sguazz 424 std::cout <<
" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" 427 <<
" Vertex X: " << candVtx.X() <<
" [cm] Y: " << candVtx.Y() <<
" [cm] pt+: " << candPtPlus
428 <<
" [GeV] pt-: " << candPtMinus <<
" [GeV]; #its: " << nite <<
"\n";
432 double minLegPt = CleaningMinLegPt;
433 double maxRadialDistance = CleaningmaxRadialDistance;
437 if (candPtPlus < minLegPt)
439 if (candPtMinus < minLegPt)
442 if (candPtPlus > maxLegPt)
444 if (candPtMinus > maxLegPt)
449 double maxr2 = (maxRadialDistance + cr);
451 if (h2.Perp2() > maxr2)
453 if (h3.Perp2() > maxr2)
460 float nomField = bfield.nominalValue();
462 if (ClusterShapeFiltering) {
474 GlobalPoint vertexPos(candVtx.x(), candVtx.y(), candVtx.z());
476 float ptMinReg = 0.1;
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();
493 double quadPhotCotTheta = 0.;
497 double quadPhotPhi = (candVtx - vPhotVertex).
Phi();
501 candVtx.SetZ(
std::sqrt(candVtx.Perp2()) * quadPhotCotTheta + quadZ0);
502 GlobalPoint convVtxGlobalPoint(candVtx.X(), candVtx.Y(), candVtx.Z());
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;
523 ptth2->globalPosition(), ptth1->globalPosition(), convVtxGlobalPoint, nomField, &bfield, convVtxGlobalPoint);
527 GlobalVector(candPtPlus *
cos(quadPhotPhi), candPtPlus *
sin(quadPhotPhi), candPtPlus * quadPhotCotTheta),
529 &kinePlus.magneticField());
534 mtth2->globalPosition(), mtth1->globalPosition(), convVtxGlobalPoint, nomField, &bfield, convVtxGlobalPoint);
538 GlobalVector(candPtMinus *
cos(quadPhotPhi), candPtMinus *
sin(quadPhotPhi), candPtMinus * quadPhotCotTheta),
540 &kineMinus.magneticField());
542 float sinThetaPlus =
sin(kinePlus.momentum().theta());
543 float sinThetaMinus =
sin(kineMinus.momentum().theta());
558 double vError =
region.originZBound();
561 std::cout <<
"QuadDispLine " << vgPhotVertex.
x() <<
" " << vgPhotVertex.
y() <<
" " << vgPhotVertex.
z() <<
" " 562 << vError <<
" " << vHit[0].
x() <<
" " << vHit[0].
y() <<
" " << vHit[0].
z() <<
" " 566 << vHit[3].
x() <<
" " << vHit[3].
y() <<
" " << vHit[3].
z() <<
" " 568 << candVtx.Z() <<
" " << fittedPrimaryVertex.X() <<
" " << fittedPrimaryVertex.Y() <<
" " 569 << fittedPrimaryVertex.Z()
573 << nite <<
" " <<
chi2 <<
"\n";
575 #ifdef mydebug_sguazz 576 std::cout <<
" >>>>> Hit quad fast reco done >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" 579 std::cout <<
"[SeedForPhotonConversionFromQuadruplets]\n ptth1 ";
580 detid = ptth1->geographicalId().rawId();
582 std::cout <<
" \t " << detid <<
" " << ptth1->localPosition() <<
" " << ptth1->globalPosition();
583 detid = ptth2->geographicalId().rawId();
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();
590 detid = mtth1->geographicalId().rawId();
591 std::cout <<
" \t " << detid <<
" " << mtth1->localPosition() <<
" " << mtth1->globalPosition();
593 detid = mtth2->geographicalId().rawId();
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 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" 604 cloner = (*builder).cloner();
609 if (buildSeedBoolPos && buildSeedBoolNeg) {
620 const float cotTheta)
const {
627 float nomField = bfield.nominalValue();
628 bool isBOFF = (0 == nomField);
630 FastHelix helix(tth2->globalPosition(), tth1->globalPosition(), vertexPos, nomField, &bfield, vertexPos);
631 kine = helix.stateAtVertex();
637 GlobalVector(kine.momentum().x(), kine.momentum().y(), kine.momentum().perp() * cotTheta),
639 &kine.magneticField());
649 (*pss) <<
"[SeedForPhotonConversionFromQuadruplets] initialKinematic tth1 ";
650 detid = tth1->geographicalId().rawId();
652 (*pss) <<
" \t " << detid <<
" " << tth1->localPosition() <<
" " << tth1->globalPosition();
653 detid = tth2->geographicalId().rawId();
654 (*pss) <<
" \n\t tth2 ";
656 (*pss) <<
" \t " << detid <<
" " << tth2->localPosition() <<
" " << tth2->globalPosition() <<
"\nhelix momentum " 669 float sinTheta)
const {
679 float sin2th =
sqr(sinTheta);
682 float zErr = vertexErr.
czz();
683 float transverseErr = vertexErr.
cxx();
684 C[3][3] = transverseErr;
685 C[4][4] = zErr * sin2th + transverseErr * (1 - sin2th);
711 for (
unsigned int iHit = 0; iHit <
hits.size() && iHit < 2; iHit++) {
725 uint32_t detid =
hit->geographicalId().rawId();
726 (*pss) <<
"\n[SeedForPhotonConversionFromQuadruplets] hit " << iHit;
728 (*pss) <<
" " << detid <<
"\t lp " <<
hit->localPosition() <<
" tth " << tth->localPosition() <<
" newtth " 749 double dzcut)
const {
765 for (
unsigned int iHit = 0; iHit <
hits.size() && iHit < 2; iHit++) {
770 if (!
state.isValid()) {
800 double EstMomGamLength =
801 std::sqrt(EstMomGam.x() * EstMomGam.x() + EstMomGam.y() * EstMomGam.y() + EstMomGam.z() * EstMomGam.z());
803 EstMomGam.x() / EstMomGamLength, EstMomGam.y() / EstMomGamLength, EstMomGam.z() / EstMomGamLength);
816 EstPosGamGlobalPoint, EstMomGamGlobalVector, qCharge, magField);
820 for (
int i = 0;
i < 6; ++
i)
821 for (
int j = 0;
j < 6; ++
j)
822 aCovarianceMatrix(
i,
j) = 1
e-4;
826 const FreeTrajectoryState stateForProjectionToBeamLine(myGlobalTrajectoryParameter, myCartesianError);
834 double CovMatEntry = 0.;
836 for (
int i = 0;
i < 3; ++
i) {
837 cov(
i,
i) = CovMatEntry;
841 reco::BeamSpot myBeamSpot(BeamSpotPoint, 0., 0., 0., 0., cov, BeamType_);
844 if (tscbl.
isValid() ==
false) {
883 #ifdef mydebug_knuenz 884 std::cout <<
"zCA: " << zCA << std::endl;
887 if (std::fabs(zCA) > dzcut)
911 (*pss) <<
"\n" <<
s <<
"\t";
912 for (
size_t i = 0;
i < 2; ++
i)
913 (*
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) <<
" | ";
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() <<
" | ";
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";
943 for (
int i = 0;
i <
n -
j;
i++) {
961 for (
int i = 0;
i <
n -
j;
i++) {
979 double x[5],
y[5], e2y[5];
984 x[0] = ohit->globalPosition().perp();
985 y[0] = ohit->globalPosition().z();
988 x[1] = nohit->globalPosition().perp();
989 y[1] = nohit->globalPosition().z();
992 x[2] = nihit->globalPosition().perp();
993 y[2] = nihit->globalPosition().z();
996 x[3] = ihit->globalPosition().perp();
997 y[3] = ihit->globalPosition().z();
1001 x[4] =
region.origin().perp();
1003 double vError =
region.originZBound();
1006 e2y[4] =
sqr(vError);
1015 int size,
double* ax,
double* ay,
double* e2y,
double& p0,
double& e2p0,
double&
p1) {
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()));
1032 for (
auto const& quad : quadV) {
1033 double dx = thisQuad.
x - quad.x;
1034 double dy = thisQuad.
y - quad.y;
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) {
1058 quadV.push_back(thisQuad);
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;
constexpr double deltaPhi(double phi1, double phi2)
math::Error< dimension >::type CovarianceMatrix
GlobalTrajectoryParameters initialKinematic(const SeedingHitSet &hits, const GlobalPoint &vertexPos, const edm::EventSetup &es, const float cotTheta) const
static const int cotTheta_Max
bool buildSeedBool(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits, const FreeTrajectoryState &fts, const edm::EventSetup &es, bool apply_dzCut, const TrackingRegion ®ion, double dzcut) 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)
CurvilinearTrajectoryError initialError(const GlobalVector &vertexBounds, float ptMin, float sinTheta) const
std::pair< ALIstring, ALIstring > pss
double DeltaPhiManual(const math::XYZVector &v1, const math::XYZVector &v2)
GlobalPoint position() const
void stupidPrint(std::string s, float *d)
void bubbleReverseSortVsPhi(GlobalPoint arr[], int n, GlobalPoint vtx)
~SeedForPhotonConversionFromQuadruplets()
Sin< T >::type sin(const T &t)
BaseTrackerRecHit const * hit() const final
Global3DPoint GlobalPoint
math::XYZPoint Point
point in the space
TrackCharge charge() const
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
GlobalVector momentum() 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
const TrajectorySeed * buildSeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits, const FreeTrajectoryState &fts, const edm::EventSetup &es, bool apply_dzCut, const TrackingRegion ®ion) 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)
std::unique_ptr< SeedComparitor > theComparitor
Cos< T >::type cos(const T &t)
unsigned int size() const
Abs< T >::type abs(const T &t)
SeedingHitSet::RecHitPointer refitHit(SeedingHitSet::ConstRecHitPointer hit, const TrajectoryStateOnSurface &state) const
float transverseCurvature() const
FTS const & trackStateAtPCA() const
void print(std::stringstream &ss, const SiStripCluster &clus)
bool getData(T &iHolder) const
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
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
const MagneticField & magneticField() const
GlobalVector globalMomentum() const
edm::ESGetToken< TransientTrackingRecHitBuilder, TransientRecHitRecord > theTTRHBuilderToken
double getSqrEffectiveErrorOnZ(const SeedingHitSet::ConstRecHitPointer &hit, const TrackingRegion ®ion)
LocalPoint localPosition() const override
bool similarQuadExist(Quad &thisQuad, std::vector< Quad > &quadV)
Vector3DBase unit() const
Global3DVector GlobalVector
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