Print

Print


Commit in lcsim/src/org/lcsim/digisim on MAIN
Raw2SimConverter.java+82added 1.1
GL: New class to mediate RawCalHit to SimCalHit conversion

lcsim/src/org/lcsim/digisim
Raw2SimConverter.java added at 1.1
diff -N Raw2SimConverter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Raw2SimConverter.java	20 Jan 2006 23:34:52 -0000	1.1
@@ -0,0 +1,82 @@
+package org.lcsim.digisim;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.util.lcio.SIOSimCalorimeterHit;
+import org.lcsim.event.EventHeader.LCMetaData;
+import org.lcsim.event.MCParticle;
+
+/**
+ * Utility class to handle the conversion of RawCalorimeterHits to
+ * SimCalorimeterHits
+ *
+ * @author Guilherme Lima
+ * @version $Id: Raw2SimConverter.java,v 1.1 2006/01/20 23:34:52 lima Exp $
+ */
+public class Raw2SimConverter
+{
+    private Map<MCParticle,HitContrib> _contribs;
+    private RawCalorimeterHit _rawhit;
+
+    /** constructor */
+    public Raw2SimConverter(RawCalorimeterHit rawhit)
+    {
+	_rawhit = rawhit;
+	_contribs = new HashMap<MCParticle,HitContrib>();
+    }
+
+    public void addContribution(MCParticle mcp, double energy, double time) {
+	HitContrib contr = _contribs.get(mcp);
+	if(contr==null) {
+	    _contribs.put( mcp, new HitContrib(energy,time) );
+	}
+	else {
+	    contr.increment(energy,time);
+	}
+    }
+
+    public SIOSimCalorimeterHit convertToSimCalorimeterHit() {
+	int ncontr = _contribs.size();
+	Object[] mcparts = new Object[ncontr];
+	float[] energies = new float[ncontr];
+	float[] times = new float[ncontr];
+	int[] pdgs = new int[ncontr];
+	int imc = 0;
+	double etot = 0;
+	double rawT = _rawhit.getTimeStamp()*1.0e-6;
+
+	for( MCParticle mcp : _contribs.keySet() ) {
+	    HitContrib contr = _contribs.get(mcp);
+	    mcparts[imc] = mcp;
+	    energies[imc] = (float)contr.energy();
+	    times[imc] = (float)contr.time();
+	    pdgs[imc] = 0;
+	    if(mcp!=null) pdgs[imc] = mcp.getPDGID();
+	    etot += contr.energy();
+	    ++imc;
+	}
+
+	double rawE = _rawhit.getAmplitude()*1.0e-8;
+	double tolerance = (rawE-etot)/etot;
+	double abstol = Math.abs(tolerance);
+// 	if(abstol>0) org.lcsim.util.aida.AIDA.defaultInstance().cloud1D("conversion tolerance").fill(Math.log(abstol)/Math.log(10.0));
+	// fails for large round-off errors
+//    	assert abstol < 1.0e-3
+//    	    : "***** MySimCalHit.convert: energy conversion problem";
+
+	long cellid = _rawhit.getCellID();
+	return new SIOSimCalorimeterHit(cellid, rawE, rawT, mcparts, energies, times, pdgs);
+    }
+
+    void print() {
+	System.out.println("MySimHit: #contr="+_contribs.size());
+	int i=0;
+	for(MCParticle mcp : _contribs.keySet() ) {
+	    HitContrib contr = _contribs.get(mcp);
+	    System.out.println("contr "+i+": ene="+(1e8*contr.energy())+", time="+contr.time());
+	    ++i;
+	}
+    }
+}
CVSspam 0.2.8