31 #include "FairTrackParP.h"
32 #include "FairRootManager.h"
35 #include "TMatrixTSym.h"
41 for (
int row = 0;
row < mat.GetNrows();
row++)
43 for (
int col = 0;
col < mat.GetNcols();
col++)
45 std::cout << mat[
row][
col] <<
" ";
47 std::cout << std::endl;
54 fn(3),fav(3), fc(0), fm(0), ft(0), fmError(0), ftError(0), fChi2(0), fcovPlane(4,4), fjacRXY(3,4), fcovRXY(3,3),
55 fVerbose(0), fFitDone(false), fSZFitDone(false), fErrorCalcDone(false), fweight(0),ftrefit(false),fVertexCut(0.5),
56 fStartAlpha(0), fStopAlpha(0)
62 fn(3),fav(3), fc(0), fm(0), ft(0), fmError(0), ftError(0), fChi2(0), fcovPlane(4,4), fjacRXY(3,4), fcovRXY(3,3),
63 fVerbose(0), fFitDone(false), fSZFitDone(false), fErrorCalcDone(false), fweight(0),ftrefit(false),fVertexCut(0.5),
64 fStartAlpha(0), fStopAlpha(0)
72 FairRootManager* ioman = FairRootManager::Instance();
73 std::set<FairLink> linksToHits = trackCand->GetLinks();
74 for (std::set<FairLink>::iterator iter = linksToHits.begin(); iter != linksToHits.end(); iter++)
76 PndRiemannHit riemannHit((FairHit*)ioman->GetCloneOfLinkData(*iter));
88 double mydip,
double){
91 fn[0] = x0_/y0_*
fn[1];
93 double fn2 = fn[2] * fn[2];
94 fc = fn2*4*R_*R_-1+fn2/(-4*fn[2]);
105 fHits.push_back(hit);
113 if (
fVerbose > 1) std::cout <<
"-I- PndRiemannTrack::addHit " <<
fHits.size() -1 <<
": " << hit.
x().X() <<
" " << hit.
x().Y() <<
" "
131 d2+=hit->
x().X()*
fn[0];
132 d2+=hit->
x().Y()*
fn[1];
133 d2+=hit->
x().Z()*
fn[2];
136 std::cout <<
"PndRiemannTrack::dist: c " <<
fc <<
" n: " <<
fn[0] <<
"/" <<
fn[1] <<
"/" <<
fn[2] <<
137 " hit: " << hit->
x().X() <<
"/" << hit->
x().Y() <<
"/" << hit->
x().Z() <<
" Dist: " << d2 << std::endl;
155 pos.Set(hit->
x().x(), hit->
x().y());
156 diff.Set(pos.X() - origin[0], pos.Y() - origin[1]);
158 return (diff.Mod() -
r());
164 for (
size_t i = 0;
i <
fHits.size();
i++){
166 sum += TMath::Power(distance /
fHits[i].sigmaXY(), 2);
175 TMatrixT<double> my_av(3,1);
187 if (
fVerbose > 1) std::cout <<
"fav: " <<
fav[0] <<
" " <<
fav[1] <<
" " <<
fav[2] << std::endl;
192 for(
int i=0;
i<nh;++
i){
199 TMatrixD dt(TMatrixD::kTransposed,d);
201 if (
fHits[
i].sigmaXY() != 0)
204 std::cout <<
"-E- PndRiemannTrack::refit sigmaXY() == 0" << std::endl;
209 sampleCov*=1./(double)nh;
211 std::cout <<
"-E- PndRiemannTrack::refit nh == 0" << std::endl;
215 if (
fVerbose > 1) std::cout <<
"sampleCov: " << std::endl;
218 TVectorD eigenValues(3);
219 TMatrixD eigenVec=sampleCov.EigenVectors(eigenValues);
231 double smallestDistance = -1;
233 TVectorD correctN(3);
236 for (
int i = 0;
i < 3;
i++){
238 fn=TMatrixDColumn(eigenVec,g);
240 if (
fVerbose > 1) std::cout <<
"eigenVec: " << std::endl;
243 if (
fVerbose > 1) std::cout <<
"eigenValues: ";
244 for (
int j = 0; j < 3; j++){
245 if (
fVerbose > 1) std::cout << eigenValues[j] <<
" ";
247 if (
fVerbose > 1) std::cout << std::endl;
250 if (
fn.Norm2Sqr() != 0)
255 if (smallestDistance < 0){
260 val = eigenValues[
i];
266 val = eigenValues[
i];
269 if (
fVerbose > 1) std::cout <<
"fn: " <<
fn[0] <<
" " <<
fn[1] <<
" " <<
fn[2] << std::endl;
270 if (
fVerbose > 1) std::cout <<
"fc: " <<
fc << std::endl;
272 TVectorD origin =
orig();
273 std::cout <<
"Origin: " << origin[0] <<
" " << origin[1] << std::endl;
275 if (
fVerbose > 1) std::cout <<
"r: " <<
r() << std::endl;
288 for (
int i = 0;
i < 3;
i++){
291 CovNorm += res * (val * eigenValues[
i]/TMath::Power(val-eigenValues[
i],2));
297 CovNorm *= TMath::Power(
fHits.size(),-1);
298 if (
fVerbose > 1) std::cout <<
"CovNorm: " << std::endl;
305 for (
size_t i = 0;
i <
fHits.size();
i++){
306 covAv[0][0] +=
fHits[
i].covX(0,0)/(TMath::Power(
fHits[
i].sigmaXY(),4));
307 covAv[1][1] +=
fHits[
i].covX(1,1)/(TMath::Power(
fHits[
i].sigmaXY(),4));
308 covAv[1][0] +=
fHits[
i].covX(1,0)/(TMath::Power(
fHits[
i].sigmaXY(),4));
310 /(TMath::Power(
fHits[
i].sigmaXY(),4));
312 /(TMath::Power(
fHits[
i].sigmaXY(),4));
316 /(TMath::Power(
fHits[
i].sigmaXY(),4));
318 covAv[0][1] = covAv[1][0];
319 covAv[0][2] = covAv[2][0];
320 covAv[1][2] = covAv[2][1];
322 covAv *= TMath::Power(
fweight,-2);
325 if (
fVerbose > 1) std::cout <<
"covAv: " << std::endl;
331 double nCrn = (
fn * (covAv *
fn));
332 double rCnr = (
fav * (CovNorm *
fav));
334 TMatrixD CnCr(CovNorm,TMatrixD::kMult,covAv);
336 for (
int i = 0;
i < CnCr.GetNcols();
i++){
337 trCnCr += CnCr[
i][
i];
339 if (
fVerbose > 1) std::cout <<
"nCrn: " << nCrn <<
" rCnr: " << rCnr <<
" trCnCr: " << trCnCr << std::endl;
340 double varc = nCrn + rCnr + trCnCr;
342 TVectorD corr_cn = CovNorm *
fav;
372 if (
fVerbose > 1) std::cout <<
"jacRXY: " << std::endl;
378 if (
fVerbose > 1) std::cout <<
"temp: " << temp.GetNrows() <<
"x" << temp.GetNcols() << std::endl;
380 if (
fVerbose > 1) std::cout <<
"temp: " << std::endl;
385 if (
fVerbose > 1) std::cout <<
"covPlane: " << std::endl;
388 if (
fVerbose > 1) std::cout <<
"covRXY: " << std::endl;
407 if(
fn[2]==0)
return o;
408 double den=TMath::Power((2 *
fn[2]),-1);
425 double nom = 1-
fn[2]*
fn[2]-4*
fc*
fn[2];
428 if (
fVerbose > 1) std::cout<<
"PndRiemannTrack::nom<0! set r=1E-4!"<<std::endl;
443 refit(withErrorCalc);
445 if (
fVerbose > 1) std::cout <<
"szFit() for " << num <<
" Points!" << std::endl;
451 for(
unsigned int i=0;
i<
num;++
i){
454 std::cout <<
"Point: " <<
i <<
": " <<
fHits[
i].hit()->GetEntryNr() <<
" ";
458 fHits[
i].calcPosOnTrk(
this);
466 TF1*
f = g.GetFunction(
"pol1");
468 ft = f->GetParameter(0);
469 fm = f->GetParameter(1);
472 fChi2 = f->GetChisquare()/f->GetNDF();
483 std::cout <<
"-W- PndRiemannTrack::calcSZ less than 2 points with z-Info: " << *
this << std::endl;
494 std::cout <<
"-W- PndRiemannTrack::calcSZ r == 0: " << *
this << std::endl;
503 double chiSquare = 0;
511 chiSquare += TMath::Power((
dist(actualHit)/
distError(actualHit)),2);
530 std::cout <<
"szChi2Fit(hit) for " << num + 1 <<
" Points!" << std::endl;
533 for (
unsigned int i = 0;
i <
num; ++
i) {
537 fHits[
i].calcPosOnTrk(
this);
540 std::cout <<
"Point: " << j <<
": ";
542 std::cout <<
fHits[
i].hit()->GetEntryNr() <<
" ";
543 std::cout <<
fHits[
i].s() <<
" " <<
fHits[
i].z() << std::endl;
550 std::cout <<
"Additional hit: ";
553 std::cout << hit->
s() <<
" " << hit->
z() << std::endl;
554 g.SetPoint(j, hit->
s(), hit->
z());
557 f = g.GetFunction(
"pol1");
561 std::cout <<
"t, m: " << f->GetParameter(0) <<
" +/- "
562 << f->GetParError(0) <<
" / " << f->GetParameter(1)
563 <<
" +/- " << f->GetParError(1) <<
"Chi2: "
564 << f->GetChisquare() << std::endl;
566 return f->GetChisquare() / f->GetNDF();
569 std::cout <<
"-W- PndRiemannTrack::calcSZChi2 r == 0: " << *
this << std::endl;
597 TVector2 k(firstHit->
x().X()-o[0],firstHit->
x().Y()-o[1]);
601 TVector2 Res2D(
r(), 0);
603 TVector2 rotated = Res2D.Rotate(start_phi + delta_phi);
605 TVector3 result(rotated.X() + o[0], rotated.Y() + o[1],
calcZPosByS(s));
612 const double SMALL = 1E-12;
615 if (
fVerbose > 1) std::cout <<
"-I- PndRiemannTrack::clacIntersection: less than 3 hits in track!" << std::endl;
619 TVector3 n1(
fn[0],
fn[1],
fn[2]);
620 TVectorD tempn = track.
n();
621 TVector3 n2(tempn[0], tempn[1], tempn[2]);
625 if(
fVerbose > 1) std::cout <<
"n1: " << n1.X() <<
" " << n1.Y() <<
" " << n1.Z() <<
" c1: " << c1 << std::endl;
626 if(
fVerbose > 1) std::cout <<
"n2: " << n2.X() <<
" " << n2.Y() <<
" " << n2.Z() <<
" c2: " << c2 << std::endl;
628 TVector3 lineNorm = n1.Cross(n2);
632 if (lineNorm.Mag() < SMALL)
635 if(
fVerbose > 1) std::cout <<
"n1 x n2: " << lineNorm.X() <<
"+/-" << dLineNorm.X() <<
" "
636 << lineNorm.Y() <<
"+/-" << dLineNorm.Y() <<
" "
637 << lineNorm.Z() <<
"+/-" << dLineNorm.Z() << std::endl;
639 double denom = n1[0]*n2[1]-n1[1]*n2[0];
640 double x0 = (n1[1]*c2-c1*n2[1])/denom;
641 double y0 = (c1*n2[0] - n1[0]*
c2)/denom;
642 TVector3 lineOffset(x0, y0, 0);
644 if(
fVerbose > 1) std::cout <<
"lineOffset: " << lineOffset.X() <<
"+/-" << dLineOffset.X() <<
" "
645 << lineOffset.Y() <<
"+/-" << dLineOffset.Y() << std::endl;
648 double denom2 = lineNorm[0]*lineNorm[0]+lineNorm[1]*lineNorm[1];
649 double p = (2*(lineNorm[0]*lineOffset[0]+lineNorm[1]*lineOffset[1]) - lineNorm[2])/denom2;
650 double q = (lineOffset[0]*lineOffset[0]+lineOffset[1]*lineOffset[1] - lineOffset[2])/denom2;
652 double rad = (p/2)*(p/2) - q;
655 std::cout <<
"PndRiemannTrack::calcIntersection: No match with parabola" << std::endl;
661 TVectorD dXY12 =
calcErrorXY1XY2(lineNorm, dLineNorm, lineOffset, dLineOffset);
664 std::cout <<
"l1: " << l1 <<
"+/-" << dXY12[4] <<
" l2: " << l2 <<
"+/-" << dXY12[5] << std::endl;
666 TVector3 inter1 = lineNorm * l1 + lineOffset;
667 TVector3 inter2 = lineNorm * l2 + lineOffset;
669 std::cout <<
"intersection parabola 1: " << inter1.X() <<
"+/-" << dXY12[0] <<
" " << inter1.Y() <<
"+/-" << dXY12[1] <<
" " << inter1.Z()<< std::endl;
670 std::cout <<
"intersection parabola 2: " << inter2.X() <<
"+/-" << dXY12[2] <<
" " << inter2.Y() <<
"+/-" << dXY12[3] <<
" " << inter2.Z()<< std::endl;
673 hit1.
setXYZ(inter1.X(), inter1.Y(), inter1.Z());
674 hit2.
setXYZ(inter2.X(), inter2.Y(), inter2.Z());
677 double s1 = hit1.
s();
678 TVector2 dummy1(inter1.X(), inter2.Y());
679 TVector2 dummy2(dXY12[0], dXY12[1]);
680 double dS1 =
calcErrorS(dummy1, dummy2,
this);
681 if (
fVerbose > 1) std::cout <<
"S1 for track1: " << s1 <<
"+/-" << dS1 << std::endl;
684 double s2 = hit1.
s();
685 double dS2 =
calcErrorS(dummy1, dummy2, &track);
686 if (
fVerbose > 1) std::cout <<
"S1 for track2: " << s2 <<
"+/-" << dS2 << std::endl;
694 vertex1.SetXYZ(inter1.X(),inter1.Y(),
calcZPosByS(s1));
695 vertex2.SetXYZ(inter1.X(),inter1.Y(),track.
calcZPosByS(s2));
698 std::cout <<
"vertex candidate1 for hit1: " << vertex1.X() <<
" " << vertex1.Y() <<
" " << vertex1.Z()<< std::endl;
699 std::cout <<
"vertex candidate2 for hit1: " << vertex2.X() <<
" " << vertex2.Y() <<
" " << vertex2.Z()<< std::endl;
702 if ((vertex1-vertex2).Mag() < VERTEX_CUT){
703 if (
fVerbose > -1) std::cout <<
"Vertex Found!" << std::endl;
710 double s1b = hit2.
s();
711 dummy1.Set(inter2.X(),inter2.Y());
712 dummy2.Set(dXY12[2],dXY12[3]);
713 double dS1b =
calcErrorS(dummy1, dummy2,
this);
714 if (
fVerbose > 1) std::cout <<
"S1b for track1: " << s1b <<
"+/-" << dS1b << std::endl;
717 double s2b = hit2.
s();
718 double dS2b =
calcErrorS(dummy1, dummy2, &track);
719 if (
fVerbose > 1) std::cout <<
"S1b for track2: " << s2b <<
"+/-" << dS2b << std::endl;
724 vertex1.SetXYZ(inter2.X(),inter2.Y(),
calcZPosByS(s1b));
725 vertex2.SetXYZ(inter2.X(),inter2.Y(),track.
calcZPosByS(s2b));
731 std::cout <<
"vertex candidate1 for hit2: " << vertex1.X() <<
" " << vertex1.Y() <<
" " << vertex1.Z()<< std::endl;
732 std::cout <<
"vertex candidate2 for hit2: " << vertex2.X() <<
" " << vertex2.Y() <<
" " << vertex2.Z()<< std::endl;
734 if ((vertex1-vertex2).Mag() < VERTEX_CUT){
735 if (
fVerbose > -1) std::cout <<
"Vertex Found!" << std::endl;
746 TVectorD n2=track.
n();
754 Double_t dLineNorm1 =
TMath::Sqrt(TMath::Power(dN1[1]*n2[2],2) + TMath::Power(n1[1]*dN2[2],2) +
755 TMath::Power(dN1[2]*n2[1],2) + TMath::Power(n1[2]*dN2[1],2));
757 Double_t dLineNorm2 =
TMath::Sqrt(TMath::Power(dN1[2]*n2[0],2) + TMath::Power(n1[2]*dN2[0],2) +
758 TMath::Power(dN1[0]*n2[2],2) + TMath::Power(n1[0]*dN2[2],2));
760 Double_t dLineNorm3 =
TMath::Sqrt(TMath::Power(dN1[0]*n2[1],2) + TMath::Power(n1[0]*dN2[1],2) +
761 TMath::Power(dN1[1]*n2[0],2) + TMath::Power(n1[1]*dN2[0],2));
763 return TVector3(dLineNorm1, dLineNorm2, dLineNorm3);
771 TVectorD n2=track.
n();
782 Double_t denom = n1[0]*n2[1] - n1[1]*n2[0];
786 Double_t qX = (n1[1]*c2-n2[1]*
c1)/(TMath::Power(denom,2));
787 Double_t qY = (n2[0]*c1-n1[0]*
c2)/(TMath::Power(denom,2));
790 TMath::Power(qX*n2[1]*dN1[0],2) + TMath::Power(qX*n1[1]*dN2[0],2) +
791 TMath::Power((c1/denom + qX*n2[0])*dN1[1],2) +
792 TMath::Power((c1/denom + qX*n1[0])*dN2[1],2));
795 TMath::Power(qX*n2[0]*dN1[1],2) + TMath::Power(qX*n1[0]*dN2[1],2) +
796 TMath::Power((c1/denom + qY*n2[1])*dN1[0],2) +
797 TMath::Power((c1/denom + qY*n1[1])*dN2[0],2));
799 return TVector3(dx, dy, 0);
805 const double SMALL = 1E-12;
806 Double_t denom = (TMath::Power(line[0],2) + TMath::Power(line[1],2));
807 Double_t p = (2*(offset[0]*line[0] + offset[1]*line[1]) - line[2]) / denom;
808 Double_t q = (TMath::Power(offset[0],2)+TMath::Power(offset[1],2) - offset[2]) / denom;
813 Double_t prod = (2*(offset[0]*line[0] + offset[1]*line[1]) - line[2]) / TMath::Power(denom,2);
816 if ((TMath::Power(p/2,2)-q) < SMALL)
821 Double_t dP =
TMath::Sqrt(TMath::Power(2*line[0]*dOffset[0]/denom,2) + TMath::Power(2*line[1]*dOffset[1]/denom,2) +
822 TMath::Power(dLine[2]/denom,2) +
823 TMath::Power((2*offset[0]/denom - 2*prod*line[0])*dLine(0),2) +
824 TMath::Power((2*offset[1]/denom - 2*prod*line[1])*dLine(1),2));
831 TMath::Power(2*offset[1]/denom*dOffset[1],2) +
832 TMath::Power(dOffset[2]/denom,2));
834 Double_t dS1 =
TMath::Sqrt(TMath::Power((-1/2 + p/(4*sqrterm)) * dP,2) + TMath::Power(1/(2*sqrterm)*dQ, 2));
835 Double_t dS2 =
TMath::Sqrt(TMath::Power((-1/2 - p/(4*sqrterm)) * dP,2) + TMath::Power(1/(2*sqrterm)*dQ, 2));
837 Double_t dX1 =
TMath::Sqrt(TMath::Power(dOffset[0],2) + TMath::Power(line[0]*dS1,2) + TMath::Power(dLine[0]*S1,2));
838 Double_t dY1 =
TMath::Sqrt(TMath::Power(dOffset[1],2) + TMath::Power(line[1]*dS1,2) + TMath::Power(dLine[1]*S1,2));
842 Double_t dX2 =
TMath::Sqrt(TMath::Power(dOffset[0],2) + TMath::Power(line[0]*dS2,2) + TMath::Power(dLine[0]*S2,2));
843 Double_t dY2 =
TMath::Sqrt(TMath::Power(dOffset[1],2) + TMath::Power(line[1]*dS2,2) + TMath::Power(dLine[1]*S2,2));
860 TVectorD o=track->
orig();
862 double dr = track->
dR();
865 assert(firstHit!=NULL);
866 TVector2 k(firstHit->
x().X()-o[0],firstHit->
x().Y()-o[1]);
867 TVector2 l(XY.X()-o[0],XY.Y()-o[1]);
869 double alpha=l.DeltaPhi(k);
870 double dAlpha =
TMath::Sqrt(TMath::Power(XY.X()*dXY.Y(),2) + TMath::Power(XY.Y()*dXY.X(),2))/(TMath::Power(XY.X(),2) + TMath::Power(XY.Y(),2));
872 double dS =
TMath::Sqrt(TMath::Power(dAlpha*R,2) + TMath::Power(alpha*dr,2));
882 assert(firstHit!=NULL);
883 TVector2 k(firstHit->
x().X()-o[0],firstHit->
x().Y()-o[1]);
893 TVector3 result(resX, resY, dZCoord);
895 if (
fVerbose > 1) std::cout<<
"PosBySError: s:" << dS <<
" Vector: " << result.x() <<
" " << result.y() <<
" " << result.z() << std::endl;
905 double hits=hit->
s();
906 double predz=hits*
fm+
ft;
907 return predz-hit->
z();
914 double hits=hit->
s();
932 TVectorD origin =
orig();
933 TVector2 myVector(myHit->
x().x() - origin[0], myHit->
x().y() - origin[1]);
934 return myVector.Phi();
938 for (
size_t i = 0;
i <
fHits.size();
i++){
939 fHits[
i].calcPosOnTrk(
this);
949 return cos(atan(
fm));
971 double result = 0.3 * B *
r() * 0.01;
972 if (
fVerbose > 0) std::cout <<
"Pt: " << result << std::endl;
979 double pl =
Pt(B) *
m();
984 if (nextHit->
z() - startHit->
z() > 0){
1008 TVectorD origin =
orig();
1024 TVector2 ptVec(0,pt);
1025 ptVec = ptVec.Rotate(phi);
1029 TVector2 difVec(myHit->
x().x() - myHitBefore->
x().x(), myHit->
x().y() - myHitBefore->
x().y());
1040 TVector2 difVec2(myHitAfter->
x().x() - myHit->
x().x(), myHitAfter->
x().y() - myHit->
x().y());
1042 Double_t length2 = ptVec * difVec2;
1048 result.SetXYZ(ptVec.X(), ptVec.Y(), pl);
1051 if (
fVerbose > 0) std::cout <<
"P-Vector for point " << i <<
" : " << result.X() <<
" " << result.Y() <<
" " << result.Z() << std::endl;
1060 TVector2 hitPos2D(hitPos.x(), hitPos.y());
1062 TVector2
pt(p.x(), p.y());
1063 TVectorD origin =
orig();
1064 TVector2 orig2(origin[0], origin[1]);
1068 TVector2 origRotated = orig2.Rotate(-
pt.Phi());
1072 if (origRotated.Y() < 0)
1084 TVector3 hitPosError;
1085 TVector3 momError(2, 2, 2);
1088 TVector3 origin(0, 0, 1);
1095 getHit(i)->
hit()->PositionError(hitPosError);
1096 FairTrackParP result(hitPos,
getPforHit(i, B), hitPosError, momError,
getCharge(B), origin, dj, dk);
1101 return FairTrackParP();
1107 FairTrackParP first, last;
1114 return PndTrack(first, last, myCand);
1121 return s<0 ? -1. : 1;
1127 if ((1-
fn[2]*
fn[2]-4*
fc*
fn[2]) > 0)
1130 std::cout <<
"-E- PndRiemannTrack::calcJacRXY val is imaginary: Sqrt of " << (1-fn[2]*fn[2]-4*
fc*fn[2]) << std::endl;
1144 fjacRXY[0][3] = -1/(2*fn[2]) * (fn[2]+2*
fc)/val - val/(2*fn[2]*fn[2]);
1146 fjacRXY[1][3] = fn[0]/(2*fn[2]*fn[2]);
1148 fjacRXY[2][3] = fn[1]/(2*fn[2]*fn[2]);
1151 std::cout <<
"-E- PndRiemannTrack::calcJacRXY fn[2] is zero!" << std::endl;
1156 std::cout <<
"-I- PndRiemannTrack::PrintHits: " <<
fHits.size() << std::endl;
1158 for (
size_t i = 0;
i <
fHits.size();
i++){
1159 std::cout <<
i <<
": ";
1164 std::cout <<
fHits[
i].x().X() <<
" +/- " <<
fHits[
i].sigmaX()
1165 <<
"\t" <<
fHits[
i].x().Y()<<
" +/- " <<
fHits[
i].sigmaY()
1168 std::cout << std::endl;
1177 TVectorD normalVector =
n();
1179 std::cout <<
"MySttHit: " << mySttHit << std::endl;
1183 Double_t phi =
TMath::ATan2((normalVector[1]+2*normalVector[2]*y_val), (normalVector[0]+2*normalVector[2]*x_val));
1193 myRiemannHit1.
setXYZ(correctedX, correctedY, 0);
1195 myRiemannHit2.
setXYZ(correctedX1, correctedY1, 0);
1205 finalX = correctedX1;
1206 finalY = correctedY1;
1210 finalX = correctedX;
1211 finalY = correctedY;
1213 finalX = correctedX1;
1214 finalY = correctedY1;
1220 std::cout <<
"TrackNormal + Length: " << normalVector[0] <<
"/" << normalVector[1] <<
"/" << normalVector[2] <<
" o: " <<
c() << std::endl;
1221 std::cout <<
"CalculateCorrectedSTTHit: TubeCenter(" << x_val <<
"/" << y_val <<
") Radius: " << mySttHit->
GetIsochrone() <<
" Distance: " <<
dist(&myRiemannHit) << std::endl;
1222 std::cout <<
"CalculateCorrectedSTTHit: Corrected1(" << correctedX <<
"/" << correctedY <<
") Distance: " <<
dist(&myRiemannHit1) <<
" phi: " << phi << std::endl;
1223 std::cout <<
"CalculateCorrectedSTTHit: Corrected2(" << correctedX1 <<
"/" << correctedY1 <<
") Distance: " <<
dist(&myRiemannHit2) <<
" phi: " << phi << std::endl;
1225 std::cout <<
"Result: " << finalX <<
"/" << finalY << std::endl;
1229 std::cout <<
"result: " << mySttHit <<
" " << result.
x().X() <<
"/" << result.
x().Y() <<
"/" << result.
x().Z() <<
" " << result.
z() << std::endl;
1231 result.
setXYZ(finalX, finalY, 0);
1232 result.
setDXYZ(0.01,0.01,200);
1235 std::cout <<
"result: " << result.
x().X() <<
"/" << result.
x().Y() <<
"/" << result.
x().Z() <<
" " << result.
z() << std::endl;
1243 TVectorD nVec =
n();
1245 std::cout <<
"MySttHit: " << mySttHit << std::endl;
1250 Double_t nominator = nVec[0]*tubeDir.x() + nVec[1]*tubeDir.y() + 2*nVec[2]*(tubeDir.x() + tubeDir.y());
1251 Double_t denominator = 2*nVec[2]*myTube->
GetHalfLength()*(tubeDir.x() * tubeDir.x() + tubeDir.y()*tubeDir.y());
1253 Double_t posOnTube = nominator/denominator;
1256 }
else if (posOnTube < -1) {
1262 tubeMidPos.y()+posOnTube*myTube->
GetHalfLength()*tubeDir.y(),
1263 tubeMidPos.z()+posOnTube*myTube->
GetHalfLength()*tubeDir.z());
1271 for (
size_t i = 0;
i <
fHits.size();
i++){
1323 fHits[
i].setXYZ(correctedHit.
x().X(), correctedHit.
x().Y(), 0);
1324 fHits[
i].setDXYZ(0.001,0.001,200);
1335 fBranchNameMap[branchName] = FairRootManager::Instance()->GetBranchId(branchName);
friend F32vec4 acos(const F32vec4 &a)
PndRiemannHit * getLastHit()
unsigned int getNumHits()
friend F32vec4 cos(const F32vec4 &a)
double fweight
sum over all weights (1/(sigmaXY*sigmaXY))
double calcSZChi2(PndRiemannHit *hit)
double distError(PndRiemannHit *hit)
PndRiemannHit correctSttSkewedHit(PndSttHit *mySttHit, PndSttTube *myTube)
void init(double x0, double y0, double R, double dip, double z0)
double calcZPosByS(double s)
PndRiemannHit correctSttHit(PndSttHit *mySttHit)
friend F32vec4 sqrt(const F32vec4 &a)
std::vector< PndRiemannHit > fHits
Double_t val[nBoxes][nFEBox]
static T Sqrt(const T &x)
double distCircle(PndRiemannHit *hit)
const FairHit * hit() const
friend F32vec4 sin(const F32vec4 &a)
double szDist(PndRiemannHit *hit)
double dist(PndRiemannHit *hit)
Int_t GetBranchId(TString branchName)
double fmError
Error of fit.
void setDXYZ(double dx, double dy, double dz)
std::map< TString, Int_t > fBranchNameMap
double fChi2
Chisquare of sz fit.
void calcJacRXY()
calcualtes fjacRXY
TVector3 calcErrorPosByS(Double_t s, Double_t dS)
TVector3 calcErrorLineOffset(PndRiemannTrack &track)
TString pt(TString pts, TString exts="px py pz")
const TVectorD & n() const
TVector3 calcErrorLineNorm(PndRiemannTrack &track)
FairTrackParP getTrackParPForHit(Int_t i, Double_t B)
Int_t getCharge(Double_t B)
Double_t GetIsochrone() const
void addPndTrackCand(PndTrackCand *trackCand)
TVectorD fn
normal vector to plane;
static T ATan2(const T &y, const T &x)
void setXYZ(double x, double y, double z)
TVectorD calcErrorXY1XY2(TVector3 &line, TVector3 &dLine, TVector3 &offset, TVector3 &dOffset)
void refit(bool withErrorCalc=true)
friend F32vec4 fabs(const F32vec4 &a)
void calcStartStopAlpha()
double ChiSquareDistCircle()
int calcIntersection(PndRiemannTrack &track, TVector3 &p1, TVector3 &p2)
TMatrixD covPlane() const
const TVector3 & x() const
TMatrixD fjacRXY
jacobian matrix to transform from c,n1,n2,n2 to r,x,y
void szFit(bool withErrorCalc=true)
void addHit(PndRiemannHit &hit)
Double_t calcErrorS(TVector2 &XY, TVector2 &dXY, PndRiemannTrack *track)
double fc
distance of plane to origin
void MatrixOutput(TMatrixD mat)
TMatrixD fcovPlane
full covarince matrix of the plane;
void calcPosOnTrk(PndRiemannTrack *trk)
TVector3 getPforHit(int i, double B)
double fm
parameters of sz-fit
TVectorD fav
average over all hits
PndTrack getPndTrack(Double_t B)
TVector3 GetWireDirection()
double calcAlpha(PndRiemannHit *myHit)
TVector3 calcPosByS(double s)
PndRiemannHit * getHit(unsigned int i)
TMatrixT< double > TMatrixD
double ftError
Error of fit.
double szError(PndRiemannHit *hit)