13 LogDebug(
"VectorHitBuilderAlgorithm") <<
"Run VectorHitBuilderAlgorithm ... \n";
14 const auto* clustersPhase2Collection =
clusters.product();
17 LogDebug(
"VectorHitBuilderAlgorithm") <<
"with #clusters : " << clustersPhase2Collection->size() << std::endl;
18 for (
auto dSViter : *clustersPhase2Collection) {
19 unsigned int rawDetId1(dSViter.detId());
20 DetId detId1(rawDetId1);
21 DetId lowerDetId, upperDetId;
31 LogDebug(
"VectorHitBuilderAlgorithm") <<
" DetId stack : " << detIdStack.
rawId() << std::endl;
32 LogDebug(
"VectorHitBuilderAlgorithm") <<
" DetId lower set of clusters : " << lowerDetId.
rawId();
33 LogDebug(
"VectorHitBuilderAlgorithm") <<
" DetId upper set of clusters : " << upperDetId.
rawId() << std::endl;
37 const auto& it_detLower = dSViter;
38 const auto& it_detUpper = clustersPhase2Collection->find(upperDetId);
40 if (it_detUpper != clustersPhase2Collection->end()) {
46 LogDebug(
"VectorHitBuilderAlgorithm") <<
"End run VectorHitBuilderAlgorithm ... \n";
51 const Detset& theLowerDetSet,
52 const Detset& theUpperDetSet)
const {
53 if (theLowerDetSet.
size() == 1 && theUpperDetSet.
size() == 1)
57 std::vector<Phase2TrackerCluster1D> lowerClusters;
58 lowerClusters.reserve(theLowerDetSet.
size());
59 if (theLowerDetSet.
size() > 1)
60 LogDebug(
"VectorHitBuilderAlgorithm") <<
" more than 1 lower cluster! " << std::endl;
61 if (theUpperDetSet.
size() > 1)
62 LogDebug(
"VectorHitBuilderAlgorithm") <<
" more than 1 upper cluster! " << std::endl;
65 lowerClusters.push_back(*clusterLower);
84 const Detset& theLowerDetSet,
85 const Detset& theUpperDetSet,
86 const std::vector<bool>& phase2OTClustersToSkip)
const {
88 LogDebug(
"VectorHitBuilderAlgorithm") <<
" compatible -> continue ... " << std::endl;
90 LogTrace(
"VectorHitBuilderAlgorithm") <<
" not compatible, going to the next cluster";
98 LogDebug(
"VectorHitBuilderAlgorithm") <<
" \t is barrel. " << std::endl;
100 LogDebug(
"VectorHitBuilderAlgorithm") <<
" \t is endcap. " << std::endl;
101 LogDebug(
"VectorHitBuilderAlgorithm") <<
" \t layer is : " << layerStack << std::endl;
108 LogDebug(
"VectorHitBuilderAlgorithm") <<
" \t the cut is:" <<
cut << std::endl;
111 std::vector<std::pair<LocalPoint, LocalError>> localParamsUpper;
112 std::vector<const PixelGeomDetUnit*> localGDUUpper;
115 for (
auto const& clusterUpper : theUpperDetSet) {
116 localGDUUpper.push_back(gduUpp);
119 int upperIterator = 0;
122 LogDebug(
"VectorHitBuilderAlgorithm") <<
" lower clusters " << std::endl;
129 for (
const_iterator ciu = theUpperDetSet.begin(); ciu != theUpperDetSet.end(); ++ciu) {
130 LogDebug(
"VectorHitBuilderAlgorithm") <<
"\t upper clusters " << std::endl;
137 gduLow, lparamsLow.first, localGDUUpper[upperIterator], localParamsUpper[upperIterator].first);
138 LogDebug(
"VectorHitBuilderAlgorithm") <<
" \t parallax correction:" << pC << std::endl;
139 double lpos_upp_corr = 0.0;
140 double lpos_low_corr = 0.0;
141 auto const localUpperX = localParamsUpper[upperIterator].first.x();
142 if (localUpperX > lparamsLow.first.x()) {
143 if (localUpperX > 0) {
144 lpos_low_corr = lparamsLow.first.x();
145 lpos_upp_corr = localParamsUpper[upperIterator].first.x() -
std::abs(pC);
146 }
else if (localUpperX < 0) {
147 lpos_low_corr = lparamsLow.first.x() +
std::abs(pC);
148 lpos_upp_corr = localUpperX;
150 }
else if (localUpperX < lparamsLow.first.x()) {
151 if (localUpperX > 0) {
152 lpos_low_corr = lparamsLow.first.x() -
std::abs(pC);
153 lpos_upp_corr = localUpperX;
154 }
else if (localUpperX < 0) {
155 lpos_low_corr = lparamsLow.first.x();
156 lpos_upp_corr = localUpperX +
std::abs(pC);
159 if (localUpperX > 0) {
160 lpos_low_corr = lparamsLow.first.x();
161 lpos_upp_corr = localUpperX -
std::abs(pC);
162 }
else if (localUpperX < 0) {
163 lpos_low_corr = lparamsLow.first.x();
164 lpos_upp_corr = localUpperX +
std::abs(pC);
168 LogDebug(
"VectorHitBuilderAlgorithm") <<
" \t local pos upper corrected (x):" << lpos_upp_corr << std::endl;
169 LogDebug(
"VectorHitBuilderAlgorithm") <<
" \t local pos lower corrected (x):" << lpos_low_corr << std::endl;
171 double width = lpos_low_corr - lpos_upp_corr;
172 LogDebug(
"VectorHitBuilderAlgorithm") <<
" \t width: " <<
width << std::endl;
182 LogDebug(
"VectorHitBuilderAlgorithm") <<
" accepting VH! " << std::endl;
190 LogDebug(
"VectorHitBuilderAlgorithm") <<
" rejecting VH: " << std::endl;
205 LogTrace(
"VectorHitBuilderAlgorithm") <<
"Build VH with: ";
213 Global3DPoint gparamsLower = geomDetLower->surface().toGlobal(lparamsLower.first);
214 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t lower global pos: " << gparamsLower;
218 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t upper global pos: " << gparamsUpper;
221 Local3DPoint lparamsUpperInLower = geomDetLower->surface().toLocal(gparamsUpper);
223 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t lower global pos: " << gparamsLower;
224 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t upper global pos: " << gparamsUpper;
226 LogTrace(
"VectorHitBuilderAlgorithm") <<
"A:\t lower local pos: " << lparamsLower.first
227 <<
" with error: " << lparamsLower.second << std::endl;
228 LogTrace(
"VectorHitBuilderAlgorithm") <<
"A:\t upper local pos in the lower sof " << lparamsUpperInLower
229 <<
" with error: " << lparamsUpper.second << std::endl;
236 double chi22Dzx = 0.0;
247 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t pos2Dzx: " << pos2Dzx;
248 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t dir2Dzx: " << dir2Dzx;
249 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t cov2Dzx: " << covMat2Dzx;
253 double chi22Dzy = 0.0;
264 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t pos2Dzy: " << pos2Dzy;
265 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t dir2Dzy: " << dir2Dzy;
266 LogTrace(
"VectorHitBuilderAlgorithm") <<
"\t cov2Dzy: " << covMat2Dzy;
277 if (gPositionLower.
perp() > gPositionUpper.
perp()) {
278 std::swap(gPositionLower, gPositionUpper);
290 curvatureAndPhi.
phi);
304 double&
chi2)
const {
305 float x[2] = {lpCI.
z(), lpCO.
z()};
306 float y[2] = {lpCI.
x(), lpCO.
x()};
307 float sqCI =
sqrt(leCI.
xx());
308 float sqCO =
sqrt(leCO.
xx());
309 float sigy2[2] = {sqCI * sqCI, sqCO * sqCO};
323 double&
chi2)
const {
324 float x[2] = {lpCI.
z(), lpCO.
z()};
325 float y[2] = {lpCI.
y(), lpCO.
y()};
326 float sqCI =
sqrt(leCI.
yy());
327 float sqCO =
sqrt(leCO.
yy());
328 float sigy2[2] = {sqCI * sqCI, sqCO * sqCO};
341 double&
chi2)
const {
343 float intercept = 0.;
350 covMatrix[0][0] = covss;
351 covMatrix[1][1] = covii;
352 covMatrix[1][0] = covsi;
354 for (
unsigned int j = 0;
j < 2;
j++) {
355 const double ypred = intercept +
slope *
x[
j];
356 const double dy = (
y[
j] - ypred) /
sqrt(sigy2[
j]);
362 float slopeZ =
x[1] -
x[0];
373 float errorCurvature = -999.;
376 float h1 = gPositionLower.
x() * gPositionUpper.
y() - gPositionUpper.
x() * gPositionLower.
y();
380 n1[0] = -gPositionLower.
y();
381 n1[1] = gPositionLower.
x();
383 n2[0] = gPositionUpper.
x() - gPositionLower.
x();
384 n2[1] = gPositionUpper.
y() - gPositionLower.
y();
386 double n3 = n1[0] * n2[0] + n1[1] * n2[1];
387 double signCurv = -copysign(1.0, n3);
388 double phi1 = atan2(gPositionUpper.
y() - gPositionLower.
y(), gPositionUpper.
x() - gPositionLower.
x());
390 double x2Low =
pow(gPositionLower.
x(), 2);
391 double y2Low =
pow(gPositionLower.
y(), 2);
392 double x2Up =
pow(gPositionUpper.
x(), 2);
393 double y2Up =
pow(gPositionUpper.
y(), 2);
397 double h2Inf = 1. / (2 * h1);
398 double r12 = gPositionLower.
perp2();
399 double r22 = gPositionUpper.
perp2();
400 double h3 =
pow(n2[0], 2) +
pow(n2[1], 2);
401 double h4 = -x2Low * gPositionUpper.
x() + gPositionLower.
x() * x2Up + gPositionLower.
x() * y2Up -
402 gPositionUpper.
x() * y2Low;
404 x2Low * gPositionUpper.
y() - x2Up * gPositionLower.
y() + y2Low * gPositionUpper.
y() - gPositionLower.
y() * y2Up;
407 double invRho2 = (4. * h1 * h1) / (r12 * r22 * h3);
411 double xcentre = h5 / h2;
412 double ycentre = h4 / h2;
415 double xtg = gPositionLower.
y() - ycentre;
416 double ytg = -(gPositionLower.
x() - xcentre);
419 phi = atan2(ytg, xtg);
423 double denom1 = 1. /
sqrt(r12 * r22 * h3);
424 double denom2 = 1. / (
pow(r12 * r22 * h3, 1.5));
425 jacobian[0][0] = 1.0;
426 jacobian[1][1] = 1.0;
428 -2. * ((h1 * (gPositionLower.
x() * r22 * h3 + (gPositionLower.
x() - gPositionUpper.
x()) * r12 * r22)) * denom2 -
429 (gPositionUpper.
y()) * denom1);
431 -2. * ((gPositionUpper.
x()) * denom1 +
432 (h1 * (gPositionLower.
y() * r22 * h3 + r12 * r22 * (gPositionLower.
y() - gPositionUpper.
y()))) *
435 -2. * ((gPositionLower.
y()) * denom1 +
436 (h1 * (gPositionUpper.
x() * r12 * h3 - (gPositionLower.
x() - gPositionUpper.
x()) * r12 * r22)) *
439 -2. * ((h1 * (gPositionUpper.
y() * r12 * h3 - r12 * r22 * (gPositionLower.
y() - gPositionUpper.
y()))) * denom2 -
440 (gPositionLower.
x()) * denom1);
443 mVector[0] = (gPositionLower.
y() - ycentre) * invRho2;
444 mVector[1] = -(gPositionLower.
x() - xcentre) * invRho2;
447 double h22Inv = 1. /
pow(h2, 2);
451 2. * ((gPositionLower.
x() * gPositionUpper.
y()) * h2Inf - (gPositionUpper.
y() * h5) * h22Inv);
452 kMatrix[0][1] = (2. * gPositionUpper.
x() * h5) * h22Inv -
453 (x2Up + y2Up - 2. * gPositionLower.
y() * gPositionUpper.
y()) * h2Inf;
455 2. * ((gPositionLower.
y() * h5) * h22Inv - (gPositionUpper.
x() * gPositionLower.
y()) * h2Inf);
456 kMatrix[0][3] = (x2Low + y2Low - 2. * gPositionUpper.
y() * gPositionLower.
y()) * h2Inf -
457 (2. * gPositionLower.
x() * h5) * h22Inv;
458 kMatrix[1][0] = (x2Up - 2. * gPositionLower.
x() * gPositionUpper.
x() + y2Up) * h2Inf -
459 (2. * gPositionUpper.
y() * h4) * h22Inv;
461 2. * ((gPositionUpper.
x() * h4) * h22Inv - (gPositionUpper.
x() * gPositionLower.
y()) * h2Inf);
462 kMatrix[1][2] = (2. * gPositionLower.
y() * h4) * h22Inv -
463 (x2Low - 2. * gPositionUpper.
x() * gPositionLower.
x() + y2Low) * h2Inf;
465 2. * (gPositionLower.
x() * gPositionUpper.
y()) * h2Inf - (gPositionLower.
x() * h4) * h22Inv;
468 jacobian[3][0] = nMatrix[0];
469 jacobian[3][1] = nMatrix[1];
470 jacobian[3][2] = nMatrix[2];
471 jacobian[3][3] = nMatrix[3];
474 if ((signCurv < 0 && curvature > 0) || (signCurv > 0 &&
curvature < 0)) {
476 for (
int i = 0;
i < 4;
i++) {
477 jacobian[2][
i] = -jacobian[2][
i];
490 for (
int i = 0;
i < 4;
i++) {
491 curvatureJacobian[
i] = jacobian[2][
i];
496 gErrors[0][0] = gErrorLower.
cxx();
497 gErrors[0][1] = gErrorLower.
cyx();
498 gErrors[1][0] = gErrorLower.
cyx();
499 gErrors[1][1] = gErrorLower.
cyy();
500 gErrors[2][2] = gErrorUpper.
cxx();
501 gErrors[2][3] = gErrorUpper.
cyx();
502 gErrors[3][2] = gErrorUpper.
cyx();
503 gErrors[3][3] = gErrorUpper.
cyy();
507 errorCurvature =
temp[0] * curvatureJacobian[0] +
temp[1] * curvatureJacobian[1] +
temp[2] * curvatureJacobian[2] +
508 temp[3] * curvatureJacobian[3];
512 result.curvatureError = errorCurvature;
edm::Ref< typename HandleT::element_type, typename HandleT::element_type::value_type::value_type > makeRefTo(const HandleT &iHandle, typename HandleT::element_type::value_type::const_iterator itIter)
void push_back(data_type const &d)
static Global3DPoint phase2clusterGlobalPos(const PixelGeomDetUnit *geomDet, ClusterRef cluster)
Local3DVector LocalVector
void buildVectorHits(VectorHitCollection &vhAcc, VectorHitCollection &vhRej, DetId detIdStack, const StackGeomDet *stack, edm::Handle< edmNew::DetSetVector< Phase2TrackerCluster1D >> clusters, const Detset &DSVinner, const Detset &DSVouter, const std::vector< bool > &phase2OTClustersToSkip=std::vector< bool >()) const override
void fit(float x[2], float y[2], float sigy[2], Local3DPoint &pos, Local3DVector &dir, AlgebraicSymMatrix22 &covMatrix, double &chi2) const
static const double slope[3]
ROOT::Math::SMatrix< double, D1, D2, ROOT::Math::MatRepStd< double, D1, D2 > > Matrix
VectorHit buildVectorHit(const StackGeomDet *stack, Phase2TrackerCluster1DRef lower, Phase2TrackerCluster1DRef upper) const override
T curvature(T InversePt, const MagneticField &field)
unsigned int layer(const DetId &id) const
virtual LocalValues localParameters(const T &, const GeomDetUnit &) const =0
void fit2Dzy(const Local3DPoint lpCI, const Local3DPoint lpCO, const LocalError leCI, const LocalError leCO, Local3DPoint &pos, Local3DVector &dir, AlgebraicSymMatrix22 &covMatrix, double &chi2) const
ROOT::Math::SVector< double, 2 > AlgebraicVector2
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
bool checkClustersCompatibilityBeforeBuilding(edm::Handle< edmNew::DetSetVector< Phase2TrackerCluster1D >> clusters, const Detset &theLowerDetSet, const Detset &theUpperDetSet) const
std::vector< double > barrelCut_
const ClusterParameterEstimator< Phase2TrackerCluster1D > * cpe_
Abs< T >::type abs(const T &t)
const TrackerGeometry * tkGeom_
uint32_t stack(const DetId &id) const
DetId partnerDetId(const DetId &id) const
static GlobalError phase2clusterGlobalPosErr(const PixelGeomDetUnit *geomDet)
ROOT::Math::SVector< double, 4 > AlgebraicVector4
const TrackerGeomDet * idToDet(DetId) const override
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
bool isLower(const DetId &id) const
const Plane & surface() const
The nominal surface of the GeomDet.
constexpr uint32_t rawId() const
get the raw id
void run(edm::Handle< edmNew::DetSetVector< Phase2TrackerCluster1D >> clusters, VectorHitCollection &vhAcc, VectorHitCollection &vhRej, edmNew::DetSetVector< Phase2TrackerCluster1D > &clustersAcc, edmNew::DetSetVector< Phase2TrackerCluster1D > &clustersRej) const override
bool checkClustersCompatibility(Local3DPoint &posinner, Local3DPoint &posouter, LocalError &errinner, LocalError &errouter) const
std::vector< double > endcapCut_
void printCluster(const GeomDet *geomDetUnit, const Phase2TrackerCluster1D *cluster) const
ROOT::Math::SMatrix< double, 2, 2, ROOT::Math::MatRepSym< double, 2 > > AlgebraicSymMatrix22
double computeParallaxCorrection(const PixelGeomDetUnit *, const Point3DBase< float, LocalTag > &, const PixelGeomDetUnit *, const Point3DBase< float, LocalTag > &) const
void linearFit(T const *__restrict__ x, T const *__restrict__ y, int ndat, T const *__restrict__ sigy2, T &slope, T &intercept, T &covss, T &covii, T &covsi)
void fit2Dzx(const Local3DPoint lpCI, const Local3DPoint lpCO, const LocalError leCI, const LocalError leCO, Local3DPoint &pos, Local3DVector &dir, AlgebraicSymMatrix22 &covMatrix, double &chi2) const
Detset::const_iterator const_iterator
const TrackerTopology * tkTopo_
Power< A, B >::type pow(const A &a, const B &b)
CurvatureAndPhi curvatureANDphi(Global3DPoint gPositionLower, Global3DPoint gPositionUpper, GlobalError gErrorLower, GlobalError gErrorUpper) const
Point3DBase< float, LocalTag > Local3DPoint