00001 #include "RecoHI/HiMuonAlgos/interface/FastMuPropagator.h"
00002 #include "CLHEP/Units/GlobalPhysicalConstants.h"
00003 #include "CLHEP/Vector/ThreeVector.h"
00004 #include <CLHEP/Vector/LorentzVector.h>
00005 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00006 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00007 #include "DataFormats/GeometrySurface/interface/Cylinder.h"
00008 #include "DataFormats/GeometrySurface/interface/Surface.h"
00009 #include "DataFormats/GeometrySurface/interface/Plane.h"
00010
00011 #include <cmath>
00012 #include <stdlib.h>
00013 #include <string>
00014 #include <iostream>
00015 #include <vector>
00016
00017
00018
00019 using namespace std;
00020 namespace cms {
00021 TrajectoryStateOnSurface
00022 FastMuPropagator::propagate(const FreeTrajectoryState& fts,
00023 const Cylinder& boundcyl) const
00024 {
00025 TrajectoryStateOnSurface badtsos;
00026
00027 if(!checkfts(fts)) return badtsos;
00028
00029 #ifdef PROPAGATOR_DB
00030 cout<<"FastMuPropagator::propagate::Start propagation in barrel::zvert "<<theFmpConst->zvert<<endl;
00031 #endif
00032
00033
00034
00035 int charge;
00036
00037 int imin0, imax0;
00038 double ptmax,ptmin,pt,phi,theta,z,pl;
00039 double dfcalc,phnext,bound;
00040 float ptboun=theFmpConst->ptboun;
00041 float step=theFmpConst->step;
00042
00043 GlobalVector moment=fts.parameters().momentum();
00044 GlobalPoint posit=fts.parameters().position();
00045 pt=moment.perp();
00046
00047
00048 double zfts=fts.parameters().position().z()-theFmpConst->zvert;
00049 double rfts=fts.parameters().position().perp();
00050 theta = atan2(rfts,zfts);
00051
00052 #ifdef PROPAGATOR_DB
00053 cout<<"FastMuPropagator::propagate::Start propagation in barrel::theta old, new "<<moment.theta()<<" "<<theta<<endl;
00054 #endif
00055
00056 phi=posit.phi();
00057 ptmax=pt+fts.curvilinearError().matrix()(1,1);
00058 ptmin=pt-fts.curvilinearError().matrix()(1,1);
00059 bound=boundcyl.radius();
00060 charge=fts.parameters().charge();
00061
00062 imax0=(int)((ptmax-ptboun)/step)+1;
00063 imin0=(int)((ptmin-ptboun)/step)+1;
00064 #ifdef PROPAGATOR_DB
00065 cout<<"FastMuPropagator::Look ptboun,step,imin0,imax0="<<ptboun<<" "<<step<<
00066 " "<<imin0<<" "<<imax0<<endl;
00067 cout<<"FastMuPropagator::Parameters (pt,theta,phi,ptmax,ptmin,bound)="<<pt<<" "
00068 <<theta<<" "<<phi<<" "<<ptmax<<" "<<ptmin<<" "<<bound<<endl;
00069 #endif
00070 if(imax0 > 1){
00071 if(imin0<1) imin0=1;
00072
00073
00074
00075
00076 #ifdef PROPAGATOR_DB
00077 cout<<"FastMuPropagator::New parameters="<<theFmpConst->newparam[0]<<endl;
00078 cout<<"FastMuPropagator::New parameters for pt>40="<<
00079 theFmpConst->newparamgt40[0]<<endl;
00080 #endif
00081
00082 if(pt<40.) {
00083 dfcalc=charge/(theFmpConst->newparam[0]+theFmpConst->newparam[1]*pt
00084 +theFmpConst->newparam[2]*pt*pt);
00085 }else{
00086 dfcalc=charge/(theFmpConst->newparamgt40[0]+
00087 theFmpConst->newparamgt40[1]*pt+theFmpConst->newparamgt40[2]*pt*pt);
00088 }
00089
00090
00091
00092 if (abs(dfcalc) > 0.6 ) dfcalc = charge*0.6;
00093
00094 phnext=dfcalc+phi;
00095 if(phnext>=twopi) phnext=phnext-twopi;
00096 if(phnext <0.) phnext=twopi+phnext;
00097 #ifdef PROPAGATOR_DB
00098 cout<<"FastMuPropagator::Phi in Muon Chamb="<<phi<<endl;
00099 cout<<"FastMuPropagator::Phnext determined="<<phnext<<" dfcalc="<<dfcalc<<endl;
00100 #endif
00101
00102 if(abs(theta-pi/2.)>0.00001){
00103 z=bound/tan(theta)+theFmpConst->zvert;
00104 if(fabs(z)>140) {
00105
00106
00107
00108
00109 }
00110 }else{
00111 z=0.;
00112 }
00113 #ifdef PROPAGATOR_DB
00114 cout<<"FastMuPropgator::Z coordinate="<<z<<"bound="<<bound<<"theta="<<theta<<" "<<
00115 abs(theta-pi/2.)<<endl;
00116 #endif
00117
00118 GlobalPoint aX(bound*cos(phnext),bound*sin(phnext),z);
00119 if(abs(theta-pi/2.)<0.00001){
00120 pl=0.;
00121 }else{
00122 pl=pt/tan(theta);
00123 }
00124
00125 double dfcalcmom=charge*theFmpConst->partrack*bound/pt;
00126 GlobalVector aP(pt*cos(phnext-dfcalcmom),pt*sin(phnext-dfcalcmom),pl);
00127
00128 #ifdef PROPAGATOR_DB
00129 cout<<"phnextmom="<<phnext-dfcalcmom<<endl;
00130 cout<<"Cylinder aP="<<aP<<endl;
00131 cout<<"Before propagation="<<pt*cos(phi)<< " "<<pt*sin(phi)<<" "<<pl<<endl;
00132 #endif
00133
00134
00135 GlobalTrajectoryParameters gtp(aX,aP,charge,field);
00136 AlgebraicSymMatrix55 m;
00137 int iwin;
00138 float awin,bwin,phbound;
00139
00140 if(pt>40.) {
00141 iwin=8;
00142 phbound=theFmpConst->phiwinb[7];
00143 }else{
00144 iwin=(int)(pt/theFmpConst->ptstep);
00145 awin=(theFmpConst->phiwinb[iwin+1]-theFmpConst->phiwinb[iwin])
00146 /(theFmpConst->ptwmax[iwin]-theFmpConst->ptwmin[iwin]);
00147 bwin=theFmpConst->phiwinb[iwin]-awin*theFmpConst->ptwmin[iwin];
00148 phbound=awin*pt+bwin;
00149
00150 }
00151 #ifdef PROPAGATOR_DB
00152 cout<<"Size of window in phi="<<phbound<<" "<<iwin<<endl;
00153 cout<<theFmpConst->phiwinb[iwin+1]<<" "<<theFmpConst->phiwinb[iwin]
00154 <<" "<<theFmpConst->ptwmin[iwin]<<
00155 " "<<theFmpConst->ptwmax[iwin]<<" awin="<<awin<<" bwin="<<bwin<<endl;
00156 #endif
00157 m(0,0)=(ptmax-ptmin)/6.; m(1,1)=phbound/theFmpConst->sigf;
00158 m(2,2)=theFmpConst->zwin/theFmpConst->sigz;
00159 m(3,3)=phbound/(2.*theFmpConst->sigf);m(4,4)=theFmpConst->zwin/(2.*theFmpConst->sigz);
00160
00161 CurvilinearTrajectoryError cte(m);
00162
00163 FreeTrajectoryState fts(gtp,cte);
00164 TrajectoryStateOnSurface tsos(gtp, CurvilinearTrajectoryError(m), boundcyl);
00165 return tsos;
00166
00167 }
00168 return badtsos;
00169 }
00170
00171
00172 TrajectoryStateOnSurface
00173 FastMuPropagator::propagate(const FreeTrajectoryState& fts,
00174 const Plane& boundplane) const
00175
00176 {
00177 TrajectoryStateOnSurface badtsos;
00178
00179 #ifdef PROPAGATOR_DB
00180 cout<<"FastMuPropagator::propagate::Start propagation in forward::zvert "<<theFmpConst->zvert<<endl;
00181 #endif
00182 if(!checkfts(fts)) return badtsos;
00183
00184
00185
00186 int imin0, imax0;
00187 double ptmax,ptmin,pt,phi,theta,z,r,pl,plmin,plmax;
00188 double dfcalc,phnext;
00189 TrackCharge charge;
00190 float ptboun=theFmpConst->ptboun;
00191 float step=theFmpConst->step;
00192
00193
00194 GlobalVector moment=fts.parameters().momentum();
00195 GlobalPoint posit=fts.parameters().position();
00196 pt=moment.perp();
00197
00198
00199 double zfts=fts.parameters().position().z()-theFmpConst->zvert;
00200 double rfts=fts.parameters().position().perp();
00201 theta = atan2(rfts,zfts);
00202
00203 #ifdef PROPAGATOR_DB
00204 cout<<"FastMuPropagator::propagate::Start propagation in forward::theta old, new "<<moment.theta()<<" "<<theta<<endl;
00205 #endif
00206
00207 phi=posit.phi();
00208 ptmax=pt+fts.curvilinearError().matrix()(1,1);
00209 ptmin=pt-fts.curvilinearError().matrix()(1,1);
00210 pl=pt/tan(theta);
00211 plmin=ptmin/tan(theta);
00212 plmax=ptmax/tan(theta);
00213 imax0=(int)((ptmax-ptboun)/step)+1;
00214 imin0=(int)((ptmin-ptboun)/step)+1;
00215 #ifdef PROPAGATOR_DB
00216 cout<<"FastMuPropagator::Look ptboun,step,imin0,imax0="<<ptboun<<" "<<step<<
00217 " "<<imin0<<" "<<imax0<<endl;
00218 cout<<"FastMuPropagator::Parameters (pt,theta,phi,ptmax,ptmin)="<<pt<<" "
00219 <<theta<<" "<<phi<<" "<<ptmax<<" "<<ptmin<<endl;
00220 #endif
00221 if(imax0 > 1){
00222 if(imin0<1) imin0=1;
00223
00224 z=boundplane.position().z();
00225 r=(z-theFmpConst->zvert)*tan(theta);
00226 charge=fts.parameters().charge();
00227
00228
00229
00230 dfcalc=theFmpConst->forwparam[0]+
00231 charge*theFmpConst->forwparam[1]/abs(pl);
00232 phnext=dfcalc+phi;
00233 if(phnext>=twopi) phnext=phnext-twopi;
00234 if(phnext <0.) phnext=twopi+phnext;
00235 #ifdef PROPAGATOR_DB
00236 cout<<"FastMuPropagator::Phi in Muon Chamb="<<phi<<endl;
00237 cout<<"FastMuPropagator::Phnext determined="<<phnext<<" dfcalc="<<dfcalc<<endl;
00238 #endif
00239
00240 int iwin;
00241 float awin,bwin,phbound;
00242 AlgebraicSymMatrix55 m;
00243
00244 if(pt>40.) {
00245 phbound=theFmpConst->phiwinf[7];
00246 }else{
00247 iwin=(int)(pt/theFmpConst->ptstep);
00248 awin=(theFmpConst->phiwinf[iwin+1]-theFmpConst->phiwinf[iwin])
00249 /(theFmpConst->ptwmax[iwin]-theFmpConst->ptwmin[iwin]);
00250 bwin=theFmpConst->phiwinf[iwin]-awin*theFmpConst->ptwmin[iwin];
00251 phbound=awin*pt+bwin;
00252 }
00253 #ifdef PROPAGATOR_DB
00254 cout<<"Forward::Size of window in phi="<<phbound<<endl;
00255 #endif
00256 m(0,0)=abs(plmax-plmin)/6.; m(1,1)=phbound/theFmpConst->sigf;
00257 m(2,2)=theFmpConst->zwin/theFmpConst->sigz;
00258 m(3,3)=phbound/(2.*theFmpConst->sigf);m(4,4)=theFmpConst->zwin/(2.*theFmpConst->sigz);
00259
00260 GlobalPoint aX(r*cos(phnext),r*sin(phnext),z);
00261
00262
00263 double dfcalcmom=charge*theFmpConst->partrack*abs(z)/abs(pl);
00264 GlobalVector aP(pt*cos(phnext-dfcalcmom),pt*sin(phnext-dfcalcmom),pl);
00265 #ifdef PROPAGATOR_DB
00266 cout<<"dfcalcmom="<<charge<<" "<<theFmpConst->partrack<<" "<<z<<" "<<pl<<" "<<phnext<<endl;
00267 cout<<"phnextmom="<<phnext-dfcalcmom<<endl;
00268
00269 cout<<"Plane aP="<<aP<<endl;
00270 cout<<"Before propagation="<<pt*cos(phi)<< " "<<pt*sin(phi)<<" "<<pl<<endl;
00271 #endif
00272
00273 GlobalTrajectoryParameters gtp(aX,aP,charge,field);
00274 CurvilinearTrajectoryError cte(m);
00275
00276 TrajectoryStateOnSurface tsos(gtp, CurvilinearTrajectoryError(m), boundplane);
00277 return tsos;
00278 }
00279
00280 return badtsos;
00281 }
00282 bool
00283 FastMuPropagator::checkfts(const FreeTrajectoryState& fts) const {
00284 bool check=true;
00285 double z=fts.parameters().position().z();
00286 double r=fts.parameters().position().perp();
00287 float mubarrelrad=theFmpConst->mubarrelrad;
00288 float muforwardrad=theFmpConst->muforwardrad;
00289 float muoffset=theFmpConst->muoffset;
00290 mubarrelrad=350.; muforwardrad=400.;
00291 #ifdef PROPAGATOR_DB
00292 cout<<"checkfts::r,z="<<r<<" "<<z<<" "<<check<<endl;
00293 #endif
00294 if(r<mubarrelrad-muoffset&&abs(z)<muforwardrad-muoffset){
00295 check=false;
00296 #ifdef PROPAGATOR_DB
00297 cout<<"checkfts::false="<<check<<endl;
00298 #endif
00299 }
00300 return check;
00301 }
00302 }