LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  March 2015

HPS-SVN March 2015

Subject:

r2451 - /java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TriggerModule.java

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Sat, 14 Mar 2015 19:27:44 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (1105 lines)

Author: [log in to unmask]
Date: Sat Mar 14 12:27:39 2015
New Revision: 2451

Log:
Updated the TriggerModule class. It now exclusively uses the hardcoded hardware cluster position mappings instead of the LCSim positions. The LCSim coordinate system is fairly different from the hardware system and makes it impossible to align the behavior of the SSP hardware cuts and the simulated software cuts. The original method remains as a deprecated legacy method for LCSim Cluster objects.

Modified:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TriggerModule.java

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TriggerModule.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TriggerModule.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TriggerModule.java	Sat Mar 14 12:27:39 2015
@@ -1,11 +1,11 @@
 package org.hps.recon.ecal.triggerbank;
 
-import java.awt.Point;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.hps.recon.ecal.daqconfig.PairTriggerConfig;
 import org.hps.recon.ecal.daqconfig.SinglesTriggerConfig;
+import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.Cluster;
 
 /**
@@ -72,9 +72,6 @@
     // 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.
@@ -361,6 +358,116 @@
     }
     
     /**
+     * Gets the size of a cluster.
+     * @param cluster - The cluster for which to obtain the size.
+     * @return Returns the size as an <code>int</code>.
+     */
+    public static final double getClusterHitCount(Cluster cluster) {
+    	return cluster.getCalorimeterHits().size();
+    }
+    
+    /**
+     * Gets the seed hit from a <code>Cluster</code> object.
+     * @param cluster - The cluster.
+     * @return Returns the seed hit as a <code>CalorimeterHit</code>
+     * object.
+     */
+    public static final CalorimeterHit getClusterSeedHit(Cluster cluster) {
+    	if(getClusterHitCount(cluster) > 0) {
+    		return cluster.getCalorimeterHits().get(0);
+    	} else {
+    		throw new NullPointerException("Cluster does not define hits!");
+    	}
+    }
+    
+    /**
+     * Gets the time-stamp of a cluster.
+     * @param cluster - The cluster for which to obtain the time.
+     * @return Returns the time as a <code>double</code>.
+     */
+    public static final double getClusterTime(Cluster cluster) {
+    	return getClusterSeedHit(cluster).getTime();
+    }
+    
+    /**
+     * Gets the x-position of a cluster in millimeters in the hardware
+     * coordinate system.
+     * @param cluster - The cluster of which to get the x-position.
+     * @return Returns the cluster x-position.
+     */
+    public static double getClusterX(Cluster cluster) {
+    	return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[0];
+    }
+    
+    /**
+     * Gets the x-position of a cluster in millimeters in the hardware
+     * coordinate system.
+     * @param cluster - The cluster of which to get the x-position.
+     * @return Returns the cluster x-position.
+     */
+    public static double getClusterX(SSPCluster cluster) {
+    	return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[0];
+    }
+    
+    /**
+     * Gets the x-index of a cluster.
+     * @param cluster - The cluster for which to obtain the index.
+     * @return Returns the index as an <code>int</code>.
+     */
+    public static final int getClusterXIndex(Cluster cluster) {
+    	return getClusterSeedHit(cluster).getIdentifierFieldValue("ix");
+    }
+    
+    /**
+     * Gets the y-position of a cluster in millimeters in the hardware
+     * coordinate system.
+     * @param cluster - The cluster of which to get the y-position.
+     * @return Returns the cluster y-position.
+     */
+    public static double getClusterY(Cluster cluster) {
+    	return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[1];
+    }
+    
+    /**
+     * Gets the y-position of a cluster in millimeters in the hardware
+     * coordinate system.
+     * @param cluster - The cluster of which to get the y-position.
+     * @return Returns the cluster y-position.
+     */
+    public static double getClusterY(SSPCluster cluster) {
+    	return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[1];
+    }
+    
+    /**
+     * Gets the y-index of a cluster.
+     * @param cluster - The cluster for which to obtain the index.
+     * @return Returns the index as an <code>int</code>.
+     */
+    public static final int getClusterYIndex(Cluster cluster) {
+    	return getClusterSeedHit(cluster).getIdentifierFieldValue("iy");
+    }
+    
+    /**
+     * Gets the z-position of a cluster in millimeters in the hardware
+     * coordinate system.
+     * @param cluster - The cluster of which to get the z-position.
+     * @return Returns the cluster z-position.
+     */
+    public static double getClusterZ(Cluster cluster) {
+    	return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[2];
+    }
+    
+    /**
+     * Gets the z-position of a cluster in millimeters in the hardware
+     * coordinate system.
+     * @param cluster - The cluster of which to get the z-position.
+     * @return Returns the cluster z-position.
+     */
+    public static double getClusterZ(SSPCluster cluster) {
+    	return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[2];
+    }
+    
+    /**
      * Gets the value used for the cluster total energy cut.
      * @param cluster - The cluster from which the value should be
      * derived.
@@ -419,10 +526,10 @@
     public static double getValueCoplanarity(Cluster[] clusterPair) {
     	// Get the variables used by the calculation.
     	double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) };
-    	double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) };
+    	double z[] = { getClusterZ(clusterPair[0]), getClusterZ(clusterPair[1]) };
     	
     	// Return the calculated value.
-    	return getValueCoplanarity(x, y);
+    	return getValueCoplanarity(x, z);
     }
     
     /**
@@ -434,10 +541,29 @@
     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]) };
+    	double z[] = { getClusterZ(clusterPair[0]), getClusterZ(clusterPair[1]) };
     	
     	// Return the calculated value.
-    	return getValueCoplanarity(x, y);
+    	return getValueCoplanarity(x, z);
+    }
+    
+    /**
+     * Calculates the value used by the coplanarity cut using the LCSim
+     * coordinate system. This method will not match the hardware results.
+     * @param clusterPair - The cluster pair from which the value should
+     * be calculated.
+     * @return Returns the cut value.
+     */
+    @Deprecated
+    public static double getValueCoplanarityLegacy(Cluster[] clusterPair) {
+    	// Get the variables used by the calculation.
+    	double x[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("ix"),
+    			getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("ix") };
+    	double y[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("iy"),
+    			getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("iy") };
+    	
+    	// Return the calculated value.
+    	return getValueCoplanarityLegacy(x, y);
     }
     
     /**
@@ -480,10 +606,10 @@
     	// 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]) };
+    	double z[] = { getClusterZ(clusterPair[0]), getClusterZ(clusterPair[1]) };
     	
     	// Perform the calculation.
-    	return getValueEnergySlope(energy, x, y, energySlopeParamF);
+    	return getValueEnergySlope(energy, x, z, energySlopeParamF);
     }
     
     /**
@@ -498,10 +624,33 @@
     	// 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]) };
+    	double z[] = { getClusterZ(clusterPair[0]), getClusterZ(clusterPair[1]) };
     	
     	// Perform the calculation.
-    	return getValueEnergySlope(energy, x, y, energySlopeParamF);
+    	return getValueEnergySlope(energy, x, z, energySlopeParamF);
+    }
+    
+    /**
+     * Calculates the value used by the energy slope cut the LCSim
+     * coordinate system.  This method will not match the hardware
+     * results.
+     * @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.
+     */
+    @Deprecated
+    public static double getValueEnergySlopeLegacy(Cluster[] clusterPair, double energySlopeParamF) {
+    	// Get the variables used by the calculation.
+    	double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() };
+    	double x[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("ix"),
+    			getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("ix") };
+    	double y[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("iy"),
+    			getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("iy") };
+    	
+    	// Perform the calculation.
+    	return getValueEnergySlopeLegacy(energy, x, y, energySlopeParamF);
     }
     
     /**
@@ -717,20 +866,6 @@
     	return pairTimeCoincidenceCut(getValueTimeCoincidence(clusterPair));
     }
     
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    
     /**
      * Checks whether the argument hit count meets the minimum required
      * hit count.
@@ -811,50 +946,37 @@
     /**
      * Calculates the distance between the origin and a cluster.
      * @param x - The cluster's x-position.
-     * @param y - The cluster's y-position.
+     * @param z - The cluster's z-position.
      * @return Returns displacement of the cluster.
      */
