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 && !isnan( flfit.c()) && !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
00172
00173
00174 GlobalPoint pMid(theMiddleHit);
00175 GlobalPoint v(theVertex);
00176
00177 double dydx = 0.;
00178 double pt = 0., px = 0., py = 0.;
00179
00180 if(fabs(theCircle.n1()) > 0. || fabs(theCircle.n2()) > 0.)
00181 pt = 1.e+4;
00182 if(fabs(theCircle.n2()) > 0.) {
00183 dydx = -theCircle.n1()/theCircle.n2();
00184 }
00185 px = pt/sqrt(1. + dydx*dydx);
00186 py = px*dydx;
00187
00188 if (px*(pMid.x() - v.x()) + py*(pMid.y() - v.y()) < 0.) {
00189 px *= -1.;
00190 py *= -1.;
00191 }
00192
00193
00194
00195
00196
00197
00198
00199
00200 FastLine flfit(theOuterHit, theMiddleHit);
00201 FTS atVertex;
00202
00203 double z_0 = 0;
00204 if (flfit.n2() !=0 && !isnan( flfit.c()) && !isnan(flfit.n2()) ) {
00205 z_0 = -flfit.c()/flfit.n2();
00206
00207 double dzdr = -flfit.n1()/flfit.n2();
00208 double pz = pt*dzdr;
00209
00210 TrackCharge q = 1;
00211
00212 AlgebraicSymMatrix66 C = AlgebraicMatrixID();
00213
00214 FTS atVertex = FTS(GlobalTrajectoryParameters(GlobalPoint(v.x(), v.y(), z_0),
00215 GlobalVector(px, py, pz),
00216 q,
00217 mField),
00218 CartesianTrajectoryError(C));
00219
00220 validStateAtVertex=true;
00221
00222
00223 return atVertex;
00224
00225 } else {
00226
00227 return atVertex;
00228
00229 }
00230
00231 }