Print

Print


Author: phansson
Date: Tue Oct 28 10:04:05 2014
New Revision: 1323

Log:
New interface b/w Millepede and compact. Not tested yet.

Added:
    java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java

Added: java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java	(added)
+++ java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java	Tue Oct 28 10:04:05 2014
@@ -0,0 +1,197 @@
+package org.hps.svt.alignment;
+
+/**
+ * Class building a new compact.xml detector based on MillepedeII input corrections
+ * @author phansson
+ * created on 1/15/2014
+ */
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.cli.PosixParser;
+import org.hps.conditions.deprecated.HPSSVTSensorSetup;
+import org.hps.conditions.deprecated.SvtUtils;
+import org.hps.recon.tracking.CoordinateTransformations;
+import org.jdom.DataConversionException;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.XMLOutputter;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.GeometryReader;
+import org.lcsim.geometry.compact.converter.MilleParameter;
+import org.lcsim.util.xml.ElementFactory.ElementCreationException;
+
+
+public class BuildMillepedeCompact {
+
+	private static Options createCmdLineOpts() {
+		Options options = new Options();
+		options.addOption(new Option("c",true,"The path to the compact xml file."));
+		options.addOption(new Option("o",true,"The name of the new compact xml file."));
+		return options;
+	}
+	
+	private static void printHelpAndExit(Options options) {
+		HelpFormatter help = new HelpFormatter();
+		help.printHelp(" ", options);
+		System.exit(1);
+	}
+	
+		
+	public static void main(String[] args) {
+
+		// Setup command line input
+		Options options = createCmdLineOpts();
+		if (args.length == 0) {
+			printHelpAndExit(options);
+		}
+
+		CommandLineParser parser = new PosixParser();
+		CommandLine cl = null;
+		try {
+			cl = parser.parse(options, args);
+		} catch (ParseException e) {
+			throw new RuntimeException("Problem parsing command line options.",e);
+		}
+		
+		String compactFilename = null;  
+		if(cl.hasOption("c")) {
+			compactFilename = cl.getOptionValue("c");
+		} else {
+			printHelpAndExit(options);
+		}
+		
+		String compactFilenameNew = "compact_new.xml";
+		if(cl.hasOption("o")) {
+			compactFilenameNew = cl.getOptionValue("o");
+		}
+
+		
+		
+		File compactFile = new File(compactFilename);
+		
+		// read XML
+		SAXBuilder builder = new SAXBuilder();
+		Document compact_document = null;
+		try {
+			compact_document = (Document) builder.build(compactFile);
+		} catch (JDOMException | IOException e1) {
+			throw new RuntimeException("problem with JDOM ", e1);
+		}
+		
+		
+		
+		// Loop over all millepede input files and build a list of parameters
+		
+		List<MilleParameter> params = new ArrayList<MilleParameter>();
+		
+		FileInputStream inMille = null;
+		BufferedReader brMille = null;
+		try {
+			for(String milleFilename : cl.getArgs()) {
+				inMille = new FileInputStream(milleFilename);
+				brMille = new BufferedReader(new InputStreamReader(inMille));
+				String line;
+				while((line = brMille.readLine()) != null) {
+					//System.out.printf("%s\n",line);
+					if(!line.contains("Parameter") && !line.contains("!")) {
+						
+						MilleParameter par = new MilleParameter(line);
+						//System.out.println(par.getXMLName() + " " + par.getValue());
+						
+						//add the parameter
+						params.add(par);
+						
+					}
+				}
+				brMille.close();
+			}
+		}
+		catch (IOException e) {
+			throw new RuntimeException("problem reading mille file",e);
+		}
+		
+		Element rootNode = compact_document.getRootElement();
+        
+		for(MilleParameter p : params) {
+		    System.out.println("Update value for " + p.getXMLName());
+            Element node = findNode(rootNode,p.getXMLName());
+            double correction = p.getValue();
+            double oldValue = 0;
+            try {
+                oldValue = node.getAttribute("value").getDoubleValue();
+            } catch (DataConversionException e) {
+                e.printStackTrace();
+            }
+            double newValue = oldValue + correction;
+            System.out.println("old " + oldValue + " correction " + correction + " -> new "  + newValue);
+            node.setAttribute("value", String.format("%.6f",newValue));
+		}		
+		
+
+		// Save new XML file
+		
+		XMLOutputter xmlOutput = new XMLOutputter();
+		// display nice 
+		//xmlOutput.setFormat(Format.getPrettyFormat());
+		try {
+			xmlOutput.output(compact_document, new FileWriter(compactFilenameNew));
+		} catch (IOException e) {
+			throw new RuntimeException("problem with xml output",e);
+		}
+			
+		
+		
+		
+		
+	}
+
+	
+	private static Element findNode(Element node, String name) {
+	    List list = node.getChildren();
+	    for(Object o : list) {
+	        Element element = (Element) o;
+	        if(element.getAttributeValue("name").compareTo(name) == 0) {
+	            return element;
+	        } 
+	        return findNode(element,name);
+	    }
+	    return null;
+	}
+	
+	
+
+	
+	
+	
+
+}