00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <iomanip>
00031 #include <cmath>
00032 #include "RecoTracker/RoadSearchHelixMaker/interface/DcxHel.hh"
00033 #include "RecoTracker/RoadSearchHelixMaker/interface/DcxHit.hh"
00034
00035 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00036
00037 using std::cout;
00038 using std::endl;
00039 using std::ostream;
00040
00041 DcxHit::DcxHit(float sx, float sy, float sz, float wx, float wy, float wz,
00042 float c0, float cresol)
00043 :_wx(wx),_wy(wy),_wz(wz),_c0(c0),_cresol(cresol)
00044 {
00045
00046 _layernumber=0;
00047 if (_wz<0.0){_wx=-_wx;_wy=-_wy;_wz=-_wz;}
00048 _s = false; if (_wz<0.9975)_s=true;
00049 if (_s){
00050 double rad=sqrt(sx*sx+sy*sy);
00051 if ((20.0<rad)&&(rad<30.0))_layernumber=2;
00052 if ((30.0<rad)&&(rad<38.0))_layernumber=4;
00053 if ((58.0<rad)&&(rad<66.0))_layernumber=10;
00054 if ((66.0<rad)&&(rad<74.0))_layernumber=12;
00055
00056
00057 _x = sx-sz*_wx/_wz; _y = sy-sz*_wy/_wz;
00058 }else{
00059 _x = sx; _y = sy;
00060 double rad=sqrt(_x*_x+_y*_y);
00061 if ((20.0<rad)&&(rad<30.0))_layernumber=1;
00062 if ((30.0<rad)&&(rad<38.0))_layernumber=3;
00063 if ((38.0<rad)&&(rad<46.0))_layernumber=5;
00064 if ((46.0<rad)&&(rad<58.0))_layernumber=7;
00065 if ((58.0<rad)&&(rad<66.0))_layernumber=9;
00066 if ((66.0<rad)&&(rad<74.0))_layernumber=11;
00067 if ((74.0<rad)&&(rad<83.0))_layernumber=13;
00068 if ((83.0<rad)&&(rad<92.0))_layernumber=15;
00069 if ((92.0<rad)&&(rad<100.0))_layernumber=17;
00070 if ((100.0<rad)&&(rad<120.0))_layernumber=19;
00071
00072 }
00073 _wirenumber=0;
00074 _superlayer=1+(_layernumber-1)/4;
00075 _t=0.0;
00076 _p = 0.0;
00077 double deltaz = 0.0;
00078 double pw=atan2(_y,_x);
00079 _pw=pw;
00080
00081
00082
00083 _x -= deltaz*_wx/_wz; _y -= deltaz*_wy/_wz;
00084 _sp = sin(_p); _cp = cos(_p);
00085 _d=d();
00086 _consterr = 1;
00087 _e = _cresol;
00088
00089 _v=0.0018;
00090
00091 _xpos = _x - _d*_sp; _ypos = _y + _d*_cp;
00092 _xneg = _x + _d*_sp; _yneg = _y - _d*_cp;
00093 usedonhel=0;
00094 }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 void
00110 DcxHit::process()
00111 {
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 _consterr = 1;
00132 _e = _cresol;
00133
00134 _v=0.0018;
00135
00136
00137
00138 usedonhel=0;
00139 }
00140
00141
00142 DcxHit::~DcxHit( )
00143 {
00144 ;
00145 }
00146
00147 float
00148 DcxHit::d(DcxHel &hel)const
00149 {
00150 hel.Doca(*this);
00151 return d(hel.Doca_Zh(),hel.Doca_Tof(),hel.T0(),
00152 hel.Doca_Wamb(),hel.Doca_Eang());
00153 }
00154
00155 float
00156 DcxHit::pull(DcxHel &hel)const
00157 {
00158
00159
00160
00161 return residual(hel)/e();
00162 }
00163
00164 float
00165 DcxHit::residual(DcxHel &hel)const
00166 {
00167 float doca=hel.Doca(*this);
00168 if(hel.Mode() == 0)doca=fabs(doca);
00169
00170 return d(hel.Doca_Zh(),hel.Doca_Tof(),hel.T0(),
00171 hel.Doca_Wamb(),hel.Doca_Eang())-doca;
00172 }
00173
00174 std::vector<float>
00175 DcxHit::derivatives(DcxHel &hel)const
00176 {
00177 std::vector<float> deriv=hel.derivatives(*this);
00178 float dtemp=d(hel.Doca_Zh(),hel.Doca_Tof(),hel.T0(),
00179 hel.Doca_Wamb(),hel.Doca_Eang());
00180 deriv[0]=dtemp-deriv[0];
00181
00182 float ewire=e(dtemp);
00183 for(unsigned int i=0; i<deriv.size(); i++) {deriv[i]/=ewire;}
00184 return deriv;
00185 }
00186
00187 void
00188 DcxHit::print(ostream &o,int i)const
00189 {
00190 o << " Digi # " << i
00191 << " Layer # " << Layer()
00192 << " SuperLayer # " << SuperLayer()
00193 << " Wire # " << WireNo()
00194
00195
00196 << " Drift time (ns) " << t();
00197 }