lcsim/src/org/lcsim/digisim
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;
+ }
+ }
+}