00001
00002
00003
00005
00006
00007
00008
00009
00010
00012
00013
00014 #include "TFndEvdTrack.h"
00015 #include <Riostream.h>
00016
00017 ClassImp(TFndEvdTrack)
00018
00019
00020 TFndEvdTrack::TFndEvdTrack():
00021 fLine(),fHelix(),fHelixPoints(),
00022 fB(),fPID(),fMode((Int_t)E_FndTrack_None)
00023 {
00024
00025 Info("TFndEvdTrack","creating new dummy evd-track: nothing will happen...");
00026 }
00027
00028
00029 TFndEvdTrack::TFndEvdTrack(Double_t Bx,Double_t By,Double_t Bz):
00030 fLine(),fHelix(),fHelixPoints(),
00031 fB(),fPID(),fMode((Int_t)E_FndTrack_None)
00032 {
00033
00034 fB[0] = Bx;
00035 fB[1] = By;
00036 fB[2] = Bz;
00037
00038 }
00039
00040
00041 TFndEvdTrack::~TFndEvdTrack(){
00042
00043
00044
00045 delete fLine;
00046 delete fHelix;
00047 delete fHelixPoints;
00048 }
00049
00050
00051 void TFndEvdTrack::BuildLine(const Double_t &x,const Double_t &y,const Double_t &z,const Double_t &phi_d, const Double_t &lam_d,const Double_t &length){
00052
00053
00054
00055
00056
00057
00058
00059 if(fMode == (Int_t)E_FndTrack_Helix){
00060 Warning("InitLine","Can not build line: helix already defined");
00061 return;
00062 }
00063
00064 if(fLine) delete fLine;
00065 fLine = new TPolyLine3D(2);
00066
00067 Double_t theta_rad = TMath::DegToRad() * ( (Double_t)(90 -lam_d) );
00068
00069 fLine->SetNextPoint(x,y,z);
00070 Double_t xl = x + length * TMath::Sin(theta_rad) * TMath::Cos(TMath::DegToRad() * phi_d);
00071 Double_t yl = y + length * TMath::Sin(theta_rad) * TMath::Sin(TMath::DegToRad() * phi_d);
00072 Double_t zl = z + length * TMath::Cos(theta_rad);
00073
00074 fLine->SetNextPoint(xl,yl,zl);
00075 fMode = (Int_t)E_FndTrack_Line;
00076
00077 SetWidth(3);
00078 }
00079
00080
00081 void TFndEvdTrack::BuildLine(const Double_t &x,const Double_t &y,const Double_t &z,const Double_t &cx,const Double_t &cy,const Double_t &cz,const Double_t &length){
00082
00083
00084 Double_t theta_r = 0;
00085 Double_t phi_r = 0;
00086 RefSys_CosDir_To_Spheric(cx,cy,cz,theta_r,phi_r);
00087
00088 Double_t phi_d = (Double_t) (TMath::RadToDeg() * phi_r);
00089 Double_t lam_d = (Double_t) ( 90 - (TMath::RadToDeg() * theta_r) );
00090
00091 BuildLine(x,y,z,phi_d, lam_d,length);
00092
00093 }
00094
00095
00096 void TFndEvdTrack::BuildHelix(const Double_t &x,const Double_t &y,const Double_t &z,const Int_t &charge,const Double_t &rad, const Double_t &phi_d, const Double_t &lam_d, const Double_t &Length){
00097
00098
00099
00100
00101
00102
00103
00104 Double_t Bmod_sq = 0;
00105 for(Int_t i=0;i<3;i++) Bmod_sq += fB[i] * fB[i] ;
00106 if(Bmod_sq==0){
00107 Warning("BuildHelix","Null magnetic field: Must use a line instead of a helix");
00108 return;
00109 }
00110
00111 if(fMode == (Int_t)E_FndTrack_Line){
00112 Warning("InitHelix","Can not build helix: straight track already defined");
00113 return;
00114 }
00115
00116 InitHelix(charge,rad, lam_d);
00117 Double_t z_sig = (lam_d >=0 ) ? 1 : -1;
00118
00119 SetHelix(x,y,z,phi_d,z_sig);
00120 LoadHelixPoints(Length);
00121
00122 SetWidth(3);
00123 }
00124
00125
00126 void TFndEvdTrack::BuildHelix(const Double_t &x,const Double_t &y,const Double_t &z,const Int_t &charge,const Double_t &rad, const Double_t &cx,const Double_t &cy,const Double_t &cz, const Double_t &Length){
00127
00128
00129
00130
00131 Double_t theta_r = 0;
00132 Double_t phi_r = 0;
00133 RefSys_CosDir_To_Spheric(cx,cy,cz,theta_r,phi_r);
00134
00135 Double_t phi_d = (Double_t) (TMath::RadToDeg() * phi_r);
00136
00137
00138
00139 Double_t lam_d = (Double_t) ( 90 - (TMath::RadToDeg() * theta_r) );
00140
00141 BuildHelix(x,y,z,charge,rad, phi_d, lam_d, Length);
00142 }
00143
00144
00145 void TFndEvdTrack::InitHelix(const Int_t &charge,const Double_t &rad, const Double_t &lam_d){
00146
00147
00148 if(fHelix) delete fHelix;
00149 Double_t curv = 1/rad;
00150 Double_t lambda = TMath::DegToRad() * lam_d;
00151 Double_t zstep= TMath::Abs( TMath::TwoPi() * rad * TMath::Tan(lambda) );
00152
00153 fHelix = new TGeoHelix(curv, zstep, charge);
00154 fHelix->SetField(fB[0], fB[1], fB[2]);
00155
00156 fMode = (Int_t)E_FndTrack_Helix;
00157 }
00158
00159 void TFndEvdTrack::SetHelix(const Double_t &x,const Double_t &y,const Double_t &z, const Double_t &phi_d,const Double_t &z_sig){
00160
00161 if(!fHelix){
00162 Warning("SetHelix","Could not set helix parameters: helix not available");
00163 return;
00164 }
00165 Double_t phi = TMath::DegToRad() * phi_d;
00166 fHelix->InitPoint(x,y,z);
00167 fHelix->InitDirection(TMath::Cos(phi), TMath::Sin(phi), z_sig, kFALSE);
00168 }
00169
00170
00171 void TFndEvdTrack::LoadHelixPoints(const Double_t &MaxLength,const Double_t step,const Int_t N_max_points){
00172
00173 if(!fHelix){
00174 Warning("LoadHelixPoints","Could not load helix points: helix not available");
00175 return;
00176 }
00177
00178 delete fHelixPoints;
00179 fHelixPoints = new TPointSet3D(2000);
00180
00181 const Double_t* p = fHelix->GetCurrentPoint();
00182 Int_t N_all = 0;
00183 for(N_all=0; N_all<=N_max_points; N_all++) {
00184 fHelixPoints->SetNextPoint( p[0], p[1], p[2] );
00185 fHelix->Step(step);
00186 if(fHelix->GetStep() > MaxLength) break;
00187 }
00188
00189 fHelixPoints->SetMarkerColor(E_FndTrCol_Default);
00190
00191
00192 }
00193
00194
00195 void TFndEvdTrack::SetPID(const Int_t &pid){
00196
00197 fPID = pid;
00198
00199
00200
00201
00202 Int_t col;
00203 switch(fPID){
00204 case (Int_t)(FPh_PID_Electron) : col = E_FndTrCol_Elec; break;
00205 case (Int_t)(FPh_PID_Positron) : col = E_FndTrCol_Posit; break;
00206 case (Int_t)(FPh_PID_Kaon_min) : col = E_FndTrCol_KaonMin; break;
00207 case (Int_t)(FPh_PID_Kaon_plu) : col = E_FndTrCol_KaonPlu; break;
00208 case (Int_t)(FPh_PID_Muon_min) : col = E_FndTrCol_MuonMin; break;
00209 case (Int_t)(FPh_PID_Muon_plu) : col = E_FndTrCol_MuonPlu; break;
00210 case (Int_t)(FPh_PID_Pi_min) : col = E_FndTrCol_PiMin; break;
00211 case (Int_t)(FPh_PID_Pi_plu) : col = E_FndTrCol_PiPlu; break;
00212 case (Int_t)(FPh_PID_Proton) : col = E_FndTrCol_Prot; break;
00213 case (Int_t)(FPh_PID_Neutron) : col = E_FndTrCol_Neut; break;
00214 case (Int_t)(FPh_PID_Gamma) : col = E_FndTrCol_Phot; break;
00215 default: col = (Int_t)E_FndTrCol_Default; break;
00216
00217 }
00218 SetColor(col);
00219
00220 }
00221
00222
00223 void TFndEvdTrack::SetColor(const Int_t &col){
00224
00225
00226 if(fHelixPoints) fHelixPoints->SetMarkerColor(col);
00227 if(fLine) fLine->SetLineColor(col);
00228
00229 }
00230
00231 void TFndEvdTrack::SetWidth(const Double_t &w){
00232
00233 if(fHelixPoints){
00234 fHelixPoints->SetMarkerStyle(4);
00235 fHelixPoints->SetMarkerSize(w/8);
00236 }
00237 if(fLine) fLine->SetLineWidth((Width_t)w);
00238 }
00239
00240
00241 TObject *TFndEvdTrack::GetDrawable(){
00242
00243
00244
00245 switch(fMode){
00246 case (Int_t)E_FndTrack_Line : return fLine;
00247 case (Int_t)E_FndTrack_Helix: return fHelixPoints;
00248 default: return 0;
00249 }
00250
00251 }
00252
00253
00254 void TFndEvdTrack::DrawTrack(Option_t *option){
00255
00256 if(GetDrawable()) GetDrawable()->Draw(option);
00257 }