00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #include "HoughTrans.h"
00020 #include <iostream>
00021 #include <cmath>
00022
00023 HoughTrans::HoughTrans()
00024 {
00025 houghSpace = new TH2F("houghSpace","houghSpace",80,-2.0,2.0,80,-4.0,4.0);
00026 houghSpace->SetDirectory(0);
00027 vtxz = 0.0;
00028 }
00029
00030 HoughTrans::~HoughTrans(){
00031
00032 delete houghSpace; houghSpace=0;
00033
00034 }
00035
00036 HoughTrans::HoughTrans(Int_t numSamps,Float_t lowGrad,Float_t highGrad)
00037
00038 {
00039
00040 houghSpace = new TH2F("houghSpace","houghSpace",numSamps,lowGrad,highGrad,numSamps,-4.0,4.0);
00041 houghSpace->SetDirectory(0);
00042 vtxz = 0.0;
00043 }
00044
00045 HoughTrans::HoughTrans(Int_t numSamps,Float_t lowGrad,Float_t highGrad,Float_t lowIcept,Float_t highIcept)
00046
00047 {
00048 houghSpace = new TH2F("houghSpace","houghSpace",numSamps,lowGrad,highGrad,numSamps,lowIcept,highIcept);
00049 houghSpace->SetDirectory(0);
00050 vtxz = 0.0;
00051 }
00052
00053 void HoughTrans::SetVtxz(Float_t vertz)
00054 {
00055 vtxz=vertz;
00056 }
00057
00058 void HoughTrans::FillHough(NtpSRStrip* stp)
00059 {
00060 FillHough(stp->z,stp->tpos);
00061 }
00062
00063 void HoughTrans::FillHough(Float_t zPos, Float_t tPos)
00064 {
00065 if(zPos<vtxz) return;
00066 for(Int_t i=1;i<houghSpace->GetNbinsX();i++){
00067 Float_t gradient=(houghSpace->GetXaxis())->GetBinCenter(i);
00068 Float_t icept=tPos-gradient*(zPos-vtxz);
00069 if(icept>4.0 || icept<-4.0) continue;
00070 houghSpace->Fill(gradient,icept);
00071 }
00072 }
00073
00074 void HoughTrans::ResetHough()
00075 {
00076 houghSpace->Reset();
00077 }
00078
00079 void HoughTrans::DeleteHough()
00080 {
00081 delete houghSpace;
00082 }
00083
00084 Int_t HoughTrans::GetPeakHeight()
00085 {
00086 Int_t binmax = static_cast<Int_t>(houghSpace->GetBinContent(houghSpace->GetMaximumBin()));
00087 return binmax;
00088 }
00089
00090 Int_t HoughTrans::GetPeakGradBin()
00091 {
00092 Int_t x=0;
00093 Int_t y=0;
00094 Int_t z=0;
00095 houghSpace->GetMaximumBin(x,y,z);
00096 return x;
00097 }
00098
00099 Int_t HoughTrans::GetPeakIceptBin()
00100 {
00101 Int_t x=0;
00102 Int_t y=0;
00103 Int_t z=0;
00104 houghSpace->GetMaximumBin(x,y,z);
00105 return y;
00106 }
00107
00108 Float_t HoughTrans::GetPeakGradVal()
00109 {
00110 Int_t x=0;
00111 Int_t y=0;
00112 Int_t z=0;
00113 houghSpace->GetMaximumBin(x,y,z);
00114 return (houghSpace->GetXaxis())->GetBinCenter(x);
00115 }
00116
00117 Float_t HoughTrans::GetPeakIceptVal()
00118 {
00119 Int_t x=0;
00120 Int_t y=0;
00121 Int_t z=0;
00122 houghSpace->GetMaximumBin(x,y,z);
00123 return (houghSpace->GetYaxis())->GetBinCenter(y);
00124 }
00125
00126 Float_t HoughTrans::GetRms(Float_t frac)
00127 {
00128 Int_t bincount = 0;
00129 Int_t mRmsInput[6400];
00130 Int_t cRmsInput[6400];
00131 for(Int_t mBin=1;mBin<houghSpace->GetNbinsX();mBin++){
00132 for(Int_t cBin=1;cBin<houghSpace->GetNbinsY();cBin++){
00133 if(houghSpace->GetBinContent(mBin,cBin)>=frac*GetPeakHeight()){
00134 mRmsInput[bincount]=mBin;
00135 cRmsInput[bincount]=cBin;
00136 bincount++;
00137 }
00138 }
00139 }
00140 if(bincount==0) return 0;
00141 Float_t squaresum = 0;
00142 for (Int_t count=0;count<bincount;count++) {
00143 squaresum+=(pow(static_cast<Float_t>((mRmsInput[count]-GetPeakGradBin())),2)+pow(static_cast<Float_t>((cRmsInput[count]-GetPeakIceptBin())),2));
00144 }
00145 Float_t Rms = sqrt(squaresum/bincount);
00146 return Rms;
00147 }