#include <TwoBowedSurfacesDeformation.h>
Public Member Functions | |
virtual bool | add (const SurfaceDeformation &other) |
virtual TwoBowedSurfacesDeformation * | clone () const |
virtual std::vector< double > | parameters () const |
parameters - see constructor for meaning | |
virtual Local2DVector | positionCorrection (const Local2DPoint &localPos, const LocalTrackAngles &localAngles, double length, double width) const |
TwoBowedSurfacesDeformation (const std::vector< double > ¶meters) | |
virtual int | type () const |
specific type, i.e. SurfaceDeformationFactory::kTwoBowedSurfaces | |
Static Public Member Functions | |
static constexpr unsigned int | k_ySplit () |
static constexpr unsigned int | maxParameterSize () |
maximum size of vector that is accepted by constructor from vector | |
static constexpr unsigned int | minParameterSize () |
minimum size of vector that is accepted by constructor from vector | |
static constexpr unsigned int | parameterSize () |
Static Public Attributes | |
static constexpr unsigned int | parSize = 13 |
Private Attributes | |
double | theParameters [parSize] |
TwoBowedSurfacesAlignmentParameters
Class to apply corrections to local positions resulting from two surfaces chained in local y. Possible bows are parametrised using Legendre polynomials up to second order, excluding 0th and 1st order that are already treated by local w shift and rotations around local u and v axes. In addition store relative shifts and rotations of the two surfaces.
Definition at line 19 of file TwoBowedSurfacesDeformation.h.
TwoBowedSurfacesDeformation::TwoBowedSurfacesDeformation | ( | const std::vector< double > & | pars | ) |
Constructor from vector of parameters, its size() must be between minParameterSize() and maxParameterSize(). The parameters are (in that order)
(last update by
)
Definition at line 16 of file TwoBowedSurfacesDeformation.cc.
References i, min, parameterSize(), and theParameters.
Referenced by clone().
{ if (pars.size() != parameterSize()) { edm::LogError("BadSetup") << "@SUB=TwoBowedSurfacesDeformation" << "Input vector of wrong size " << pars.size() << " instead of " << parameterSize() << ", add zeros to fill up!"; } for (unsigned int i=0; i!=std::min((unsigned int)(pars.size()), parameterSize()); ++i ) theParameters[i]=pars[i]; for (unsigned int i=pars.size(); i!=parameterSize(); ++i ) theParameters[i]=0; }
bool TwoBowedSurfacesDeformation::add | ( | const SurfaceDeformation & | other | ) | [virtual] |
update information with parameters of 'other', false in case the type or some parameters do not match and thus the information cannot be used (then no changes are done), true if merge was successful
Implements SurfaceDeformation.
Definition at line 99 of file TwoBowedSurfacesDeformation.cc.
References i, k_ySplit(), LogDebug, SurfaceDeformation::parameters(), parameterSize(), theParameters, SurfaceDeformation::type(), and type().
{ if (this->type() == other.type()) { const std::vector<double> otherParameters(other.parameters()); if (otherParameters.size() ==parameterSize() ) { if (theParameters[k_ySplit()] == otherParameters[k_ySplit()]) { for (unsigned int i = 0; i != parameterSize()-1; ++i) {// -1 for ySplit // mean bows, delta shifts, delta angles and delta bows can simply be added up theParameters[i] += otherParameters[i]; } return true; } else { // ySplit values are different! LogDebug("Alignment") << "@SUB=TwoBowedSurfacesDeformation::add" << "Different ySplit: this " << theParameters[k_ySplit()] << ", to add " << otherParameters[k_ySplit()]; } } // same size } // same type return false; }
TwoBowedSurfacesDeformation * TwoBowedSurfacesDeformation::clone | ( | void | ) | const [virtual] |
Implements SurfaceDeformation.
Definition at line 29 of file TwoBowedSurfacesDeformation.cc.
References TwoBowedSurfacesDeformation().
{ return new TwoBowedSurfacesDeformation(*this); }
static constexpr unsigned int TwoBowedSurfacesDeformation::k_ySplit | ( | ) | [inline, static] |
Definition at line 75 of file TwoBowedSurfacesDeformation.h.
References parameterSize().
Referenced by add(), and positionCorrection().
{ return parameterSize()-1;}
static constexpr unsigned int TwoBowedSurfacesDeformation::maxParameterSize | ( | ) | [inline, static] |
maximum size of vector that is accepted by constructor from vector
Definition at line 72 of file TwoBowedSurfacesDeformation.h.
References parameterSize().
Referenced by SurfaceDeformationFactory::create().
{ return parameterSize();}
static constexpr unsigned int TwoBowedSurfacesDeformation::minParameterSize | ( | ) | [inline, static] |
minimum size of vector that is accepted by constructor from vector
Definition at line 70 of file TwoBowedSurfacesDeformation.h.
References parameterSize().
Referenced by SurfaceDeformationFactory::create().
{ return parameterSize(); }
std::vector< double > TwoBowedSurfacesDeformation::parameters | ( | void | ) | const [virtual] |
parameters - see constructor for meaning
Implements SurfaceDeformation.
Definition at line 122 of file TwoBowedSurfacesDeformation.cc.
References parameterSize(), and theParameters.
{ return std::vector<double>(theParameters,theParameters+parameterSize()); }
static constexpr unsigned int TwoBowedSurfacesDeformation::parameterSize | ( | ) | [inline, static] |
Definition at line 66 of file TwoBowedSurfacesDeformation.h.
References parSize.
Referenced by add(), k_ySplit(), maxParameterSize(), minParameterSize(), parameters(), and TwoBowedSurfacesDeformation().
{ return parSize; }
SurfaceDeformation::Local2DVector TwoBowedSurfacesDeformation::positionCorrection | ( | const Local2DPoint & | localPos, |
const LocalTrackAngles & | localAngles, | ||
double | length, | ||
double | width | ||
) | const [virtual] |
correction to add to local position depending on
Implements SurfaceDeformation.
Definition at line 42 of file TwoBowedSurfacesDeformation.cc.
References Topology::LocalTrackAngles::dxdz(), Topology::LocalTrackAngles::dydz(), k_ySplit(), theParameters, tablePrinter::width, PV2DBase< T, PVType, FrameType >::x(), x, PV2DBase< T, PVType, FrameType >::y(), and detailsBasic3DVector::y.
{ const double ySplit = theParameters[k_ySplit()]; // treatment of different widthes at high/low y could be done by theRelWidthLowY or so // if (widthLowY > 0. && widthHighY != widthLowY) { // std::cout << "SurfaceDeformation::positionCorrection2Bowed: Cannot yet deal " // << " with different widthes, take " << widthHighY << " not " << widthLowY // << std::endl; // } // const double width = widthHighY; // Some signs depend on whether we are in surface part below or above ySplit: const double sign = (localPos.y() < ySplit ? +1. : -1.); const double yMiddle = ySplit * 0.5 - sign * length * .25; // 'calibrate' y length and transform y to be w.r.t. surface middle const double myY = localPos.y() - yMiddle; const double myLength = length * 0.5 + sign * ySplit; double uRel = 2. * localPos.x() / width; // relative u (-1 .. +1) double vRel = 2. * myY / myLength; // relative v (-1 .. +1) // 'range check': const double cutOff = 1.5; if (uRel < -cutOff) { uRel = -cutOff; } else if (uRel > cutOff) { uRel = cutOff; } if (vRel < -cutOff) { vRel = -cutOff; } else if (vRel > cutOff) { vRel = cutOff; } auto pars = theParameters; // 1st, get dw effect depending // - on the surface sagittas (Legendre polynomials), // see BowedSurfaceAlignmentDerivatives::operator()(..) // - relative dw // - surface specific dalpha (note that this shifts surface specific dw) // - surface specific dbeta const double dw = (uRel * uRel - 1./3.) * (pars[0] + sign * pars[9]) // sagittaX + uRel * vRel * (pars[1] + sign * pars[10]) // sagittaXY + (vRel * vRel - 1./3.) * (pars[2] + sign * pars[11]) // sagittaY + sign * pars[5] // different dw + myY * sign * pars[6] // different dalpha - localPos.x() * sign * pars[7]; // different dbeta // 2nd, translate the dw effect to shifts in x and y // Positive dxdz/dydz and positive dw mean negative shift in x/y: Local2DVector::ScalarType x = -dw * localAngles.dxdz(); Local2DVector::ScalarType y = -dw * localAngles.dydz(); // 3rd, treat in-plane differences depending on surface from xy-shifts... x += (sign * pars[3]); // different du y += (sign * pars[4]); // different dv // ...and gamma-rotation x -= myY * (sign * pars[8]); // different dgamma for u y += localPos.x() * (sign * pars[8]); // different dgamma for v return Local2DVector(x, y); }
int TwoBowedSurfacesDeformation::type | ( | ) | const [virtual] |
specific type, i.e. SurfaceDeformationFactory::kTwoBowedSurfaces
Implements SurfaceDeformation.
Definition at line 35 of file TwoBowedSurfacesDeformation.cc.
References AlignmentParametersFactory::kTwoBowedSurfaces.
Referenced by add().
{ return SurfaceDeformationFactory::kTwoBowedSurfaces; }
constexpr unsigned int TwoBowedSurfacesDeformation::parSize = 13 [static] |
Definition at line 65 of file TwoBowedSurfacesDeformation.h.
Referenced by parameterSize().
double TwoBowedSurfacesDeformation::theParameters[parSize] [private] |
Definition at line 78 of file TwoBowedSurfacesDeformation.h.
Referenced by add(), parameters(), positionCorrection(), and TwoBowedSurfacesDeformation().