Go to the documentation of this file.00001 #include "DQM/SiStripCommissioningSources/plugins/tracking/SiStripFineDelayTOF.h"
00002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00003 #include <DataFormats/TrackReco/interface/Track.h>
00004 #include <iostream>
00005 #include "TVector3.h"
00006 #include "TMath.h"
00007
00008
00009
00010 double SiStripFineDelayTOF::timeOfFlight(bool cosmics, bool field, double* trackParameters, double* hit, double* phit, bool onDisk)
00011 {
00012
00013
00014 if(cosmics && !field) {
00015 return timeOfFlightCosmic(hit,phit);
00016 }
00017
00018 else if(cosmics && field) {
00019 return timeOfFlightCosmicB(trackParameters,hit,phit,onDisk);
00020 }
00021
00022 else if(!cosmics && !field) {
00023 return timeOfFlightBeam(hit,phit);
00024 }
00025
00026 else {
00027 return timeOfFlightBeamB(trackParameters,hit,phit,onDisk);
00028 }
00029 }
00030
00031 double SiStripFineDelayTOF::timeOfFlightCosmic(double* hit, double* phit)
00032 {
00033
00034 const double c = 30;
00035 #ifndef TIF_COSMIC_SETUP
00036 const double Rmu = 385;
00037 const double zmu = 560;
00038
00039 TVector3 r0(hit[0],hit[1],hit[2]);
00040 TVector3 pr(phit[0],phit[1],phit[2]);
00041 TVector2 r0_xy = r0.XYvector();
00042 TVector2 pr_xy = pr.Unit().XYvector();
00043 double t_barrel = ((r0_xy*pr_xy)+sqrt( (r0_xy*pr_xy)*(r0_xy*pr_xy) - r0_xy.Mod2() + Rmu*Rmu ))/c*pr.Mag()/pr.Perp();
00044
00045 double t_endcap = fabs(((phit[2]/fabs(phit[2])*zmu)+hit[2])/c*pr.Mag()/pr.Pz());
00046
00047 return t_barrel<t_endcap ? t_barrel : t_endcap;
00048 #else
00049 const double y_trigger = 100;
00050 double p = sqrt(phit[0]*phit[0]+phit[1]*phit[1]+phit[2]*phit[2]);
00051
00052
00053
00054 return fabs((y_trigger-hit[1])*(p/phit[1])/c);
00055 #endif
00056 }
00057
00058 double SiStripFineDelayTOF::timeOfFlightCosmicB(double* trackParameters, double* hit, double* phit, bool onDisk)
00059 {
00060
00061 const double Rmu = 385;
00062 const double zmu = 560;
00063 const double c = 30;
00064
00065 double& kappa = trackParameters[0];
00066 double& theta = trackParameters[1];
00067 double& phi_0 = trackParameters[2];
00068 double& d_0 = trackParameters[3];
00069 double& z_0 = trackParameters[4];
00070 double invkappa = 1/kappa;
00071
00072
00073 double phi = getPhi(trackParameters,hit,onDisk) - phi_0;
00074
00075
00076 double phi_mu_b = (kappa>0 ? -1 : 1 ) * acos((Rmu*Rmu-d_0*d_0-2*invkappa*invkappa+2*invkappa*d_0)/(2*invkappa*d_0-2*invkappa*invkappa));
00077 double phi_mu_e = kappa*tan(theta)*((phit[2]<0 ? 1 : -1)*zmu-z_0);
00078
00079 double t_barrel = fabs(invkappa/(c*sin(theta))*(phi-phi_mu_b));
00080
00081 double t_endcap = fabs(invkappa/(c*sin(theta))*(phi-phi_mu_e));
00082
00083 return t_barrel<t_endcap ? t_barrel : t_endcap;
00084 }
00085
00086 double SiStripFineDelayTOF::timeOfFlightBeam(double* hit, double*)
00087 {
00088
00089 const double c = 30;
00090 TVector3 r0(hit[0],hit[1],hit[2]);
00091 return r0.Mag()/c;
00092 }
00093
00094 double SiStripFineDelayTOF::timeOfFlightBeamB(double* trackParameters, double* hit, double* phit, bool onDisk)
00095 {
00096
00097 const double c = 30;
00098
00099 double& theta = trackParameters[1];
00100
00101 return onDisk? fabs(hit[2]/(c*cos(theta))) : fabs(sqrt(hit[0]*hit[0]+hit[1]*hit[1])/(c*sin(theta)));
00102 }
00103
00104 double SiStripFineDelayTOF::x(double* trackParameters, double phi)
00105 {
00106 return trackParameters[3]*sin(trackParameters[2]) + (1/trackParameters[0])*(sin(phi)-sin(trackParameters[2]));
00107 }
00108
00109 double SiStripFineDelayTOF::y(double* trackParameters, double phi)
00110 {
00111 return -trackParameters[3]*cos(trackParameters[2]) - (1/trackParameters[0])*(cos(phi)-cos(trackParameters[2]));
00112 }
00113
00114 double SiStripFineDelayTOF::z(double* trackParameters, double phi)
00115 {
00116 return trackParameters[4] + (phi-trackParameters[2])/(trackParameters[0]*tan(trackParameters[1]));
00117 }
00118
00119 double SiStripFineDelayTOF::getPhi(double* trackParameters, double* hit, bool onDisk)
00120 {
00121 if(onDisk)
00122 return trackParameters[2] + trackParameters[0]*tan(trackParameters[1])*(hit[2]-trackParameters[4]);
00123 else
00124 {
00125 double phi =0;
00126 if(trackParameters[2]>-2.35 && trackParameters[2]<-0.78) {
00127
00128 phi = acos(-trackParameters[0]*(hit[1]-(trackParameters[3]-1/trackParameters[0])*(-cos(trackParameters[2]))));
00129
00130 if(fabs(x(trackParameters,phi)-hit[0])>fabs(x(trackParameters,-phi)-hit[0])) phi *= -1.;
00131 } else {
00132
00133 phi = asin(trackParameters[0]*(hit[0]-(trackParameters[3]-1/trackParameters[0])*sin(trackParameters[2])));
00134
00135 if((fabs(y(trackParameters,phi)-hit[1])>fabs(y(trackParameters,TMath::Pi()-phi)-hit[1])))
00136 phi = phi>0 ? TMath::Pi()-phi: -TMath::Pi()-phi;
00137 }
00138 return phi;
00139 }
00140 return 0.;
00141 }
00142
00143 void SiStripFineDelayTOF::trackParameters(const reco::Track& tk,double* trackParameters)
00144 {
00145 math::XYZPoint position = tk.outerPosition();
00146 math::XYZVector momentum = tk.outerMomentum();
00147 LogDebug("trackParameters") << "outer position: " << position.x() << " " << position.y() << " " << position.z();
00148 LogDebug("trackParameters") << "outer momentum: " << momentum.x() << " " << momentum.y() << " " << momentum.z();
00149 math::XYZVector fieldDirection(0,0,1);
00150
00151 math::XYZVector radius = momentum.Cross(fieldDirection).Unit();
00152 position -= radius / trackParameters[0];
00153 LogDebug("trackParameters") << "center of curvature: " << position.x() << " " << position.y() << " " << position.z();
00154
00155 trackParameters[3] = position.rho() - fabs(1/trackParameters[0]);
00156 if(trackParameters[0]>0) trackParameters[3] *= -1.;
00157
00158 double phi_out = trackParameters[2];
00159 double phi_0 = position.phi() - TMath::Pi()/2;
00160 if(trackParameters[0]<0) phi_0 -= TMath::Pi();
00161 if(phi_0<-2*TMath::Pi()) phi_0 += 2*TMath::Pi();
00162 if(phi_0>2*TMath::Pi()) phi_0 -= 2*TMath::Pi();
00163 if(phi_0 > 0) phi_0 -= 2*TMath::Pi();
00164 LogDebug("trackParameters") << "phi_0: " << phi_0;
00165 trackParameters[2] = phi_0;
00166
00167 trackParameters[4] = tk.outerPosition().z() - (phi_out-phi_0)/TMath::Tan(trackParameters[1])/trackParameters[0];
00168 LogDebug("trackParameters") << "z_0: " << tk.outerPosition().z() << " " << trackParameters[4] << " " << tk.innerPosition().z();
00169 }
00170