//*-- AUTHOR : A.Rustamov /////////////////////////////////////////////////////////////////////////// //HMdcTrackGSpline calculates momentum of particle using spline interpolation //Input data are 4 points from MDC chambers using namespace std; #include #include "hmdctrackgspline.h" ClassImp(HMdcTrackGSpline) HMdcTrackGSpline::HMdcTrackGSpline(const char* name, const char * title ):TNamed(name,title) { N=4; N1=50; N2=N1-2; pi=acos(-1.); } HMdcTrackGSpline::~HMdcTrackGSpline() {;} Double_t det3(Double_t a[3][3]) { double sp; sp=(a[0][0]*a[1][1]*a[2][2]+a[1][0]*a[2][1]*a[0][2]+ a[0][1]*a[1][2]*a[2][0]-a[0][2]*a[1][1]*a[2][0]- a[2][1]*a[1][2]*a[0][0]-a[1][0]*a[0][1]*a[2][2]); return sp; } void HMdcTrackGSpline::init1() { Double_t BBy[N2]; Double_t fi=60*pi/180; for(Int_t i=0;i0;i--) Y[i]=P[i]*Y[i+1]+Q[i]; Y[0]=Y[1]; for (Int_t i=0;i0;i--) X[i]=P[i]*X[i+1]+Q[i]; X[0]=X[1]; for (Int_t i=0;i90) phidigg=180-phidig; if(phidigg >= c->phiI[i] && phidigg < c->phiI[i+1] && precon >= c->precI[j] && precon < c->precI[j+1] && tetadig >= c->tetaI[k] && tetadig < c->tetaI[k+1]) { if(teta2dig>tetadig) { getcorrE(k,i,j,corr1); polarity=-1; } if(teta2diggetTheta(); phiseg[0]=SEG[0]->getPhi(); zseg[0]=SEG[0]->getZ(); roseg[0]=SEG[0]->getR(); tetaseg[1]=SEG[1]->getTheta(); phiseg[1]=SEG[1]->getPhi(); zseg[1]=SEG[1]->getZ(); roseg[1]=SEG[1]->getR(); Double_t Xseg[4],Yseg[4],Zseg[4]; Xseg[0]=roseg[0]*cos(phiseg[0]+pi/2); Yseg[0]=roseg[0]*sin(phiseg[0]+pi/2); Zseg[0]=zseg[0]; Xseg[1]=Xseg[0]+cos(phiseg[0])*sin(tetaseg[0]); Yseg[1]=Yseg[0]+sin(phiseg[0])*sin(tetaseg[0]); Zseg[1]=Zseg[0]+cos(tetaseg[0]); Xseg[2]=roseg[1]*cos(phiseg[1]+pi/2); Yseg[2]=roseg[1]*sin(phiseg[1]+pi/2); Zseg[2]=zseg[1]; Xseg[3]=Xseg[2]+cos(phiseg[1])*sin(tetaseg[1]); Yseg[3]=Yseg[2]+sin(phiseg[1])*sin(tetaseg[1]); Zseg[3]=Zseg[2]+cos(tetaseg[1]); SEGPOINTS[0].setXYZ(0.1*Xseg[0],0.1*Yseg[0],0.1*Zseg[0]); SEGPOINTS[1].setXYZ(0.1*Xseg[1],0.1*Yseg[1],0.1*Zseg[1]); SEGPOINTS[2].setXYZ(0.1*Xseg[2],0.1*Yseg[2],0.1*Zseg[2]); SEGPOINTS[3].setXYZ(0.1*Xseg[3],0.1*Yseg[3],0.1*Zseg[3]); } void HMdcTrackGSpline::calcSegPoints(HMdcSegSim *SEG[2],HGeomVector *SEGPOINTS) { Float_t tetaseg[2],phiseg[2],zseg[2],roseg[2]; tetaseg[0]=SEG[0]->getTheta(); phiseg[0]=SEG[0]->getPhi(); zseg[0]=SEG[0]->getZ(); roseg[0]=SEG[0]->getR(); tetaseg[1]=SEG[1]->getTheta(); phiseg[1]=SEG[1]->getPhi(); zseg[1]=SEG[1]->getZ(); roseg[1]=SEG[1]->getR(); Double_t Xseg[4],Yseg[4],Zseg[4]; Xseg[0]=roseg[0]*cos(phiseg[0]+pi/2); Yseg[0]=roseg[0]*sin(phiseg[0]+pi/2); Zseg[0]=zseg[0]; Xseg[1]=Xseg[0]+cos(phiseg[0])*sin(tetaseg[0]); Yseg[1]=Yseg[0]+sin(phiseg[0])*sin(tetaseg[0]); Zseg[1]=Zseg[0]+cos(tetaseg[0]); Xseg[2]=roseg[1]*cos(phiseg[1]+pi/2); Yseg[2]=roseg[1]*sin(phiseg[1]+pi/2); Zseg[2]=zseg[1]; Xseg[3]=Xseg[2]+cos(phiseg[1])*sin(tetaseg[1]); Yseg[3]=Yseg[2]+sin(phiseg[1])*sin(tetaseg[1]); Zseg[3]=Zseg[2]+cos(tetaseg[1]); SEGPOINTS[0].setXYZ(0.1*Xseg[0],0.1*Yseg[0],0.1*Zseg[0]); SEGPOINTS[1].setXYZ(0.1*Xseg[1],0.1*Yseg[1],0.1*Zseg[1]); SEGPOINTS[2].setXYZ(0.1*Xseg[2],0.1*Yseg[2],0.1*Zseg[2]); SEGPOINTS[3].setXYZ(0.1*Xseg[3],0.1*Yseg[3],0.1*Zseg[3]); } void HMdcTrackGSpline::calcSegPoints123(HMdcSeg *SEG[2],HGeomVector *SEGPOINTS) { Float_t tetaseg[2],phiseg[2],zseg[2],roseg[2]; tetaseg[0]=SEG[0]->getTheta(); phiseg[0]=SEG[0]->getPhi(); zseg[0]=SEG[0]->getZ(); roseg[0]=SEG[0]->getR(); tetaseg[1]=SEG[1]->getTheta(); phiseg[1]=SEG[1]->getPhi(); zseg[1]=SEG[1]->getZ(); roseg[1]=SEG[1]->getR(); Double_t Xseg[4],Yseg[4],Zseg[4]; Xseg[0]=roseg[0]*cos(phiseg[0]+pi/2); Yseg[0]=roseg[0]*sin(phiseg[0]+pi/2); Zseg[0]=zseg[0]; Xseg[1]=Xseg[0]+cos(phiseg[0])*sin(tetaseg[0]); Yseg[1]=Yseg[0]+sin(phiseg[0])*sin(tetaseg[0]); Zseg[1]=Zseg[0]+cos(tetaseg[0]); Double_t dirX=Xseg[1]-Xseg[0]; Double_t dirY=Yseg[1]-Yseg[0]; Double_t dirZ=Zseg[1]-Zseg[0]; //Intersection with kickplane HGeomVector point,dir,interkickpoint; point.setXYZ(Xseg[0],Yseg[0],Zseg[0]); dir.setXYZ(dirX,dirY,dirZ); kickplane->calcIntersection(point,dir,interkickpoint); Xseg[2]=roseg[1]*cos(phiseg[1]+pi/2); Yseg[2]=roseg[1]*sin(phiseg[1]+pi/2); Zseg[2]=zseg[1]; Xseg[3]=Xseg[2]+cos(phiseg[1])*sin(tetaseg[1]); Yseg[3]=Yseg[2]+sin(phiseg[1])*sin(tetaseg[1]); Zseg[3]=Zseg[2]+cos(tetaseg[1]); //PARAMETERS FOR THE MIDDLE OF THE 3-rd CHAMBER Double_t A=0., B=1.547, D=210.292; //Third point from KickPlane, 4-from the middle of 3 chamber //calculation of 4 point HGeomVector point3, point4,interpoint;//interpoint in sm point3.setXYZ(0.1*Xseg[2],0.1*Yseg[2],0.1*Zseg[2]); point4.setXYZ(0.1*Xseg[3],0.1*Yseg[3],0.1*Zseg[3]); calcInter(A,B,D,point3,point4,interpoint); Xseg[2]=interkickpoint.getX(); Yseg[2]=interkickpoint.getY(); Zseg[2]=interkickpoint.getZ(); Xseg[3]=interpoint.getX(); Yseg[3]=interpoint.getY(); Zseg[3]=interpoint.getZ(); SEGPOINTS[0].setXYZ(0.1*Xseg[0],0.1*Yseg[0],0.1*Zseg[0]); SEGPOINTS[1].setXYZ(0.1*Xseg[1],0.1*Yseg[1],0.1*Zseg[1]); SEGPOINTS[2].setXYZ(0.1*Xseg[2],0.1*Yseg[2],0.1*Zseg[2]); SEGPOINTS[3].setXYZ(Xseg[3],Yseg[3],Zseg[3]); } void HMdcTrackGSpline::calcSegPoints123(HMdcSegSim *SEG[2],HGeomVector *SEGPOINTS) { Float_t tetaseg[2],phiseg[2],zseg[2],roseg[2]; tetaseg[0]=SEG[0]->getTheta(); phiseg[0]=SEG[0]->getPhi(); zseg[0]=SEG[0]->getZ(); roseg[0]=SEG[0]->getR(); tetaseg[1]=SEG[1]->getTheta(); phiseg[1]=SEG[1]->getPhi(); zseg[1]=SEG[1]->getZ(); roseg[1]=SEG[1]->getR(); Double_t Xseg[4],Yseg[4],Zseg[4]; Xseg[0]=roseg[0]*cos(phiseg[0]+pi/2); Yseg[0]=roseg[0]*sin(phiseg[0]+pi/2); Zseg[0]=zseg[0]; Xseg[1]=Xseg[0]+cos(phiseg[0])*sin(tetaseg[0]); Yseg[1]=Yseg[0]+sin(phiseg[0])*sin(tetaseg[0]); Zseg[1]=Zseg[0]+cos(tetaseg[0]); Double_t dirX=Xseg[1]-Xseg[0]; Double_t dirY=Yseg[1]-Yseg[0]; Double_t dirZ=Zseg[1]-Zseg[0]; //Intersection with kickplane HGeomVector point,dir,interkickpoint; point.setXYZ(Xseg[0],Yseg[0],Zseg[0]); dir.setXYZ(dirX,dirY,dirZ); kickplane->calcIntersection(point,dir,interkickpoint); Xseg[2]=roseg[1]*cos(phiseg[1]+pi/2); Yseg[2]=roseg[1]*sin(phiseg[1]+pi/2); Zseg[2]=zseg[1]; Xseg[3]=Xseg[2]+cos(phiseg[1])*sin(tetaseg[1]); Yseg[3]=Yseg[2]+sin(phiseg[1])*sin(tetaseg[1]); Zseg[3]=Zseg[2]+cos(tetaseg[1]); //PARAMETERS FOR THE MIDDLE OF THE 3-rd CHAMBER Double_t A=0., B=1.547, D=210.292; //Third point from KickPlane, 4-from the middle of 3 chamber //calculation of 4 point HGeomVector point3, point4,interpoint;//interpoint in sm point3.setXYZ(0.1*Xseg[2],0.1*Yseg[2],0.1*Zseg[2]); point4.setXYZ(0.1*Xseg[3],0.1*Yseg[3],0.1*Zseg[3]); calcInter(A,B,D,point3,point4,interpoint); Xseg[2]=interkickpoint.getX(); Yseg[2]=interkickpoint.getY(); Zseg[2]=interkickpoint.getZ(); Xseg[3]=interpoint.getX(); Yseg[3]=interpoint.getY(); Zseg[3]=interpoint.getZ(); SEGPOINTS[0].setXYZ(0.1*Xseg[0],0.1*Yseg[0],0.1*Zseg[0]); SEGPOINTS[1].setXYZ(0.1*Xseg[1],0.1*Yseg[1],0.1*Zseg[1]); SEGPOINTS[2].setXYZ(0.1*Xseg[2],0.1*Yseg[2],0.1*Zseg[2]); SEGPOINTS[3].setXYZ(Xseg[3],Yseg[3],Zseg[3]); } void HMdcTrackGSpline::getDistance(Double_t *distance) { for(int i=0; i<4; i++) distance[i]=10*dist[i]; } Double_t HMdcTrackGSpline::calcMomentum(HGeomVector *pp,Bool_t cond,Double_t targ) { target=targ*0.1; HGeomVector ppp[4]; // Double_t A1=-1.21395e-06, B1=0.972304, D1=78.5016; // Double_t A2=-6.62478e-07, B2=1.37611, D2=123.19; // Double_t A3=-1.54441e-05, B3=1.15462, D3=210.281; // Double_t A4=3.80808e-06, B4=1.15466, D4=256.111; Double_t A1=0., B1=0.972306, D1=78.5016; Double_t A2=0., B2=1.37611, D2=125.351; Double_t A3=0., B3=1.15462, D3=207.245; Double_t A4=0., B4=1.15466, D4=256.117; calcInter(A1,B1,D1,pp[0],pp[1],ppp[0]); calcInter(A2,B2,D2,pp[0],pp[1],ppp[1]); calcInter(A3,B3,D3,pp[2],pp[3],ppp[2]); calcInter(A4,B4,D4,pp[2],pp[3],ppp[3]); Double_t xVector[3],fieldVector[3]; x[0]=ppp[0].getX(); x[1]=ppp[0].getY(); x[2]=ppp[0].getZ(); x[3]=ppp[1].getX(); x[4]=ppp[1].getY(); x[5]=ppp[1].getZ(); x[6]=ppp[2].getX(); x[7]=ppp[2].getY(); x[8]=ppp[2].getZ(); x[9]=ppp[3].getX(); x[10]=ppp[3].getY(); x[11]=ppp[3].getZ(); // x[0]=pp[0].getX(); // x[1]=pp[0].getY(); // x[2]=pp[0].getZ(); // // x[3]=pp[1].getX(); // x[4]=pp[1].getY(); // x[5]=pp[1].getZ(); // x[6]=pp[2].getX(); // x[7]=pp[2].getY(); // x[8]=pp[2].getZ(); // x[9]=pp[3].getX(); // x[10]=pp[3].getY(); // x[11]=pp[3].getZ(); getPoint(); spline(point,YZ,YZP,XZ,XZP,4); getpoints(); transFieldpoints(); for(Int_t i=0;i<48;i++) { xVector[0]=Tfieldpoints[i].getX(); xVector[1]=Tfieldpoints[i].getY(); xVector[2]=Tfieldpoints[i].getZ(); if(xVector[0]<0) xVector[0]*=-1; b->calcField(xVector,fieldVector,0.7215); Bx[i]=fieldVector[0]; By[i]=fieldVector[1]; Bz[i]=fieldVector[2]; // cout<<"FIELD="<corrE[k][i][j]+ (c->corrE[k][i][j+1]-c->corrE[k][i][j])*(precon-c->precI[j])/ (c->precI[j+1]-c->precI[j])+(c->corrE[k][i+1][j]-c->corrE[k][i][j])*(phidigg-c->phiI[i])/ (c->phiI[i+1]-c->phiI[i])+(c->corrE[k+1][i][j]-c->corrE[k][i][j])*(tetadig-c->tetaI[k])/ (c->tetaI[k+1]-c->tetaI[k]); } void HMdcTrackGSpline::getcorrP(Int_t k,Int_t i, Int_t j, Double_t & corr) { corr=c->corrP[k][i][j]+ (c->corrP[k][i][j+1]-c->corrP[k][i][j])*(precon-c->precI[j])/ (c->precI[j+1]-c->precI[j])+(c->corrP[k][i+1][j]-c->corrP[k][i][j])*(phidigg-c->phiI[i])/ (c->phiI[i+1]-c->phiI[i])+(c->corrP[k+1][i][j]-c->corrP[k][i][j])*(tetadig-c->tetaI[k])/ (c->tetaI[k+1]-c->tetaI[k]); } void HMdcTrackGSpline::setDataPointer(HMdcTrackGField* field,HMdcTrackGCorrections* corr) { b=field; c=corr; } void HMdcTrackGSpline::setKickPointer(HKickPlane2 *kickpointer) { kickplane=kickpointer; } //HGeomVector HMdcTrackGSpline::calcInter(Double_t A,Double_t B,Double_t D,HGeomVector in1 , // HGeomVector in2,HGeomVector &out) // // void HMdcTrackGSpline::calcInter(Double_t A,Double_t B,Double_t D,HGeomVector in1 , HGeomVector in2,HGeomVector &out) { Double_t x1,y1,z1,x2,y2,z2,x,y,z; x1=in1.getX(); y1=in1.getY(); z1=in1.getZ(); x2=in2.getX(); y2=in2.getY(); z2=in2.getZ(); Double_t dX=x2-x1; Double_t dY=y2-y1; Double_t dZ=z2-z1; Double_t del=1/(A*dX+B*dY+dZ); x=(dX*(D-z1-B*y1)+x1*(B*dY+dZ))*del; y=(dY*(D-z1-A*x1)+y1*(A*dX+dZ))*del; z=D-A*x-B*y; out.setXYZ(x,y,z); // return out; } void HMdcTrackGSpline::equationofLine(Double_t* xz1,Double_t *xz2,Double_t Z,Double_t &X) { Double_t A,B; Double_t delta,deltaA,deltaB; delta=xz1[1]-xz2[1]; deltaA=xz1[0]-xz2[0]; deltaB=xz1[1]*xz2[0]-xz1[0]*xz2[1]; A=deltaA/delta; B=deltaB/delta; X=A*Z+B; } void HMdcTrackGSpline::equationofLine3D(HGeomVector point1,HGeomVector point2,Double_t Z,Double_t &X,Double_t &Y) { Double_t t; t=(Z-point1.getZ())/(point2.getZ()-point1.getZ()); X=point1.getX()+t*(point2.getX()-point1.getX()); Y=point1.getY()+t*(point2.getY()-point1.getY()); }