Author: [log in to unmask] Date: Fri Aug 28 15:03:11 2015 New Revision: 3447 Log: Modify ECal recon test so it runs on readout output; change expected test results to match. Modified: java/trunk/integration-tests/src/test/java/org/hps/test/it/EcalSimReconTest.java Modified: 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 (original) +++ java/trunk/integration-tests/src/test/java/org/hps/test/it/EcalSimReconTest.java Fri Aug 28 15:03:11 2015 @@ -19,88 +19,150 @@ 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. - * + * 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 { + + /** + * 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); + /** + * Number of clusters found. + */ + private int clusterCount; + + /** + * Save histograms and perform checks on statistics. + */ + @Override + public void endOfData() { + + // Print some statistics. + System.out.println("clus count: " + clusterCount); + System.out.println("mean clus per event: " + clusCountH1D.mean()); + System.out.println("mean clus energy: " + clusEnergyH1D.mean()); + System.out.println("high energy clus mean: " + clusHighEnergyH1D.mean()); + System.out.println("mean clus time: " + clusTimeH1D.mean()); + + // Save plots to AIDA file. + try { + aida.saveAs(new TestOutputFile(EcalSimReconTest.class, "plots.aida")); + } catch (final IOException e) { + throw new RuntimeException(e); + } + + // Check high cluster energy mean. + TestCase.assertEquals("High cluster energy does not match.", CLUS_HIGH_MEAN_E, + clusHighEnergyH1D.mean(), 0.0004); + + // Check high cluster time mean. + TestCase.assertEquals("High cluster mean time does not match.", CLUS_MEAN_T, + clusTimeH1D.mean(), 0.03); + + // Check mean number of clusters per event. + TestCase.assertEquals("Mean number of clusters per event does not match.", CLUS_COUNT_MEAN, + clusCountH1D.mean(), 0.002); + + // Check total number of clusters. + TestCase.assertEquals("Number of clusters does not match.", CLUS_COUNT, clusterCount, 1); + } + + /** + * Process events and fill histograms from cluster collection. + */ + @Override + public void process(final EventHeader event) { + final List<Cluster> clusters = event.get(Cluster.class, "EcalClustersCorr"); + clusterCount += clusters.size(); + clusCountH1D.fill(clusters.size()); + for (final Cluster cluster : clusters) { + clusEnergyH1D.fill(cluster.getEnergy()); + if (cluster.getEnergy() == 0) { + throw new RuntimeException("Cluster has 0. energy."); + } + } + + final Cluster highClus = ClusterUtilities.findHighestEnergyCluster(clusters); + clusHighEnergyH1D.fill(highClus.getEnergy()); + clusTimeH1D.fill(highClus.getCalorimeterHits().get(0).getTime()); + } + } + /** - * Test input file name on lcsim.org site. + * Expected mean time of primary cluster in nanoseconds. */ - private static final String FILE_NAME = "egsv3-triv2-g4v1_s2d6_HPS-EngRun2015-Nominal-v1_101.slcio"; + private static final double CLUS_MEAN_T = 58.89; + + /** + * Expected mean of high cluster energy in GeV. + */ + private static final double CLUS_HIGH_MEAN_E = 1.071; /** - * Steering resource file for readout simulation. - */ - private static final String READOUT_STEERING = "/org/hps/steering/readout/EngineeringRun2015TrigSingles1.lcsim"; + * Expected mean number of clusters per event. + */ + private static final double CLUS_COUNT_MEAN = 2.95; + /** + * Expected total number of clusters. + */ + private static final int CLUS_COUNT = 2549; + /** * 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 = 5000; /** - * Expected mean of high cluster energy in GeV. - */ - private static final double HIGH_CLUS_MEAN_E = 1.05; - - /** - * Acceptable delta of high cluster mean energy in GeV. - */ - private static final double HIGH_CLUS_DELTA_E = 0.05; - - /** - * Expected mean time of primary cluster in nanoseconds. - */ - private static final double CLUS_MEAN_T = 58.6; - - /** - * Acceptable delta of cluster time in nanoseconds. - */ - private static final double CLUS_DELTA_T = 5; - - /** - * Expected number of triggers. - */ - private static final int TRIGGERS = 880; - - /** - * Acceptable delta of trigger count. - */ - private static final int TRIGGER_DELTA = 5; - - - /** * 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"); + final File readoutFile = TestFileUrl.getInputFile(EcalSimReconTest.class, "readout.slcio"); + + // Run the recon on the readout output. + final File reconFile = new TestOutputFile(EcalSimReconTest.class, "recon.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", "")); @@ -108,90 +170,14 @@ job.setup(RECON_STEERING); job.run(); System.out.println("recon ran on " + job.getLCSimLoop().getTotalCountableConsumed() + " events"); - + // Check the recon output. - LCSimLoop loop = new LCSimLoop(); + final LCSimLoop loop = new LCSimLoop(); loop.setLCIORecordSource(reconFile); - EcalSimReconCheckDriver checkDriver = new EcalSimReconCheckDriver(); + final EcalSimReconCheckDriver checkDriver = new EcalSimReconCheckDriver(); loop.add(checkDriver); loop.loop(-1); loop.dispose(); System.out.println("EcalSimReconCheckDriver ran on " + loop.getTotalCountableConsumed() + " events"); - - // Check the number of triggers. - TestCase.assertEquals("Number of triggers out of range.", TRIGGERS, loop.getTotalCountableConsumed(), TRIGGER_DELTA); } - - /** - * 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 statistics. - */ - public void endOfData() { - - // Print some statistics. - 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()); - - // Save plots to AIDA file. - try { - aida.saveAs(new TestOutputFile(EcalSimReconTest.class, "plots.aida")); - } catch (IOException e) { - throw new RuntimeException(e); - } - - // Check high cluster energy mean. - TestCase.assertEquals("High cluster energy was not within range.", HIGH_CLUS_MEAN_E, clusHighEnergyH1D.mean(), HIGH_CLUS_DELTA_E); - - // Check high cluster time mean. - TestCase.assertEquals("High cluster mean time was not within range.", CLUS_MEAN_T, clusTimeH1D.mean(), CLUS_DELTA_T); - } - } }