Print

Print


Author: ngraf
Date: Wed Nov  5 13:46:05 2014
New Revision: 1442

Log:
Enable writing of millepedeII binary files.

Modified:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblData.java   (contents, props changed)
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblTrajectory.java   (contents, props changed)
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java   (contents, props changed)
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MilleBinary.java   (contents, props changed)

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblData.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblData.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblData.java	Wed Nov  5 13:46:05 2014
@@ -1,5 +1,6 @@
 package org.hps.recon.tracking.gbl;
 
+import static java.lang.Math.sqrt;
 import java.util.ArrayList;
 import java.util.List;
 import org.hps.recon.tracking.gbl.matrix.Matrix;
@@ -270,27 +271,27 @@
         return theParameters.size();
     }
 
-//
-///// Get all Data for MP-II binary record.
-///**
-// * \param [out] fValue Value
-// * \param [out] fErr Error
-// * \param [out] indLocal List of labels of local parameters
-// * \param [out] derLocal List of derivatives for local parameters
-// * \param [out] labGlobal List of labels of global parameters
-// * \param [out] derGlobal List of derivatives for global parameters
-// */
-//void getAllData(float &fValue, float &fErr,
-//		std::vector<unsigned int>* &indLocal, std::vector<double>* &derLocal,
-//		std::vector<int>* &labGlobal, std::vector<double>* &derGlobal) {
-//	fValue = theValue;
-//	fErr = 1.0 / sqrt(thePrecision);
-//	indLocal = &theParameters;
-//	derLocal = &theDerivatives;
-//	labGlobal = &globalLabels;
-//	derGlobal = &globalDerivatives;
-//}
-//
+
+/// Get all Data for MP-II binary record.
+/**
+ * \param [out] fValue Value
+ * \param [out] fErr Error
+ * \param [out] indLocal List of labels of local parameters
+ * \param [out] derLocal List of derivatives for local parameters
+ * \param [out] labGlobal List of labels of global parameters
+ * \param [out] derGlobal List of derivatives for global parameters
+ */
+void getAllData(float[] floats,
+		List<Integer> indLocal, List<Double> derLocal,
+		List<Integer> labGlobal, List<Double> derGlobal) {
+	floats[0] = (float)theValue;
+	floats[1] = (float) (1.0 / sqrt(thePrecision));
+	indLocal.addAll(theParameters);
+	derLocal.addAll(theDerivatives);
+	labGlobal.addAll(globalLabels);
+	derGlobal.addAll(globalDerivatives);
+}
+
 ///// Get data for residual (and errors).
 ///**
 // * \param [out] aResidual Measurement-Prediction

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblTrajectory.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblTrajectory.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblTrajectory.java	Wed Nov  5 13:46:05 2014
@@ -34,11 +34,6 @@
     public void fit(double m_chi2, int m_ndf, int m_lost_weight)
     {
         // TODO Auto-generated method stub
-    }
-
-    public void milleOut(MilleBinary mille)
-    {
-        // TODO implement binary writeout of millepedeII data
     }
 
     /**
@@ -756,30 +751,27 @@
         return ierr;
     }
 
-    //TODO Implement the millepedeII output
-///// Write trajectory to Millepede-II binary file.
-//void milleOut(MilleBinary &aMille) {
-//	float fValue;
-//	float fErr;
-//	List< int>* indLocal;
-//	List<double>* derLocal;
-//	List<int>* labGlobal;
-//	List<double>* derGlobal;
-//
-//	if (not constructOK)
-//		return;
-//
-////   data: measurements, kinks and external seed
-//	List<GblData>::iterator itData;
-//	for (itData = theData.begin(); itData != theData.end(); ++itData) {
-//		itData->getAllData(fValue, fErr, indLocal, derLocal, labGlobal,
-//				derGlobal);
-//		aMille.addData(fValue, fErr, *indLocal, *derLocal, *labGlobal,
-//				*derGlobal);
-//	}
-//	aMille.writeRecord();
-//}
+
+// Write trajectory to Millepede-II binary file.
+    public void milleOut(MilleBinary aMille)
+    {
+        if (!constructOK) {
+            throw new RuntimeException("GblTrajectory milleOut not properly constructed");
+        }
+//   data: measurements, kinks and external seed
+        for (GblData d : theData) {
+            float[] floats = new float[2]; // fValue , fErr
+            List<Integer> indLocal = new ArrayList<Integer>();
+            List<Double> derLocal = new ArrayList<Double>();
+            List<Integer> labGlobal = new ArrayList<Integer>();
+            List<Double> derGlobal = new ArrayList<Double>();
+            d.getAllData(floats, indLocal, derLocal, labGlobal, derGlobal);
+            aMille.addData(floats[0], floats[1], indLocal, derLocal, labGlobal, derGlobal);
+        }
+        aMille.writeRecord();
+    }
 /// Print GblTrajectory
+
     /**
      * \param [in] level print level (0: minimum, >0: more)
      */

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java	Wed Nov  5 13:46:05 2014
@@ -23,9 +23,9 @@
 import org.hps.recon.tracking.gbl.matrix.Vector;
 
 /**
- * A Driver which refits tracks using GBL. 
- * Modeled on the hps-dst code written by Per Hansson and Omar Moreno. 
- * Requires the GBL Collections and Relations to be present in the event.
+ * A Driver which refits tracks using GBL. Modeled on the hps-dst code written
+ * by Per Hansson and Omar Moreno. Requires the GBL Collections and Relations to
+ * be present in the event.
  *
  * @author Norman A Graf
  *
@@ -39,9 +39,43 @@
     private final String track2GblTrackRelationName = "TrackToGBLTrack";
     private final String gblTrack2StripRelationName = "GBLTrackToStripData";
 
+    private MilleBinary mille;
+    private String milleBinaryFileName = MilleBinary.DEFAULT_OUTPUT_FILE_NAME;
+    private boolean writeMilleBinary = false;
+
     public void setDebug(boolean debug)
     {
         _debug = debug;
+    }
+
+    public void setMilleBinaryFileName(String filename)
+    {
+        milleBinaryFileName = filename;
+    }
+
+    public void setWriteMilleBinary(boolean writeMillepedeFile)
+    {
+        writeMilleBinary = writeMillepedeFile;
+    }
+
+    public HpsGblRefitter()
+    {
+    }
+
+    @Override
+    protected void startOfData()
+    {
+        if (writeMilleBinary) {
+            mille = new MilleBinary(milleBinaryFileName);
+        }
+    }
+
+    @Override
+    protected void endOfData()
+    {
+        if (writeMilleBinary) {
+            mille.close();
+        }
     }
 
     @Override
@@ -376,7 +410,9 @@
         }
 
 //	// write to MP binary file
-//	traj.milleOut(mille);
+        if (writeMilleBinary) {
+            traj.milleOut(mille);
+        }
 //
         return 0;
     }

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MilleBinary.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MilleBinary.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MilleBinary.java	Wed Nov  5 13:46:05 2014
@@ -123,8 +123,8 @@
      */
         public void writeRecord()
     {
-        int recordLength = _intBuffer.size() * 2;
-        ByteBuffer b = ByteBuffer.allocate((recordLength + 1) * 2);
+        int recordLength = _intBuffer.size() * 2 * 4; // writing both ints and floats, each is 4 bytes
+        ByteBuffer b = ByteBuffer.allocate((recordLength + 1) * 2); // writing one extra word per collection
         b.order(ByteOrder.LITTLE_ENDIAN);
         b.putInt(recordLength);
         for (Float f : _floatBuffer) {