Print

Print


Commit in hps-java/src/main/java/org/lcsim/hps/users/mgraham on MAIN
TwoTrackAnalysis.java+828added 1.1
Class for looking at vertexing & inv. mass from test run.

hps-java/src/main/java/org/lcsim/hps/users/mgraham
TwoTrackAnalysis.java added at 1.1
diff -N TwoTrackAnalysis.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TwoTrackAnalysis.java	20 Nov 2012 19:21:33 -0000	1.1
@@ -0,0 +1,828 @@
+package org.lcsim.hps.users.mgraham;
+
+import Jama.Matrix;
+import Jama.SingularValueDecomposition;
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterStyle;
+import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.hps.monitoring.AIDAFrame;
+import org.lcsim.hps.monitoring.Resettable;
+import org.lcsim.hps.recon.tracking.HPSTrack;
+import org.lcsim.hps.recon.vertexing.HelixConverter;
+import org.lcsim.hps.recon.vertexing.StraightLineTrack;
+import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+
+ @author mgraham
+ */
+public class TwoTrackAnalysis extends Driver implements Resettable {
+
+    private AIDAFrame plotterFrame;
+    private AIDA aida = AIDA.defaultInstance();
+    IPlotter plotter;
+    IPlotter plotter2;
+    IPlotter plotter3;
+    IPlotter plotter4;
+    IPlotter plotter5;
+    IAnalysisFactory fac = aida.analysisFactory();
+    private String trackCollectionName = "MatchedTracks";
+    private double zAtConverter = -674.062;//mm
+    private String outputPlots = null;
+    private boolean isMC = true;
+    private boolean showPlots = false;
+
+    protected void detectorChanged(Detector detector) {
+        aida.tree().cd("/");
+        plotterFrame = new AIDAFrame();
+        plotterFrame.setTitle("HPS Tracking Plots");
+
+        plotter = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter.setTitle("Momentum");
+        IPlotterStyle style = plotter.style();
+        style.dataStyle().fillStyle().setColor("yellow");
+        style.dataStyle().errorBarStyle().setVisible(false);
+        plotter.createRegions(2, 2);
+        plotterFrame.addPlotter(plotter);
+
+        IHistogram1D trkPx = aida.histogram1D("Track Momentum (Px)", 25, -0.25, 0.25);
+        IHistogram1D trkPy = aida.histogram1D("Track Momentum (Py)", 25, -0.1, 0.1);
+        IHistogram1D trkPz = aida.histogram1D("Track Momentum (Pz)", 25, 0, 3.5);
+        IHistogram1D trkChi2 = aida.histogram1D("Track Chi2", 25, 0, 25.0);
+
+        plotter.region(0).plot(trkPx);
+        plotter.region(1).plot(trkPy);
+        plotter.region(2).plot(trkPz);
+        plotter.region(3).plot(trkChi2);
+
+////////////////////////////////////////////////////////////////////
+
+        plotter2 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter2.setTitle("Vertex");
+
+        plotter2.style().dataStyle().fillStyle().setColor("yellow");
+        plotter2.style().dataStyle().errorBarStyle().setVisible(false);
+        plotter2.createRegions(2, 2);
+        plotterFrame.addPlotter(plotter2);
+
+        IHistogram1D xvert = aida.histogram1D("XVertex", 40, -30, 50);
+        IHistogram1D yvert = aida.histogram1D("YVertex", 40, -35, 30);
+        IHistogram1D zvert = aida.histogram1D("ZVertex", 40, -800, -450);
+        IHistogram1D dist = aida.histogram1D("Distance btwn Trks @ Solution", 40, 0, 20);
+        plotter2.region(0).plot(xvert);
+        plotter2.region(1).plot(yvert);
+        plotter2.region(2).plot(zvert);
+        plotter2.region(3).plot(dist);
+        ////////////////////////////////////////////////////////////////////
+
+        plotter4 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter4.setTitle("Vertex w/cut");
+        plotter4.style().dataStyle().fillStyle().setColor("yellow");
+        plotter4.style().dataStyle().errorBarStyle().setVisible(false);
+        plotter4.createRegions(2, 2);
+        plotterFrame.addPlotter(plotter4);
+
+        IHistogram1D xvertns = aida.histogram1D("XVertex no softies", 40, -30, 50);
+        IHistogram1D yvertns = aida.histogram1D("YVertex no softies", 40, -35, 30);
+        IHistogram1D zvertns = aida.histogram1D("ZVertex no softies", 40, -800, -450);
+        IHistogram1D distns = aida.histogram1D("Distance btwn Trks @ Solution no softies", 40, 0, 20);
+        plotter4.region(0).plot(xvertns);
+        plotter4.region(1).plot(yvertns);
+        plotter4.region(2).plot(zvertns);
+        plotter4.region(3).plot(distns);
+////////////////////////////////////////////////////////////////////
+
+        plotter3 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter3.setTitle("Track @ Converter");
+
+        plotter3.style().dataStyle().fillStyle().setColor("yellow");
+        plotter3.style().dataStyle().errorBarStyle().setVisible(false);
+        plotter3.createRegions(2, 2);
+        plotterFrame.addPlotter(plotter3);
+        IHistogram1D xAtConvert = aida.histogram1D("X (mm) @ Converter using Map", 50, -50, 50);
+        IHistogram1D yAtConvert = aida.histogram1D("Y (mm) @ Converter using Map", 50, -20, 20);
+        IHistogram1D xAtConvertSLT = aida.histogram1D("X (mm) @ Converter using SLT", 50, -50, 50);
+        IHistogram1D yAtConvertSLT = aida.histogram1D("Y (mm) @ Converter using SLT", 50, -20, 20);
+        plotter3.region(0).plot(xAtConvert);
+        plotter3.region(1).plot(yAtConvert);
+        plotter3.region(2).plot(xAtConvertSLT);
+        plotter3.region(3).plot(yAtConvertSLT);
+
+         plotter5 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter5.setTitle("Mass");
+
+        plotter5.style().dataStyle().fillStyle().setColor("yellow");
+        plotter5.style().dataStyle().errorBarStyle().setVisible(false);
+        //plotter5.createRegions(2, 2);
+        plotterFrame.addPlotter(plotter5);
+        IHistogram1D invMass = aida.histogram1D("Invariant Mass", 50, 0, .4);
+       
+        plotter5.region(0).plot(invMass);
+       
+        
+       
+        plotterFrame.pack();
+        if(showPlots)   
+            plotterFrame.setVisible(true);
+
+    }
+
+    public void setIsMC(boolean setit) {
+        isMC = setit;
+    }
+
+    public void process(EventHeader event) {
+        aida.tree().cd("/");
+        List<Track> tracks = event.get(Track.class, trackCollectionName);
+        for (Track trk : tracks) {
+            aida.histogram1D("Track Momentum (Px)").fill(trk.getPY());
+            aida.histogram1D("Track Momentum (Py)").fill(trk.getPZ());
+            aida.histogram1D("Track Momentum (Pz)").fill(trk.getPX());
+            aida.histogram1D("Track Chi2").fill(trk.getChi2());
+
+            SeedTrack stEle = (SeedTrack) trk;
+            SeedCandidate seedEle = stEle.getSeedCandidate();
+            HelicalTrackFit ht = seedEle.getHelix();
+            HelixConverter converter = new HelixConverter(0);
+            StraightLineTrack slt = converter.Convert(ht);
+            HPSTrack hpstrack = new HPSTrack(ht);
+            Hep3Vector[] trkatconver = hpstrack.getPositionAtZMap(100, zAtConverter, 1);
+            aida.histogram1D("X (mm) @ Converter using Map").fill(trkatconver[0].x()); // y tracker frame?
+            aida.histogram1D("Y (mm) @ Converter using Map").fill(trkatconver[0].y()); // z tracker frame?
+            aida.histogram1D("X (mm) @ Converter using SLT").fill(slt.getYZAtX(zAtConverter)[0]); // y tracker frame?
+            aida.histogram1D("Y (mm) @ Converter using SLT").fill(slt.getYZAtX(zAtConverter)[1]); // z tracker frame?
+        }
+
+
+        if (tracks.size() == 2) { //uncert can be used here  && (Ytrue || Ytrue2) && (Xtrue || Xtrue2)
+
+            Track trk1 = tracks.get(0);
+            Track trk2 = tracks.get(1);
+            int isTrk1Top = -1;
+            if (trk1.getTrackerHits().get(0).getPosition()[2] > 0) {
+                isTrk1Top = 1;
+            }
+            int isTrk2Top = -1;
+            if (trk2.getTrackerHits().get(0).getPosition()[2] > 0) {
+                isTrk2Top = 1;
+            }
+            boolean topbot = false;
+            if ((isTrk1Top + isTrk2Top) == 0) {
+                topbot = true;
+            }
+
+            SeedTrack stEle1 = (SeedTrack) trk1;
+            SeedCandidate seedEle1 = stEle1.getSeedCandidate();
+            HelicalTrackFit ht1 = seedEle1.getHelix();
+            HelixConverter converter1 = new HelixConverter(0);
+            StraightLineTrack slt1 = converter1.Convert(ht1);
+
+            SeedTrack stEle2 = (SeedTrack) trk2;
+            SeedCandidate seedEle2 = stEle2.getSeedCandidate();
+            HelicalTrackFit ht2 = seedEle2.getHelix();
+            HelixConverter converter2 = new HelixConverter(0);
+            StraightLineTrack slt2 = converter2.Convert(ht2);
+
+//            HPSTrack hpstrack1 = new HPSTrack(ht1);
+//            Hep3Vector[] trkatconver1 = hpstrack1.getPositionAtZMap(100, zAtConverter, 1);
+//            HPSTrack hpstrack2 = new HPSTrack(ht2);
+//            Hep3Vector[] trkatconver2 = hpstrack2.getPositionAtZMap(100, zAtConverter, 1);
+
+            HPSTrack hpstrack1 = new HPSTrack(ht1);
+            Hep3Vector[] trkatconver1 = {new BasicHep3Vector(),new BasicHep3Vector(0,0,0)};
+            HPSTrack hpstrack2 = new HPSTrack(ht2);
+            Hep3Vector[] trkatconver2 = {new BasicHep3Vector(),new BasicHep3Vector(0,0,0)};;
+            if (isMC) {
+                double[] t1 = slt1.getYZAtX(zAtConverter);
+                double[] t2 = slt2.getYZAtX(zAtConverter);
+                trkatconver1[0] = new BasicHep3Vector(t1[0], t1[1], zAtConverter);
+                trkatconver2[0] = new BasicHep3Vector(t2[0], t2[1], zAtConverter);
+            } else {
+                trkatconver1 = hpstrack1.getPositionAtZMap(100, zAtConverter, 1);
+                trkatconver2 = hpstrack2.getPositionAtZMap(100, zAtConverter, 1);
+            }
+            List<TrackerHit> hitsOnTrack1 = trk1.getTrackerHits();
+            int layer1;
+            double y1 = 0;
+            double y2 = 0;
+            double z1 = 0;
+            double z2 = 0;
+            double dely1 = 0;
+            double dely2 = 0;
+            for (TrackerHit hit : hitsOnTrack1) {
+                HelicalTrackHit htc1 = (HelicalTrackHit) hit;
+                layer1 = htc1.Layer();
+                int y1layer = 0;
+                int y2layer = 0;
+                if (y1 == 0) {
+                    y1 = htc1.getPosition()[2]; //
+                    z1 = htc1.getPosition()[0]; // z1 is jlab but the get position refers to hps-tracking
+                    y1layer = layer1;
+                    SymmetricMatrix ErrorHitOne = htc1.getCorrectedCovMatrix();
+                    dely1 = Math.sqrt(ErrorHitOne.diagonal(2)); //y in jlab is z in hps
+                } else {
+
+                    if ((layer1 > y1layer) && (y2layer == 0)) {
+                        y2 = htc1.getPosition()[2]; //
+                        z2 = htc1.getPosition()[0]; // see above comments!
+                        y2layer = layer1;
+                        SymmetricMatrix ErrorHitTwo = htc1.getCorrectedCovMatrix();
+                        dely2 = Math.sqrt(ErrorHitTwo.diagonal(2));
+                    }
+
+                }
+
+            }
+            List<TrackerHit> hitsOnTrack2 = trk2.getTrackerHits();
+
+            double my1 = 0;
+            double my2 = 0;
+            double mz1 = 0;
+            double mz2 = 0;
+            double delymy1 = 0;
+            double delymy2 = 0;
+            int layer2;
+            for (TrackerHit hit : hitsOnTrack2) {
+                HelicalTrackHit htc2 = (HelicalTrackHit) hit;
+//            if (htc.getPosition()[2] < 0) {
+
+                layer2 = htc2.Layer();
+                int my1layer = 0;
+                int my2layer = 0;
+                if (my1 == 0) {
+                    my1 = htc2.getPosition()[2]; //see above comments
+                    mz1 = htc2.getPosition()[0];
+                    my1layer = layer2;
+                    SymmetricMatrix ErrorHitOne = htc2.getCorrectedCovMatrix();
+                    delymy1 = Math.sqrt(ErrorHitOne.diagonal(2));
+                } else {
+                    if ((layer2 > my1layer) && (my2layer == 0)) {
+                        my2 = htc2.getPosition()[2];
+                        mz2 = htc2.getPosition()[0];
+                        my2layer = layer2;
+                        SymmetricMatrix ErrorHitTwo = htc2.getCorrectedCovMatrix();
+                        delymy2 = Math.sqrt(ErrorHitTwo.diagonal(2));
+                    }
+                }
+            }
+            //   double dely = .00001; //mm
+            double b1;
+            double m1;
+            double b2;
+            double m2;
+            boolean check1 = true;
+            if (y1 == 0) {
+                check1 = false;
+            }
+            boolean check2 = true;
+            if (my1 == 0) {
+                check2 = false;
+            }
+            boolean check3 = true;
+            if (my2 == 0) {
+                check3 = false;
+            }
+
+
+
+
+            //-674.062;//mm
+            double X1 = slt1.getYZAtX(zAtConverter)[0];
+            double Y1 = slt1.getYZAtX(zAtConverter)[1];
+
+
+            boolean X1cent = false;
+            boolean Y1cent = false; //for simulation
+
+            if (11 < X1 && X1 < 29) {
+                X1cent = true;
+            }
+            if (-3.5 < Y1 && Y1 < 3.5) {
+                Y1cent = true;
+            }
+
+
+            double X2 = slt2.getYZAtX(zAtConverter)[0];
+            double Y2 = slt2.getYZAtX(zAtConverter)[1];
+
+
+            boolean X2cent = false;
+            boolean Y2cent = false; //for simulation
+            if (11 < X2 && X2 < 29) {
+                X2cent = true;
+            }
+            if (-3.5 < Y2 && Y2 < 3.5) {
+                Y2cent = true;
+            }
+
+            int qtrk1 = trk1.getCharge();
+            int qtrk2 = trk2.getCharge();
+            boolean pm = false;
+            if ((qtrk1 + qtrk2) == 0) {
+                pm = true;
+            }
+
+
+            if (topbot && pm) {
+
+                double b1p;
+                double b2p;
+                double m1p;
+                double m2p;
+
+                if (check1 && check2 && check3) {
+                    if (isTrk1Top == 1) {
+                        double zc = -1 * z1 / (z2 - z1);
+                        b1 = (zc * (y2 - y1 + .5 * (dely2 + dely1))) + y1 - (.5 * dely1);
+                        m1 = (y2 - y1 + .5 * (dely2 + dely1)) / (z2 - z1);
+                        m1p = (y2 - y1 - .5 * (dely2 + dely1)) / (z2 - z1);
+                        b1p = y1 - (m1p * z1) + (.5 * dely1);
+                    } else {
+                        double zc = -1 * z1 / (z2 - z1);
+                        b1 = (zc * (y2 - y1 - .5 * (dely2 + dely1))) + y1 + (.5 * dely1);
+                        m1 = (y2 - y1 - .5 * (dely2 + dely1)) / (z2 - z1);
+                        m1p = (y2 - y1 + .5 * (dely2 + dely1)) / (z2 - z1);
+                        b1p = y1 - (m1p * z1) - (.5 * dely1);
+                    }
+
+                    if (isTrk2Top == 1) {
+                        double zc = -1 * mz1 / (mz2 - mz1);
+                        b2 = (zc * (my2 - my1 + .5 * (delymy2 + delymy1))) + my1 - (.5 * delymy1);
+                        m2 = (my2 - my1 + .5 * (delymy2 + delymy1)) / (mz2 - mz1);
+                        m2p = (my2 - my1 - .5 * (delymy2 + delymy1)) / (mz2 - mz1);
+                        b2p = my1 - (m2p * mz1) + (.5 * delymy1);
+                    } else {
+                        double zc = -1 * mz1 / (mz2 - mz1);
+                        b2 = (zc * (my2 - my1 - .5 * (delymy2 + delymy1))) + my1 + (.5 * delymy1);
+                        m2 = (my2 - my1 - .5 * (delymy2 + delymy1)) / (mz2 - mz1);
+                        m2p = (my2 - my1 + .5 * (delymy2 + delymy1)) / (mz2 - mz1);
+                        b2p = my1 - (m2p * mz1) - (.5 * delymy1);
+                    }
+
+                    double zi = (b2 - b1) / (m1 - m2);
+                    double zr = Math.abs(zi - zAtConverter);
+                    double zs = 2 * zr / 100;
+                    //      System.out.println("Closest Possible Z to Tracker");
+                    //      System.out.println(zi);
+
+
+                    List<double[]> Trk1 = new ArrayList<double[]>();
+                    for (int i = 0; i < 100; i++) {
+                        double z = zAtConverter - zr + (zs * i);
+                        double[] posvec = new double[3];
+                        if (isMC) {
+                            posvec[0] = slt1.getYZAtX(z)[0];
+                             posvec[1] = slt1.getYZAtX(z)[1];
+                              posvec[2] = z;
+                        } else {
+                            Hep3Vector[] trk1atz = hpstrack1.getPositionAtZMap(100, z, 1);
+                            posvec[0] = trk1atz[0].x();
+                            posvec[1] = trk1atz[0].y();
+                            posvec[2] = z;
+                        }
+                        Trk1.add(posvec);
+                    }
+                    //  System.out.println("Vectors ");
+
+                    //  System.out.println(Trk1);
+
+                    double xbar = 0;
+                    double ybar = 0;
+                    double zbar = 0;
+                    double xsqbar = 0;
+                    double ysqbar = 0;
+                    double zsqbar = 0;
+                    int n = 0;
+                    for (double[] inttrk : Trk1) {
+                        //      System.out.println(inttrk[0]);
+                        //    System.out.println(inttrk[1]);
+                        //    System.out.println(inttrk[2]);
+                        xbar = xbar + inttrk[0];
+                        ybar = ybar + inttrk[1];
+                        zbar = zbar + inttrk[2];
+                        n = n + 1;
+                    }
+                    //   System.out.println("n " + n);
+                    xbar = xbar / n;
+                    ybar = ybar / n;
+                    zbar = zbar / n;
+                    //    System.out.println("Xbar is " + xbar);
+                    //    System.out.println("Ybar is " + ybar);
+                    //    System.out.println("Zbar is " + zbar);
+                    Matrix d;
+                    Matrix A = Matrix.random(n, 3);
+                    int j1 = 0;
+                    for (double[] inttrk : Trk1) {
+                        A.set(j1, 0, inttrk[0] - xbar);
+                        A.set(j1, 1, inttrk[1] - ybar);
+                        A.set(j1, 2, inttrk[2] - zbar);
+                        j1++;
+                    }
+
+                    //           System.out.println("Matrix A");
+                    //           A.print(9, 6);
+                    A.svd();
+                    SingularValueDecomposition s = A.svd();
+                    Matrix S = s.getS();
+                    //         System.out.println("S Matrix");
+                    //         S.print(9, 6);
+                    Matrix V = s.getV();
+                    //         System.out.println("V Matrix");
+                    //         V.print(9, 6);
+                    d = V.getMatrix(0, 2, 0, 0);
+                    double[] dd;
+                    dd = new double[3];
+
+                    dd[0] = d.get(0, 0);
+                    dd[1] = d.get(1, 0);
+                    dd[2] = d.get(2, 0);
+                    double nd = Math.sqrt((Math.pow(dd[0], 2)) + (Math.pow(dd[1], 2)) + (Math.pow(dd[2], 2)));
+
+                    for (double[] inttrk : Trk1) {
+                        double t1 = (inttrk[2] - zbar) / dd[2];
+                        double restrk1[];
+                        restrk1 = new double[3];
+                        restrk1[0] = xbar + (t1) * dd[0] - inttrk[0];
+                        restrk1[1] = ybar + (t1) * dd[1] - inttrk[1];
+                        restrk1[2] = zbar + (t1) * dd[2] - inttrk[2];
+                        //aida.histogram1D("X Res Trk1").fill(restrk1[0]);
+                        //aida.histogram1D("Y Res Trk1").fill(restrk1[1]);
+                    }
+
+                    List<double[]> Trk2 = new ArrayList<double[]>();
+                    for (int i = 0; i < 100; i++) {
+                        double z = zAtConverter - zr + (zs * i);
+                        double[] posvec2 = new double[3];
+
+                        if (isMC) {
+                               posvec2[0] = slt2.getYZAtX(z)[0];
+                             posvec2[1] = slt2.getYZAtX(z)[1];
+                              posvec2[2] = z;
+                        } else {
+                            Hep3Vector[] trk2atz = hpstrack2.getPositionAtZMap(100, z, 1);
+                            posvec2[0] = trk2atz[0].x();
+                            posvec2[1] = trk2atz[0].y();
+                            posvec2[2] = z;
+                        }
+                        Trk2.add(posvec2);
+                        //      System.out.println("Components");
+                        //      System.out.println(posvec2[0]);
+                        //      System.out.println(posvec2[1]);
+                        //      System.out.println(posvec2[2]);
+                    }
+                    double xbar2 = 0;
+                    double ybar2 = 0;
+                    double zbar2 = 0;
+                    int n2 = 0;
+                    for (double[] trk : Trk2) {
+                        xbar2 = xbar2 + trk[0];
+                        ybar2 = ybar2 + trk[1];
+                        zbar2 = zbar2 + trk[2];
+                        n2 = n2 + 1;
+                    }
+                    xbar2 = xbar2 / n2;
+                    ybar2 = ybar2 / n2;
+                    zbar2 = zbar2 / n2;
+                    Matrix d2;
+                    Matrix A2 = Matrix.random(n, 3);
+
+                    int j2 = 0;
+                    for (double[] inttrk : Trk2) {
+                        A2.set(j2, 0, inttrk[0] - xbar2);
+                        A2.set(j2, 1, inttrk[1] - ybar2);
+                        A2.set(j2, 2, inttrk[2] - zbar2);
+                        j2++;
+                    }
+
+                    A2.svd();
+                    SingularValueDecomposition s2 = A2.svd();
+                    Matrix V2 = s2.getV();
+                    d2 = V2.getMatrix(0, 2, 0, 0);
+                    double[] d22;
+                    d22 = new double[3];
+                    d22[0] = d2.get(0, 0);
+                    d22[1] = d2.get(1, 0);
+                    d22[2] = d2.get(2, 0);
+                    double nd2 = Math.sqrt((Math.pow(d22[0], 2)) + (Math.pow(d22[1], 2)) + (Math.pow(d22[2], 2)));
+
+                    for (double[] inttrk : Trk2) {
+                        double t2 = (inttrk[2] - zbar2) / d22[2];
+                        double restrk2[];
+                        restrk2 = new double[3];
+                        restrk2[0] = xbar2 + (t2) * d22[0] - inttrk[0];
+                        restrk2[1] = ybar2 + (t2) * d22[1] - inttrk[1];
+                        restrk2[2] = zbar2 + (t2) * d22[2] - inttrk[2];
+                        //aida.histogram1D("X Res Trk2").fill(restrk2[0]);
+                        //aida.histogram1D("Y Res Trk2").fill(restrk2[1]);
+
+                    }
+
+                    //solution for intersection below!! 
+
+                    //starting with costant matrix b
+                    double x11 = Math.pow(nd, 2) - Math.pow(dd[0], 2);
+                    double y11 = Math.pow(nd, 2) - Math.pow(dd[1], 2);
+                    double z11 = Math.pow(nd, 2) - Math.pow(dd[2], 2);
+                    double x22 = Math.pow(nd2, 2) - Math.pow(d22[0], 2);
+                    double y22 = Math.pow(nd2, 2) - Math.pow(d22[1], 2);
+                    double z22 = Math.pow(nd2, 2) - Math.pow(d22[2], 2);
+                    double xy1 = -1 * dd[0] * dd[1];
+                    double xz1 = -1 * dd[0] * dd[2];
+                    double yz1 = -1 * dd[1] * dd[2];
+                    double xy2 = -1 * d22[0] * d22[1];
+                    double xz2 = -1 * d22[0] * d22[2];
+                    double yz2 = -1 * d22[1] * d22[2];
+                    Matrix Intersect = Matrix.random(6, 3);
+                    Intersect.set(0, 0, x11);
+                    Intersect.set(1, 0, xy1);
+                    Intersect.set(2, 0, xz1);
+                    Intersect.set(0, 1, xy1);
+                    Intersect.set(1, 1, y11);
+                    Intersect.set(2, 1, yz1);
+                    Intersect.set(0, 2, xz1);
+                    Intersect.set(1, 2, yz1);
+                    Intersect.set(2, 2, z11);
+
+                    Intersect.set(3, 0, x22);
+                    Intersect.set(4, 0, xy2);
+                    Intersect.set(5, 0, xz2);
+                    Intersect.set(3, 1, xy2);
+                    Intersect.set(4, 1, y22);
+                    Intersect.set(5, 1, yz2);
+                    Intersect.set(3, 2, xz2);
+                    Intersect.set(4, 2, yz2);
+                    Intersect.set(5, 2, z22);
+                    Matrix b = Matrix.random(6, 1);
+                    b.set(0, 0, (x11 * xbar) + (xy1 * ybar) + (xz1 * zbar));
+                    b.set(1, 0, (y11 * ybar) + (xy1 * xbar) + (yz1 * zbar));
+                    b.set(2, 0, (z11 * zbar) + (xz1 * xbar) + (yz1 * ybar));
+                    b.set(3, 0, (x22 * xbar2) + (xy2 * ybar2) + (xz2 * zbar2));
+                    b.set(4, 0, (y22 * ybar2) + (xy2 * xbar2) + (yz2 * zbar2));
+                    b.set(5, 0, (z22 * zbar2) + (xz2 * xbar2) + (yz2 * ybar2));
+
+                    Intersect.svd();
+                    SingularValueDecomposition s3 = Intersect.svd();
+                    Matrix Vint = s3.getV();
+                    Matrix Uint = s3.getU();
+                    Matrix Sint = s3.getS();
+                    //       System.out.println("S Matrix");
+                    //       Sint.print(9, 6);
+                    Matrix VT = Vint.transpose();
+                    Matrix UT = Uint.transpose();
+                    Matrix SI = Sint.inverse();
+                    //      System.out.println("Inverted S Matrix");
+                    //      SI.print(9, 6);
+                    Matrix C1 = VT.times(SI);
+                    Matrix C2 = C1.times(UT);
+                    Matrix C = C2.times(b);
+                    C.print(9, 6);
+                    aida.histogram1D("XVertex").fill(C.get(0, 0));
+                    aida.histogram1D("YVertex").fill(C.get(1, 0));
+                    aida.histogram1D("ZVertex").fill(C.get(2, 0));
+
+                    //aida.histogram2D("X v Y").fill(C.get(0, 0), C.get(1, 0));
+                    //aida.histogram2D("X v Z").fill(C.get(0, 0), C.get(2, 0));
+                    //aida.histogram2D("Y v Z").fill(C.get(1, 0), C.get(2, 0));
+
+                    double zint = C.get(2, 0);
+                    double t1 = (zint - zbar) / dd[2];
+                    double t2 = (zint - zbar2) / d22[2];
+                    double postrk1[];
+                    postrk1 = new double[3];
+                    postrk1[0] = xbar + (t1) * dd[0];
+                    postrk1[1] = ybar + (t1) * dd[1];
+                    postrk1[2] = zbar + (t1) * dd[2];
+                    double postrk2[];
+                    postrk2 = new double[3];
+                    postrk2[0] = xbar2 + (t2) * d22[0];
+                    postrk2[1] = ybar2 + (t2) * d22[1];
+                    postrk2[2] = zbar2 + (t2) * d22[2];
+                    double distance = Math.sqrt(Math.pow(postrk2[0] - postrk1[0], 2) + Math.pow(postrk2[1] - postrk1[1], 2) + Math.pow(postrk2[2] - postrk1[2], 2));
+                    //     double distancex = Math.sqrt(Math.pow(postrk2[0] - postrk1[0], 2));
+                    //   double distancey = Math.sqrt(Math.pow(postrk2[1] - postrk1[1], 2));
+                    aida.histogram1D("Distance btwn Trks @ Solution").fill(distance);
+                    if(trk1.getPX()>0.25&&trk2.getPX()>0.25){
+                         aida.histogram1D("XVertex no softies").fill(C.get(0, 0));
+                    aida.histogram1D("YVertex no softies").fill(C.get(1, 0));
+                    aida.histogram1D("ZVertex no softies").fill(C.get(2, 0));
+                         aida.histogram1D("Distance btwn Trks @ Solution no softies").fill(distance);
+                    }
+                    double tt1 = (zAtConverter - zbar) / dd[2]; //target
+                    double tt2 = (zAtConverter - zbar2) / d22[2]; //target
+                    double postrk1att[];
+                    postrk1att = new double[3]; //target
+                    postrk1att[0] = xbar + (tt1) * dd[0];
+                    postrk1att[1] = ybar + (tt1) * dd[1];
+                    postrk1att[2] = zbar + (tt1) * dd[2];
+                    double postrk2att[]; //target
+                    postrk2att = new double[3];
+                    postrk2att[0] = xbar2 + (tt2) * d22[0];
+                    postrk2att[1] = ybar2 + (tt2) * d22[1];
+                    postrk2att[2] = zbar2 + (tt2) * d22[2];
+
+                    //aida.histogram1D("Trk1 X @ Target").fill(postrk1att[0]);
+                    //aida.histogram1D("Trk1 Y @ Target").fill(postrk1att[1]);
+                    //aida.histogram1D("Trk2 X @ Target").fill(postrk2att[0]);
+                    //aida.histogram1D("Trk2 Y @ Target").fill(postrk2att[1]);
+                    double distanceatt = Math.sqrt(Math.pow(postrk2att[0] - postrk1att[0], 2) + Math.pow(postrk2att[1] - postrk1att[1], 2) + Math.pow(postrk2att[2] - postrk1att[2], 2));
+                    // double zdiff = postrk2att[2] - postrk1att[2];
+                    //aida.histogram1D("Distance btwn Trks @ Target").fill(distanceatt);
+                    // aida.histogram1D("Z Diff").fill(zdiff);
+
+
+                    double uncerty = Math.abs((m1 - m2) * zint + (b1 - b2));
+                    //   double uncertx1 = Math.sqrt(uncertx1sq);
+                    double uncertz1 = Math.sqrt(zr);
+                    //   double uncertx2 = Math.sqrt(uncertx2sq);
+                    double uncertz2 = Math.sqrt(zr);
+                    //   aida.histogram1D("Uncert X Trk 1").fill(uncertx1);
+                    //aida.histogram1D("Uncert Y Trk 1").fill(uncerty);
+                    //aida.histogram1D("Uncert Z Trk 1").fill(uncertz1);
+                    // aida.histogram1D("Uncert X Trk 2").fill(uncerty2);
+                    //aida.histogram1D("Uncert Y Trk 2").fill(uncerty);
+                    //aida.histogram1D("Uncert Z Trk 2").fill(uncertz2);
+                    boolean yzbump1 = false;
+                    if (-18 < C.get(1, 0) && C.get(1, 0) < -12 && -645 < C.get(2, 0) && C.get(2, 0) < -600) {
+                        yzbump1 = true;
+                    }
+                    boolean yzbump2 = false;
+                    if (-4 < C.get(1, 0) && C.get(1, 0) < 4 && -720 < C.get(2, 0) && C.get(2, 0) < -605) {
+                        yzbump2 = true;
+                    }
+                    boolean xybump1 = false;
+                    if (-1 < C.get(0, 0) && C.get(0, 0) < 11 && -20 < C.get(1, 0) && C.get(1, 0) < -13) {
+                        xybump1 = true;
+                    }
+                    boolean xybump2 = false;
+                    if (11 < C.get(0, 0) && C.get(0, 0) < 25 && -4 < C.get(1, 0) && C.get(1, 0) < 3) {
+                        xybump2 = true;
+                    }
+                    int trksparity = 0;
+                    if (isTrk1Top == 1 && qtrk1 == 1) { //top e+ will be far right
+                        trksparity = 6;
+                    }
+                    if (isTrk1Top == 1 && qtrk1 == -1) { //top e- will be right of middle two
+                        trksparity = 4;
+                    }
+                    if (isTrk1Top == -1 && qtrk1 == 1) { // bot e+ will be left of middle two
+                        trksparity = 2;
+                    }
+                    if (isTrk1Top == -1 && qtrk1 == -1) { //bot e- will be far left
+                        trksparity = 0;
+                    }
+                    boolean eplustop = false;
+                    if ((isTrk1Top == 1 && qtrk1 == 1) || (isTrk2Top == 1 && qtrk2 == 1)) {
+                        eplustop = true;
+                    }
+                    if (yzbump1 && xybump1) {
+                        // aida.histogram1D("Little Bump Track Parity").fill(trksparity);
+                    }
+                    if (yzbump2 && xybump2) {
+                        // aida.histogram1D("Big Bump Track Parity").fill(trksparity);
+                    }
+                    if (eplustop) { //read Little bump as e+ top
+                        // aida.histogram1D("Little Bump Track Momenta (Px)").fill(trk1.getPX());
+                        // aida.histogram1D("Little Bump Track Momenta (Py)").fill(trk1.getPY());
+                        // aida.histogram1D("Little Bump Track Momenta (Pz)").fill(trk1.getPZ());
+                        // aida.histogram1D("Little Bump Tracks Chi2").fill(trk1.getChi2());
+                        // aida.histogram1D("Little Bump Track Momenta (Px)").fill(trk2.getPX());
+                        // aida.histogram1D("Little Bump Track Momenta (Py)").fill(trk2.getPY());
+                        // aida.histogram1D("Little Bump Track Momenta (Pz)").fill(trk2.getPZ());
+                        // aida.histogram1D("Little Bump Tracks Chi2").fill(trk2.getChi2());
+                        // aida.histogram1D("Little Bump Sum of Track's Momentums").fill(Math.sqrt(Math.pow((trk1.getPY() + trk2.getPY()), 2) + Math.pow((trk1.getPX() + trk2.getPX()), 2) + Math.pow((trk1.getPZ() + trk2.getPZ()), 2)));
+                        double Etrk1sq = (Math.pow(trkatconver1[1].x(), 2) + Math.pow(trkatconver1[1].y(), 2) + Math.pow(trkatconver1[1].z(), 2));
+                        double Etrk2sq = (Math.pow(trkatconver2[1].x(), 2) + Math.pow(trkatconver2[1].y(), 2) + Math.pow(trkatconver2[1].z(), 2));
+                        double Etrk1 = Math.sqrt(Etrk1sq);
+                        double Etrk2 = Math.sqrt(Etrk2sq);
+                        double p1dotp2 = (trkatconver1[1].x() * trkatconver2[1].x() + trkatconver1[1].y() * trkatconver2[1].y() + trkatconver1[1].z() * trkatconver2[1].z());
+                           aida.histogram1D("Invariant Mass").fill(Math.sqrt(2 * Etrk1 * Etrk2 - 2 * p1dotp2));
+                        if (qtrk1 == 1) {
+                            //       aida.histogram2D("Little Bump P+ vs. P-").fill(Math.sqrt((Math.pow((trk1.getPY()), 2) + Math.pow((trk1.getPX()), 2) + Math.pow((trk1.getPZ()), 2))), Math.sqrt((Math.pow((trk2.getPY()), 2) + Math.pow((trk2.getPX()), 2) + Math.pow((trk2.getPZ()), 2))));
+                        } else {
+                            //      aida.histogram2D("Little Bump P+ vs. P-").fill(Math.sqrt((Math.pow((trk2.getPY()), 2) + Math.pow((trk2.getPX()), 2) + Math.pow((trk2.getPZ()), 2))), Math.sqrt((Math.pow((trk1.getPY()), 2) + Math.pow((trk1.getPX()), 2) + Math.pow((trk1.getPZ()), 2))));
+                        }
+                        //  aida.histogram2D("X v Y - e+ Top").fill(C.get(0, 0), C.get(1, 0));
+                        //  aida.histogram2D("X v Z - e+ Top").fill(C.get(0, 0), C.get(2, 0));
+                        //  aida.histogram2D("Y v Z - e+ Top").fill(C.get(1, 0), C.get(2, 0));
+                    } else { //read Big bump as e- top
+//                        aida.histogram1D("Big Bump Track Momenta (Px)").fill(trk1.getPX());
+//                        aida.histogram1D("Big Bump Track Momenta (Py)").fill(trk1.getPY());
+//                        aida.histogram1D("Big Bump Track Momenta (Pz)").fill(trk1.getPZ());
+//                        aida.histogram1D("Big Bump Tracks Chi2").fill(trk1.getChi2());
+//                        aida.histogram1D("Big Bump Track Momenta (Px)").fill(trk2.getPX());
+//                        aida.histogram1D("Big Bump Track Momenta (Py)").fill(trk2.getPY());
+//                        aida.histogram1D("Big Bump Track Momenta (Pz)").fill(trk2.getPZ());
+//                        aida.histogram1D("Big Bump Tracks Chi2").fill(trk2.getChi2());
+//                        aida.histogram1D("Big Bump Sum of Track's Momentums").fill(Math.sqrt(Math.pow((trk1.getPY() + trk2.getPY()), 2) + Math.pow((trk1.getPX() + trk2.getPX()), 2) + Math.pow((trk1.getPZ() + trk2.getPZ()), 2)));
+                        double Etrk1sq = (Math.pow(trkatconver1[1].x(), 2) + Math.pow(trkatconver1[1].y(), 2) + Math.pow(trkatconver1[1].z(), 2));
+                        double Etrk2sq = (Math.pow(trkatconver2[1].x(), 2) + Math.pow(trkatconver2[1].y(), 2) + Math.pow(trkatconver2[1].z(), 2));
+                        double Etrk1 = Math.sqrt(Etrk1sq);
+                        double Etrk2 = Math.sqrt(Etrk2sq);
+                        double p1dotp2 = (trkatconver1[1].x() * trkatconver2[1].x() + trkatconver1[1].y() * trkatconver2[1].y() + trkatconver1[1].z() * trkatconver2[1].z());
+                          aida.histogram1D("Invariant Mass").fill(Math.sqrt(2 * Etrk1 * Etrk2 - 2 * p1dotp2));
+                        if (qtrk1 == 1) {
+                            //  aida.histogram2D("Big Bump P+ vs. P-").fill(Math.sqrt((Math.pow((trk1.getPY()), 2) + Math.pow((trk1.getPX()), 2) + Math.pow((trk1.getPZ()), 2))), Math.sqrt((Math.pow((trk2.getPY()), 2) + Math.pow((trk2.getPX()), 2) + Math.pow((trk2.getPZ()), 2))));
+                        } else {
+                            // aida.histogram2D("Big Bump P+ vs. P-").fill(Math.sqrt((Math.pow((trk2.getPY()), 2) + Math.pow((trk2.getPX()), 2) + Math.pow((trk2.getPZ()), 2))), Math.sqrt((Math.pow((trk1.getPY()), 2) + Math.pow((trk1.getPX()), 2) + Math.pow((trk1.getPZ()), 2))));
+                        }
+//                        aida.histogram2D("X v Y - e- Top").fill(C.get(0, 0), C.get(1, 0));
+//                        aida.histogram2D("X v Z - e- Top").fill(C.get(0, 0), C.get(2, 0));
+//                        aida.histogram2D("Y v Z - e- Top").fill(C.get(1, 0), C.get(2, 0));
+                    }
+                }
+                boolean check4 = true;
+                if (my2 == 0) {
+                    check4 = false;
+                }
+
+//                aida.histogram1D("Track Distributions").fill(isTrk2Top + isTrk1Top);
+//                aida.histogram1D("Charge Distributions").fill(qtrk1 + qtrk2);
+
+
+                if ((isTrk2Top + isTrk1Top) == 0) {
+//                    aida.histogram1D("Split Track Momenta (Px)").fill(trk1.getPX());
+//                    aida.histogram1D("Split Track Momenta (Py)").fill(trk1.getPY());
+//                    aida.histogram1D("Split Track Momenta (Pz)").fill(trk1.getPZ());
+//                    aida.histogram1D("Split Tracks Chi2").fill(trk1.getChi2());
+//                    aida.histogram1D("Split Track Momenta (Px)").fill(trk2.getPX());
+//                    aida.histogram1D("Split Track Momenta (Py)").fill(trk2.getPY());
+//                    aida.histogram1D("Split Track Momenta (Pz)").fill(trk2.getPZ());
+//                    aida.histogram1D("Split Tracks Chi2").fill(trk2.getChi2());
+                    //     aida.histogram1D("Charge Distributions Split Tracks").fill(qtrk1 + qtrk2);
+                }
+
+                if ((isTrk2Top + isTrk1Top) == 2) {
+//                    aida.histogram1D("Top-Top Track Momenta (Px)").fill(trk1.getPX());
+//                    aida.histogram1D("Top-Top Track Momenta (Py)").fill(trk1.getPY());
+//                    aida.histogram1D("Top-Top Track Momenta (Pz)").fill(trk1.getPZ());
+//                    aida.histogram1D("Top-Top Tracks Chi2").fill(trk1.getChi2());
+//                    aida.histogram1D("Top-Top Track Momenta (Px)").fill(trk2.getPX());
+//                    aida.histogram1D("Top-Top Track Momenta (Py)").fill(trk2.getPY());
+//                    aida.histogram1D("Top-Top Track Momenta (Pz)").fill(trk2.getPZ());
+//                    aida.histogram1D("Top-Top Tracks Chi2").fill(trk2.getChi2());
+                    //     aida.histogram1D("Charge Distributions Non-Split Tracks").fill(qtrk1 + qtrk2);
+                }
+
+
+//                if ((qtrk1 + qtrk2) == 0) {
+//                    aida.histogram1D("Perpendicular Momentum").fill(Math.sqrt(Math.pow((trk1.getPY() + trk2.getPY()), 2) + Math.pow((trk1.getPZ() + trk2.getPZ()), 2)));
+//
+//                    if (qtrk1 == 1) {
+//                        aida.histogram2D("Py+ vs. Py-").fill(trk1.getPY(), trk2.getPY());
+//                        aida.histogram2D("Pz+ vs. Pz-").fill(trk1.getPZ(), trk2.getPZ());
+//                        aida.histogram2D("Total P+ vs. P-").fill(Math.sqrt((Math.pow((trk1.getPY()), 2) + Math.pow((trk1.getPX()), 2) + Math.pow((trk1.getPZ()), 2))), Math.sqrt((Math.pow((trk2.getPY()), 2) + Math.pow((trk2.getPX()), 2) + Math.pow((trk2.getPZ()), 2))));
+//
+//                    } else {
+//                        aida.histogram2D("Py+ vs. Py-").fill(trk2.getPY(), trk1.getPY());
+//                        aida.histogram2D("Pz+ vs. Pz-").fill(trk2.getPZ(), trk1.getPZ());
+//                        aida.histogram2D("Total P+ vs. P-").fill(Math.sqrt((Math.pow((trk2.getPY()), 2) + Math.pow((trk2.getPX()), 2) + Math.pow((trk2.getPZ()), 2))), Math.sqrt((Math.pow((trk1.getPY()), 2) + Math.pow((trk1.getPX()), 2) + Math.pow((trk1.getPZ()), 2))));
+//                    }
+//                }
+
+            }
+
+
+        }
+    }
+
+    @Override
+    public void reset() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public void setOutputPlots(String output) {
+        this.outputPlots = output;
+    }
+     public void setShowPlots(boolean showem) {
+        this.showPlots = showem;
+    }
+
+    public void endOfData() {
+        System.out.println("Output");
+        if (outputPlots != null) {
+            try {
+                aida.saveAs(outputPlots);
+            } catch (IOException ex) {
+                Logger.getLogger(ElwinsTrackingRecon.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+    }
+}
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1