Author: [log in to unmask] Date: Wed Dec 3 16:04:42 2014 New Revision: 1646 Log: Convert signal analysis to use Profile1D instead of Histogram1D. Modified: java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCSignalPlotsDriver.java Modified: java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCSignalPlotsDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCSignalPlotsDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCSignalPlotsDriver.java Wed Dec 3 16:04:42 2014 @@ -1,12 +1,16 @@ package org.hps.users.jeremym; import hep.aida.IAnalysisFactory; -import hep.aida.IHistogram1D; +import hep.aida.IProfile1D; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import org.hps.conditions.database.TableConstants; import org.hps.conditions.ecal.EcalChannel; @@ -24,24 +28,31 @@ /** * This Driver will process ECAL raw mode (window) data and extract hits * that look like signal, by requiring a certain number of ADC samples - * in a row that are above a sigma threshold. + * in a row that are above a sigma threshold. For events with number + * of hits greater than a minimum (5 by default), it will convert + * the raw data into CalorimeterHits and write them to an output + * collection. * @author Jeremy McCormick <[log in to unmask]> */ public class EcalADCSignalPlotsDriver extends Driver { EcalConditions conditions = null; EcalChannelCollection channels = null; - - Map<EcalChannel, Double[]> channelADCValues = new HashMap<EcalChannel, Double[]>(); - Map<EcalChannel, Integer> channelEventCounts = new HashMap<EcalChannel, Integer>(); + + Map<EcalChannel, IProfile1D> signalProfiles = new HashMap<EcalChannel, IProfile1D>(); + Map<EcalChannel, IProfile1D> backgroundProfiles = new HashMap<EcalChannel, IProfile1D>(); + AIDA aida = AIDA.defaultInstance(); IAnalysisFactory analysisFactory = aida.analysisFactory(); double sigmaThreshold = 2.5; - int minimumSelectedHits = 3; + + int minimumSelectedSamples = 3; + int minimumNumberOfHits = 3; + int minNeighbors = 2; String outputHitsCollectionName = null; String inputHitsCollectionName = "EcalReadoutHits"; HPSEcal3 ecal = null; - String ecalName = "Ecal"; + static String ecalName = "Ecal"; /** * Set the sigma threshold for an ADC value. @@ -56,8 +67,12 @@ * saved for the event. * @param selectedHits The minimum number of hits above threshold. */ - public void setMinimumHits(int selectedHits) { - this.minimumSelectedHits = selectedHits; + public void setMinimumSelectedSamples(int minimumSelectedSamples) { + this.minimumSelectedSamples = minimumSelectedSamples; + } + + public void setMinimumNumberOfHits(int minimumNumberOfHits) { + this.minimumNumberOfHits = minimumNumberOfHits; } public void setOutputHitsCollectionName(String outputHitsCollectionName) { @@ -68,13 +83,9 @@ ecal = (HPSEcal3)detector.getSubdetector(ecalName); conditions = ConditionsManager.defaultInstance().getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData(); channels = conditions.getChannelCollection(); - for (EcalChannel channel : conditions.getChannelCollection()) { - channelADCValues.put(channel, new Double[100]); - channelEventCounts.put(channel, new Integer(0)); - Double[] adcValues = channelADCValues.get(channel); - for (int adcSample = 0; adcSample < adcValues.length; adcSample++) { - adcValues[adcSample] = new Double(0.0); - } + for (EcalChannel channel : conditions.getChannelCollection()) { + signalProfiles.put(channel, aida.profile1D("Average Signal ADC Values : " + String.format("%03d", channel.getChannelId()), 100, 0, 100)); + backgroundProfiles.put(channel, aida.profile1D("Average Background ADC Values : " + String.format("%03d", channel.getChannelId()), 100, 0, 100)); } } @@ -85,10 +96,6 @@ for (RawTrackerHit hit : hits) { EcalChannel channel = channels.findGeometric(hit.getCellID()); if (channel != null) { - Double[] adcValues = channelADCValues.get(channel); - if (adcValues == null) { - throw new RuntimeException("The ADC values array is null."); - } int nSelectedHits = 0; boolean saveHit = false; EcalChannelConstants channelConstants = conditions.getChannelConstants(channel); @@ -99,7 +106,7 @@ short adcValue = hit.getADCValues()[adcIndex]; if (adcValue > threshold) { ++nSelectedHits; - if (nSelectedHits >= minimumSelectedHits) { + if (nSelectedHits >= minimumSelectedSamples) { saveHit = true; break adcThresholdLoop; } @@ -107,41 +114,37 @@ nSelectedHits = 0; } } + + // Pick the signal or background Profile1D based on the selection. + IProfile1D profile = null; if (saveHit) { - for (int adcIndex = 0; adcIndex < hit.getADCValues().length; adcIndex++) { - adcValues[adcIndex] += hit.getADCValues()[adcIndex]; - } - Integer nEvents = channelEventCounts.get(channel); - nEvents += 1; - channelEventCounts.put(channel, nEvents); - - // Add hit to selected hits list. + profile = signalProfiles.get(channel); selectedHitsList.add(hit); + } else { + profile = backgroundProfiles.get(channel); } + + // Fill the Profile1D. + for (int adcIndex = 0; adcIndex < hit.getADCValues().length; adcIndex++) { + profile.fill(adcIndex, hit.getADCValues()[adcIndex]); + } } else { System.err.println("EcalChannel not found for cell ID 0x" + String.format("%08d", Long.toHexString(hit.getCellID()))); } } - - if (outputHitsCollectionName != null) { - // Save selected hits list to event. - event.put(outputHitsCollectionName, selectedHitsList, RawTrackerHit.class, event.getMetaData(hits).getFlags(), ecal.getReadout().getName()); - } + + if (outputHitsCollectionName != null) { + // Is number of hits above minimum? + if (selectedHitsList.size() >= this.minimumNumberOfHits) { + // Save selected hits list to event. + getLogger().info("writing " + selectedHitsList.size() + " hits into " + outputHitsCollectionName); + event.put(outputHitsCollectionName, selectedHitsList, RawTrackerHit.class, event.getMetaData(hits).getFlags(), ecal.getReadout().getName()); + } else { + // Skip this event so LCIODriver does not write this event. + throw new NextEventException(); + } + } } } - public void endOfData() { - for (EcalChannel channel : conditions.getChannelCollection()) { - int nEvents = channelEventCounts.get(channel); - IHistogram1D channelHistogram = aida.histogram1D("Average Signal ADC Values : " + channel.getChannelId(), 100, 0, 100); - Double[] adcValues = channelADCValues.get(channel); - for (int adcIndex = 0; adcIndex < adcValues.length; adcIndex++) { - // Calculate the average ADC value across number of events processed for this channel. - double averageAdcValue = adcValues[adcIndex] / nEvents; - - // Fill the ADC sample's bin, scaling by the ADC value. - channelHistogram.fill(adcIndex, averageAdcValue); - } - } - } }