Print

Print


Author: [log in to unmask]
Date: Thu Feb 12 12:58:36 2015
New Revision: 2122

Log:
Updated TriggerModule to contain a mapping between crystal indices and crystal location as used by the hardware. This should be considered temporary until it can be implemented into the conditions database. All energy slope and coplanarity implementations now use this mapping. TriggerModule also supports the ability to perform a time cut on cluster pairs. Classes SSPSinglesTrigger and SSPPairTrigger have been updated to include methods that allow users to easily check whether the trigger represents the first or second trigger hardware trigger of its type.

Modified:
    java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/TriggerModule.java
    java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/triggerbank/SSPPairTrigger.java
    java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/triggerbank/SSPSinglesTrigger.java

Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/TriggerModule.java
 =============================================================================
--- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/TriggerModule.java	(original)
+++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/TriggerModule.java	Thu Feb 12 12:58:36 2015
@@ -1,5 +1,6 @@
 package org.hps.readout.ecal;
 
+import java.awt.Point;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -69,6 +70,9 @@
     // Trigger cut settings map.
     private final Map<String, Double> cuts = new HashMap<String, Double>(11);
     
+    // Crystal x/y-index to location map.
+    private static final Map<Point, double[]> locationMap = new HashMap<Point, double[]>(442);
+    
     /**
      * Creates an <code>SSPTriggerModule</code> that accepts all single
      * cluster and cluster pair events.
@@ -370,6 +374,21 @@
     }
     
     /**
+     * Calculates the value used by the coplanarity cut.
+     * @param clusterPair - The cluster pair from which the value should
+     * be calculated.
+     * @return Returns the cut value.
+     */
+    public static double getValueCoplanarity(SSPCluster[] clusterPair) {
+    	// Get the variables used by the calculation.
+    	double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) };
+    	double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) };
+    	
+    	// Return the calculated value.
+    	return getValueCoplanarity(x, y);
+    }
+    
+    /**
      * Calculates the value used by the energy difference cut.
      * @param clusterPair - The cluster pair from which the value should
      * be calculated.
@@ -416,6 +435,24 @@
     }
     
     /**
+     * Calculates the value used by the energy slope cut.
+     * @param clusterPair - The cluster pair from which the value should
+     * be calculated.
+     * @param energySlopeParamF - The value of the variable F in the
+     * energy slope equation E_low + R_min * F.
+     * @return Returns the energy slope value.
+     */
+    public static double getValueEnergySlope(SSPCluster[] clusterPair, double energySlopeParamF) {
+    	// Get the variables used by the calculation.
+    	double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() };
+    	double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) };
+    	double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) };
+    	
+    	// Perform the calculation.
+    	return getValueEnergySlope(energy, x, y, energySlopeParamF);
+    }
+    
+    /**
      * Calculates the value used by the energy sum cut.
      * @param clusterPair - The cluster pair from which the value should
      * be calculated.
@@ -480,6 +517,17 @@
      * the cut and <code>false</code> if it does not.
      */
     public boolean pairCoplanarityCut(Cluster[] clusterPair) {
+        return pairCoplanarityCut(getValueCoplanarity(clusterPair));
+    }
+    
+    /**
+     * Checks if a cluster pair is coplanar to the beam within a given
+     * angle.
+     * @param clusterPair - The cluster pair to check.
+     * @return Returns <code>true</code> if the cluster pair passes
+     * the cut and <code>false</code> if it does not.
+     */
+    public boolean pairCoplanarityCut(SSPCluster[] clusterPair) {
         return pairCoplanarityCut(getValueCoplanarity(clusterPair));
     }
     
