38 square(
const double x) {
43 distance(
const std::vector<Amg::Vector2D> &vectorOfPositions,
44 const std::vector<Amg::Vector2D> &allLocalPositions,
45 const std::vector<Amg::MatrixX> &allErrorMatrix,
46 const int i,
const int j,
const int k) {
48 square(vectorOfPositions[i][0] - allLocalPositions[0][0]) / allErrorMatrix[0](0, 0) +
49 square(vectorOfPositions[j][0] - allLocalPositions[1][0]) / allErrorMatrix[1](0, 0) +
50 square(vectorOfPositions[k][0] - allLocalPositions[2][0]) / allErrorMatrix[2](0, 0) +
51 square(vectorOfPositions[i][1] - allLocalPositions[0][1]) / allErrorMatrix[0](1, 1) +
52 square(vectorOfPositions[j][1] - allLocalPositions[1][1]) / allErrorMatrix[1](1, 1) +
53 square(vectorOfPositions[k][1] - allLocalPositions[2][1]) / allErrorMatrix[2](1, 1);
58 (
const std::string &t,
const std::string &n,
const IInterface *p) :
60 declareInterface<IRIO_OnTrackCreator>(
this);
109 constexpr double phimin=-0.27, phimax=0.27;
111 constexpr double etacen[
s_nbineta]={-0.,1.,1.55,1.9,2.15,2.35};
113 for (
int i=0; i<
s_nbineta-1; i++)
m_etax[i+1]=(etacen[i]+etacen[i+1])/2.;
120 return StatusCode::SUCCESS;
131return StatusCode::SUCCESS;
180 using CLHEP::micrometer;
182 const double TOPHAT_SIGMA = 1. / std::sqrt(12.);
211 if (
pix->rdoList().empty()) {
212 ATH_MSG_WARNING(
"Pixel RDO-list size is 0, check integrity of pixel clusters! stop ROT creation.");
223 float trkphicomp = my_track.dot(my_phiax);
224 float trketacomp = my_track.dot(my_etaax);
225 float trknormcomp = my_track.dot(my_normal);
226 double bowphi = std::atan2(trkphicomp, trknormcomp);
227 double boweta = std::atan2(trketacomp, trknormcomp);
228 float etatrack = trackPar.
eta();
234 if (bowphi >
M_PI *0.5) {
237 if (bowphi < -
M_PI *0.5) {
243 double angle = std::atan(std::tan(bowphi) - readoutside * tanl);
247 int PixEtaModule =
m_pixelid->eta_module(element_id);
248 int PixPhiModule =
m_pixelid->phi_module(element_id);
249 double PixTrkPt = trackPar.
pT();
250 double PixTrkEta = trackPar.
eta();
251 ATH_MSG_VERBOSE(
"tanl = " << tanl <<
" readout side is " << readoutside <<
252 " module " << PixEtaModule <<
" " << PixPhiModule <<
253 " track pt, eta = " << PixTrkPt <<
" " << PixTrkEta <<
254 " track momentum phi, norm = " << trkphicomp <<
" " <<
255 trknormcomp <<
" bowphi = " << bowphi <<
" angle = " <<
angle);
257 float omegaphi =
pix->omegax();
258 float omegaeta =
pix->omegay();
259 double localphi = -9999.;
260 double localeta = -9999.;
262 const std::vector<Identifier> & rdos =
pix->rdoList();
268 for (
const auto & rId:rdos) {
269 const int row =
m_pixelid->phi_index(rId);
270 const int col =
m_pixelid->eta_index(rId);
271 rowmin = std::min(rowmin, row);
272 rowmax = std::max(rowmax,row);
273 colmin = std::min(colmin, col);
274 colmax = std::max(colmax, col);
277 meanpos = meanpos / rdos.size();
289 int nrows = rowmax - rowmin + 1;
290 int ncol = colmax - colmin + 1;
297 localphi = centroid.
xPhi() + shift;
298 localeta = centroid.
xEta();
301 ang = 180 *
angle * M_1_PI;
304 delta = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaXbarrel(nrows, ang, 1);
316 ATH_MSG_ERROR(
"bin out of range in line " << __LINE__ <<
" of PixelClusterOnTrackTool.cxx.");
320 if (offlineCalibData->getPixelChargeInterpolationParameters()->getVersion()<-1) {
321 delta = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaXbarrel(nrows, ang, 0);
324 localphi += delta * (omegaphi - 0.5);
326 double thetaloc = -999.;
327 if (boweta > -0.5 *
M_PI && boweta <
M_PI / 2.) {
328 thetaloc = M_PI_2 - boweta;
329 }
else if (boweta > M_PI_2 && boweta <
M_PI) {
330 thetaloc = 1.5 *
M_PI - boweta;
332 thetaloc = -M_PI_2 - boweta;
334 double etaloc = -1 * log(tan(thetaloc * 0.5));
336 delta = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaYbarrel(ncol, etaloc, 1);
338 etaloc = std::abs(etaloc);
349 }
else if (ncol ==
bin + 1) {
351 }
else if (ncol ==
bin + 2) {
357 ATH_MSG_ERROR(
"bin out of range in line " << __LINE__ <<
" of PixelClusterOnTrackTool.cxx.");
360 if (offlineCalibData->getPixelChargeInterpolationParameters()->getVersion()<-1) {
361 delta = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaYbarrel(ncol, std::abs(etaloc), 0);
364 localeta += delta * (omegaeta - 0.5);
370 localphi += deltax * (omegaphi - 0.5);
371 localeta += deltay * (omegaeta - 0.5);
377 double deltax = 35 * micrometer;
378 double deltay = 35 * micrometer;
379 localphi += deltax * (omegaphi - 0.5);
380 localeta += deltay * (omegaeta - 0.5);
386 localphi = meanpos.
xPhi() + shift;
387 localeta = meanpos.
xEta();
399 if (std::abs(
angle) > 1) {
400 const double thickness = element->
thickness();
401 errphi = thickness * std::tan(std::abs(
angle)) * TOPHAT_SIGMA;
402 erreta =
width.z() > thickness * std::tan(std::abs(boweta)) ?
403 width.z() * TOPHAT_SIGMA : thickness * std::tan(std::abs(boweta)) * TOPHAT_SIGMA;
404 ATH_MSG_VERBOSE(
"Shallow track with tanl = " << tanl <<
" bowphi = " <<
405 bowphi <<
" angle = " <<
angle <<
" width.z = " <<
width.z() <<
406 " errphi = " << errphi <<
" erreta = " << erreta);
408 errphi =
width.phiR() * TOPHAT_SIGMA;
409 erreta =
width.z() * TOPHAT_SIGMA;
411 errphi = (
width.phiR() / nrows) * TOPHAT_SIGMA;
412 erreta = (
width.z() / ncol) * TOPHAT_SIGMA;
416 int ibin = offlineCalibData->getPixelClusterOnTrackErrorData()->getBarrelBinPhi(ang, nrows);
417 errphi = offlineCalibData->getPixelClusterOnTrackErrorData()->getPixelBarrelPhiError(ibin);
420 errphi =
width.phiR() * TOPHAT_SIGMA;
429 }
else if (nrows == 2) {
435 ATH_MSG_ERROR(
"bin out of range in line " << __LINE__ <<
" of PixelClusterOnTrackTool.cxx.");
441 int ibin = offlineCalibData->getPixelClusterOnTrackErrorData()->getBarrelBinEta(std::abs(etatrack), ncol, nrows);
442 erreta = offlineCalibData->getPixelClusterOnTrackErrorData()->getPixelBarrelEtaError(ibin);
444 double etaloc = std::abs(etatrack);
446 erreta =
width.z() * TOPHAT_SIGMA;
449 while (bin < s_nbineta && etaloc >
m_etax[
bin + 1]) {
453 ATH_MSG_ERROR(
"bin out of range in line " << __LINE__ <<
" of PixelClusterOnTrackTool.cxx.");
457 }
else if (ncol ==
bin + 1) {
459 }
else if (ncol ==
bin + 2) {
462 erreta =
width.z() * TOPHAT_SIGMA;
468 int ibin = offlineCalibData->getPixelClusterErrorData()->getEndcapBin(ncol, nrows);
469 errphi = offlineCalibData->getPixelClusterErrorData()->getPixelEndcapPhiError(ibin);
470 erreta = offlineCalibData->getPixelClusterErrorData()->getPixelEndcapRError(ibin);
472 if (errphi > erreta) {
473 erreta =
width.z() * TOPHAT_SIGMA;
494 cov(0, 0) = errphi * errphi;
497 cov(1, 1) = erreta * erreta;
506 ->getScaledCovariance(std::move(cov), *
m_pixelid,
513 glob,
pix->gangedPixel(), isbroad);
518 const double theta,
const EventContext& ctx)
const {
528 const InDet::PixelClusterStrategy strategy,
const EventContext& ctx)
const {
529 int initial_errorStrategy;
533 case InDet::PIXELCLUSTER_OUTLIER:
534 case InDet::PIXELCLUSTER_SHARED:
537 newROT =
correct(rio, trackPar, ctx);
542 return correct(rio, trackPar, ctx);
551 const EventContext& ctx)
const {
558 if (pixelPrepCluster ==
nullptr) {
565 ATH_MSG_WARNING(
"Cannot access detector element. Aborting cluster correction...");
578 float trkphicomp = my_track.dot(my_phiax);
579 float trketacomp = my_track.dot(my_etaax);
580 float trknormcomp = my_track.dot(my_normal);
581 double bowphi = std::atan2(trkphicomp, trknormcomp);
582 double boweta = std::atan2(trketacomp, trknormcomp);
602 if (!
getErrorsTIDE_Ambi(pixelPrepCluster, trackPar, finalposition, finalerrormatrix, ctx)) {
614 <<
" +/- " << std::sqrt(pixelPrepCluster->
localCovariance()(1, 1)) <<
"\n"
615 <<
" Final position x: " << finalposition[0]
616 <<
" +/- " << std::sqrt(finalerrormatrix(0, 0))
617 <<
" y: " << finalposition[1] <<
" +/- "
618 <<std::sqrt(finalerrormatrix(1, 1)) );
624 float trkphicomp = my_track.dot(my_phiax);
625 float trketacomp = my_track.dot(my_etaax);
626 float trknormcomp = my_track.dot(my_normal);
627 double bowphi = std::atan2(trkphicomp, trknormcomp);
628 double boweta = std::atan2(trketacomp, trknormcomp);
640 ->getScaledCovariance(std::move(cov), *
m_pixelid,
664 const EventContext& ctx)
const {
665 std::vector<Amg::Vector2D> vectorOfPositions;
666 int numberOfSubclusters = 1;
667 vectorOfPositions.push_back(pixelPrepCluster->
localPosition());
671 InDet::PixelGangedClusterAmbiguities::const_iterator mapBegin = splitClusterMap->begin();
672 InDet::PixelGangedClusterAmbiguities::const_iterator mapEnd = splitClusterMap->end();
673 for (InDet::PixelGangedClusterAmbiguities::const_iterator mapIter = mapBegin; mapIter != mapEnd; ++mapIter) {
674 const SiCluster *first = (*mapIter).first;
675 const SiCluster *second = (*mapIter).second;
676 if (first == pixelPrepCluster && second != pixelPrepCluster) {
677 ATH_MSG_DEBUG(
"Found additional split cluster in ambiguity map (+=1).");
678 numberOfSubclusters += 1;
684 if (pixelAddCluster ==
nullptr) {
685 ATH_MSG_WARNING(
"Pixel ambiguity map has empty pixel cluster. Please DEBUG!");
688 vectorOfPositions.push_back(pixelAddCluster->
localPosition());
701 "Parameters are not at a plane ! Aborting cluster correction... ");
705 std::vector<Amg::Vector2D> allLocalPositions;
706 std::vector<Amg::MatrixX> allErrorMatrix;
712 numberOfSubclusters);
714 if (allLocalPositions.empty()) {
715 ATH_MSG_DEBUG(
" Cluster cannot be treated by NN. Giving back to default clusterization " );
720 if (allLocalPositions.size() !=
size_t(numberOfSubclusters)) {
721 ATH_MSG_WARNING(
"Returned position vector size " << allLocalPositions.size() <<
722 " not according to expected number of subclusters: " << numberOfSubclusters <<
". Abort cluster correction..." );
730 if (numberOfSubclusters == 1) {
731 finalposition = allLocalPositions[0];
732 finalerrormatrix = allErrorMatrix[0];
735 else if (numberOfSubclusters == 2) {
737 square(vectorOfPositions[0][0] - allLocalPositions[0][0]) / allErrorMatrix[0](0, 0) +
738 square(vectorOfPositions[1][0] - allLocalPositions[1][0]) / allErrorMatrix[1](0, 0) +
739 square(vectorOfPositions[0][1] - allLocalPositions[0][1]) / allErrorMatrix[0](1, 1) +
740 square(vectorOfPositions[1][1] - allLocalPositions[1][1]) / allErrorMatrix[1](1, 1);
743 square(vectorOfPositions[1][0] - allLocalPositions[0][0]) / allErrorMatrix[0](0, 0) +
744 square(vectorOfPositions[0][0] - allLocalPositions[1][0]) / allErrorMatrix[1](0, 0) +
745 square(vectorOfPositions[1][1] - allLocalPositions[0][1]) / allErrorMatrix[0](1, 1) +
746 square(vectorOfPositions[0][1] - allLocalPositions[1][1]) / allErrorMatrix[1](1, 1);
749 " Old pix (1) x: " << vectorOfPositions[0][0] <<
" y: " << vectorOfPositions[0][1] <<
"\n"
750 <<
" Old pix (2) x: " << vectorOfPositions[1][0] <<
" y: " << vectorOfPositions[1][1] <<
"\n"
751 <<
" Pix (1) x: " << allLocalPositions[0][0] <<
" +/- " << std::sqrt(allErrorMatrix[0](0, 0))
752 <<
" y: " << allLocalPositions[0][1] <<
" +/- " << std::sqrt(allErrorMatrix[0](1, 1)) <<
"\n"
753 <<
" Pix (2) x: " << allLocalPositions[1][0] <<
" +/- " << std::sqrt(allErrorMatrix[1](0, 0))
754 <<
" y: " << allLocalPositions[1][1] <<
" +/- " << std::sqrt(allErrorMatrix[1](1, 1)) <<
"\n"
755 <<
" Old (1) new (1) dist: " << std::sqrt(distancesq1) <<
" Old (1) new (2) " << std::sqrt(distancesq2) );
758 if (distancesq1 < distancesq2) {
759 finalposition = allLocalPositions[0];
760 finalerrormatrix = allErrorMatrix[0];
762 finalposition = allLocalPositions[1];
763 finalerrormatrix = allErrorMatrix[1];
768 else if (numberOfSubclusters == 3) {
771 distances[0] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 0, 1, 2);
772 distances[1] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 0, 2, 1);
773 distances[2] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 1, 0, 2);
774 distances[3] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 1, 2, 0);
775 distances[4] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 2, 0, 1);
776 distances[5] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 2, 1, 0);
778 int smallestDistanceIndex = -10;
779 double minDistance = 1e10;
781 for (
int i = 0; i < 6; i++) {
782 ATH_MSG_VERBOSE(
" distance n.: " << i <<
" distance is: " << distances[i]);
784 if (distances[i] < minDistance) {
785 minDistance = distances[i];
786 smallestDistanceIndex = i;
790 ATH_MSG_DEBUG(
" The minimum distance is : " << minDistance <<
" for index: " << smallestDistanceIndex);
792 if (smallestDistanceIndex == 0 || smallestDistanceIndex == 1) {
793 finalposition = allLocalPositions[0];
794 finalerrormatrix = allErrorMatrix[0];
796 if (smallestDistanceIndex == 2 || smallestDistanceIndex == 4) {
797 finalposition = allLocalPositions[1];
798 finalerrormatrix = allErrorMatrix[1];
800 if (smallestDistanceIndex == 3 || smallestDistanceIndex == 5) {
801 finalposition = allLocalPositions[2];
802 finalerrormatrix = allErrorMatrix[2];
813 const EventContext& ctx)
const {
815 std::vector<Amg::Vector2D> vectorOfPositions;
816 int numberOfSubclusters = 1;
819 numberOfSubclusters = 1 + splitClusterMap->count(pixelPrepCluster);
821 if (splitClusterMap->count(pixelPrepCluster) == 0 && splitProb.
isSplit()) {
822 numberOfSubclusters = 2;
824 if (splitClusterMap->count(pixelPrepCluster) != 0 && !splitProb.
isSplit()) {
825 numberOfSubclusters = 1;
830 if(numberOfSubclusters>3) numberOfSubclusters = 3;
835 ATH_MSG_WARNING(
"Parameters are not at a plane surface ! Aborting cluster "
840 std::vector<Amg::Vector2D> allLocalPositions;
841 std::vector<Amg::MatrixX> allErrorMatrix;
847 numberOfSubclusters);
849 if (allLocalPositions.empty()) {
851 " Cluster cannot be treated by NN. Giving back to default clusterization, too big: " <<
856 if (allLocalPositions.size() !=
size_t(numberOfSubclusters)) {
858 "Returned position vector size " << allLocalPositions.size() <<
" not according to expected number of subclusters: " << numberOfSubclusters <<
859 ". Abort cluster correction...");
866 if (numberOfSubclusters == 1) {
867 finalposition = allLocalPositions[0];
868 finalerrormatrix = allErrorMatrix[0];
876 if (trackPar.covariance()) {
877 localerr =
Amg::Vector2D(std::sqrt((*trackPar.covariance())(0, 0)), std::sqrt((*trackPar.covariance())(1, 1)));
880 double minDistance(1e300);
883 for (
unsigned int i(0); i < allLocalPositions.size(); ++i) {
885 square(localpos[0] - allLocalPositions[i][0]) / localerr[0]
886 + square(localpos[1] - allLocalPositions[i][1]) / localerr[1];
888 if (distance < minDistance) {
890 minDistance = distance;
894 finalposition = allLocalPositions[
index];
895 finalerrormatrix = allErrorMatrix[
index];
Scalar phi() const
phi method
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
This is an Identifier helper class for the Pixel subdetector.
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
const ServiceHandle< StoreGateSvc > & detStore() const
This is a "hash" representation of an Identifier.
int readoutSide() const
ReadoutSide.
Class used to describe the design of a module (diode segmentation and readout scheme).
SiLocalPosition positionFromColumnRow(const int column, const int row) const
Given row and column index of a diode, return position of diode center ALTERNATIVE/PREFERED way is to...
Class to hold geometrical description of a silicon detector element.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
double xPhi() const
position along phi direction:
double xEta() const
position along eta direction:
const Amg::Vector3D & etaAxis() const
virtual const Amg::Vector3D & normal() const override final
Get reconstruction local normal axes in global frame.
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
HepGeom::Point3D< double > globalPosition(const HepGeom::Point3D< double > &localPos) const
transform a reconstruction local position into a global position (inline):
virtual Identifier identify() const override final
identifier of this detector element (inline)
const Amg::Vector3D & phiAxis() const
Specific class to represent the pixel measurements.
const Amg::Vector3D & globalPosition() const
return global position reference
bool gangedPixel() const
return the flag of this cluster containing a gangedPixel
virtual const InDetDD::SiDetectorElement * detectorElement() const override final
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
static float getDeltaXendcap()
static float getDeltaYendcap()
double eta() const
Access method for pseudorapidity - from momentum.
const Amg::Vector3D & momentum() const
Access method for the momentum.
double pT() const
Access method for transverse momentum.
virtual const Surface & associatedSurface() const =0
Access to the Surface associated to the Parameters.
virtual constexpr SurfaceType surfaceType() const =0
Returns the Surface Type enum for the surface used to define the derived class.
Amg::Vector2D localPosition() const
Access method for the local coordinates, local parameter definitions differ for each surface type.
virtual constexpr ParametersType type() const =0
Return the ParametersType enum.
virtual const TrkDetElementBase * detectorElement() const =0
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
const Amg::Vector2D & localPosition() const
return the local position reference
virtual bool type(PrepRawDataType type) const
Interface method checking the type.
const Amg::MatrixX & localCovariance() const
return const ref to the error matrix
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersBase< TrackParametersDim, Charged > TrackParameters
const T_res * ErrorScalingCast(const T_src *src)
bool isTooBigToBeSplit() const