00001
00002
00003
00004
00005
00006
00008 #include "CandTrackCam/CandTrackCamHandle.h"
00009 #include "MessageService/MsgService.h"
00010
00011 #include "RecoBase/CandStripHandle.h"
00012 #include "RecoBase/LinearFit.h"
00013 #include <cmath>
00014
00015 CVSID("$Id: CandTrackCamHandle.cxx,v 1.4 2007/01/15 20:02:43 rhatcher Exp $");
00016
00017
00019 CandTrackCamHandle::CandTrackCamHandle()
00020 {
00021 }
00023
00024
00026 CandTrackCamHandle::CandTrackCamHandle(const CandTrackCamHandle& handle)
00027 : CandTrackHandle(handle)
00028 {
00029 }
00031
00032
00034 CandTrackCamHandle::CandTrackCamHandle(CandTrackCam* candidate)
00035 : CandTrackHandle(candidate)
00036 {
00037 }
00039
00040
00042 CandTrackCamHandle::~CandTrackCamHandle()
00043 {
00044 }
00046
00047
00049 CandTrackCamHandle* CandTrackCamHandle::DupHandle() const
00050 {
00051 return new CandTrackCamHandle(*this);
00052 }
00054
00055
00056
00058 double CandTrackCamHandle::GetDirCos(int plane, int iuvz) const
00059 {
00060
00061 if (iuvz<0 || iuvz>=3) {
00062 MSG("TrackCam",Msg::kError) << "iuvz out of range\n";
00063 return 0.;
00064 }
00065
00066 TIter stripItr(GetDaughterIterator());
00067 double uzpos[1000],upos[1000],uph[1000];
00068 int uplane[1000];
00069 double vzpos[1000],vpos[1000],vph[1000];
00070 int vplane[1000];
00071 for (int i=0; i<1000; i++) {
00072 uzpos[i] = 0.;
00073 upos[i] = 0.;
00074 uph[i] = 0.;
00075 uplane[i] = 0;
00076 vzpos[i] = 0.;
00077 vpos[i] = 0.;
00078 vph[i] = 0.;
00079 vplane[i] = 0;
00080 }
00081 while (CandStripHandle *strip = dynamic_cast<CandStripHandle*>(stripItr())) {
00082 int iplane = strip->GetPlane();
00083 if (iplane<0 || iplane>=1000) {
00084 MSG("TrackCam",Msg::kError) << "plane out of range\n";
00085 }
00086 else {
00087 switch (strip->GetPlaneView()) {
00088 case PlaneView::kU:
00089 uph[iplane] += strip->GetCharge();
00090 upos[iplane] += strip->GetCharge()*strip->GetTPos();
00091 uzpos[iplane] = strip->GetZPos();
00092 uplane[iplane] = iplane;
00093 break;
00094 case PlaneView::kV:
00095 vph[iplane] += strip->GetCharge();
00096 vpos[iplane] += strip->GetCharge()*strip->GetTPos();
00097 vzpos[iplane] = strip->GetZPos();
00098 vplane[iplane] = iplane;
00099 break;
00100 default:
00101 break;
00102 }
00103 }
00104 }
00105 for (int i=0; i<1000; i++) {
00106 if (uph[i]>0) upos[i] /= uph[i];
00107 if (vph[i]>0) vpos[i] /= vph[i];
00108 }
00109 double uzfit[5],ufit[5];
00110 double uwfit[5] = {0.,0.,0.,0.,0.};
00111 double vzfit[5],vfit[5];
00112 double vwfit[5] = {0.,0.,0.,0.,0.};
00113 for (int i=0; i<5; i++) {
00114 uzfit[i] = ufit[i] = vzfit[i] = vfit[i] = 0.0;
00115 int dplane[2]={-1,-1};
00116 int jbest[2]={-1,-1};
00117 for (int j=0; j<1000; j++) {
00118 if (uph[j]>0. && (dplane[0]<0 || TMath::Abs(uplane[j]-plane)<dplane[0])) {
00119 dplane[0] = TMath::Abs(uplane[j]-plane);
00120 uzfit[i] = uzpos[j];
00121 ufit[i] = upos[j];
00122 uwfit[i] = 1.;
00123 jbest[0] = j;
00124 }
00125 if (vph[j]>0. && (dplane[1]<0 || TMath::Abs(vplane[j]-plane)<dplane[1])) {
00126 dplane[1] = TMath::Abs(vplane[j]-plane);
00127 vzfit[i] = vzpos[j];
00128 vfit[i] = vpos[j];
00129 vwfit[i] = 1.;
00130 jbest[1] = j;
00131 }
00132 }
00133 if (jbest[0]>=0) uph[jbest[0]] = 0.;
00134 if (jbest[1]>=0) vph[jbest[1]] = 0.;
00135 }
00136 double uparm[2],ueparm[2];
00137 double vparm[2],veparm[2];
00138 LinearFit::Weighted(5,uzfit,ufit,uwfit,uparm,ueparm);
00139 LinearFit::Weighted(5,vzfit,vfit,vwfit,vparm,veparm);
00140 double dudz = uparm[1];
00141 double dvdz = vparm[1];
00142 double ddz[3] = {uparm[1],vparm[1],1.};
00143
00144 return ddz[iuvz]/sqrt(1.+dudz*dudz+dvdz*dvdz);
00145 }
00147
00148
00150 double CandTrackCamHandle::GetDirCosU(int plane) const
00151 {
00152 return GetDirCos(plane,0);
00153 }
00155
00156
00158 double CandTrackCamHandle::GetDirCosV(int plane) const
00159 {
00160 return GetDirCos(plane,1);
00161 }
00163
00164
00166 double CandTrackCamHandle::GetDirCosZ(int plane) const
00167 {
00168 return GetDirCos(plane,2);
00169 }
00171
00172
00173 ClassImp(CandTrackCamHandle)