-    private static double getClusterDistance(double x, double y) {
-        return Math.hypot(x - ORIGIN_X, y);
-    }
-    
-    /**
-     * 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(Cluster cluster) {
-    	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];
-    }
-    
-    /**
-     * 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(Cluster cluster) {
-      	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];
-    }
+    private static double getClusterDistance(double x, double z) {
+        return Math.hypot(x, z);
+    }
+    
+    /**
+     * Gets the mapped position used by the SSP for a specific crystal.
+     * @param ix - The crystal x-index.
+     * @param iy - The crystal y-index.
+     * @return Returns the crystal position as a <double</code> array
+     * where the coordinates are ordered from the lowest to highest
+     * index as x, y, z.
+     * @throws IndexOutOfBoundsException Occurs if in either of the
+     * cases where <code>ix == 0</code> or <code>|ix| > 23</code> for
+     * the x-index and either of the cases where <code>iy == 0</code>
+     * or <code>|iy| > 5</code> for the y-index.
+     */
+	private static double[] getCrystalPosition(int ix, int iy) throws IndexOutOfBoundsException {
+		// Make sure that the requested crystal is a valid crystal.
+		if(ix == 0 || ix < -23 || ix > 23) {
+			throw new IndexOutOfBoundsException(String.format("Value \"%d\" is invalid for field x-index.", ix));
+		} if(iy == 0 || iy < -5 || iy > 5) {
+			throw new IndexOutOfBoundsException(String.format("Value \"%d\" is invalid for field y-index.", iy));
+		}
+		
+		// Return the mapped position.
+		if(ix < 1) { return position[5 - iy][22 - ix]; }
+		else { return position[5 - iy][23 - ix]; }
+	}
     
     /**
      * Calculates the value used by the coplanarity cut.
@@ -864,7 +986,29 @@
      * second clusters' y-positions.
      * @return Returns the cluster pair's coplanarity.
      */
