Author: [log in to unmask] Date: Fri Jun 5 19:23:01 2015 New Revision: 3107 Log: truth-recon hit matching Added: java/trunk/users/src/main/java/org/hps/users/meeg/EcalTruthMatchingDriver.java Added: java/trunk/users/src/main/java/org/hps/users/meeg/EcalTruthMatchingDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/EcalTruthMatchingDriver.java (added) +++ java/trunk/users/src/main/java/org/hps/users/meeg/EcalTruthMatchingDriver.java Fri Jun 5 19:23:01 2015 @@ -0,0 +1,89 @@ +package org.hps.users.meeg; + +import hep.aida.IHistogram1D; +import hep.aida.IHistogram2D; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.lcsim.event.CalorimeterHit; +import org.lcsim.event.Cluster; +import org.lcsim.event.EventHeader; +import org.lcsim.event.MCParticle; +import org.lcsim.util.Driver; +import org.lcsim.util.aida.AIDA; + +/** + * + * @author Sho Uemura <[log in to unmask]> + * @version $Id: $ + */ +public class EcalTruthMatchingDriver extends Driver { + + private AIDA aida = AIDA.defaultInstance(); + private IHistogram2D energy2D = aida.histogram2D("recon vs. truth hit E", 200, 0.0, 2.2, 200, 0.0, 2.2); + private IHistogram2D energyRatio2D = aida.histogram2D("recon energy scale vs. truth E", 200, 0.0, 2.2, 200, 0.0, 2.0); + private IHistogram1D energy1D = aida.histogram1D("hit recon energy scale", 200, 0, 2.0); + private IHistogram1D hitTime1D = aida.histogram1D("recon hit time with truth hit match", 100, 0, 400); + private IHistogram2D hitTime2D = aida.histogram2D("recon hit time vs. truth E", 400, 0.0, 2.2, 100, 0, 400); + + private double triggerTime = 150.0; + private boolean debug = false; + + public void process(EventHeader event) { + + List<CalorimeterHit> truthHits = event.get(CalorimeterHit.class, "EcalHits"); + List<MCParticle> truthParticles = event.get(MCParticle.class, "MCParticle"); + List<CalorimeterHit> reconHits = event.get(CalorimeterHit.class, "EcalCalHits"); + List<Cluster> reconClusters = event.get(Cluster.class, "EcalClusters"); + + for (MCParticle particle : truthParticles) { + if (particle.getSimulatorStatus().isDecayedInCalorimeter() && particle.getEnergy() > 0.1) { + if (debug) { + System.out.println(particle.getEnergy()); + } + } + } + + Map<Long, CalorimeterHit> crystalToReconHit = new HashMap<Long, CalorimeterHit>(); + for (CalorimeterHit hit : reconHits) { + CalorimeterHit hitInMap = crystalToReconHit.get(hit.getCellID()); + if (hitInMap == null || Math.abs(hitInMap.getTime() - triggerTime) > Math.abs(hit.getTime() - triggerTime)) { + crystalToReconHit.put(hit.getCellID(), hit); + } + } + + Collections.sort(truthHits, new EnergyComparator()); + + for (CalorimeterHit hit : truthHits) { + CalorimeterHit reconHit = crystalToReconHit.get(hit.getCellID()); + + if (debug) { + System.out.format("truth hit: energy %f, ix %d, iy %d, time %f;\t", hit.getRawEnergy(), hit.getIdentifierFieldValue("ix"), hit.getIdentifierFieldValue("iy"), hit.getTime()); + } + if (reconHit == null) { + if (debug) { + System.out.format("recon hit: not found\n"); + } + } else { + energy2D.fill(hit.getRawEnergy(), reconHit.getCorrectedEnergy()); + energy1D.fill(reconHit.getCorrectedEnergy() / hit.getRawEnergy()); + energyRatio2D.fill(hit.getRawEnergy(), reconHit.getCorrectedEnergy() / hit.getRawEnergy()); + hitTime1D.fill(reconHit.getTime()); + hitTime2D.fill(hit.getRawEnergy(), reconHit.getTime()); + if (debug) { + System.out.format("recon hit: energy %f, time %f\n", reconHit.getCorrectedEnergy(), reconHit.getTime()); + } + } + } + } + + private static class EnergyComparator implements Comparator<CalorimeterHit> { + + @Override + public int compare(CalorimeterHit hit1, CalorimeterHit hit2) { + return Double.compare(hit1.getRawEnergy(), hit2.getRawEnergy()); + } + } +}