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);
- }
- }
- }
}
|