@@ -518,6 +566,18 @@
     }
     
     /**
+     * Requires that the distance from the beam of the lowest energy
+     * cluster in a cluster pair satisfies the following:<br/>
+     * <code>E_low + R_min * F < [ Threshold ]</code>
+     * @param clusterPair - The cluster pair to check.
+     * @return Returns <code>true</code> if the cluster pair passes
+     * the cut and <code>false</code> if it does not.
+     */
+    public boolean pairEnergySlopeCut(SSPCluster[] clusterPair) {
+        return pairEnergySlopeCut(getValueEnergySlope(clusterPair, cuts.get(PAIR_ENERGY_SLOPE_F)));
+    }
+    
+    /**
      * Checks if the sum of the energies of the clusters making up a
      * cluster pair is within an energy sum threshold.
      * @param clusterPair - The cluster pair to check.
@@ -712,7 +772,17 @@
      * @return Returns the cluster x-position.
      */
     private static double getClusterX(Cluster cluster) {
-    	return cluster.getCalorimeterHits().get(0).getPosition()[0];
+    	return getCrystalPosition(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"),
+    			cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"))[0];
+    }
+    
+    /**
+     * Gets the x-position of a cluster.
+     * @param cluster - The cluster of which to get the x-position.
+     * @return Returns the cluster x-position.
+     */
+    private static double getClusterX(SSPCluster cluster) {
+    	return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[0];
     }
     
     /**
@@ -721,7 +791,17 @@
      * @return Returns the cluster y-position.
      */
     private static double getClusterY(Cluster cluster) {
-    	return cluster.getCalorimeterHits().get(0).getPosition()[1];
+      	return getCrystalPosition(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"),
+    			cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"))[1];
+    }
+    
+    /**
+     * Gets the y-position of a cluster.
+     * @param cluster - The cluster of which to get the y-position.
+     * @return Returns the cluster y-position.
+     */
+    private static double getClusterY(SSPCluster cluster) {
+    	return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[1];
     }
     
     /**
@@ -873,4 +953,484 @@
     private boolean pairTimeCoincidenceCut(double timeDifference) {
     	return (timeDifference <= cuts.get(PAIR_TIME_COINCIDENCE));
     }
+    
+    
+    
+    
+    
+    /**
+     * Gets the x/y/z location of a crystal from its x/y-indices.
+     * @param ix - The crystal x-index.
+     * @param iy - The crystal y-index.
+     * @return Returns the crystal's x/y/z position in millimeters as
+     * a size-three array of <code>double</code> primitives. Index 0
+     * corresponds to x, 1 to y, and 2 to z.
+     * @throws IllegalArgumentException Occurs if the values given for
+     * <code>ix</code> and <code>iy</code> do not refer to a crystal.
+     */
+    private static final double[] getCrystalPosition(int ix, int iy) throws IllegalArgumentException {
+    	// Make sure that the location map is initialized.
+    	if(locationMap.isEmpty()) { initializeLocationMap(); }
+    	
+    	// Get the mapped location.
+    	double[] location = locationMap.get(new Point(ix, iy));
+    	
+    	// If it is null, produce an error.
+    	if(location == null) {
+    		throw new IllegalArgumentException(
+    				String.format("Crystal indices (%3d, %3d) do not map to a valid location.", ix, iy)
+    		);
+    	}
+    	
+    	// Otherwise, return the location.
+    	return location;
+    }
+    
+    /**
+     * Sets all of the mappings for the crystal index to position map.
+     */
+    private static final void initializeLocationMap() {
+    	locationMap.put(new Point( 23,   5), new double[] { -340.003,   97.065,   87.845 });
+    	locationMap.put(new Point( 22,   5), new double[] { -324.283,   97.450,   87.875 });
+    	locationMap.put(new Point( 21,   5), new double[] { -308.648,   97.810,   87.900 });
+    	locationMap.put(new Point( 20,   5), new double[] { -293.093,   98.150,   87.920 });
+    	locationMap.put(new Point( 19,   5), new double[] { -277.618,   98.470,   87.940 });
+    	locationMap.put(new Point( 18,   5), new double[] { -262.213,   98.765,   87.965 });
+    	locationMap.put(new Point( 17,   5), new double[] { -246.878,   99.040,   87.980 });
+    	locationMap.put(new Point( 16,   5), new double[] { -231.603,   99.290,   87.995 });
+    	locationMap.put(new Point( 15,   5), new double[] { -216.393,   99.520,   88.010 });
+    	locationMap.put(new Point( 14,   5), new double[] { -201.228,   99.725,   88.030 });
+    	locationMap.put(new Point( 13,   5), new double[] { -186.118,   99.905,   88.040 });
+    	locationMap.put(new Point( 12,   5), new double[] { -171.058,  100.070,   88.050 });
+    	locationMap.put(new Point( 11,   5), new double[] { -156.038,  100.205,   88.055 });
+    	locationMap.put(new Point( 10,   5), new double[] { -141.058,  100.325,   88.070 });
+    	locationMap.put(new Point(  9,   5), new double[] { -126.113,  100.415,   88.075 });
+    	locationMap.put(new Point(  8,   5), new double[] { -111.198,  100.485,   88.075 });
+    	locationMap.put(new Point(  7,   5), new double[] {  -96.313,  100.530,   88.080 });
+    	locationMap.put(new Point(  6,   5), new double[] {  -81.453,  100.555,   88.085 });
+    	locationMap.put(new Point(  5,   5), new double[] {  -66.608,  100.560,   88.085 });
+    	locationMap.put(new Point(  4,   5), new double[] {  -51.788,  100.540,   88.080 });
+    	locationMap.put(new Point(  3,   5), new double[] {  -36.983,  100.490,   88.075 });
+    	locationMap.put(new Point(  2,   5), new double[] {  -22.183,  100.425,   88.075 });
+    	locationMap.put(new Point(  1,   5), new double[] {   -7.393,  100.335,   88.070 });
+    	locationMap.put(new Point( -1,   5), new double[] {    7.393,  100.335,   88.070 });
+    	locationMap.put(new Point( -2,   5), new double[] {   22.183,  100.425,   88.075 });
+    	locationMap.put(new Point( -3,   5), new double[] {   36.983,  100.490,   88.075 });
+    	locationMap.put(new Point( -4,   5), new double[] {   51.793,  100.540,   88.080 });
+    	locationMap.put(new Point( -5,   5), new double[] {   66.613,  100.560,   88.085 });
+    	locationMap.put(new Point( -6,   5), new double[] {   81.453,  100.555,   88.085 });
+    	locationMap.put(new Point( -7,   5), new double[] {   96.313,  100.530,   88.080 });
+    	locationMap.put(new Point( -8,   5), new double[] {  111.198,  100.485,   88.075 });
+    	locationMap.put(new Point( -9,   5), new double[] {  126.113,  100.415,   88.075 });
+    	locationMap.put(new Point(-10,   5), new double[] {  141.053,  100.325,   88.070 });
+    	locationMap.put(new Point(-11,   5), new double[] {  156.038,  100.205,   88.055 });
+    	locationMap.put(new Point(-12,   5), new double[] {  171.053,  100.070,   88.050 });
+    	locationMap.put(new Point(-13,   5), new double[] {  186.118,   99.905,   88.040 });
+    	locationMap.put(new Point(-14,   5), new double[] {  201.228,   99.725,   88.030 });
+    	locationMap.put(new Point(-15,   5), new double[] {  216.388,   99.520,   88.010 });
+    	locationMap.put(new Point(-16,   5), new double[] {  231.608,   99.290,   87.995 });
+    	locationMap.put(new Point(-17,   5), new double[] {  246.878,   99.040,   87.980 });
+    	locationMap.put(new Point(-18,   5), new double[] {  262.218,   98.765,   87.965 });
+    	locationMap.put(new Point(-19,   5), new double[] {  277.623,   98.470,   87.940 });
+    	locationMap.put(new Point(-20,   5), new double[] {  293.098,   98.150,   87.920 });
+    	locationMap.put(new Point(-21,   5), new double[] {  308.653,   97.810,   87.900 });
+    	locationMap.put(new Point(-22,   5), new double[] {  324.288,   97.450,   87.875 });
+    	locationMap.put(new Point(-23,   5), new double[] {  340.008,   97.065,   87.845 });
+    	locationMap.put(new Point( 23,   4), new double[] { -340.003,   97.040,   72.715 });
+    	locationMap.put(new Point( 22,   4), new double[] { -324.283,   97.420,   72.735 });
+    	locationMap.put(new Point( 21,   4), new double[] { -308.648,   97.785,   72.750 });
+    	locationMap.put(new Point( 20,   4), new double[] { -293.093,   98.125,   72.765 });
+    	locationMap.put(new Point( 19,   4), new double[] { -277.618,   98.450,   72.785 });
+    	locationMap.put(new Point( 18,   4), new double[] { -262.213,   98.745,   72.800 });
+    	locationMap.put(new Point( 17,   4), new double[] { -246.878,   99.015,   72.815 });
+    	locationMap.put(new Point( 16,   4), new double[] { -231.603,   99.265,   72.825 });
+    	locationMap.put(new Point( 15,   4), new double[] { -216.388,   99.495,   72.840 });
+    	locationMap.put(new Point( 14,   4), new double[] { -201.228,   99.700,   72.850 });
+    	locationMap.put(new Point( 13,   4), new double[] { -186.118,   99.885,   72.860 });
+    	locationMap.put(new Point( 12,   4), new double[] { -171.058,  100.045,   72.865 });
+    	locationMap.put(new Point( 11,   4), new double[] { -156.033,  100.185,   72.875 });
+    	locationMap.put(new Point( 10,   4), new double[] { -141.053,  100.300,   72.880 });
+    	locationMap.put(new Point(  9,   4), new double[] { -126.108,  100.395,   72.880 });
+    	locationMap.put(new Point(  8,   4), new double[] { -111.193,  100.460,   72.890 });
+    	locationMap.put(new Point(  7,   4), new double[] {  -96.308,  100.510,   72.890 });
+    	locationMap.put(new Point(  6,   4), new double[] {  -81.448,  100.535,   72.895 });
+    	locationMap.put(new Point(  5,   4), new double[] {  -66.608,  100.535,   72.890 });
+    	locationMap.put(new Point(  4,   4), new double[] {  -51.788,  100.510,   72.890 });
+    	locationMap.put(new Point(  3,   4), new double[] {  -36.978,  100.470,   72.890 });
+    	locationMap.put(new Point(  2,   4), new double[] {  -22.183,  100.405,   72.880 });
+    	locationMap.put(new Point(  1,   4), new double[] {   -7.388,  100.310,   72.880 });
+    	locationMap.put(new Point( -1,   4), new double[] {    7.393,  100.310,   72.880 });
+    	locationMap.put(new Point( -2,   4), new double[] {   22.188,  100.405,   72.885 });
+    	locationMap.put(new Point( -3,   4), new double[] {   36.983,  100.470,   72.890 });
+    	locationMap.put(new Point( -4,   4), new double[] {   51.793,  100.510,   72.890 });
+    	locationMap.put(new Point( -5,   4), new double[] {   66.613,  100.535,   72.890 });
+    	locationMap.put(new Point( -6,   4), new double[] {   81.453,  100.535,   72.895 });
+    	locationMap.put(new Point( -7,   4), new double[] {   96.313,  100.510,   72.890 });
+    	locationMap.put(new Point( -8,   4), new double[] {  111.198,  100.460,   72.890 });
+    	locationMap.put(new Point( -9,   4), new double[] {  126.113,  100.395,   72.880 });
+    	locationMap.put(new Point(-10,   4), new double[] {  141.063,  100.300,   72.880 });
+    	locationMap.put(new Point(-11,   4), new double[] {  156.043,  100.185,   72.875 });
+    	locationMap.put(new Point(-12,   4), new double[] {  171.063,  100.045,   72.865 });
+    	locationMap.put(new Point(-13,   4), new double[] {  186.123,   99.885,   72.860 });
+    	locationMap.put(new Point(-14,   4), new double[] {  201.233,   99.700,   72.850 });
+    	locationMap.put(new Point(-15,   4), new double[] {  216.393,   99.495,   72.840 });
+    	locationMap.put(new Point(-16,   4), new double[] {  231.608,   99.265,   72.825 });
+    	locationMap.put(new Point(-17,   4), new double[] {  246.883,   99.015,   72.815 });
+    	locationMap.put(new Point(-18,   4), new double[] {  262.218,   98.745,   72.800 });
+    	locationMap.put(new Point(-19,   4), new double[] {  277.623,   98.450,   72.785 });
+    	locationMap.put(new Point(-20,   4), new double[] {  293.098,   98.125,   72.765 });
+    	locationMap.put(new Point(-21,   4), new double[] {  308.653,   97.785,   72.750 });
+    	locationMap.put(new Point(-22,   4), new double[] {  324.288,   97.420,   72.735 });
+    	locationMap.put(new Point(-23,   4), new double[] {  340.008,   97.040,   72.715 });
+    	locationMap.put(new Point( 23,   3), new double[] { -340.003,   96.990,   57.600 });
+    	locationMap.put(new Point( 22,   3), new double[] { -324.283,   97.375,   57.610 });
+    	locationMap.put(new Point( 21,   3), new double[] { -308.648,   97.740,   57.625 });
+    	locationMap.put(new Point( 20,   3), new double[] { -293.093,   98.080,   57.630 });
+    	locationMap.put(new Point( 19,   3), new double[] { -277.618,   98.395,   57.645 });
+    	locationMap.put(new Point( 18,   3), new double[] { -262.213,   98.700,   57.655 });
+    	locationMap.put(new Point( 17,   3), new double[] { -246.873,   98.970,   57.660 });
+    	locationMap.put(new Point( 16,   3), new double[] { -231.603,   99.220,   57.670 });
+    	locationMap.put(new Point( 15,   3), new double[] { -216.383,   99.450,   57.680 });
+    	locationMap.put(new Point( 14,   3), new double[] { -201.228,   99.660,   57.685 });
+    	locationMap.put(new Point( 13,   3), new double[] { -186.113,   99.840,   57.695 });
+    	locationMap.put(new Point( 12,   3), new double[] { -171.053,  100.005,   57.695 });
+    	locationMap.put(new Point( 11,   3), new double[] { -156.033,  100.140,   57.700 });
+    	locationMap.put(new Point( 10,   3), new double[] { -141.053,  100.255,   57.710 });
+    	locationMap.put(new Point(  9,   3), new double[] { -126.108,  100.345,   57.710 });
+    	locationMap.put(new Point(  8,   3), new double[] { -111.193,  100.420,   57.710 });
+    	locationMap.put(new Point(  7,   3), new double[] {  -96.308,  100.465,   57.715 });
+    	locationMap.put(new Point(  6,   3), new double[] {  -81.448,  100.490,   57.715 });
+    	locationMap.put(new Point(  5,   3), new double[] {  -66.608,  100.490,   57.715 });
+    	locationMap.put(new Point(  4,   3), new double[] {  -51.788,  100.470,   57.710 });
+    	locationMap.put(new Point(  3,   3), new double[] {  -36.978,  100.425,   57.710 });
+    	locationMap.put(new Point(  2,   3), new double[] {  -22.178,  100.355,   57.710 });
+    	locationMap.put(new Point(  1,   3), new double[] {   -7.388,  100.265,   57.705 });
+    	locationMap.put(new Point( -1,   3), new double[] {    7.398,  100.265,   57.705 });
+    	locationMap.put(new Point( -2,   3), new double[] {   22.188,  100.355,   57.710 });
+    	locationMap.put(new Point( -3,   3), new double[] {   36.988,  100.425,   57.710 });
+    	locationMap.put(new Point( -4,   3), new double[] {   51.793,  100.470,   57.710 });
+    	locationMap.put(new Point( -5,   3), new double[] {   66.613,  100.490,   57.715 });
+    	locationMap.put(new Point( -6,   3), new double[] {   81.458,  100.490,   57.715 });
+    	locationMap.put(new Point( -7,   3), new double[] {   96.318,  100.465,   57.715 });
+    	locationMap.put(new Point( -8,   3), new double[] {  111.198,  100.420,   57.710 });
+    	locationMap.put(new Point( -9,   3), new double[] {  126.118,  100.345,   57.710 });
+    	locationMap.put(new Point(-10,   3), new double[] {  141.063,  100.255,   57.710 });
+    	locationMap.put(new Point(-11,   3), new double[] {  156.043,  100.140,   57.700 });
+    	locationMap.put(new Point(-12,   3), new double[] {  171.063,  100.005,   57.695 });
+    	locationMap.put(new Point(-13,   3), new double[] {  186.123,   99.840,   57.695 });
+    	locationMap.put(new Point(-14,   3), new double[] {  201.233,   99.660,   57.685 });
+    	locationMap.put(new Point(-15,   3), new double[] {  216.393,   99.450,   57.680 });
+    	locationMap.put(new Point(-16,   3), new double[] {  231.608,   99.220,   57.670 });
+    	locationMap.put(new Point(-17,   3), new double[] {  246.883,   98.970,   57.660 });
+    	locationMap.put(new Point(-18,   3), new double[] {  262.218,   98.700,   57.655 });
+    	locationMap.put(new Point(-19,   3), new double[] {  277.623,   98.395,   57.645 });
+    	locationMap.put(new Point(-20,   3), new double[] {  293.098,   98.080,   57.630 });
+    	locationMap.put(new Point(-21,   3), new double[] {  308.653,   97.740,   57.625 });
+    	locationMap.put(new Point(-22,   3), new double[] {  324.288,   97.375,   57.610 });
+    	locationMap.put(new Point(-23,   3), new double[] {  340.008,   96.990,   57.600 });
+    	locationMap.put(new Point( 23,   2), new double[] { -340.003,   96.925,   42.490 });
+    	locationMap.put(new Point( 22,   2), new double[] { -324.283,   97.305,   42.495 });
+    	locationMap.put(new Point( 21,   2), new double[] { -308.648,   97.675,   42.505 });
+    	locationMap.put(new Point( 20,   2), new double[] { -293.093,   98.010,   42.510 });
+    	locationMap.put(new Point( 19,   2), new double[] { -277.618,   98.330,   42.510 });
+    	locationMap.put(new Point( 18,   2), new double[] { -262.213,   98.625,   42.515 });
+    	locationMap.put(new Point( 17,   2), new double[] { -246.873,   98.900,   42.525 });
+    	locationMap.put(new Point( 16,   2), new double[] { -231.603,   99.155,   42.530 });
+    	locationMap.put(new Point( 15,   2), new double[] { -216.383,   99.385,   42.535 });
+    	locationMap.put(new Point( 14,   2), new double[] { -201.223,   99.590,   42.530 });
+    	locationMap.put(new Point( 13,   2), new double[] { -186.113,   99.775,   42.535 });
+    	locationMap.put(new Point( 12,   2), new double[] { -171.048,   99.930,   42.540 });
+    	locationMap.put(new Point( 11,   2), new double[] { -156.033,  100.070,   42.545 });
+    	locationMap.put(new Point( 10,   2), new double[] { -141.048,  100.185,   42.545 });
+    	locationMap.put(new Point(  9,   2), new double[] { -126.108,  100.280,   42.550 });
+    	locationMap.put(new Point(  8,   2), new double[] { -111.193,  100.350,   42.545 });
+    	locationMap.put(new Point(  7,   2), new double[] {  -96.308,  100.400,   42.545 });
+    	locationMap.put(new Point(  6,   2), new double[] {  -81.448,  100.420,   42.550 });
+    	locationMap.put(new Point(  5,   2), new double[] {  -66.608,  100.425,   42.550 });
+    	locationMap.put(new Point(  4,   2), new double[] {  -51.788,  100.405,   42.550 });
+    	locationMap.put(new Point(  3,   2), new double[] {  -36.978,  100.355,   42.545 });
+    	locationMap.put(new Point(  2,   2), new double[] {  -22.178,  100.290,   42.545 });
+    	locationMap.put(new Point(  1,   2), new double[] {   -7.388,  100.200,   42.545 });
+    	locationMap.put(new Point( -1,   2), new double[] {    7.398,  100.200,   42.545 });
+    	locationMap.put(new Point( -2,   2), new double[] {   22.188,  100.290,   42.545 });
+    	locationMap.put(new Point( -3,   2), new double[] {   36.988,  100.355,   42.545 });
+    	locationMap.put(new Point( -4,   2), new double[] {   51.793,  100.405,   42.550 });
+    	locationMap.put(new Point( -5,   2), new double[] {   66.613,  100.425,   42.550 });
+    	locationMap.put(new Point( -6,   2), new double[] {   81.458,  100.420,   42.550 });
+    	locationMap.put(new Point( -7,   2), new double[] {   96.318,  100.400,   42.545 });
+    	locationMap.put(new Point( -8,   2), new double[] {  111.198,  100.350,   42.545 });
+    	locationMap.put(new Point( -9,   2), new double[] {  126.118,  100.280,   42.550 });
+    	locationMap.put(new Point(-10,   2), new double[] {  141.063,  100.185,   42.545 });
+    	locationMap.put(new Point(-11,   2), new double[] {  156.043,  100.070,   42.545 });
+    	locationMap.put(new Point(-12,   2), new double[] {  171.063,   99.930,   42.540 });
+    	locationMap.put(new Point(-13,   2), new double[] {  186.123,   99.775,   42.535 });
+    	locationMap.put(new Point(-14,   2), new double[] {  201.233,   99.590,   42.530 });
+    	locationMap.put(new Point(-15,   2), new double[] {  216.393,   99.385,   42.535 });
+    	locationMap.put(new Point(-16,   2), new double[] {  231.608,   99.155,   42.530 });
+    	locationMap.put(new Point(-17,   2), new double[] {  246.883,   98.900,   42.525 });
+    	locationMap.put(new Point(-18,   2), new double[] {  262.218,   98.625,   42.515 });
+    	locationMap.put(new Point(-19,   2), new double[] {  277.628,   98.330,   42.510 });
+    	locationMap.put(new Point(-20,   2), new double[] {  293.098,   98.010,   42.510 });
+    	locationMap.put(new Point(-21,   2), new double[] {  308.653,   97.675,   42.505 });
+    	locationMap.put(new Point(-22,   2), new double[] {  324.288,   97.305,   42.495 });
+    	locationMap.put(new Point(-23,   2), new double[] {  340.008,   96.925,   42.490 });
+    	locationMap.put(new Point( 23,   1), new double[] { -340.003,   96.830,   27.385 });
+    	locationMap.put(new Point( 22,   1), new double[] { -324.278,   97.215,   27.385 });
+    	locationMap.put(new Point( 21,   1), new double[] { -308.648,   97.575,   27.385 });
+    	locationMap.put(new Point( 20,   1), new double[] { -293.093,   97.915,   27.385 });
+    	locationMap.put(new Point( 19,   1), new double[] { -277.613,   98.240,   27.385 });
+    	locationMap.put(new Point( 18,   1), new double[] { -262.213,   98.535,   27.385 });
+    	locationMap.put(new Point( 17,   1), new double[] { -246.878,   98.810,   27.385 });
+    	locationMap.put(new Point( 16,   1), new double[] { -231.603,   99.060,   27.385 });
+    	locationMap.put(new Point( 15,   1), new double[] { -216.383,   99.290,   27.385 });
+    	locationMap.put(new Point( 14,   1), new double[] { -201.223,   99.495,   27.385 });
+    	locationMap.put(new Point( 13,   1), new double[] { -186.113,   99.680,   27.385 });
+    	locationMap.put(new Point( 12,   1), new double[] { -171.048,   99.840,   27.385 });
+    	locationMap.put(new Point( 11,   1), new double[] { -156.033,   99.980,   27.385 });
+    	locationMap.put(new Point( 10,   1), new double[] { -141.048,  100.095,   27.385 });
+    	locationMap.put(new Point(  9,   1), new double[] { -126.103,  100.185,   27.385 });
+    	locationMap.put(new Point(  8,   1), new double[] { -111.193,  100.255,   27.385 });
+    	locationMap.put(new Point(  7,   1), new double[] {  -96.303,  100.305,   27.385 });
+    	locationMap.put(new Point(  6,   1), new double[] {  -81.448,  100.330,   27.385 });
+    	locationMap.put(new Point(  5,   1), new double[] {  -66.608,  100.330,   27.385 });
+    	locationMap.put(new Point(  4,   1), new double[] {  -51.783,  100.310,   27.385 });
+    	locationMap.put(new Point(  3,   1), new double[] {  -36.973,  100.265,   27.385 });
+    	locationMap.put(new Point(  2,   1), new double[] {  -22.178,  100.200,   27.385 });
+    	locationMap.put(new Point(  1,   1), new double[] {   -7.388,  100.105,   27.385 });
+    	locationMap.put(new Point( -1,   1), new double[] {    7.403,  100.105,   27.385 });
+    	locationMap.put(new Point(-11,   1), new double[] {  156.078,   99.980,   27.385 });
+    	locationMap.put(new Point(-12,   1), new double[] {  171.103,   99.840,   27.385 });
+    	locationMap.put(new Point(-13,   1), new double[] {  186.168,   99.680,   27.385 });
+    	locationMap.put(new Point(-14,   1), new double[] {  201.268,   99.495,   27.385 });
+    	locationMap.put(new Point(-15,   1), new double[] {  216.423,   99.290,   27.385 });
+    	locationMap.put(new Point(-16,   1), new double[] {  231.638,   99.060,   27.385 });
+    	locationMap.put(new Point(-17,   1), new double[] {  246.913,   98.810,   27.385 });
+    	locationMap.put(new Point(-18,   1), new double[] {  262.248,   98.535,   27.385 });
+    	locationMap.put(new Point(-19,   1), new double[] {  277.658,   98.240,   27.385 });
+    	locationMap.put(new Point(-20,   1), new double[] {  293.133,   97.920,   27.385 });
+    	locationMap.put(new Point(-21,   1), new double[] {  308.688,   97.575,   27.385 });
+    	locationMap.put(new Point(-22,   1), new double[] {  324.323,   97.215,   27.385 });
+    	locationMap.put(new Point(-23,   1), new double[] {  340.043,   96.830,   27.385 });
+    	locationMap.put(new Point( 23,  -1), new double[] { -339.998,   96.840,  -27.330 });
+    	locationMap.put(new Point( 22,  -1), new double[] { -324.278,   97.225,  -27.340 });
+    	locationMap.put(new Point( 21,  -1), new double[] { -308.643,   97.585,  -27.345 });
+    	locationMap.put(new Point( 20,  -1), new double[] { -293.093,   97.925,  -27.350 });
+    	locationMap.put(new Point( 19,  -1), new double[] { -277.613,   98.245,  -27.360 });
+    	locationMap.put(new Point( 18,  -1), new double[] { -262.213,   98.545,  -27.365 });
+    	locationMap.put(new Point( 17,  -1), new double[] { -246.868,   98.820,  -27.365 });
+    	locationMap.put(new Point( 16,  -1), new double[] { -231.598,   99.070,  -27.370 });
+    	locationMap.put(new Point( 15,  -1), new double[] { -216.383,   99.300,  -27.375 });
+    	locationMap.put(new Point( 14,  -1), new double[] { -201.223,   99.505,  -27.380 });
+    	locationMap.put(new Point( 13,  -1), new double[] { -186.113,   99.690,  -27.385 });
+    	locationMap.put(new Point( 12,  -1), new double[] { -171.048,   99.850,  -27.380 });
+    	locationMap.put(new Point( 11,  -1), new double[] { -156.028,   99.990,  -27.385 });
+    	locationMap.put(new Point( 10,  -1), new double[] { -141.048,  100.100,  -27.390 });
+    	locationMap.put(new Point(  9,  -1), new double[] { -126.103,  100.195,  -27.390 });
+    	locationMap.put(new Point(  8,  -1), new double[] { -111.193,  100.265,  -27.395 });
+    	locationMap.put(new Point(  7,  -1), new double[] {  -96.303,  100.315,  -27.395 });
+    	locationMap.put(new Point(  6,  -1), new double[] {  -81.443,  100.340,  -27.390 });
+    	locationMap.put(new Point(  5,  -1), new double[] {  -66.603,  100.335,  -27.390 });
+    	locationMap.put(new Point(  4,  -1), new double[] {  -51.783,  100.315,  -27.390 });
+    	locationMap.put(new Point(  3,  -1), new double[] {  -36.973,  100.275,  -27.395 });
+    	locationMap.put(new Point(  2,  -1), new double[] {  -22.173,  100.205,  -27.390 });
+    	locationMap.put(new Point(  1,  -1), new double[] {   -7.383,  100.115,  -27.385 });
+    	locationMap.put(new Point( -1,  -1), new double[] {    7.403,  100.115,  -27.385 });
+    	locationMap.put(new Point(-11,  -1), new double[] {  156.088,   99.985,  -27.385 });
+    	locationMap.put(new Point(-12,  -1), new double[] {  171.103,   99.845,  -27.380 });
+    	locationMap.put(new Point(-13,  -1), new double[] {  186.168,   99.680,  -27.385 });
+    	locationMap.put(new Point(-14,  -1), new double[] {  201.268,   99.495,  -27.380 });
+    	locationMap.put(new Point(-15,  -1), new double[] {  216.428,   99.290,  -27.375 });
+    	locationMap.put(new Point(-16,  -1), new double[] {  231.643,   99.060,  -27.370 });
+    	locationMap.put(new Point(-17,  -1), new double[] {  246.913,   98.810,  -27.365 });
+    	locationMap.put(new Point(-18,  -1), new double[] {  262.258,   98.535,  -27.365 });
+    	locationMap.put(new Point(-19,  -1), new double[] {  277.658,   98.240,  -27.360 });
+    	locationMap.put(new Point(-20,  -1), new double[] {  293.138,   97.925,  -27.350 });
+    	locationMap.put(new Point(-21,  -1), new double[] {  308.688,   97.580,  -27.345 });
+    	locationMap.put(new Point(-22,  -1), new double[] {  324.323,   97.215,  -27.340 });
+    	locationMap.put(new Point(-23,  -1), new double[] {  340.043,   96.835,  -27.330 });
+    	locationMap.put(new Point( 23,  -2), new double[] { -339.998,   96.930,  -42.435 });
+    	locationMap.put(new Point( 22,  -2), new double[] { -324.278,   97.315,  -42.445 });
+    	locationMap.put(new Point( 21,  -2), new double[] { -308.648,   97.680,  -42.455 });
+    	locationMap.put(new Point( 20,  -2), new double[] { -293.093,   98.015,  -42.470 });
+    	locationMap.put(new Point( 19,  -2), new double[] { -277.613,   98.340,  -42.480 });
+    	locationMap.put(new Point( 18,  -2), new double[] { -262.208,   98.635,  -42.490 });
+    	locationMap.put(new Point( 17,  -2), new double[] { -246.873,   98.910,  -42.500 });
+    	locationMap.put(new Point( 16,  -2), new double[] { -231.593,   99.160,  -42.510 });
+    	locationMap.put(new Point( 15,  -2), new double[] { -216.383,   99.390,  -42.515 });
+    	locationMap.put(new Point( 14,  -2), new double[] { -201.223,   99.595,  -42.525 });
+    	locationMap.put(new Point( 13,  -2), new double[] { -186.113,   99.780,  -42.525 });
+    	locationMap.put(new Point( 12,  -2), new double[] { -171.048,   99.940,  -42.535 });
+    	locationMap.put(new Point( 11,  -2), new double[] { -156.028,  100.080,  -42.540 });
+    	locationMap.put(new Point( 10,  -2), new double[] { -141.048,  100.195,  -42.540 });
+    	locationMap.put(new Point(  9,  -2), new double[] { -126.103,  100.290,  -42.545 });
+    	locationMap.put(new Point(  8,  -2), new double[] { -111.193,  100.355,  -42.550 });
+    	locationMap.put(new Point(  7,  -2), new double[] {  -96.303,  100.405,  -42.550 });
+    	locationMap.put(new Point(  6,  -2), new double[] {  -81.443,  100.430,  -42.550 });
+    	locationMap.put(new Point(  5,  -2), new double[] {  -66.608,  100.430,  -42.550 });
+    	locationMap.put(new Point(  4,  -2), new double[] {  -51.783,  100.405,  -42.550 });
+    	locationMap.put(new Point(  3,  -2), new double[] {  -36.973,  100.365,  -42.550 });
+    	locationMap.put(new Point(  2,  -2), new double[] {  -22.178,  100.295,  -42.545 });
+    	locationMap.put(new Point(  1,  -2), new double[] {   -7.388,  100.205,  -42.545 });
+    	locationMap.put(new Point( -1,  -2), new double[] {    7.403,  100.205,  -42.545 });
+    	locationMap.put(new Point( -2,  -2), new double[] {   22.193,  100.295,  -42.545 });
+    	locationMap.put(new Point( -3,  -2), new double[] {   36.988,  100.365,  -42.550 });
+    	locationMap.put(new Point( -4,  -2), new double[] {   51.798,  100.405,  -42.550 });
+    	locationMap.put(new Point( -5,  -2), new double[] {   66.623,  100.430,  -42.550 });
+    	locationMap.put(new Point( -6,  -2), new double[] {   81.458,  100.430,  -42.550 });
+    	locationMap.put(new Point( -7,  -2), new double[] {   96.318,  100.405,  -42.550 });
+    	locationMap.put(new Point( -8,  -2), new double[] {  111.208,  100.355,  -42.550 });
+    	locationMap.put(new Point( -9,  -2), new double[] {  126.118,  100.290,  -42.545 });
+    	locationMap.put(new Point(-10,  -2), new double[] {  141.063,  100.195,  -42.540 });
+    	locationMap.put(new Point(-11,  -2), new double[] {  156.043,  100.080,  -42.540 });
+    	locationMap.put(new Point(-12,  -2), new double[] {  171.063,   99.940,  -42.535 });
+    	locationMap.put(new Point(-13,  -2), new double[] {  186.128,   99.780,  -42.525 });
+    	locationMap.put(new Point(-14,  -2), new double[] {  201.238,   99.595,  -42.525 });
+    	locationMap.put(new Point(-15,  -2), new double[] {  216.398,   99.390,  -42.515 });
+    	locationMap.put(new Point(-16,  -2), new double[] {  231.613,   99.160,  -42.510 });
+    	locationMap.put(new Point(-17,  -2), new double[] {  246.888,   98.910,  -42.500 });
+    	locationMap.put(new Point(-18,  -2), new double[] {  262.223,   98.635,  -42.490 });
+    	locationMap.put(new Point(-19,  -2), new double[] {  277.628,   98.340,  -42.480 });
+    	locationMap.put(new Point(-20,  -2), new double[] {  293.108,   98.015,  -42.470 });
+    	locationMap.put(new Point(-21,  -2), new double[] {  308.663,   97.680,  -42.455 });
+    	locationMap.put(new Point(-22,  -2), new double[] {  324.293,   97.315,  -42.445 });
+    	locationMap.put(new Point(-23,  -2), new double[] {  340.013,   96.930,  -42.435 });
+    	locationMap.put(new Point( 23,  -3), new double[] { -339.998,   97.000,  -57.540 });
+    	locationMap.put(new Point( 22,  -3), new double[] { -324.278,   97.385,  -57.560 });
+    	locationMap.put(new Point( 21,  -3), new double[] { -308.648,   97.745,  -57.575 });
+    	locationMap.put(new Point( 20,  -3), new double[] { -293.093,   98.090,  -57.595 });
+    	locationMap.put(new Point( 19,  -3), new double[] { -277.613,   98.410,  -57.610 });
+    	locationMap.put(new Point( 18,  -3), new double[] { -262.208,   98.705,  -57.625 });
+    	locationMap.put(new Point( 17,  -3), new double[] { -246.873,   98.975,  -57.640 });
+    	locationMap.put(new Point( 16,  -3), new double[] { -231.593,   99.225,  -57.655 });
+    	locationMap.put(new Point( 15,  -3), new double[] { -216.383,   99.455,  -57.665 });
+    	locationMap.put(new Point( 14,  -3), new double[] { -201.223,   99.665,  -57.675 });
+    	locationMap.put(new Point( 13,  -3), new double[] { -186.113,   99.845,  -57.685 });
+    	locationMap.put(new Point( 12,  -3), new double[] { -171.048,  100.010,  -57.690 });
+    	locationMap.put(new Point( 11,  -3), new double[] { -156.028,  100.145,  -57.700 });
+    	locationMap.put(new Point( 10,  -3), new double[] { -141.048,  100.265,  -57.705 });
+    	locationMap.put(new Point(  9,  -3), new double[] { -126.103,  100.355,  -57.710 });
+    	locationMap.put(new Point(  8,  -3), new double[] { -111.193,  100.425,  -57.710 });
+    	locationMap.put(new Point(  7,  -3), new double[] {  -96.303,  100.475,  -57.720 });
+    	locationMap.put(new Point(  6,  -3), new double[] {  -81.443,  100.495,  -57.715 });
+    	locationMap.put(new Point(  5,  -3), new double[] {  -66.608,  100.500,  -57.720 });
+    	locationMap.put(new Point(  4,  -3), new double[] {  -51.783,  100.480,  -57.715 });
+    	locationMap.put(new Point(  3,  -3), new double[] {  -36.973,  100.430,  -57.710 });
+    	locationMap.put(new Point(  2,  -3), new double[] {  -22.178,  100.365,  -57.710 });
+    	locationMap.put(new Point(  1,  -3), new double[] {   -7.388,  100.275,  -57.705 });
+    	locationMap.put(new Point( -1,  -3), new double[] {    7.403,  100.275,  -57.705 });
+    	locationMap.put(new Point( -2,  -3), new double[] {   22.193,  100.365,  -57.710 });
+    	locationMap.put(new Point( -3,  -3), new double[] {   36.988,  100.430,  -57.710 });
+    	locationMap.put(new Point( -4,  -3), new double[] {   51.798,  100.480,  -57.715 });
+    	locationMap.put(new Point( -5,  -3), new double[] {   66.623,  100.500,  -57.720 });
+    	locationMap.put(new Point( -6,  -3), new double[] {   81.458,  100.495,  -57.715 });
+    	locationMap.put(new Point( -7,  -3), new double[] {   96.318,  100.475,  -57.720 });
+    	locationMap.put(new Point( -8,  -3), new double[] {  111.208,  100.425,  -57.710 });
+    	locationMap.put(new Point( -9,  -3), new double[] {  126.118,  100.355,  -57.710 });
+    	locationMap.put(new Point(-10,  -3), new double[] {  141.063,  100.265,  -57.705 });
+    	locationMap.put(new Point(-11,  -3), new double[] {  156.043,  100.145,  -57.700 });
+    	locationMap.put(new Point(-12,  -3), new double[] {  171.063,  100.010,  -57.690 });
+    	locationMap.put(new Point(-13,  -3), new double[] {  186.128,   99.845,  -57.685 });
+    	locationMap.put(new Point(-14,  -3), new double[] {  201.238,   99.665,  -57.675 });
+    	locationMap.put(new Point(-15,  -3), new double[] {  216.398,   99.455,  -57.665 });
+    	locationMap.put(new Point(-16,  -3), new double[] {  231.613,   99.225,  -57.655 });
+    	locationMap.put(new Point(-17,  -3), new double[] {  246.888,   98.975,  -57.640 });
+    	locationMap.put(new Point(-18,  -3), new double[] {  262.223,   98.705,  -57.625 });
+    	locationMap.put(new Point(-19,  -3), new double[] {  277.628,   98.410,  -57.610 });
+    	locationMap.put(new Point(-20,  -3), new double[] {  293.108,   98.090,  -57.595 });
+    	locationMap.put(new Point(-21,  -3), new double[] {  308.663,   97.745,  -57.575 });
+    	locationMap.put(new Point(-22,  -3), new double[] {  324.293,   97.385,  -57.560 });
+    	locationMap.put(new Point(-23,  -3), new double[] {  340.013,   97.000,  -57.540 });
+    	locationMap.put(new Point( 23,  -4), new double[] { -339.998,   97.045,  -72.655 });
+    	locationMap.put(new Point( 22,  -4), new double[] { -324.278,   97.435,  -72.680 });
+    	locationMap.put(new Point( 21,  -4), new double[] { -308.648,   97.795,  -72.710 });
+    	locationMap.put(new Point( 20,  -4), new double[] { -293.093,   98.135,  -72.730 });
+    	locationMap.put(new Point( 19,  -4), new double[] { -277.613,   98.455,  -72.750 });
+    	locationMap.put(new Point( 18,  -4), new double[] { -262.208,   98.750,  -72.775 });
+    	locationMap.put(new Point( 17,  -4), new double[] { -246.873,   99.020,  -72.795 });
+    	locationMap.put(new Point( 16,  -4), new double[] { -231.593,   99.280,  -72.810 });
+    	locationMap.put(new Point( 15,  -4), new double[] { -216.383,   99.505,  -72.820 });
+    	locationMap.put(new Point( 14,  -4), new double[] { -201.223,   99.710,  -72.840 });
+    	locationMap.put(new Point( 13,  -4), new double[] { -186.113,   99.895,  -72.850 });
+    	locationMap.put(new Point( 12,  -4), new double[] { -171.048,  100.055,  -72.860 });
+    	locationMap.put(new Point( 11,  -4), new double[] { -156.028,  100.190,  -72.870 });
+    	locationMap.put(new Point( 10,  -4), new double[] { -141.048,  100.305,  -72.880 });
+    	locationMap.put(new Point(  9,  -4), new double[] { -126.103,  100.400,  -72.885 });
+    	locationMap.put(new Point(  8,  -4), new double[] { -111.193,  100.470,  -72.890 });
+    	locationMap.put(new Point(  7,  -4), new double[] {  -96.303,  100.520,  -72.890 });
+    	locationMap.put(new Point(  6,  -4), new double[] {  -81.443,  100.540,  -72.895 });
+    	locationMap.put(new Point(  5,  -4), new double[] {  -66.608,  100.540,  -72.895 });
+    	locationMap.put(new Point(  4,  -4), new double[] {  -51.783,  100.520,  -72.895 });
+    	locationMap.put(new Point(  3,  -4), new double[] {  -36.973,  100.480,  -72.890 });
+    	locationMap.put(new Point(  2,  -4), new double[] {  -22.178,  100.405,  -72.885 });
+    	locationMap.put(new Point(  1,  -4), new double[] {   -7.388,  100.320,  -72.880 });
+    	locationMap.put(new Point( -1,  -4), new double[] {    7.403,  100.320,  -72.880 });
+    	locationMap.put(new Point( -2,  -4), new double[] {   22.193,  100.405,  -72.885 });
+    	locationMap.put(new Point( -3,  -4), new double[] {   36.988,  100.480,  -72.890 });
+    	locationMap.put(new Point( -4,  -4), new double[] {   51.798,  100.520,  -72.895 });
+    	locationMap.put(new Point( -5,  -4), new double[] {   66.623,  100.540,  -72.895 });
+    	locationMap.put(new Point( -6,  -4), new double[] {   81.458,  100.540,  -72.895 });
+    	locationMap.put(new Point( -7,  -4), new double[] {   96.318,  100.520,  -72.890 });
+    	locationMap.put(new Point( -8,  -4), new double[] {  111.208,  100.470,  -72.890 });
+    	locationMap.put(new Point( -9,  -4), new double[] {  126.118,  100.400,  -72.885 });
+    	locationMap.put(new Point(-10,  -4), new double[] {  141.063,  100.305,  -72.880 });
+    	locationMap.put(new Point(-11,  -4), new double[] {  156.043,  100.190,  -72.870 });
+    	locationMap.put(new Point(-12,  -4), new double[] {  171.063,  100.055,  -72.860 });
+    	locationMap.put(new Point(-13,  -4), new double[] {  186.128,   99.895,  -72.850 });
+    	locationMap.put(new Point(-14,  -4), new double[] {  201.238,   99.710,  -72.840 });
+    	locationMap.put(new Point(-15,  -4), new double[] {  216.398,   99.505,  -72.820 });
+    	locationMap.put(new Point(-16,  -4), new double[] {  231.613,   99.280,  -72.810 });
+    	locationMap.put(new Point(-17,  -4), new double[] {  246.888,   99.020,  -72.795 });
+    	locationMap.put(new Point(-18,  -4), new double[] {  262.223,   98.750,  -72.775 });
+    	locationMap.put(new Point(-19,  -4), new double[] {  277.628,   98.455,  -72.750 });
+    	locationMap.put(new Point(-20,  -4), new double[] {  293.108,   98.135,  -72.730 });
+    	locationMap.put(new Point(-21,  -4), new double[] {  308.663,   97.795,  -72.710 });
+    	locationMap.put(new Point(-22,  -4), new double[] {  324.293,   97.435,  -72.680 });
+    	locationMap.put(new Point(-23,  -4), new double[] {  340.013,   97.045,  -72.655 });
+    	locationMap.put(new Point( 23,  -5), new double[] { -339.998,   97.070,  -87.790 });
+    	locationMap.put(new Point( 22,  -5), new double[] { -324.278,   97.460,  -87.820 });
+    	locationMap.put(new Point( 21,  -5), new double[] { -308.648,   97.820,  -87.850 });
+    	locationMap.put(new Point( 20,  -5), new double[] { -293.093,   98.160,  -87.885 });
+    	locationMap.put(new Point( 19,  -5), new double[] { -277.613,   98.480,  -87.910 });
+    	locationMap.put(new Point( 18,  -5), new double[] { -262.208,   98.775,  -87.935 });
+    	locationMap.put(new Point( 17,  -5), new double[] { -246.873,   99.050,  -87.960 });
+    	locationMap.put(new Point( 16,  -5), new double[] { -231.593,   99.300,  -87.980 });
+    	locationMap.put(new Point( 15,  -5), new double[] { -216.383,   99.530,  -88.000 });
+    	locationMap.put(new Point( 14,  -5), new double[] { -201.223,   99.735,  -88.015 });
+    	locationMap.put(new Point( 13,  -5), new double[] { -186.113,   99.920,  -88.030 });
+    	locationMap.put(new Point( 12,  -5), new double[] { -171.048,  100.080,  -88.045 });
+    	locationMap.put(new Point( 11,  -5), new double[] { -156.028,  100.215,  -88.055 });
+    	locationMap.put(new Point( 10,  -5), new double[] { -141.048,  100.335,  -88.065 });
+    	locationMap.put(new Point(  9,  -5), new double[] { -126.103,  100.420,  -88.070 });
+    	locationMap.put(new Point(  8,  -5), new double[] { -111.193,  100.490,  -88.075 });
+    	locationMap.put(new Point(  7,  -5), new double[] {  -96.303,  100.540,  -88.085 });
+    	locationMap.put(new Point(  6,  -5), new double[] {  -81.443,  100.565,  -88.085 });
+    	locationMap.put(new Point(  5,  -5), new double[] {  -66.608,  100.560,  -88.085 });
+    	locationMap.put(new Point(  4,  -5), new double[] {  -51.783,  100.540,  -88.085 });
+    	locationMap.put(new Point(  3,  -5), new double[] {  -36.973,  100.500,  -88.080 });
+    	locationMap.put(new Point(  2,  -5), new double[] {  -22.178,  100.430,  -88.075 });
+    	locationMap.put(new Point(  1,  -5), new double[] {   -7.388,  100.340,  -88.065 });
+    	locationMap.put(new Point( -1,  -5), new double[] {    7.403,  100.340,  -88.070 });
+    	locationMap.put(new Point( -2,  -5), new double[] {   22.193,  100.430,  -88.075 });
+    	locationMap.put(new Point( -3,  -5), new double[] {   36.988,  100.500,  -88.080 });
+    	locationMap.put(new Point( -4,  -5), new double[] {   51.798,  100.540,  -88.085 });
+    	locationMap.put(new Point( -5,  -5), new double[] {   66.623,  100.560,  -88.085 });
+    	locationMap.put(new Point( -6,  -5), new double[] {   81.458,  100.565,  -88.085 });
+    	locationMap.put(new Point( -7,  -5), new double[] {   96.318,  100.540,  -88.085 });
+    	locationMap.put(new Point( -8,  -5), new double[] {  111.208,  100.490,  -88.075 });
+    	locationMap.put(new Point( -9,  -5), new double[] {  126.118,  100.420,  -88.070 });
+    	locationMap.put(new Point(-10,  -5), new double[] {  141.063,  100.335,  -88.065 });
+    	locationMap.put(new Point(-11,  -5), new double[] {  156.043,  100.215,  -88.055 });
+    	locationMap.put(new Point(-12,  -5), new double[] {  171.063,  100.080,  -88.045 });
+    	locationMap.put(new Point(-13,  -5), new double[] {  186.128,   99.915,  -88.030 });
+    	locationMap.put(new Point(-14,  -5), new double[] {  201.238,   99.735,  -88.015 });
+    	locationMap.put(new Point(-15,  -5), new double[] {  216.398,   99.530,  -88.000 });
+    	locationMap.put(new Point(-16,  -5), new double[] {  231.613,   99.300,  -87.980 });
+    	locationMap.put(new Point(-17,  -5), new double[] {  246.888,   99.050,  -87.960 });
+    	locationMap.put(new Point(-18,  -5), new double[] {  262.223,   98.775,  -87.935 });
+    	locationMap.put(new Point(-19,  -5), new double[] {  277.628,   98.480,  -87.910 });
+    	locationMap.put(new Point(-20,  -5), new double[] {  293.108,   98.160,  -87.885 });
+    	locationMap.put(new Point(-21,  -5), new double[] {  308.663,   97.820,  -87.850 });
+    	locationMap.put(new Point(-22,  -5), new double[] {  324.293,   97.460,  -87.820 });
+    	locationMap.put(new Point(-23,  -5), new double[] {  340.013,   97.070,  -87.790 });
+    }
 }

Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/triggerbank/SSPPairTrigger.java
 =============================================================================
--- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/triggerbank/SSPPairTrigger.java	(original)
+++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/triggerbank/SSPPairTrigger.java	Thu Feb 12 12:58:36 2015
@@ -17,6 +17,28 @@
      */
     public SSPPairTrigger(boolean isFirstTrigger, int time, int data) {
         super(isFirstTrigger ? SSPData.TRIG_TYPE_PAIR0 : SSPData.TRIG_TYPE_PAIR1, time, data);
+    }
+    
+    /**
+     * Indicates whether the trigger was reported by the first of the
+     * pair triggers.
+     * @return <code>true</code> if the trigger was reported by the
+     * first trigger and <code>false</code> if it was reported by the
+     * second trigger.
+     */
+    public boolean isFirstTrigger() {
+    	return (type == SSPData.TRIG_TYPE_PAIR0);
+    }
+    
+    /**
+     * Indicates whether the trigger was reported by the second of
+     * the pair triggers.
+     * @return <code>true</code> if the trigger was reported by the
+     * second trigger and <code>false</code> if it was reported by
+     * the first trigger.
+     */
+    public boolean isSecondTrigger() {
+    	return (type == SSPData.TRIG_TYPE_PAIR1);
     }
     
     /**

Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/triggerbank/SSPSinglesTrigger.java
 =============================================================================
--- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/triggerbank/SSPSinglesTrigger.java	(original)
+++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/triggerbank/SSPSinglesTrigger.java	Thu Feb 12 12:58:36 2015
@@ -33,7 +33,29 @@
      * by the top crate.
      */
     public boolean isBottom() {
-        return (type == SSPData.TRIG_TYPE_SINGLES0_BOT || type == SSPData.TRIG_TYPE_SINGLES1_BOT);
+        return (type == SSPData.TRIG_TYPE_SINGLES0_BOT) || (type == SSPData.TRIG_TYPE_SINGLES1_BOT);
+    }
+    
+    /**
+     * Indicates whether the trigger was reported by the first of the
+     * singles triggers.
+     * @return <code>true</code> if the trigger was reported by the
+     * first trigger and <code>false</code> if it was reported by the
+     * second trigger.
+     */
+    public boolean isFirstTrigger() {
+    	return (type == SSPData.TRIG_TYPE_SINGLES0_BOT) || (type == SSPData.TRIG_TYPE_SINGLES0_TOP);
+    }
+    
+    /**
+     * Indicates whether the trigger was reported by the second of
+     * the singles triggers.
+     * @return <code>true</code> if the trigger was reported by the
+     * second trigger and <code>false</code> if it was reported by
+     * the first trigger.
+     */
+    public boolean isSecondTrigger() {
+    	return (type == SSPData.TRIG_TYPE_SINGLES1_BOT) || (type == SSPData.TRIG_TYPE_SINGLES1_TOP);
     }
     
     /**