Author: [log in to unmask] Date: Wed Jun 10 16:08:41 2015 New Revision: 3125 Log: Add ECal MC test case (not working yet). HPSJAVA-545 Added: java/trunk/integration-tests/src/test/java/org/hps/test/ java/trunk/integration-tests/src/test/java/org/hps/test/it/ java/trunk/integration-tests/src/test/java/org/hps/test/it/EcalSimReconTest.java Added: java/trunk/integration-tests/src/test/java/org/hps/test/it/EcalSimReconTest.java ============================================================================= --- java/trunk/integration-tests/src/test/java/org/hps/test/it/EcalSimReconTest.java (added) +++ java/trunk/integration-tests/src/test/java/org/hps/test/it/EcalSimReconTest.java Wed Jun 10 16:08:41 2015 @@ -0,0 +1,156 @@ +package org.hps.test.it; + +import hep.aida.IHistogram1D; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import junit.framework.TestCase; + +import org.hps.job.JobManager; +import org.hps.recon.ecal.cluster.ClusterUtilities; +import org.hps.test.util.TestFileUrl; +import org.hps.test.util.TestOutputFile; +import org.lcsim.event.Cluster; +import org.lcsim.event.EventHeader; +import org.lcsim.util.Driver; +import org.lcsim.util.aida.AIDA; +import org.lcsim.util.loop.LCSimLoop; + +/** + * Run readout simulation and full 2015 Engineering Run reconstruction on ECal MC input data and then check histograms of cluster data. + * + * @author Jeremy McCormick, SLAC + */ +public class EcalSimReconTest extends TestCase { + + /** + * Test input file name on lcsim.org site. + */ + private static final String FILE_NAME = "egsv3-triv2-g4v1_s2d6_HPS-EngRun2015-Nominal-v1_101.slcio"; + + /** + * Steering resource file for readout simulation. + */ + private static final String READOUT_STEERING = "/org/hps/steering/readout/EngineeringRun2015TrigPairs1.lcsim"; + + /** + * Steering resource file for running reconstruction. + */ + private static final String RECON_STEERING = "/org/hps/steering/recon/EngineeringRun2015FullReconMC.lcsim"; + + /** + * Run number for conditions system. + */ + private static final Integer RUN = 0; + + /** + * Run the test. + * + * @throws Exception if there is an uncaught exception thrown + */ + public void testEcalSimRecon() throws Exception { + + // Get the input events file. + File inputFile = TestFileUrl.getInputFile(EcalSimReconTest.class, FILE_NAME); + + // Run readout simulation on MC input. + File readoutFile = new TestOutputFile(EcalSimReconTest.class, "readout.slcio"); + JobManager job = new JobManager(); + job.addVariableDefinition("detector", "HPS-EngRun2015-Nominal-v1"); + job.addVariableDefinition("outputFile", readoutFile.getPath().replace(".slcio", "")); + job.addVariableDefinition("run", RUN.toString()); + job.addInputFile(inputFile); + job.setup(READOUT_STEERING); + job.configure(); + job.run(); + System.out.println("readout ran on " + job.getLCSimLoop().getTotalCountableConsumed() + " events"); + + // Run the recon on the readout output. + File reconFile = new TestOutputFile(EcalSimReconTest.class, "recon.slcio"); + job = new JobManager(); + job.addInputFile(readoutFile); + job.addVariableDefinition("detector", "HPS-EngRun2015-Nominal-v1"); + job.addVariableDefinition("outputFile", reconFile.getPath().replace(".slcio", "")); + job.addVariableDefinition("run", RUN.toString()); + job.setup(RECON_STEERING); + job.run(); + System.out.println("recon ran on " + job.getLCSimLoop().getTotalCountableConsumed() + " events"); + + // Check the recon output. + LCSimLoop loop = new LCSimLoop(); + loop.setLCIORecordSource(reconFile); + loop.add(new EcalSimReconCheckDriver()); + loop.loop(-1); + loop.dispose(); + System.out.println("EcalSimReconCheckDriver ran on " + loop.getTotalCountableConsumed() + " events"); + } + + /** + * Driver for checking test output. + * + * @author Jeremy McCormick, SLAC + */ + static class EcalSimReconCheckDriver extends Driver { + + /** + * Setup AIDA histogramming. + */ + private final static AIDA aida = AIDA.defaultInstance(); + + /** + * Count of clusters per event. + */ + private final IHistogram1D clusCountH1D = aida.histogram1D("Cluster Count", 20, -0.5, 19.5); + + /** + * Individual cluster energies. + */ + private final IHistogram1D clusEnergyH1D = aida.histogram1D("Cluster Energy", 100, -0.5, 9.5); + + /** + * Highest cluster energy in event. + */ + private final IHistogram1D clusHighEnergyH1D = aida.histogram1D("Cluster Highest Energy", 100, -0.5, 9.5); + + /** + * First hit time in highest energy cluster. + */ + private final IHistogram1D clusTimeH1D = aida.histogram1D("Cluster Time", 500, -0.5, 499.5); + + /** + * Process events and fill histograms from cluster collection. + */ + public void process(EventHeader event) { + List<Cluster> clusters = event.get(Cluster.class, "EcalClustersCorr"); + clusCountH1D.fill(clusters.size()); + for (Cluster cluster : clusters) { + clusEnergyH1D.fill(cluster.getEnergy()); + } + + Cluster highClus = ClusterUtilities.findHighestEnergyCluster(clusters); + clusHighEnergyH1D.fill(highClus.getEnergy()); + clusTimeH1D.fill(highClus.getCalorimeterHits().get(0).getTime()); + } + + /** + * Save histograms and perform checks on histogram statistics. + */ + public void endOfData() { + + System.out.println("clusCountH1D mean: " + clusCountH1D.mean()); + System.out.println("clusEnergyH1D mean: " + clusEnergyH1D.mean()); + System.out.println("clusHighEnergyH1D mean: " + clusHighEnergyH1D.mean()); + System.out.println("clusTimeH1D mean: " + clusTimeH1D.mean()); + + // TODO: Add test assertions here. + + try { + aida.saveAs(new TestOutputFile(EcalSimReconTest.class, "plots.aida")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } +}