Author: [log in to unmask]
Date: Wed May 20 16:41:59 2015
New Revision: 3007
Log:
updating ecal running pedestal to work on mode-1
Modified:
java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRunningPedestalDriver.java
Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRunningPedestalDriver.java
=============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRunningPedestalDriver.java (original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRunningPedestalDriver.java Wed May 20 16:41:59 2015
@@ -12,12 +12,15 @@
import org.lcsim.event.GenericObject;
import org.lcsim.event.LCRelation;
import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.event.RawTrackerHit;
import org.lcsim.geometry.Detector;
import org.lcsim.util.Driver;
/**
* Calculate a running pedestal average for every channel from Mode7 FADCs. Uses
* pedestals from the database if not available from the data.
+ *
+ * May 2015: Updated to also work on Mode1 data.
*
* TODO: Use Logger.
*
@@ -49,6 +52,9 @@
private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations";
private static final String runningPedestalsName = "EcalRunningPedestals";
+ // number of samples from the beginning of the time window used to calculate the pedestal:
+ private static final int nSamples = 4;
+
// TODO: Get this from somewhere else.
private final int nChannels = 442;
@@ -57,7 +63,7 @@
nChannels);
// recent event-by-event pedestals and timestamps:
- private Map<EcalChannel, List<Integer>> eventPedestals = new HashMap<EcalChannel, List<Integer>>();
+ private Map<EcalChannel, List<Double>> eventPedestals = new HashMap<EcalChannel, List<Double>>();
private Map<EcalChannel, List<Long>> eventTimestamps = new HashMap<EcalChannel, List<Long>>();
private boolean debug = false;
@@ -82,7 +88,7 @@
for (int ii = 0; ii < nChannels; ii++) {
EcalChannel chan = findChannel(ii + 1);
runningPedestals.put(chan,getStaticPedestal(chan));
- eventPedestals.put(chan,new ArrayList<Integer>());
+ eventPedestals.put(chan,new ArrayList<Double>());
eventTimestamps.put(chan,new ArrayList<Long>());
}
if (debug) {
@@ -127,9 +133,21 @@
System.out.printf("\n");
}
+ private double getNSampleMinimum(short samples[]) {
+ double min=99999999;
+ for (int ii=0; ii<samples.length-nSamples; ii++) {
+ double tmp=0;
+ for (int jj=ii; jj<ii+nSamples; jj++) tmp += samples[jj];
+ tmp /= nSamples;
+ if (tmp < min) min=tmp;
+ }
+ return min;
+ }
+
@Override
protected void process(EventHeader event) {
+ // Mode-7 Input Data:
if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) {
if (event.hasCollection(LCRelation.class, extraDataRelationsName)) {
for (LCRelation rel : event.get(LCRelation.class,
@@ -140,7 +158,38 @@
}
}
}
+
+ // Mode-1 Input Data:
+ else if (event.hasCollection(RawTrackerHit.class, rawCollectionName)) {
+ List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawCollectionName);
+ for (RawTrackerHit hit : hits) {
+ short samples[] = hit.getADCValues();
+ if (nSamples > samples.length) {
+ System.err.println("NOT ENGOUTH SAMPLES FOR ECAL RUNNING PEDETSAL.");
+ System.exit(0);
+ }
+
+ //double ped = getNSampleMinimum(samples);
+
+ boolean good=true;
+ double ped=0;
+ for (int ii=0; ii<nSamples; ii++) {
+ // reject pulses from pedestal calculation:
+ if (samples[ii] > getStaticPedestal(findChannel(hit))+12) {
+ good=false;
+ break;
+ }
+ ped += samples[ii];
+ }
+ if (good) {
+ ped /= nSamples;
+ updatePedestal(event,findChannel(hit),ped);
+ }
+ }
+ }
+
event.put(runningPedestalsName, runningPedestals);
+
if (debug) {
printPedestals();
}
@@ -149,7 +198,6 @@
private void updatePedestal(EventHeader event, RawCalorimeterHit hit,
GenericObject mode7data) {
- final long timestamp = event.getTimeStamp();
final int min = ((HitExtraData.Mode7Data) mode7data).getAmplLow();
final int max = ((HitExtraData.Mode7Data) mode7data).getAmplHigh();
@@ -162,7 +210,15 @@
System.err.println("hit doesn't correspond to ecalchannel");
return;
}
- List<Integer> peds = eventPedestals.get(chan);
+
+ updatePedestal(event,chan,(double)min);
+ }
+
+ private void updatePedestal(EventHeader event,EcalChannel chan,double min) {
+
+ final long timestamp = event.getTimeStamp();
+
+ List<Double> peds = eventPedestals.get(chan);
List<Long> times = eventTimestamps.get(chan);
if (maxLookbackTime > 0) {
@@ -214,8 +270,8 @@
} else {
ped = getStaticPedestal(chan);
}
+
runningPedestals.put(chan, ped);
-
}
public double getStaticPedestal(EcalChannel chan) {
@@ -227,6 +283,10 @@
return ecalConditions.getChannelCollection().findChannel(channel_id);
}
+ public EcalChannel findChannel(RawTrackerHit hit) {
+ return ecalConditions.getChannelCollection().findGeometric(
+ hit.getCellID());
+ }
public EcalChannel findChannel(RawCalorimeterHit hit) {
return ecalConditions.getChannelCollection().findGeometric(
hit.getCellID());
|