00001 #include "RecoLocalTracker/SiStripRecHitConverter/interface/StripCPEfromTrackAngle.h"
00002 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00004
00005
00006 StripClusterParameterEstimator::LocalValues StripCPEfromTrackAngle::localParameters( const SiStripCluster & cl,const LocalTrajectoryParameters & ltp)const{
00007
00008
00009
00010
00011 StripCPE::Param const & p = param(DetId(cl.geographicalId()));
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 LocalPoint middlepoint = ltp.position();
00033 LocalVector trackDir = ltp.momentum()/ltp.momentum().mag();
00034 LocalPoint position = p.topology->localPosition(cl.barycenter());
00035
00036
00037
00038 if(trackDir.z()*p.drift.z() > 0.) trackDir *= -1.;
00039
00040
00041 if(trackDir.z() !=0.) {
00042 trackDir *= fabs(p.thickness/trackDir.z());
00043 } else {
00044 trackDir *= p.maxLength/trackDir.mag();
00045 }
00046
00047
00048
00049 if(p.drift.z() == 0.) {
00050
00051 edm::LogError("StripCPE") <<"No drift towards anodes !!!";
00052 LocalError eresult = p.topology->localError(cl.barycenter(),1/12.);
00053
00054 return std::make_pair(position-p.drift*(p.thickness/2),eresult);
00055 }
00056
00057
00058
00059
00060
00061
00062 LocalVector middleOfProjection = 0.5*(trackDir + p.drift);
00063
00064 LocalPoint middlePointOnStrips = middlepoint + 0.5*p.drift;
00065
00066 LocalPoint p1 = LocalPoint(middlePointOnStrips.x() + middleOfProjection.x()
00067 ,middlePointOnStrips.y() + middleOfProjection.y());
00068 LocalPoint p2 = LocalPoint(middlePointOnStrips.x() - middleOfProjection.x()
00069 ,middlePointOnStrips.y() - middleOfProjection.y());
00070
00071 MeasurementPoint m1 = p.topology->measurementPosition(p1);
00072 MeasurementPoint m2 = p.topology->measurementPosition(p2);
00073 float u1 = m1.x();
00074 float u2 = m2.x();
00075 float uerr2;
00076 float uProj = std::min( float(fabs( u1 - u2)), float(p.nstrips));
00077 if((cl.amplitudes().size() - (uProj+2.5)) > 1)uerr2=cl.amplitudes().size() * cl.amplitudes().size() * (1./12.);
00078 else{
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 const float P1=-0.339;
00090 const float P2=0.90;
00091 const float P3=0.279;
00092
00093 float uerr=P1*uProj*exp(-uProj*P2)+P3;
00094 uerr2=uerr*uerr;
00095 }
00096
00097 MeasurementError merror=MeasurementError( uerr2, 0., 1./12.);
00098 LocalPoint result=LocalPoint(position.x()-0.5*p.drift.x(),position.y()-0.5*p.drift.y(),0);
00099 MeasurementPoint mpoint=p.topology->measurementPosition(result);
00100 LocalError eresult=p.topology->localError(mpoint,merror);
00101 return std::make_pair(result,eresult);
00102 }
00103
00104