Author: [log in to unmask] Date: Wed Mar 23 18:20:27 2016 New Revision: 4328 Log: fix bug in residual calculation Modified: java/trunk/recon/src/main/java/org/hps/recon/vertexing/BilliorVertexer.java Modified: java/trunk/recon/src/main/java/org/hps/recon/vertexing/BilliorVertexer.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/vertexing/BilliorVertexer.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/vertexing/BilliorVertexer.java Wed Mar 23 18:20:27 2016 @@ -24,40 +24,25 @@ // default is a constant field along the z axis private boolean _debug = false; - private double _bField; - private boolean _beamspotConstraint = true; - private boolean _targetConstraint = false; - private double[] _beamSize = {0.001, 0.01, 0.01}; //10um in y and z + private final double _bField; + private boolean _beamspotConstraint; + private boolean _targetConstraint; + private String _constraintType; + private final double[] _beamSize = {0.001, 0.01, 0.01}; //10um in y and z + private final double[] _beamPosition = {0.0, 0.0, 0.0}; //origin private int _ntracks; - private List<Matrix> paramList = new ArrayList<Matrix>(); - private List<Matrix> WList = new ArrayList<Matrix>(); - private List<Matrix> DList = new ArrayList<Matrix>(); - private List<Matrix> EList = new ArrayList<Matrix>(); - private Matrix A; - private Matrix T; - private List<Matrix> BList = new ArrayList<Matrix>(); - private List<Matrix> CinvList = new ArrayList<Matrix>(); - private List<Matrix> CList = new ArrayList<Matrix>(); - private List<Matrix> UList = new ArrayList<Matrix>(); - private List<Matrix> dqList = new ArrayList<Matrix>(); - private double[] _v0 = {0.0, 0.0, 0.0}; + private double[] _v0 = {0.0, 0.0, 0.0}; //initial guess for unconstrained vertex fit // private double[] _vertexPosition = {0., 0.0, 0.0}; - private Matrix _vertexPosition = new BasicMatrix(3, 1); - private Matrix _covVtx = new BasicMatrix(3, 3); - private List<Matrix> _pFit = new ArrayList<Matrix>(); + private Matrix _vertexPosition; + private Matrix _covVtx; + private List<Matrix> _pFit; ;//theta,phi_v,rho - private List<Matrix> covVtxMomList = new ArrayList<Matrix>(); - private Matrix[][] covMomList = new Matrix[2][2];//max 2 tracks...just make this bigger for more + private List<Matrix> covVtxMomList; + private Matrix[][] covMomList;//max 2 tracks...just make this bigger for more private Matrix _constrainedFit; private Matrix _constrainedCov; private double _chiSq; - private String _constraintType = "Unspecified"; - - // constructor - - public BilliorVertexer() { - } public BilliorVertexer(double bField) { _bField = bField; @@ -89,9 +74,9 @@ _ntracks = tracks.size(); follow1985Paper(tracks); if (_beamspotConstraint) { - addV0fromBSConstraint(true); + applyBSconstraint(true); } else if (_targetConstraint) { - addV0fromBSConstraint(false); + applyBSconstraint(false); } Map<Integer, Hep3Vector> pFitMap = new HashMap<Integer, Hep3Vector>(); for (int i = 0; i < tracks.size(); i++) { @@ -104,309 +89,15 @@ return new BilliorVertex(vertDet, covVtxDet, _chiSq, getInvMass(), pFitMap, _constraintType); } - public BilliorVertex fitFastVertex(List<BilliorTrack> tracks) { - _ntracks = tracks.size(); - fastVertex(tracks); - Hep3Vector vert = new BasicHep3Vector(_vertexPosition.e(0, 0), _vertexPosition.e(1, 0), _vertexPosition.e(2, 0)); - return new BilliorVertex((Hep3Vector) _vertexPosition, _covVtx, _chiSq, getInvMass()); - } - -// private void calculateCovariance() { -// for (int i = 0; i < _ntracks; i++) { -// BasicMatrix b = (BasicMatrix) BList.get(i); -// BasicMatrix cinv = (BasicMatrix) CinvList.get(i); -// BasicMatrix bt = (BasicMatrix) MatrixOp.transposed(b); -// covVtxMomList.add((MatrixOp.mult(-1, MatrixOp.mult(_covVtx, MatrixOp.mult(b, cinv))))); -// for (int j = 0; j < _ntracks; j++) { -// BasicMatrix bj = (BasicMatrix) BList.get(j); -// BasicMatrix cjinv = (BasicMatrix) CinvList.get(j); -// BasicMatrix tmp = (BasicMatrix) MatrixOp.mult(cinv, MatrixOp.mult(bt, MatrixOp.mult(_covVtx, MatrixOp.mult(bj, cjinv)))); -// if (i == j) -// tmp = (BasicMatrix) MatrixOp.add(tmp, cinv); -// covMomList[i][j] = tmp; -// } -// } -// } -// -// private void calculateMomenta() { -// -// for (int i = 0; i < _ntracks; i++) { -// BasicMatrix params = (BasicMatrix) paramList.get(i); -// BasicMatrix b = (BasicMatrix) BList.get(i); -// BasicMatrix cinv = (BasicMatrix) CinvList.get(i); -// BasicMatrix u = (BasicMatrix) UList.get(i); -// //not sure following line is correct...mg 10/21/10 -// BasicMatrix CinvU = (BasicMatrix) MatrixOp.mult(cinv, u); -// BasicMatrix CinvBTdV = (BasicMatrix) MatrixOp.mult(-1, MatrixOp.mult(cinv, MatrixOp.mult(MatrixOp.transposed(b), _vertexPosition))); -//// if(_debug)System.out.println(" B = "+b.toString()); -//// if(_debug)System.out.println(" cinv = "+cinv.toString()); -//// if(_debug)System.out.println(" u = "+u.toString()); -//// if(_debug)System.out.println(" CinvU = "+CinvU.toString()); -//// if(_debug)System.out.println(" CinvBTdV = "+CinvBTdV.toString()); -// BasicMatrix tmpP = (BasicMatrix) MatrixOp.add(CinvBTdV, CinvU); -// tmpP.setElement(0, 0, tmpP.e(0, 0) + params.e(2, 0)); -// tmpP.setElement(1, 0, tmpP.e(1, 0) + params.e(3, 0)); -// tmpP.setElement(2, 0, tmpP.e(2, 0) + params.e(4, 0)); -// _pFit.add(tmpP); -//// if(_debug)System.out.println("Track "+i+" orig parameters = "+params); -//// if(_debug)System.out.println("Track "+i+" deltaP = "+MatrixOp.add(CinvBTdV, CinvU)); -//// if(_debug)System.out.println("Track " + i + " _pFit = " + tmpP); -// } -// } -// -// private void calculateVertexPosition() { -// BasicMatrix tmpcov = new BasicMatrix(3, 3); -// BasicMatrix tmp = new BasicMatrix(3, 1); -// for (int i = 0; i < _ntracks; i++) { -// BasicMatrix b = (BasicMatrix) BList.get(i); -// BasicMatrix cinv = (BasicMatrix) CinvList.get(i); -// BasicMatrix u = (BasicMatrix) UList.get(i); -//// if(_debug)System.out.println("Cinv matrix " + cinv.toString()); -//// if(_debug)System.out.println("B matrix " + b.toString()); -//// if(_debug)System.out.println("U matrix " + u.toString()); -// BasicMatrix bt = (BasicMatrix) MatrixOp.transposed(b); -// // if(_debug)System.out.println("Adding this to tmpcov : " + MatrixOp.mult(-1, MatrixOp.mult(b, MatrixOp.mult(cinv, bt)))); -// if (i == 0) { -// tmpcov = (BasicMatrix) MatrixOp.mult(-1, MatrixOp.mult(b, MatrixOp.mult(cinv, bt))); -// tmp = (BasicMatrix) MatrixOp.mult(-1, MatrixOp.mult(b, MatrixOp.mult(cinv, u))); -// } else { -// tmpcov = (BasicMatrix) MatrixOp.add(tmpcov, MatrixOp.mult(-1, MatrixOp.mult(b, MatrixOp.mult(cinv, bt)))); -// tmp = (BasicMatrix) MatrixOp.add(tmp, MatrixOp.mult(-1, MatrixOp.mult(b, MatrixOp.mult(cinv, u)))); -// } -//// if(_debug)System.out.println("tmpCov matrix " + tmpcov.toString()); -//// if(_debug)System.out.println("tmp matrix " + tmp.toString()); -// } -//// -//// if(_debug)System.out.println("A matrix " + A.toString()); -//// if(_debug)System.out.println("tmpCov matrix " + tmpcov.toString()); -//// if(_debug)System.out.println("sum of A and tmpCov = " + MatrixOp.add(A, tmpcov).toString()); -// _covVtx = MatrixOp.inverse(MatrixOp.add(A, tmpcov)); -//// if(_debug)System.out.println("_covVtx matrix " + _covVtx.toString()); -//// if(_debug)System.out.println("T matrix " + T.toString()); -// _vertexPosition = (BasicMatrix) MatrixOp.mult(_covVtx, MatrixOp.add(T, tmp)); -// -// } -// -// private void makeOtherMatrices() { -// BasicMatrix tmpA = new BasicMatrix(3, 3); -// BasicMatrix tmpT = new BasicMatrix(3, 1); -// -// for (int i = 0; i < _ntracks; i++) { -// BasicMatrix tmpD = (BasicMatrix) DList.get(i); -// BasicMatrix tmpE = (BasicMatrix) EList.get(i); -// BasicMatrix dq = (BasicMatrix) dqList.get(i); -// BasicMatrix tmpW = (BasicMatrix) WList.get(i); -// -// if (i == 0) { -// tmpA = (BasicMatrix) MatrixOp.mult(MatrixOp.transposed(tmpD), MatrixOp.mult(tmpW, tmpD)); -// tmpT = (BasicMatrix) MatrixOp.mult(MatrixOp.transposed(tmpD), MatrixOp.mult(tmpW, dq)); -// } else { -// tmpT = (BasicMatrix) MatrixOp.add(tmpT, MatrixOp.mult(MatrixOp.transposed(tmpD), MatrixOp.mult(tmpW, dq))); -// tmpA = (BasicMatrix) MatrixOp.add(tmpA, MatrixOp.mult(MatrixOp.transposed(tmpD), MatrixOp.mult(tmpW, tmpD))); -// } -// BList.add(MatrixOp.mult(MatrixOp.transposed(tmpD), MatrixOp.mult(tmpW, tmpE))); -// BasicMatrix tmpC = (BasicMatrix) MatrixOp.mult(MatrixOp.transposed(tmpE), MatrixOp.mult(tmpW, tmpE)); -// CList.add(tmpC); -// CinvList.add(MatrixOp.inverse(tmpC)); -// UList.add(MatrixOp.mult(MatrixOp.transposed(tmpE), MatrixOp.mult(tmpW, dq))); -// -// } -// A = tmpA; -// T = tmpT; -// } -// -// private void calculateChisq() { -// _chiSq = 0; -// for (int i = 0; i < _ntracks; i++) { -// BasicMatrix params = (BasicMatrix) paramList.get(i); -// BasicMatrix d = (BasicMatrix) DList.get(i); -// BasicMatrix e = (BasicMatrix) EList.get(i); -// BasicMatrix w = (BasicMatrix) WList.get(i); -// BasicMatrix pi = (BasicMatrix) _pFit.get(i); -// BasicMatrix Vtilde = (BasicMatrix) MatrixOp.mult(d, _vertexPosition); -// BasicMatrix Trtilde = (BasicMatrix) MatrixOp.mult(e, pi); -// BasicMatrix ptilde = (BasicMatrix) MatrixOp.add(Vtilde, Trtilde); -// // if(_debug)System.out.println("Vtilde = "+Vtilde); -// // if(_debug)System.out.println("Trtilde = "+Trtilde); -// BasicMatrix resid = (BasicMatrix) MatrixOp.add(params, MatrixOp.mult(-1, ptilde)); -// BasicMatrix residT = (BasicMatrix) MatrixOp.transposed(resid); -//// if(_debug)System.out.println("ptilde = "+ptilde); -//// if(_debug)System.out.println("params = "+params); -//// if(_debug)System.out.println("resid = "+resid); -//// if(_debug)System.out.println("Covariance = "+MatrixOp.inverse(w)); -//// if(_debug)System.out.println("Weight = "+w); -// _chiSq = _chiSq + (MatrixOp.mult(residT, MatrixOp.mult(w, resid))).e(0, 0); -//// if(_debug)System.out.println("_chiSq = "+_chiSq); -// } -// } - private void fastVertex(List<BilliorTrack> tracks) { - boolean firstTrack = true; - BasicMatrix sumwi = new BasicMatrix(3, 3); - BasicMatrix sumwiXi = new BasicMatrix(3, 1); - BasicMatrix dX = new BasicMatrix(3, 1); - - for (BilliorTrack bt : tracks) { - double[] par = bt.parameters(); -// if(_debug)System.out.println("Track parameters = (" + par[0] + ", " + par[1] + ", " + par[2] + ", " + par[3] + ", " + par[4] + ")"); - double cotth = 1. / tan(par[2]); - double phiv = par[3]; - double cosf = cos(phiv); - double sinf = sin(phiv); - - double xi = par[0] * sin(par[3]); - double yi = -par[0] * cos(par[3]); - double zi = par[1]; - - dX.setElement(0, 0, xi); - dX.setElement(1, 0, yi); - dX.setElement(2, 0, zi); - - BasicMatrix tmpD = new BasicMatrix(2, 3); - tmpD.setElement(0, 0, sinf); - tmpD.setElement(0, 1, -cosf); - tmpD.setElement(1, 0, -cotth * cosf); - tmpD.setElement(1, 1, -cotth * sinf); - tmpD.setElement(1, 2, 1); - BasicMatrix trkCov = new BasicMatrix(2, 2); - trkCov.setElement(0, 0, bt.covariance().e(0, 0)); - trkCov.setElement(0, 1, bt.covariance().e(0, 1)); - trkCov.setElement(1, 0, bt.covariance().e(1, 0)); - trkCov.setElement(1, 1, bt.covariance().e(1, 1)); - BasicMatrix tmpW = (BasicMatrix) MatrixOp.inverse(trkCov); - BasicMatrix wi = (BasicMatrix) MatrixOp.mult(MatrixOp.transposed(tmpD), MatrixOp.mult(tmpW, tmpD)); - if (firstTrack) { - sumwi = wi; - sumwiXi = (BasicMatrix) MatrixOp.mult(wi, dX); - } else { - sumwi = (BasicMatrix) MatrixOp.add(sumwi, wi); - sumwiXi = (BasicMatrix) MatrixOp.add(sumwiXi, MatrixOp.mult(wi, dX)); - } - firstTrack = false; - } - _covVtx = MatrixOp.inverse(sumwi); - if (_debug) { - System.out.println("fastVertex::_covVtx matrix " + _covVtx.toString()); - } - _vertexPosition = (BasicMatrix) MatrixOp.mult(_covVtx, sumwiXi); - _chiSq = 0; - //get the chisq - for (BilliorTrack bt : tracks) { - double[] par = bt.parameters(); -// if(_debug)System.out.println("Track parameters = (" + par[0] + ", " + par[1] + ", " + par[2] + ", " + par[3] + ", " + par[4] + ")"); - double cotth = 1. / tan(par[2]); - double phiv = par[3]; - double cosf = cos(phiv); - double sinf = sin(phiv); - - double xi = par[0] * sin(par[3]); - double yi = -par[0] * cos(par[3]); - double zi = par[1]; - //this is xi - fitted vertex now - dX.setElement(0, 0, xi - _vertexPosition.e(0, 0)); - dX.setElement(1, 0, yi - _vertexPosition.e(1, 0)); - dX.setElement(2, 0, zi - _vertexPosition.e(2, 0)); - - BasicMatrix tmpD = new BasicMatrix(2, 3); - tmpD.setElement(0, 0, sinf); - tmpD.setElement(0, 1, -cosf); - tmpD.setElement(1, 0, -cotth * cosf); - tmpD.setElement(1, 1, -cotth * sinf); - tmpD.setElement(1, 2, 1); - BasicMatrix trkCov = new BasicMatrix(2, 2); - trkCov.setElement(0, 0, bt.covariance().e(0, 0)); - trkCov.setElement(0, 1, bt.covariance().e(0, 1)); - trkCov.setElement(1, 0, bt.covariance().e(1, 0)); - trkCov.setElement(1, 1, bt.covariance().e(1, 1)); - BasicMatrix tmpW = (BasicMatrix) MatrixOp.inverse(trkCov); - BasicMatrix wi = (BasicMatrix) MatrixOp.mult(MatrixOp.transposed(tmpD), MatrixOp.mult(tmpW, tmpD)); - _chiSq += MatrixOp.mult(MatrixOp.transposed(dX), MatrixOp.mult(wi, dX)).e(0, 0); - } - } - -// private void makeDerivativeMatrices(List<BilliorTrack> tracks) { -// -// //DList.clear(); -// //EList.clear(); -// //paramList.clear(); -// //dqList.clear(); -// //WList.clear(); -// BasicMatrix dq = new BasicMatrix(5, 1); -// BasicMatrix tmpW = new BasicMatrix(5, 5); -// for (BilliorTrack bt : tracks) { -// double[] par = bt.parameters(); -// BasicMatrix tmpPar = new BasicMatrix(5, 1); -// tmpPar.setElement(0, 0, par[0]); -// tmpPar.setElement(1, 0, par[1]); -// tmpPar.setElement(2, 0, par[2]); -// tmpPar.setElement(3, 0, par[3]); -// tmpPar.setElement(4, 0, par[4]); -// paramList.add(tmpPar); -// double cotth = 1. / tan(par[2]); -// double uu = _v0[0] * cos(par[3]) + _v0[1] * sin(par[3]);//Q -// double vv = _v0[1] * cos(par[3]) - _v0[0] * sin(par[3]);//R -// double eps = -vv - .5 * uu * uu * par[4]; -// double zp = _v0[2] - uu * (1 - vv * par[4]) * cotth; -// // * phi at vertex with these parameters -// double phiv = par[3] + uu * par[4]; -// double cosf = cos(phiv); -// double sinf = sin(phiv); -// -// BasicMatrix tmpD = new BasicMatrix(5, 3); -// tmpD.setElement(0, 0, sinf); -// tmpD.setElement(0, 1, -cosf); -// tmpD.setElement(1, 0, -cotth * cosf); -// tmpD.setElement(1, 1, -cotth * sinf); -// tmpD.setElement(1, 2, 1); -// tmpD.setElement(3, 0, -par[4] * cosf); -// tmpD.setElement(3, 1, -par[4] * sinf); -// -// BasicMatrix tmpE = new BasicMatrix(5, 3); -// tmpE.setElement(0, 1, uu); -// tmpE.setElement(0, 2, -uu * uu / 2); -// tmpE.setElement(1, 0, uu * (1 + cotth * cotth)); -// tmpE.setElement(1, 1, -vv * cotth); -// tmpE.setElement(1, 2, uu * vv * cotth); -// tmpE.setElement(3, 1, 1); -// tmpE.setElement(3, 2, -uu); -// tmpE.setElement(2, 0, 1); //partial(theta)/dtheta -// tmpE.setElement(4, 2, 1); //partial (rho)/drho -// DList.add(tmpD); -// EList.add(tmpE); -// -// double deps = par[0] - eps; -// double dzp = par[1] - zp; -// double dphi = par[3] - phiv; -// -// dq.setElement(0, 0, deps); -// dq.setElement(1, 0, dzp); -// dq.setElement(3, 0, dphi); -// dqList.add(dq); -// tmpW = (BasicMatrix) MatrixOp.inverse(bt.covariance()); -// WList.add(tmpW); -// -// if (_debug) -// System.out.println("makeDerivativeMatrices::Params = \n" + tmpPar); -// if (_debug) -// System.out.println("D = \n" + tmpD); -// if (_debug) -// System.out.println("E = \n" + tmpE); -// if (_debug) -// System.out.println("dq = \n" + dq); -// if (_debug) -// System.out.println("W = \n" + tmpW); -// } -// -// } - - /* Add the constraint that V0 points back to beamspot + /* Add the constraint that V0 is at/points back to beamspot * this method is based on progressive least squares fit * using the unconstrained fit result as the (k-1) fit * * all notation is taken from: * W. Hulsbergen, NIM 552 (2005) 566-575 */ - private void addV0fromBSConstraint(boolean bscon) { - String methodName = bscon ? "addV0fromBSConstraint" : "constrainV0toBS"; + private void applyBSconstraint(boolean pointback) { + String methodName = pointback ? "constrainV0toBS" : "constrainV0toTarget"; BasicMatrix Ckm1 = new BasicMatrix(3 * (_ntracks + 1), 3 * (_ntracks + 1)); BasicMatrix Xkm1 = new BasicMatrix(3 * (_ntracks + 1), 1); MatrixOp.setSubMatrix(Ckm1, _covVtx, 0, 0); @@ -457,9 +148,15 @@ pztot += pz; } //calculate the position of the A' at X=0 - BasicMatrix rk = makeRk(Vx, Vy, Vz, pxtot, pytot, pztot, bscon); - - BasicMatrix Hk = makeHk(_ntracks, pxtot, pytot, pztot, bscon); + BasicMatrix rk = makeRk(Vx, Vy, Vz, pxtot, pytot, pztot, pointback); + if (_debug) { + System.out.println(methodName + "::rk = " + rk); + } + + BasicMatrix Hk = makeHk(_ntracks, pxtot, pytot, pztot, pointback); + if (_debug) { + System.out.println(methodName + "::Hk = " + Hk); + } // the beam covariance BasicMatrix Vk = new BasicMatrix(3, 3); @@ -511,6 +208,10 @@ // if(_debug)System.out.println("With Constraint : " + _vertexPosition.toString()); // if(_debug)System.out.println("With Constraint : " + _covVtx.toString()); + if (_debug) { + System.out.println("Constrained vertex: " + _vertexPosition); + } + for (int i = 0; i < _ntracks; i++) { BasicMatrix ptmp = (BasicMatrix) MatrixOp.getSubMatrix(_constrainedFit, 3 * (i + 1), 0, 3, 1); _pFit.set(i, ptmp); @@ -519,134 +220,24 @@ // if(_debug)System.out.println("Unconstrained chi^2 = "+_chiSq); //ok...add to the chi^2 if (_debug) { - System.out.println(MatrixOp.mult(MatrixOp.transposed(rk), MatrixOp.mult(Rkinv, rk))); + System.out.println("Chisq contribution: " + MatrixOp.mult(MatrixOp.transposed(rk), MatrixOp.mult(Rkinv, rk))); } _chiSq += MatrixOp.mult(MatrixOp.transposed(rk), MatrixOp.mult(Rkinv, rk)).e(0, 0); // if(_debug)System.out.println("Constrained chi^2 = "+_chiSq); } -// private void constrainV0toBS() { -// BasicMatrix Ckm1 = new BasicMatrix(3 * (_ntracks + 1), 3 * (_ntracks + 1)); -// BasicMatrix Xkm1 = new BasicMatrix(3 * (_ntracks + 1), 1); -// MatrixOp.setSubMatrix(Ckm1, _covVtx, 0, 0); -// MatrixOp.setSubMatrix(Xkm1, _vertexPosition, 0, 0); -// -// int n = 1; -// for (Matrix covVtxMom : covVtxMomList) { -// if (_debug) -// System.out.println("constrainV0toBS::Track " + n + " covVtxMom : " + covVtxMom.toString()); -// MatrixOp.setSubMatrix(Ckm1, covVtxMom, 0, 3 * n); -// MatrixOp.setSubMatrix(Ckm1, MatrixOp.transposed(covVtxMom), 3 * n, 0); -// n++; -// } -// for (int i = 0; i < _ntracks; i++) { -// BasicMatrix pi = (BasicMatrix) _pFit.get(i); -// MatrixOp.setSubMatrix(Xkm1, pi, 3 * (i + 1), 0); -// // if(_debug)System.out.println("Track "+i+" p : " + pi.toString()); -// for (int j = 0; j < _ntracks; j++) -// MatrixOp.setSubMatrix(Ckm1, covMomList[i][j], 3 * (i + 1), 3 * (j + 1)); -// } -// // now calculate the derivative matrix for the beam constraint. -// // the beamspot is assumed to be at bvec=(0,0,0) -// // the V0 production position is Vbvec=(0,0,0) -// // where ptot=sum_i (pi) -// // need derivites wrt to the vertex position and momentum (theta,phi_v,rho) -// double Vx = _vertexPosition.e(0, 0); -// double Vy = _vertexPosition.e(1, 0); -// double Vz = _vertexPosition.e(2, 0); -// //first, get the sum of momenta... -// double pxtot = 0; -// double pytot = 0; -// double pztot = 0; -// for (int i = 0; i < _ntracks; i++) { -// BasicMatrix pi = (BasicMatrix) _pFit.get(i); -// double theta = pi.e(0, 0); -// double phiv = pi.e(1, 0); -// double rho = pi.e(2, 0); -// double Pt = Math.abs((1. / rho) * _bField * Constants.fieldConversion); -// double px = Pt * Math.cos(phiv); -// double py = Pt * Math.sin(phiv); -// double pz = Pt * 1 / Math.tan(theta); -// pxtot += px; -// pytot += py; -// pztot += pz; -// } -// BasicMatrix rk = makeRk(Vx,Vy,Vz,pxtot,pytot,pztot,false); -//// //calculate the position of the A' at X=0 -//// BasicMatrix rk = new BasicMatrix(3, 1); -//// // if(_debug)System.out.println("Vx = " + Vx + "; Vy = " + Vy + "; Vz = " + Vz + "; pxtot = " + pxtot + "; pytot = " + pytot + "; pztot = " + pztot); -//// rk.setElement(0, 0, -Vx); -//// rk.setElement(1, 0, -Vy); -//// rk.setElement(2, 0, -Vz); -// -// BasicMatrix Hk = makeHk(_ntracks,pxtot,pytot,pztot,false); -// -// // the beam covariance -// BasicMatrix Vk = new BasicMatrix(3, 3); -// Vk.setElement(0, 0, _beamSize[0] * _beamSize[0]); -// Vk.setElement(1, 1, _beamSize[1] * _beamSize[1]); -// Vk.setElement(2, 2, _beamSize[2] * _beamSize[2]); -// -// //now do the matrix operations to get the constrained parameters -// BasicMatrix Hkt = (BasicMatrix) MatrixOp.transposed(Hk); -//// if(_debug)System.out.println("Ckm1Hk = " + MatrixOp.mult(Ckm1, Hk)); -// -// BasicMatrix Rk = (BasicMatrix) MatrixOp.mult(Hkt, MatrixOp.mult(Ckm1, Hk)); -//// if(_debug)System.out.println("Pre Vk: Rk = " + Rk.toString()); -// Rk = (BasicMatrix) MatrixOp.add(Rk, Vk); -// BasicMatrix Rkinv = (BasicMatrix) MatrixOp.inverse(Rk); -// BasicMatrix Kk = (BasicMatrix) MatrixOp.mult(Ckm1, MatrixOp.mult(Hk, Rkinv)); -// -//// if(_debug)System.out.println("Ckm1 = " + Ckm1.toString()); -//// if(_debug)System.out.println("Hk = " + Hk.toString()); -//// if(_debug)System.out.println("Rk = " + Rk.toString()); -//// if(_debug)System.out.println("Vk = " + Vk.toString()); -//// if(_debug)System.out.println("rk = " + rk.toString()); -//// if(_debug)System.out.println("Kk = " + Kk.toString()); -// _constrainedFit = MatrixOp.mult(Kk, rk); -// _constrainedFit = MatrixOp.add(_constrainedFit, Xkm1);//Xk -// -// //ok, get the new covariance -// BasicMatrix RkKkt = (BasicMatrix) MatrixOp.mult(Rk, MatrixOp.transposed(Kk)); -// BasicMatrix HkCkm1 = (BasicMatrix) MatrixOp.mult(Hkt, Ckm1); -// RkKkt = (BasicMatrix) MatrixOp.mult(1, RkKkt); -// HkCkm1 = (BasicMatrix) MatrixOp.mult(-2, HkCkm1); -// BasicMatrix sumMatrix = (BasicMatrix) MatrixOp.mult(Kk, MatrixOp.add(HkCkm1, RkKkt)); -// _constrainedCov = (BasicMatrix) MatrixOp.add(Ckm1, sumMatrix); -// -// //update the regular parameter names to the constrained result -//// if(_debug)System.out.println("Without Constraint : " + _vertexPosition.toString()); -//// if(_debug)System.out.println("Without Constraint: x= "+_vertexPosition.e(0,0)); -// // if(_debug)System.out.println(_constrainedFit.toString()); -//// if(_debug)System.out.println("Without Constraint : " + _covVtx.toString()); -// _vertexPosition = (BasicMatrix) MatrixOp.getSubMatrix(_constrainedFit, 0, 0, 3, 1); -// _covVtx = (BasicMatrix) MatrixOp.getSubMatrix(_constrainedCov, 0, 0, 3, 3); -//// if(_debug)System.out.println("With Constraint : " + _vertexPosition.toString()); -//// if(_debug)System.out.println("With Constraint : " + _covVtx.toString()); -// -// for (int i = 0; i < _ntracks; i++) { -// BasicMatrix ptmp = (BasicMatrix) MatrixOp.getSubMatrix(_constrainedFit, 3 * (i + 1), 0, 3, 1); -// _pFit.set(i, ptmp); -// } -// -//// if(_debug)System.out.println("Unconstrained chi^2 = "+_chiSq); -// //ok...add to the chi^2 -// if (_debug) -// System.out.println(MatrixOp.mult(MatrixOp.transposed(rk), MatrixOp.mult(Rkinv, rk))); -// _chiSq += MatrixOp.mult(MatrixOp.transposed(rk), MatrixOp.mult(Rkinv, rk)).e(0, 0); -//// if(_debug)System.out.println("Constrained chi^2 = "+_chiSq); -// } private BasicMatrix makeHk(int ntracks, double pxtot, double pytot, double pztot, boolean bscon) { double Vx = _vertexPosition.e(0, 0); // double Vy = _vertexPosition.e(1, 0); // double Vz = _vertexPosition.e(2, 0); BasicMatrix Hk = new BasicMatrix(3 * (ntracks + 1), 3); // ok, can set the derivitives wrt to V - Hk.setElement(0, 0, 0); if (bscon) { + Hk.setElement(0, 0, 0); Hk.setElement(0, 1, pytot / pxtot); Hk.setElement(0, 2, pztot / pxtot); } else { + Hk.setElement(0, 0, 1); Hk.setElement(0, 1, 0); Hk.setElement(0, 2, 0); } @@ -670,7 +261,8 @@ Hk.setElement(3 * (i + 1), 0, 0); Hk.setElement(3 * (i + 1), 1, 0); if (bscon) { - Hk.setElement(3 * (i + 1), 2, -Pt / Math.pow(sin(theta), 2) * Vx); + Hk.setElement(3 * (i + 1), 2, + -Pt / Math.pow(sin(theta), 2) * Vx); } else { Hk.setElement(3 * (i + 1), 2, 0); } @@ -679,7 +271,8 @@ if (bscon) { Hk.setElement(3 * (i + 1) + 1, 1, (Pt * Pt * cos(phiv) * sin(phiv) / (pxtot * pxtot)) * Vx); - Hk.setElement(3 * (i + 1) + 1, 2, (Pt * sin(phiv) / (pxtot * pxtot)) * Vx * pztot); + Hk.setElement(3 * (i + 1) + 1, 2, + (Pt * sin(phiv) / (pxtot * pxtot)) * Vx * pztot); } else { Hk.setElement(3 * (i + 1) + 1, 1, 0); Hk.setElement(3 * (i + 1) + 1, 2, 0); @@ -710,16 +303,16 @@ //calculate the position of the A' at X=0 BasicMatrix rk = new BasicMatrix(3, 1); if (_debug) { - System.out.println("addV0fromBSConstraint::Vx = " + Vx + "; Vy = " + Vy + "; Vz = " + Vz + "; pxtot = " + pxtot + "; pytot = " + pytot + "; pztot = " + pztot); + System.out.println("makeRk::Vx = " + Vx + "; Vy = " + Vy + "; Vz = " + Vz + "; pxtot = " + pxtot + "; pytot = " + pytot + "; pztot = " + pztot); } if (bscon) { rk.setElement(0, 0, 0); - rk.setElement(1, 0, 0 - (Vy - pytot / pxtot * Vx)); - rk.setElement(2, 0, 0 - (Vz - pztot / pxtot * Vx)); + rk.setElement(1, 0, _beamPosition[1] - (Vy - pytot / pxtot * (Vx - _beamPosition[0]))); + rk.setElement(2, 0, _beamPosition[2] - (Vz - pztot / pxtot * (Vx - _beamPosition[0]))); } else { - rk.setElement(0, 0, -Vx); - rk.setElement(1, 0, -Vy); - rk.setElement(2, 0, -Vz); + rk.setElement(0, 0, _beamPosition[0] - Vx); + rk.setElement(1, 0, _beamPosition[1] - Vy); + rk.setElement(2, 0, _beamPosition[2] - Vz); } return rk; } @@ -734,13 +327,21 @@ _beamSize[2] = bs[2]; } + public void setBeamPosition(double[] bp) { + _beamPosition[0] = bp[0]; + _beamPosition[1] = bp[1]; + _beamPosition[2] = bp[2]; + } + public void doBeamSpotConstraint(boolean bsconst) { _beamspotConstraint = bsconst; + _targetConstraint = false; _constraintType = "BeamspotConstrained"; } public void doTargetConstraint(boolean bsconst) { + _beamspotConstraint = false; _targetConstraint = bsconst; _constraintType = "TargetConstrained"; } @@ -797,9 +398,10 @@ } } + @Override public String toString() { - StringBuffer sb = new StringBuffer("Vertex at : \nx= " + _vertexPosition.e(0, 0) + " +/- " + Math.sqrt(_covVtx.e(0, 0)) + "\ny= " + _vertexPosition.e(1, 0) + " +/- " + Math.sqrt(_covVtx.e(1, 1)) + "\nz= " + _vertexPosition.e(2, 0) + " +/- " + Math.sqrt(_covVtx.e(2, 2))); - return sb.toString(); + String sb = "Vertex at : \nx= " + _vertexPosition.e(0, 0) + " +/- " + Math.sqrt(_covVtx.e(0, 0)) + "\ny= " + _vertexPosition.e(1, 0) + " +/- " + Math.sqrt(_covVtx.e(1, 1)) + "\nz= " + _vertexPosition.e(2, 0) + " +/- " + Math.sqrt(_covVtx.e(2, 2)); + return sb; } private void follow1985Paper(List<BilliorTrack> tracks) { @@ -808,8 +410,8 @@ v0.setElement(0, 0, _v0[0]); v0.setElement(1, 0, _v0[1]); v0.setElement(2, 0, _v0[2]); - List<Matrix> params = new ArrayList<Matrix>(); - List<Matrix> q0s = new ArrayList<Matrix>(); +// List<Matrix> params = new ArrayList<Matrix>(); +// List<Matrix> q0s = new ArrayList<Matrix>(); List<Matrix> Gs = new ArrayList<Matrix>(); List<Matrix> Ds = new ArrayList<Matrix>(); List<Matrix> Es = new ArrayList<Matrix>(); @@ -828,11 +430,11 @@ tmpPar.setElement(2, 0, par[2]); tmpPar.setElement(3, 0, par[3]); tmpPar.setElement(4, 0, par[4]); - params.add(tmpPar); +// params.add(tmpPar); double theta = par[2]; - double phiv = par[3]; +// double phiv = par[3]; double rho = par[4]; - double Pt = Math.abs((1. / rho) * _bField * Constants.fieldConversion); +// double Pt = Math.abs((1. / rho) * _bField * Constants.fieldConversion); double cotth = 1. / tan(par[2]); double uu = v0.e(0, 0) * cos(par[3]) + v0.e(1, 0) * sin(par[3]);//Q @@ -858,7 +460,7 @@ q0.setElement(0, 0, theta); q0.setElement(1, 0, phiVert); q0.setElement(2, 0, rho); - q0s.add(q0); +// q0s.add(q0); double cosf = cos(phiVert); double sinf = sin(phiVert); @@ -935,8 +537,8 @@ } //ok, now the momentum - List<Matrix> qtildes = new ArrayList<Matrix>(); - List<Matrix> ptildes = new ArrayList<Matrix>(); +// List<Matrix> qtildes = new ArrayList<Matrix>(); +// List<Matrix> ptildes = new ArrayList<Matrix>(); List<Matrix> C0j = new ArrayList<Matrix>(); List<Matrix> pfit = new ArrayList<Matrix>(); Matrix[][] Cij = new Matrix[2][2];//max 2 tracks...just make this bigger for more @@ -954,9 +556,9 @@ BasicMatrix second = (BasicMatrix) MatrixOp.mult(MatrixOp.inverse(e), MatrixOp.mult(MatrixOp.transposed(b), g)); second = (BasicMatrix) MatrixOp.mult(second, p); BasicMatrix qtilde = (BasicMatrix) MatrixOp.add(first, second); - qtildes.add(qtilde); +// qtildes.add(qtilde); BasicMatrix ptilde = (BasicMatrix) MatrixOp.add(MatrixOp.mult(a, xtilde), MatrixOp.mult(b, qtilde)); - ptildes.add(ptilde); +// ptildes.add(ptilde); chisq += MatrixOp.mult(MatrixOp.transposed(MatrixOp.add(p, MatrixOp.mult(-1, ptilde))), MatrixOp.mult(g, MatrixOp.add(p, MatrixOp.mult(-1, ptilde)))).e(0, 0); if (_debug) { System.out.println("\n\nfollow1985Paper::Track #" + j); @@ -980,12 +582,12 @@ BasicMatrix tmpC0j = (BasicMatrix) MatrixOp.mult(-1, MatrixOp.mult(covVtx, MatrixOp.mult(d, MatrixOp.inverse(e)))); C0j.add(tmpC0j); for (int i = 0; i < _ntracks; i++) { - BasicMatrix ai = (BasicMatrix) As.get(i); - BasicMatrix bi = (BasicMatrix) Bs.get(i); - BasicMatrix di = (BasicMatrix) Ds.get(i); - BasicMatrix ei = (BasicMatrix) Es.get(i); - BasicMatrix gi = (BasicMatrix) Gs.get(i); - BasicMatrix pi = (BasicMatrix) pis.get(i); +// BasicMatrix ai = (BasicMatrix) As.get(i); +// BasicMatrix bi = (BasicMatrix) Bs.get(i); +// BasicMatrix di = (BasicMatrix) Ds.get(i); +// BasicMatrix ei = (BasicMatrix) Es.get(i); +// BasicMatrix gi = (BasicMatrix) Gs.get(i); +// BasicMatrix pi = (BasicMatrix) pis.get(i); BasicMatrix tmpCij = (BasicMatrix) MatrixOp.mult(-1, MatrixOp.mult(MatrixOp.inverse(e), MatrixOp.mult(MatrixOp.transposed(d), tmpC0j))); Cij[i][j] = tmpCij; }