Go to the documentation of this file.00001 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionFastHelix.h"
00002 #include "RecoTracker/TkSeedGenerator/interface/FastLine.h"
00003 #include "TrackingTools/TrajectoryParametrization/interface/GlobalTrajectoryParameters.h"
00004 #include "TrackingTools/TrajectoryParametrization/interface/CurvilinearTrajectoryError.h"
00005 #include "TrackingTools/TrajectoryParametrization/interface/CartesianTrajectoryError.h"
00006 #include "MagneticField/Engine/interface/MagneticField.h"
00007
00008
00009 #include <cfloat>
00010
00011 ConversionFastHelix::ConversionFastHelix(const GlobalPoint& outerHit,
00012 const GlobalPoint& middleHit,
00013 const GlobalPoint& aVertex,
00014 const MagneticField* field ) :
00015 theOuterHit(outerHit),
00016 theMiddleHit(middleHit),
00017 theVertex(aVertex),
00018 theCircle(outerHit,
00019 middleHit,
00020 aVertex),
00021 mField(field) {
00022
00023 validStateAtVertex=false;
00024
00025
00026 makeHelix();
00027
00028
00029 }
00030
00031
00032 void ConversionFastHelix::makeHelix() {
00033
00034
00035 if( theCircle.isValid()) {
00036 theHelix_=helixStateAtVertex();
00037 } else {
00038 theHelix_= straightLineStateAtVertex();
00039 }
00040
00041
00042 }
00043
00044
00045 FreeTrajectoryState ConversionFastHelix::stateAtVertex() {
00046
00047 return theHelix_;
00048
00049 }
00050
00051
00052 FreeTrajectoryState ConversionFastHelix::helixStateAtVertex() {
00053
00054
00055
00056 GlobalPoint pMid(theMiddleHit);
00057 GlobalPoint v(theVertex);
00058 FTS atVertex;
00059
00060 double dydx = 0.;
00061 double pt = 0., px = 0., py = 0.;
00062
00063
00064
00065
00066
00067
00068 double rho = theCircle.rho();
00069 pt = 0.01 * rho * (0.3*mField->inTesla(GlobalPoint(0,0,0)).z());
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 double arg=rho*rho - ( (v.x()-theCircle.x0())*(v.x()-theCircle.x0()) );
00082
00083 if ( arg >= 0 ) {
00084
00085
00086
00087 double root = sqrt( arg );
00088
00089 if((v.y() - theCircle.y0()) > 0.)
00090 dydx = -(v.x() - theCircle.x0()) / root;
00091 else
00092 dydx = (v.x() - theCircle.x0()) / root;
00093
00094 px = pt/sqrt(1. + dydx*dydx);
00095 py = px*dydx;
00096
00097 if(px*(pMid.x() - v.x()) + py*(pMid.y() - v.y()) < 0.) {
00098 px *= -1.;
00099 py *= -1.;
00100 }
00101
00102
00103
00104
00105
00106
00107
00108
00109 FastLine flfit(theOuterHit, theMiddleHit, theCircle.rho());
00110
00111
00112
00113 double z_0 = 0;
00114
00115
00116 if ( flfit.n2() !=0 && !std::isnan( flfit.c()) && !std::isnan(flfit.n2()) ) {
00117
00118 z_0 = -flfit.c()/flfit.n2();
00119 double dzdrphi = -flfit.n1()/flfit.n2();
00120 double pz = pt*dzdrphi;
00121
00122
00123
00124 GlobalVector magvtx=mField->inTesla(v);
00125 TrackCharge q =
00126 ((theCircle.x0()*py - theCircle.y0()*px) /
00127 (magvtx.z()) < 0.) ?
00128 -1 : 1;
00129
00130
00131 AlgebraicSymMatrix55 C = AlgebraicMatrixID();
00132
00133
00134 atVertex = FTS(GlobalTrajectoryParameters(GlobalPoint(v.x(), v.y(), z_0),
00135 GlobalVector(px, py, pz),
00136 q,
00137 mField),
00138 CurvilinearTrajectoryError(C));
00139
00140
00141
00142 if( atVertex.transverseCurvature() !=0 ) {
00143
00144 validStateAtVertex=true;
00145
00146
00147 return atVertex;
00148 }else
00149 return atVertex;
00150 } else {
00151
00152 return atVertex;
00153 }
00154
00155
00156
00157 } else {
00158
00159
00160 return atVertex;
00161 }
00162
00163
00164
00165
00166
00167 }
00168
00169 FreeTrajectoryState ConversionFastHelix::straightLineStateAtVertex() {
00170
00171 FTS atVertex;
00172
00173
00174
00175 GlobalPoint pMid(theMiddleHit);
00176 GlobalPoint v(theVertex);
00177
00178 double dydx = 0.;
00179 double pt = 0., px = 0., py = 0.;
00180
00181 if(fabs(theCircle.n1()) > 0. || fabs(theCircle.n2()) > 0.)
00182 pt = 1.e+4;
00183 if(fabs(theCircle.n2()) > 0.) {
00184 dydx = -theCircle.n1()/theCircle.n2();
00185 }
00186
00187 if ( pt==0 && dydx==0. ) {
00188 validStateAtVertex=false;
00189 return atVertex;
00190 }
00191 px = pt/sqrt(1. + dydx*dydx);
00192 py = px*dydx;
00193
00194
00195 if (px*(pMid.x() - v.x()) + py*(pMid.y() - v.y()) < 0.) {
00196 px *= -1.;
00197 py *= -1.;
00198 }
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 FastLine flfit(theOuterHit, theMiddleHit);
00209
00210 double z_0 = 0;
00211 if (flfit.n2() !=0 && !std::isnan( flfit.c()) && !std::isnan(flfit.n2()) ) {
00212 z_0 = -flfit.c()/flfit.n2();
00213
00214 double dzdr = -flfit.n1()/flfit.n2();
00215 double pz = pt*dzdr;
00216
00217 TrackCharge q = 1;
00218
00219 AlgebraicSymMatrix66 C = AlgebraicMatrixID();
00220
00221 atVertex = FTS(GlobalTrajectoryParameters(GlobalPoint(v.x(), v.y(), z_0),
00222 GlobalVector(px, py, pz),
00223 q,
00224 mField),
00225 CartesianTrajectoryError(C));
00226
00227
00228 if ( atVertex.transverseCurvature() == -0 ) {
00229 return atVertex;
00230 } else {
00231 validStateAtVertex=true;
00232 return atVertex;
00233 }
00234
00235 } else {
00236
00237
00238 return atVertex;
00239
00240 }
00241
00242 }