CMS 3D CMS Logo

StripCPEfromTrackAngle.cc

Go to the documentation of this file.
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   // get the det from the geometry
00009   //
00010 
00011   StripCPE::Param const & p = param(DetId(cl.geographicalId()));
00012   
00013 
00014  
00015   // ionisation length
00016    
00017   //float ionLen = std::min( trackDir.mag(), maxLength);
00018 
00019   //  const float par1=38.07;
00020   // const float par2=0.3184; 
00021   // const float par3=0.09828; 
00022   // const float P1 = par1 * p.thickness; 
00023   // const float P2 = par2; 
00024   // const float P3 = par3;
00025 
00026 
00027   //  drift*=(thickness/2);
00028 
00029   //calculate error form track angle
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     //  if(drift.z() == 0.||cl.amplitudes().size()==1) {
00051     edm::LogError("StripCPE") <<"No drift towards anodes !!!";
00052     LocalError eresult = p.topology->localError(cl.barycenter(),1/12.);
00053     //  LocalPoint  result=LocalPoint(position.x()-drift.x()/2,position.y()-drift.y()/2,0);
00054     return std::make_pair(position-p.drift*(p.thickness/2),eresult);
00055   }      
00056 
00057 
00058 
00059 
00060   // covered length along U
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     //   float par1=38.07;
00080     //   float par2=0.3184; 
00081     //   float par3=0.09828; 
00082     //   float P1 = par1 * thickness; 
00083     //   float P2 = par2; 
00084     //   float P3 = par3;
00085     //   float uerr;
00086     
00087     //   uerr =(uProj-P1)*(uProj-P1)*(P2-P3)/(P1*P1)+P3;
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 

Generated on Tue Jun 9 17:44:01 2009 for CMSSW by  doxygen 1.5.4