-    private static double getValueCoplanarity(double[] x, double y[]) {
+    private static double getValueCoplanarity(double[] x, double z[]) {
+        // Get the cluster angles.
+        int[] clusterAngle = new int[2];
+        for(int i = 0; i < 2; i++) {
+        	clusterAngle[i] = (int) Math.round(Math.atan(x[i] / z[i]) * 180.0 / Math.PI);
+        }
+        
+        // Calculate the coplanarity cut value.
+        return Math.abs(clusterAngle[1] - clusterAngle[0]);
+    }
+    
+    /**
+     * Calculates the value used by the coplanarity cut. This method
+     * is not accurate to the hardware is retained only for legacy
+     * purposes at this time.
+     * @param x - A two-dimensional array consisting of the first and
+     * second clusters' x-positions.
+     * @param y - A two-dimensional array consisting of the first and
+     * second clusters' y-positions.
+     * @return Returns the cluster pair's coplanarity.
+     */
+    @Deprecated
+    private static double getValueCoplanarityLegacy(double[] x, double y[]) {
         // Get the cluster angles.
         double[] clusterAngle = new double[2];
         for(int i = 0; i < 2; i++) {
@@ -893,7 +1037,7 @@
      * energy slope equation E_low + R_min * F.
      * @return Returns the cut value.
      */
-    private static double getValueEnergySlope(double energy[], double x[], double y[], double energySlopeParamF) {
+    private static double getValueEnergySlope(double energy[], double x[], double z[], double energySlopeParamF) {
     	// Determine which cluster is the lower-energy cluster.
     	int lei = energy[0] < energy[1] ? 0 : 1;
     	
@@ -902,7 +1046,33 @@
         double slopeParamE = energy[lei];
         
         // Get the low energy cluster radial distance.
-        double slopeParamR = getClusterDistance(x[lei], y[lei]);
+        double slopeParamR = Math.sqrt((x[lei] * x[lei]) + (z[lei] * z[lei]));
+        
+        // Calculate the energy slope.
+        return slopeParamE + slopeParamR * energySlopeParamF;
+    }
+    
+    /**
+     * Calculates the value used by the energy slope cut. This version
+     * is superseded by the <code>getValueEnergySlope</code>, which
+     * more accurately mirrors the hardware behavior.
+     * @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 cut value.
+     */
+    @Deprecated
+    private static double getValueEnergySlopeLegacy(double energy[], double x[], double y[], double energySlopeParamF) {
+    	// Determine which cluster is the lower-energy cluster.
+    	int lei = energy[0] < energy[1] ? 0 : 1;
+    	
+        // E + R*F
+        // Get the low energy cluster energy.
+        double slopeParamE = energy[lei];
+        
+        // Get the low energy cluster radial distance.
+        double slopeParamR = Math.sqrt((x[lei] * x[lei]) + (y[lei] * y[lei]));
         
         // Calculate the energy slope.
         return slopeParamE + slopeParamR * energySlopeParamF;
@@ -1006,483 +1176,200 @@
     	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 });
-    }
+    /**
+     * An array of the form <code>position[iy][ix]</code> that contains
+     * the hardware SSP position mappings for each crystal. Note that
+     * ix in the array goes from -22 (representing ix = 23) up to 25
+     * (representing ix = 23) and uses array index x = 0 as a valid
+     * parameter, while ix skips zero.
+     */
+	private static final double[][][] position = {
+		{	{ -340.003,   97.065,   87.845 }, { -324.283,   97.450,   87.875 }, { -308.648,   97.810,   87.900 },
+			{ -293.093,   98.150,   87.920 }, { -277.618,   98.470,   87.940 }, { -262.213,   98.765,   87.965 },
+			{ -246.878,   99.040,   87.980 }, { -231.603,   99.290,   87.995 }, { -216.393,   99.520,   88.010 },
+			{ -201.228,   99.725,   88.030 }, { -186.118,   99.905,   88.040 }, { -171.058,  100.070,   88.050 },
+			{ -156.038,  100.205,   88.055 }, { -141.058,  100.325,   88.070 }, { -126.113,  100.415,   88.075 },
+			{ -111.198,  100.485,   88.075 }, {  -96.313,  100.530,   88.080 }, {  -81.453,  100.555,   88.085 },
+			{  -66.608,  100.560,   88.085 }, {  -51.788,  100.540,   88.080 }, {  -36.983,  100.490,   88.075 },
+			{  -22.183,  100.425,   88.075 }, {   -7.393,  100.335,   88.070 }, {    7.393,  100.335,   88.070 },
+			{   22.183,  100.425,   88.075 }, {   36.983,  100.490,   88.075 }, {   51.793,  100.540,   88.080 },
+			{   66.613,  100.560,   88.085 }, {   81.453,  100.555,   88.085 }, {   96.313,  100.530,   88.080 },
+			{  111.198,  100.485,   88.075 }, {  126.113,  100.415,   88.075 }, {  141.053,  100.325,   88.070 },
+			{  156.038,  100.205,   88.055 }, {  171.053,  100.070,   88.050 }, {  186.118,   99.905,   88.040 },
+			{  201.228,   99.725,   88.030 }, {  216.388,   99.520,   88.010 }, {  231.608,   99.290,   87.995 },
+			{  246.878,   99.040,   87.980 }, {  262.218,   98.765,   87.965 }, {  277.623,   98.470,   87.940 },
+			{  293.098,   98.150,   87.920 }, {  308.653,   97.810,   87.900 }, {  324.288,   97.450,   87.875 },
+			{  340.008,   97.065,   87.845 }
+		},
+		{	{ -340.003,   97.040,   72.715 }, { -324.283,   97.420,   72.735 }, { -308.648,   97.785,   72.750 },
+			{ -293.093,   98.125,   72.765 }, { -277.618,   98.450,   72.785 }, { -262.213,   98.745,   72.800 },
+			{ -246.878,   99.015,   72.815 }, { -231.603,   99.265,   72.825 }, { -216.388,   99.495,   72.840 },
+			{ -201.228,   99.700,   72.850 }, { -186.118,   99.885,   72.860 }, { -171.058,  100.045,   72.865 },
+			{ -156.033,  100.185,   72.875 }, { -141.053,  100.300,   72.880 }, { -126.108,  100.395,   72.880 },
+			{ -111.193,  100.460,   72.890 }, {  -96.308,  100.510,   72.890 }, {  -81.448,  100.535,   72.895 },
+			{  -66.608,  100.535,   72.890 }, {  -51.788,  100.510,   72.890 }, {  -36.978,  100.470,   72.890 },
+			{  -22.183,  100.405,   72.880 }, {   -7.388,  100.310,   72.880 }, {    7.393,  100.310,   72.880 },
+			{   22.188,  100.405,   72.885 }, {   36.983,  100.470,   72.890 }, {   51.793,  100.510,   72.890 },
+			{   66.613,  100.535,   72.890 }, {   81.453,  100.535,   72.895 }, {   96.313,  100.510,   72.890 },
+			{  111.198,  100.460,   72.890 }, {  126.113,  100.395,   72.880 }, {  141.063,  100.300,   72.880 },
+			{  156.043,  100.185,   72.875 }, {  171.063,  100.045,   72.865 }, {  186.123,   99.885,   72.860 },
+			{  201.233,   99.700,   72.850 }, {  216.393,   99.495,   72.840 }, {  231.608,   99.265,   72.825 },
+			{  246.883,   99.015,   72.815 }, {  262.218,   98.745,   72.800 }, {  277.623,   98.450,   72.785 },
+			{  293.098,   98.125,   72.765 }, {  308.653,   97.785,   72.750 }, {  324.288,   97.420,   72.735 },
+			{  340.008,   97.040,   72.715 }
+		},
+		{	{ -340.003,   96.990,   57.600 }, { -324.283,   97.375,   57.610 }, { -308.648,   97.740,   57.625 },
+			{ -293.093,   98.080,   57.630 }, { -277.618,   98.395,   57.645 }, { -262.213,   98.700,   57.655 },
+			{ -246.873,   98.970,   57.660 }, { -231.603,   99.220,   57.670 }, { -216.383,   99.450,   57.680 },
+			{ -201.228,   99.660,   57.685 }, { -186.113,   99.840,   57.695 }, { -171.053,  100.005,   57.695 },
+			{ -156.033,  100.140,   57.700 }, { -141.053,  100.255,   57.710 }, { -126.108,  100.345,   57.710 },
+			{ -111.193,  100.420,   57.710 }, {  -96.308,  100.465,   57.715 }, {  -81.448,  100.490,   57.715 },
+			{  -66.608,  100.490,   57.715 }, {  -51.788,  100.470,   57.710 }, {  -36.978,  100.425,   57.710 },
+			{  -22.178,  100.355,   57.710 }, {   -7.388,  100.265,   57.705 }, {    7.398,  100.265,   57.705 },
+			{   22.188,  100.355,   57.710 }, {   36.988,  100.425,   57.710 }, {   51.793,  100.470,   57.710 },
+			{   66.613,  100.490,   57.715 }, {   81.458,  100.490,   57.715 }, {   96.318,  100.465,   57.715 },
+			{  111.198,  100.420,   57.710 }, {  126.118,  100.345,   57.710 }, {  141.063,  100.255,   57.710 },
+			{  156.043,  100.140,   57.700 }, {  171.063,  100.005,   57.695 }, {  186.123,   99.840,   57.695 },
+			{  201.233,   99.660,   57.685 }, {  216.393,   99.450,   57.680 }, {  231.608,   99.220,   57.670 },
+			{  246.883,   98.970,   57.660 }, {  262.218,   98.700,   57.655 }, {  277.623,   98.395,   57.645 },
+			{  293.098,   98.080,   57.630 }, {  308.653,   97.740,   57.625 }, {  324.288,   97.375,   57.610 },
+			{  340.008,   96.990,   57.600 }
+		},
+		{	{ -340.003,   96.925,   42.490 }, { -324.283,   97.305,   42.495 }, { -308.648,   97.675,   42.505 },
+			{ -293.093,   98.010,   42.510 }, { -277.618,   98.330,   42.510 }, { -262.213,   98.625,   42.515 },
+			{ -246.873,   98.900,   42.525 }, { -231.603,   99.155,   42.530 }, { -216.383,   99.385,   42.535 },
+			{ -201.223,   99.590,   42.530 }, { -186.113,   99.775,   42.535 }, { -171.048,   99.930,   42.540 },
+			{ -156.033,  100.070,   42.545 }, { -141.048,  100.185,   42.545 }, { -126.108,  100.280,   42.550 },
+			{ -111.193,  100.350,   42.545 }, {  -96.308,  100.400,   42.545 }, {  -81.448,  100.420,   42.550 },
+			{  -66.608,  100.425,   42.550 }, {  -51.788,  100.405,   42.550 }, {  -36.978,  100.355,   42.545 },
+			{  -22.178,  100.290,   42.545 }, {   -7.388,  100.200,   42.545 }, {    7.398,  100.200,   42.545 },
+			{   22.188,  100.290,   42.545 }, {   36.988,  100.355,   42.545 }, {   51.793,  100.405,   42.550 },
+			{   66.613,  100.425,   42.550 }, {   81.458,  100.420,   42.550 }, {   96.318,  100.400,   42.545 },
+			{  111.198,  100.350,   42.545 }, {  126.118,  100.280,   42.550 }, {  141.063,  100.185,   42.545 },
+			{  156.043,  100.070,   42.545 }, {  171.063,   99.930,   42.540 }, {  186.123,   99.775,   42.535 },
+			{  201.233,   99.590,   42.530 }, {  216.393,   99.385,   42.535 }, {  231.608,   99.155,   42.530 },
+			{  246.883,   98.900,   42.525 }, {  262.218,   98.625,   42.515 }, {  277.628,   98.330,   42.510 },
+			{  293.098,   98.010,   42.510 }, {  308.653,   97.675,   42.505 }, {  324.288,   97.305,   42.495 },
+			{  340.008,   96.925,   42.490 }
+		},
+		{	{ -340.003,   96.830,   27.385 }, { -324.278,   97.215,   27.385 }, { -308.648,   97.575,   27.385 },
+			{ -293.093,   97.915,   27.385 }, { -277.613,   98.240,   27.385 }, { -262.213,   98.535,   27.385 },
+			{ -246.878,   98.810,   27.385 }, { -231.603,   99.060,   27.385 }, { -216.383,   99.290,   27.385 },
+			{ -201.223,   99.495,   27.385 }, { -186.113,   99.680,   27.385 }, { -171.048,   99.840,   27.385 },
+			{ -156.033,   99.980,   27.385 }, { -141.048,  100.095,   27.385 }, { -126.103,  100.185,   27.385 },
+			{ -111.193,  100.255,   27.385 }, {  -96.303,  100.305,   27.385 }, {  -81.448,  100.330,   27.385 },
+			{  -66.608,  100.330,   27.385 }, {  -51.783,  100.310,   27.385 }, {  -36.973,  100.265,   27.385 },
+			{  -22.178,  100.200,   27.385 }, {   -7.388,  100.105,   27.385 }, {    7.403,  100.105,   27.385 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{  156.078,   99.980,   27.385 }, {  171.103,   99.840,   27.385 }, {  186.168,   99.680,   27.385 },
+			{  201.268,   99.495,   27.385 }, {  216.423,   99.290,   27.385 }, {  231.638,   99.060,   27.385 },
+			{  246.913,   98.810,   27.385 }, {  262.248,   98.535,   27.385 }, {  277.658,   98.240,   27.385 },
+			{  293.133,   97.920,   27.385 }, {  308.688,   97.575,   27.385 }, {  324.323,   97.215,   27.385 },
+			{  340.043,   96.830,   27.385 }
+		},
+		{	{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }
+		},
+		{	{ -339.998,   96.840,  -27.330 }, { -324.278,   97.225,  -27.340 }, { -308.643,   97.585,  -27.345 },
+			{ -293.093,   97.925,  -27.350 }, { -277.613,   98.245,  -27.360 }, { -262.213,   98.545,  -27.365 },
+			{ -246.868,   98.820,  -27.365 }, { -231.598,   99.070,  -27.370 }, { -216.383,   99.300,  -27.375 },
+			{ -201.223,   99.505,  -27.380 }, { -186.113,   99.690,  -27.385 }, { -171.048,   99.850,  -27.380 },
+			{ -156.028,   99.990,  -27.385 }, { -141.048,  100.100,  -27.390 }, { -126.103,  100.195,  -27.390 },
+			{ -111.193,  100.265,  -27.395 }, {  -96.303,  100.315,  -27.395 }, {  -81.443,  100.340,  -27.390 },
+			{  -66.603,  100.335,  -27.390 }, {  -51.783,  100.315,  -27.390 }, {  -36.973,  100.275,  -27.395 },
+			{  -22.173,  100.205,  -27.390 }, {   -7.383,  100.115,  -27.385 }, {    7.403,  100.115,  -27.385 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 }, {    0.000,    0.000,    0.000 },
+			{  156.088,   99.985,  -27.385 }, {  171.103,   99.845,  -27.380 }, {  186.168,   99.680,  -27.385 },
+			{  201.268,   99.495,  -27.380 }, {  216.428,   99.290,  -27.375 }, {  231.643,   99.060,  -27.370 },
+			{  246.913,   98.810,  -27.365 }, {  262.258,   98.535,  -27.365 }, {  277.658,   98.240,  -27.360 },
+			{  293.138,   97.925,  -27.350 }, {  308.688,   97.580,  -27.345 }, {  324.323,   97.215,  -27.340 },
+			{  340.043,   96.835,  -27.330 }
+		},
+		{	{ -339.998,   96.930,  -42.435 }, { -324.278,   97.315,  -42.445 }, { -308.648,   97.680,  -42.455 },
+			{ -293.093,   98.015,  -42.470 }, { -277.613,   98.340,  -42.480 }, { -262.208,   98.635,  -42.490 },
+			{ -246.873,   98.910,  -42.500 }, { -231.593,   99.160,  -42.510 }, { -216.383,   99.390,  -42.515 },
+			{ -201.223,   99.595,  -42.525 }, { -186.113,   99.780,  -42.525 }, { -171.048,   99.940,  -42.535 },
+			{ -156.028,  100.080,  -42.540 }, { -141.048,  100.195,  -42.540 }, { -126.103,  100.290,  -42.545 },
+			{ -111.193,  100.355,  -42.550 }, {  -96.303,  100.405,  -42.550 }, {  -81.443,  100.430,  -42.550 },
+			{  -66.608,  100.430,  -42.550 }, {  -51.783,  100.405,  -42.550 }, {  -36.973,  100.365,  -42.550 },
+			{  -22.178,  100.295,  -42.545 }, {   -7.388,  100.205,  -42.545 }, {    7.403,  100.205,  -42.545 },
+			{   22.193,  100.295,  -42.545 }, {   36.988,  100.365,  -42.550 }, {   51.798,  100.405,  -42.550 },
+			{   66.623,  100.430,  -42.550 }, {   81.458,  100.430,  -42.550 }, {   96.318,  100.405,  -42.550 },
+			{  111.208,  100.355,  -42.550 }, {  126.118,  100.290,  -42.545 }, {  141.063,  100.195,  -42.540 },
+			{  156.043,  100.080,  -42.540 }, {  171.063,   99.940,  -42.535 }, {  186.128,   99.780,  -42.525 },
+			{  201.238,   99.595,  -42.525 }, {  216.398,   99.390,  -42.515 }, {  231.613,   99.160,  -42.510 },
+			{  246.888,   98.910,  -42.500 }, {  262.223,   98.635,  -42.490 }, {  277.628,   98.340,  -42.480 },
+			{  293.108,   98.015,  -42.470 }, {  308.663,   97.680,  -42.455 }, {  324.293,   97.315,  -42.445 },
+			{  340.013,   96.930,  -42.435 }
+		},
+		{	{ -339.998,   97.000,  -57.540 }, { -324.278,   97.385,  -57.560 }, { -308.648,   97.745,  -57.575 },
+			{ -293.093,   98.090,  -57.595 }, { -277.613,   98.410,  -57.610 }, { -262.208,   98.705,  -57.625 },
+			{ -246.873,   98.975,  -57.640 }, { -231.593,   99.225,  -57.655 }, { -216.383,   99.455,  -57.665 },
+			{ -201.223,   99.665,  -57.675 }, { -186.113,   99.845,  -57.685 }, { -171.048,  100.010,  -57.690 },
+			{ -156.028,  100.145,  -57.700 }, { -141.048,  100.265,  -57.705 }, { -126.103,  100.355,  -57.710 },
+			{ -111.193,  100.425,  -57.710 }, {  -96.303,  100.475,  -57.720 }, {  -81.443,  100.495,  -57.715 },
+			{  -66.608,  100.500,  -57.720 }, {  -51.783,  100.480,  -57.715 }, {  -36.973,  100.430,  -57.710 },
+			{  -22.178,  100.365,  -57.710 }, {   -7.388,  100.275,  -57.705 }, {    7.403,  100.275,  -57.705 },
+			{   22.193,  100.365,  -57.710 }, {   36.988,  100.430,  -57.710 }, {   51.798,  100.480,  -57.715 },
+			{   66.623,  100.500,  -57.720 }, {   81.458,  100.495,  -57.715 }, {   96.318,  100.475,  -57.720 },
+			{  111.208,  100.425,  -57.710 }, {  126.118,  100.355,  -57.710 }, {  141.063,  100.265,  -57.705 },
+			{  156.043,  100.145,  -57.700 }, {  171.063,  100.010,  -57.690 }, {  186.128,   99.845,  -57.685 },
+			{  201.238,   99.665,  -57.675 }, {  216.398,   99.455,  -57.665 }, {  231.613,   99.225,  -57.655 },
+			{  246.888,   98.975,  -57.640 }, {  262.223,   98.705,  -57.625 }, {  277.628,   98.410,  -57.610 },
+			{  293.108,   98.090,  -57.595 }, {  308.663,   97.745,  -57.575 }, {  324.293,   97.385,  -57.560 },
+			{  340.013,   97.000,  -57.540 }
+		},
+		{	{ -339.998,   97.045,  -72.655 }, { -324.278,   97.435,  -72.680 }, { -308.648,   97.795,  -72.710 },
+			{ -293.093,   98.135,  -72.730 }, { -277.613,   98.455,  -72.750 }, { -262.208,   98.750,  -72.775 },
+			{ -246.873,   99.020,  -72.795 }, { -231.593,   99.280,  -72.810 }, { -216.383,   99.505,  -72.820 },
+			{ -201.223,   99.710,  -72.840 }, { -186.113,   99.895,  -72.850 }, { -171.048,  100.055,  -72.860 },
+			{ -156.028,  100.190,  -72.870 }, { -141.048,  100.305,  -72.880 }, { -126.103,  100.400,  -72.885 },
+			{ -111.193,  100.470,  -72.890 }, {  -96.303,  100.520,  -72.890 }, {  -81.443,  100.540,  -72.895 },
+			{  -66.608,  100.540,  -72.895 }, {  -51.783,  100.520,  -72.895 }, {  -36.973,  100.480,  -72.890 },
+			{  -22.178,  100.405,  -72.885 }, {   -7.388,  100.320,  -72.880 }, {    7.403,  100.320,  -72.880 },
+			{   22.193,  100.405,  -72.885 }, {   36.988,  100.480,  -72.890 }, {   51.798,  100.520,  -72.895 },
+			{   66.623,  100.540,  -72.895 }, {   81.458,  100.540,  -72.895 }, {   96.318,  100.520,  -72.890 },
+			{  111.208,  100.470,  -72.890 }, {  126.118,  100.400,  -72.885 }, {  141.063,  100.305,  -72.880 },
+			{  156.043,  100.190,  -72.870 }, {  171.063,  100.055,  -72.860 }, {  186.128,   99.895,  -72.850 },
+			{  201.238,   99.710,  -72.840 }, {  216.398,   99.505,  -72.820 }, {  231.613,   99.280,  -72.810 },
+			{  246.888,   99.020,  -72.795 }, {  262.223,   98.750,  -72.775 }, {  277.628,   98.455,  -72.750 },
+			{  293.108,   98.135,  -72.730 }, {  308.663,   97.795,  -72.710 }, {  324.293,   97.435,  -72.680 },
+			{  340.013,   97.045,  -72.655 }
+		},
+		{	{ -339.998,   97.070,  -87.790 }, { -324.278,   97.460,  -87.820 }, { -308.648,   97.820,  -87.850 },
+			{ -293.093,   98.160,  -87.885 }, { -277.613,   98.480,  -87.910 }, { -262.208,   98.775,  -87.935 },
+			{ -246.873,   99.050,  -87.960 }, { -231.593,   99.300,  -87.980 }, { -216.383,   99.530,  -88.000 },
+			{ -201.223,   99.735,  -88.015 }, { -186.113,   99.920,  -88.030 }, { -171.048,  100.080,  -88.045 },
+			{ -156.028,  100.215,  -88.055 }, { -141.048,  100.335,  -88.065 }, { -126.103,  100.420,  -88.070 },
+			{ -111.193,  100.490,  -88.075 }, {  -96.303,  100.540,  -88.085 }, {  -81.443,  100.565,  -88.085 },
+			{  -66.608,  100.560,  -88.085 }, {  -51.783,  100.540,  -88.085 }, {  -36.973,  100.500,  -88.080 },
+			{  -22.178,  100.430,  -88.075 }, {   -7.388,  100.340,  -88.065 }, {    7.403,  100.340,  -88.070 },
+			{   22.193,  100.430,  -88.075 }, {   36.988,  100.500,  -88.080 }, {   51.798,  100.540,  -88.085 },
+			{   66.623,  100.560,  -88.085 }, {   81.458,  100.565,  -88.085 }, {   96.318,  100.540,  -88.085 },
+			{  111.208,  100.490,  -88.075 }, {  126.118,  100.420,  -88.070 }, {  141.063,  100.335,  -88.065 },
+			{  156.043,  100.215,  -88.055 }, {  171.063,  100.080,  -88.045 }, {  186.128,   99.915,  -88.030 },
+			{  201.238,   99.735,  -88.015 }, {  216.398,   99.530,  -88.000 }, {  231.613,   99.300,  -87.980 },
+			{  246.888,   99.050,  -87.960 }, {  262.223,   98.775,  -87.935 }, {  277.628,   98.480,  -87.910 },
+			{  293.108,   98.160,  -87.885 }, {  308.663,   97.820,  -87.850 }, {  324.293,   97.460,  -87.820 },
+			{  340.013,   97.070,  -87.790 }
+		}
+	};
 }

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use