00001
00005
00006
00007
00008
00009
00010
00011 #include "StHelixHelper.h"
00012 #include <stdio.h>
00013 #include <stdlib.h>
00014 #include <assert.h>
00015 #if ROOT_VERSION_CODE < 331013
00016 # include "TCL.h"
00017 #else
00018 # include "TCernLib.h"
00019 #endif
00020 #include "TMath.h"
00021 #include "TVirtualPad.h"
00022 #include "TView.h"
00023
00024 #include "StObject.h"
00025 #include "THelixTrack.h"
00026 #include "StPhysicalHelixD.hh"
00027
00031
00032 ClassImp(StHelixHelper)
00033 StHelixHelper::StHelixHelper(const StPhysicalHelix &helix
00034 ,const StPhysicalHelix &outerHelix, double length)
00035 :fLength(length)
00036 {
00037 fHelx[0]=new StPhysicalHelixD(helix);
00038 fHelx[1]=new StPhysicalHelixD(outerHelix);
00039 fTHlx[0]=0; fTHlx[1]=0;
00040 }
00041
00042
00043 StHelixHelper::StHelixHelper() : TObject(),fLength(-1)
00044 {
00045 fHelx[0] = fHelx[1] = 0;
00046 fTHlx[0] = fTHlx[1] = 0;
00047 }
00048
00049
00050 StHelixHelper::StHelixHelper(const StHelixHelper &helper) : TObject (helper)
00051 ,fLength(helper.fLength)
00052 {
00053 fHelx[0]=new StPhysicalHelixD(*helper.fHelx[0]);
00054 fHelx[1]=new StPhysicalHelixD(*helper.fHelx[1]);
00055
00056 fTHlx[0] = helper.fTHlx[0] ? new THelixTrack(*helper.fTHlx[0]) : 0;
00057 fTHlx[1] = helper.fTHlx[1] ? new THelixTrack(*helper.fTHlx[1]) : 0;
00058
00059 }
00060
00061
00062 StHelixHelper::~StHelixHelper()
00063 {
00064 delete fHelx[0];delete fHelx[1];
00065 delete fTHlx[0];delete fTHlx[1];
00066 }
00067
00068 float StHelixHelper::GetLength() const {return fLength;}
00069
00070 StPhysicalHelixD *StHelixHelper::GetHelix(int idx) const
00071 {
00072 return fHelx[idx];
00073 }
00074
00075 THelixTrack *StHelixHelper::MyHelix(THelixTrack *myHlx,const StHelixD *evHlx)
00076 {
00077 if (!myHlx) myHlx= new THelixTrack;
00078 double curv = evHlx->curvature();
00079 double phase = evHlx->phase();
00080 double dip = evHlx->dipAngle();
00081 int h = evHlx->h();
00082
00083 double myDir[3];
00084 myDir[0]= -sin(phase)*cos(dip);
00085 myDir[1]= cos(phase)*cos(dip);
00086 myDir[2]= sin(dip);
00087 if (h<0) {myDir[0]=-myDir[0]; myDir[1]=-myDir[1];}
00088 double myX[3];
00089 myX[0]= evHlx->x(0.);
00090 myX[1]= evHlx->y(0.);
00091 myX[2]= evHlx->z(0.);
00092
00093 myHlx->Set(myX,myDir,curv*h);
00094 return myHlx;
00095 }
00096
00097 THelixTrack *StHelixHelper::GetTHelix(int idx) const
00098 {
00099 StPhysicalHelixD *hlx = GetHelix(idx);
00100 fTHlx[idx] = StHelixHelper::MyHelix(fTHlx[idx],hlx);
00101 return fTHlx[idx];
00102 }
00103
00106
00107
00108 Float_t *StHelixHelper::GetPoints(int &npoints) const
00109 {
00110 static int ndebug=0; ndebug++;
00111 npoints=0;
00112 double len,len0,len1;
00113 len = GetLength();
00114 if (len <= 0.0001) {
00115
00116 return 0;
00117 }
00118
00119 GetHelix(0); GetHelix(1);
00120 for (int i=0;i<2;i++) {fTHlx[i] = StHelixHelper::MyHelix(fTHlx[i],fHelx[i]);}
00121
00122 len0 = fTHlx[0]->Step(fTHlx[1]->GetXYZ());
00123 double rho0 = fTHlx[0]->GetRho();
00124 double rho1 = fTHlx[1]->GetRho();
00125 double drho = (rho1-rho0)/(len0*fTHlx[0]->GetCos());
00126 fTHlx[0]->Set(rho0,drho);
00127 fTHlx[1]->Set(rho1,drho);
00128 fTHlx[1]->Backward();
00129 npoints = abs(int(len*fTHlx[0]->GetCos()*rho0*90))+2;
00130 double step = 1./(npoints-1);
00131 len0 = fTHlx[0]->Step(fTHlx[1]->GetXYZ());
00132 len1 = fTHlx[1]->Step(fTHlx[0]->GetXYZ());
00133 float *arr = new Float_t[npoints*3];
00134 double xyz[3][3];
00135 for (int i =0;i<npoints;i++)
00136 {
00137 double s0 = i*step;
00138 double s1 = 1.-s0;
00139 fTHlx[0]->Step(s0*len0,xyz[0]);
00140 fTHlx[1]->Step(s1*len1,xyz[1]);
00141 s0 = s0*s0*s0; s1 = s1*s1*s1;
00142 double tmp = s0+s1;
00143 s0 /=tmp; s1 /=tmp;
00144 TCL::vlinco(xyz[0],s1,xyz[1],s0,xyz[2],3);
00145 TCL::ucopy(xyz[2],arr+i*3,3);
00146 }
00147 return arr;
00148 }