lcsim-contrib/src/main/java/org/lcsim/contrib/HansWenzel/DualCorrection
diff -N DRFunctionFactory.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ DRFunctionFactory.java 16 Dec 2009 17:20:26 -0000 1.1
@@ -0,0 +1,172 @@
+/*
+ * this class returns the electron, erenkov and dualreadout correction for
+ * a specific detector configuration
+ */
+package org.lcsim.contrib.HansWenzel.DualCorrection;
+
+import hep.aida.IFunction;
+import hep.aida.IFunctionFactory;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author wenzel
+ */
+final public class DRFunctionFactory {
+
+ private AIDA aida;
+ private IFunctionFactory functionFactory;
+ static DRFunctionFactory mof;
+ private static Map<DetectorConfiguration, ArrayList<IFunction>> mp;
+
+ /**
+ use very simple singleton pattern to make
+ sure that only one instance of this class.
+ */
+ public static DRFunctionFactory getInstance() {
+ if (mof == null) {
+ mof = new DRFunctionFactory();
+ }
+ return mof;
+ }
+
+ private DRFunctionFactory() {
+ aida = AIDA.defaultInstance();
+ functionFactory = aida.analysisFactory().createFunctionFactory(aida.tree());
+ mp = new HashMap<DetectorConfiguration, ArrayList<IFunction>>();
+ ArrayList<IFunction> al = new ArrayList<IFunction>();
+ // the following is not really elegant and should be replaced by a routine that reads
+ // the parameters of the correction functions from a file.
+ //
+ DetectorConfiguration dualcor = new DetectorConfiguration("ccal02", "BGO", 7.13, 1.65, "Digis", 0.02, 0.02, "LCPhys");
+ IFunction Corfu = functionFactory.createFunctionByName("dc_ccal02_digis_LCPhys", "p3");
+ Corfu.setParameter("p0", 0.52415);
+ Corfu.setParameter("p1", 0.37964);
+ Corfu.setParameter("p2", -0.60463);
+ Corfu.setParameter("p3", 0.66544);
+ al.add(Corfu);
+ IFunction Cerfu = functionFactory.createFunctionByName("cc_ccal02_digis_LCPhys", "p1");
+ Cerfu.setParameter("p0", 8.5701e-3);
+ Cerfu.setParameter("p1", 7677.7);
+ al.add(Cerfu);
+ IFunction efu = functionFactory.createFunctionByName("ec_ccal02_digis_LCPhys", "p1");
+ efu.setParameter("p0", 7.6521e-3);
+ efu.setParameter("p1", 1.0046);
+ al.add(efu);
+ mp.put(dualcor, al);
+ al = new ArrayList<IFunction>();
+ dualcor = new DetectorConfiguration("ccal02", "BGO", 7.13, 1.65, "Digis", 0.02, 0.02, "BGSP_BERT");
+ Corfu = functionFactory.createFunctionByName("ccal02_digis_QGSP_BERT", "p3");
+ Corfu.setParameter("p0", 0.53412);
+ Corfu.setParameter("p1", 0.56611);
+ Corfu.setParameter("p2", -0.57106);
+ Corfu.setParameter("p3", 0.37394);
+ al.add(Corfu);
+ // adding or set elements in Map by put method key and value pair
+ Cerfu = functionFactory.createFunctionByName("cc_ccal02_digis_QGSP_BERT", "p1");
+ Cerfu.setParameter("p0", 7.1940e-3);
+ Cerfu.setParameter("p1", 7620.7);
+ al.add(Cerfu);
+ efu = functionFactory.createFunctionByName("ec_ccal02_digis_QGSP_BERT", "p1");
+ efu.setParameter("p0", 7.2194e-3);
+ efu.setParameter("p1", 1.0047);
+ al.add(efu);
+ mp.put(dualcor, al);
+ al = new ArrayList<IFunction>();
+ dualcor = new DetectorConfiguration("ccal02", "BGO", 15., 1.65, "Digis", 0.02, 0.02, "LCPhys");
+ Corfu = functionFactory.createFunctionByName("ccal02_digis_LCPhys_d15", "p3");
+ Corfu.setParameter("p0", 0.59275);
+ Corfu.setParameter("p1", -0.063934);
+ Corfu.setParameter("p2", 0.46452);
+ Corfu.setParameter("p3", -0.025751);
+ al.add(Corfu);
+ // adding or set elements in Map by put method key and value pair
+ Cerfu = functionFactory.createFunctionByName("cc_ccal02_digis_LCPhys_d15", "p1");
+ Cerfu.setParameter("p0", 6.3057e-3);
+ Cerfu.setParameter("p1", 16584.);
+ al.add(Cerfu);
+ efu = functionFactory.createFunctionByName("ec_ccal02_digis_LCPhys_d15", "p1");
+ efu.setParameter("p0", 1.1773e-3);
+ efu.setParameter("p1", 1.0033);
+ al.add(efu);
+ mp.put(dualcor, al);
+ }
+
+ public void print() {
+ System.out.println("Currently " + mp.size() + " Detector Configurations are available");
+ //Get Map in Set interface to get key and value
+ Set s = mp.entrySet();
+ //Move next key and value of Map by iterator
+ Iterator it = s.iterator();
+ while (it.hasNext()) {
+ // key=value separator this by Map.Entry to get key and value
+ Map.Entry m = (Map.Entry) it.next();
+ // getKey is used to get key of Map
+ DetectorConfiguration key = (DetectorConfiguration) m.getKey();
+ key.print();
+ // getValue is used to get value of key in Map
+ ArrayList<IFunction> map = (ArrayList<IFunction>) m.getValue();
+ IFunction value = map.get(0);
+ System.out.println("Nr of Parameters: " + value.numberOfParameters());
+ System.out.println("Name of Function: " + value.title());
+ double[] params = value.parameters();
+ for (int i = 0; i < params.length; i++) {
+ System.out.println(params[i]);
+ }
+ value = map.get(1);
+ System.out.println("Nr of Parameters: " + value.numberOfParameters());
+ System.out.println("Name of Function: " + value.title());
+ double[] params1 = value.parameters();
+ for (int i = 0; i < params1.length; i++) {
+ System.out.println(params1[i]);
+ }
+ value = map.get(2);
+ System.out.println("Nr of Parameters: " + value.numberOfParameters());
+ System.out.println("Name of Function: " + value.title());
+ double[] params2 = value.parameters();
+ for (int i = 0; i < params2.length; i++) {
+ System.out.println(params2[i]);
+ }
+ }
+ }
+// get dual readout correction function
+ public IFunction getdcFunction(DetectorConfiguration dc) {
+ IFunction refunc = null;
+ if (mp.containsKey(dc)) {
+ ArrayList<IFunction> map = (ArrayList<IFunction>) mp.get(dc);
+ refunc = (IFunction) map.get(0);
+ }
+ return refunc;
+ }
+// get cerenkov scale
+ public IFunction getccFunction(DetectorConfiguration dc) {
+ IFunction refunc = null;
+ if (mp.containsKey(dc)) {
+ ArrayList<IFunction> map = (ArrayList<IFunction>) mp.get(dc);
+ refunc = (IFunction) map.get(2);
+ }
+ return refunc;
+ }
+// get electron scale:
+ public IFunction getecFunction(DetectorConfiguration dc) {
+ IFunction refunc = null;
+ if (mp.containsKey(dc)) {
+ ArrayList<IFunction> map = (ArrayList<IFunction>) mp.get(dc);
+ refunc = (IFunction) map.get(1);
+ }
+ return refunc;
+ }
+/// check if there is an entry for a given DetectorConfiguration
+ boolean checkdc(DetectorConfiguration dc) {
+ if (mp.containsKey(dc)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+}