File indexing completed on 2023-03-17 11:26:42
0001 #include "PathToPlane2Order.h"
0002 #include "RKLocalFieldProvider.h"
0003 #include "FrameChanger.h"
0004 #include "TrackingTools/GeomPropagators/interface/HelixArbitraryPlaneCrossing.h"
0005
0006 #include <iostream>
0007
0008 std::pair<bool, double> PathToPlane2Order::operator()(const Plane& plane,
0009 const Vector3D& pos,
0010 const Vector3D& momentum,
0011 double charge,
0012 const PropagationDirection propDir) {
0013
0014 RKLocalFieldProvider::Vector B = theField.inTesla(pos.x(), pos.y(), pos.z());
0015
0016
0017
0018 Frame::GlobalVector localZ = theFieldFrame->toGlobal(Frame::LocalVector(B.unit()));
0019
0020 Frame::GlobalVector localY = localZ.cross(Frame::GlobalVector(1, 0, 0));
0021 if (localY.mag() < 0.1) {
0022 localY = localZ.cross(Frame::GlobalVector(0, 1, 0)).unit();
0023 } else {
0024 localY = localY.unit();
0025 }
0026 Frame::GlobalVector localX = localY.cross(localZ);
0027
0028 Frame::PositionType fpos(theFieldFrame->toGlobal(Frame::LocalPoint(pos)));
0029 Frame::RotationType frot(localX, localY, localZ);
0030
0031 Frame frame(fpos, frot);
0032
0033
0034
0035
0036 Frame::LocalPoint localPos = frame.toLocal(fpos);
0037
0038
0039 Frame::GlobalVector gmom(theFieldFrame->toGlobal(Frame::LocalVector(momentum)));
0040 Frame::LocalVector localMom = frame.toLocal(gmom);
0041
0042
0043 Plane localPlane = FrameChanger::transformPlane(plane, frame);
0044
0045
0046
0047
0048
0049
0050 double k = 2.99792458e-3;
0051 double transverseMomentum = localMom.perp();
0052 if (!(transverseMomentum != 0)) {
0053
0054 return std::pair<bool, double>(false, 0);
0055 }
0056 double curvature = -k * charge * B.mag() / transverseMomentum;
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 HelixArbitraryPlaneCrossing crossing(localPos.basicVector(), localMom.basicVector(), curvature, propDir);
0074 std::pair<bool, double> res = crossing.pathLength(localPlane);
0075
0076 return res;
0077 }