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