From 6aa4e9acb7477ce4583b7691894e44c1b85baa1b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 18 Jun 2026 18:54:34 -0400 Subject: [PATCH 1/2] replace loop with map lookup --- .../detector/decode/DetectorEventDecoder.java | 80 ++++++++++--------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java index 100b9111dc..fbe6ce8613 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.stream.Collectors; import org.jlab.detector.banks.RawBank.OrderType; +import org.jlab.detector.base.DetectorDescriptor; import org.jlab.detector.base.DetectorType; import org.jlab.detector.calib.utils.ConstantsManager; import org.jlab.detector.decode.DetectorDataDgtz.ADCData; @@ -205,61 +206,64 @@ public void translate(List detectorData){ public void fitPulses(List detectorData){ + final long hash0 = IndexedTable.DEFAULT_GENERATOR.hashCode(0,0,0); + for (DetectorDataDgtz data : detectorData) { if (data.getADCSize() == 0) continue; - int crate = data.getDescriptor().getCrate(); - int slot = data.getDescriptor().getSlot(); - int channel = data.getDescriptor().getChannel(); - long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(crate,slot,channel); - long hash0 = IndexedTable.DEFAULT_GENERATOR.hashCode(0,0,0); - boolean ismm = micromegaTypes.contains(data.getDescriptor().getType()); - - for (DetectorType type : fitterTables.keySet()) { - - IndexedTable daq = fitterTables.get(type); - //custom MM fitter - if (ismm && data.getDescriptor().getType() == type) { - short adcOffset = (short) daq.getDoubleValueByHash("adc_offset", hash0); - double fineTimeStampResolution = (byte) daq.getDoubleValueByHash("dream_clock", hash0); - double samplingTime = (byte) daq.getDoubleValueByHash("sampling_time", hash0); - int sparseSample = daq.getIntValueByHash("sparse", hash0); - ADCData adc = data.getADCData(0); - mvtFitter.fit(adcOffset, fineTimeStampResolution, samplingTime, adc.getPulseArray(), adc.getTimeStamp(), sparseSample); - adc.setHeight((short) (mvtFitter.adcMax)); - adc.setTime((int) (mvtFitter.timeMax)); - adc.setIntegral((int) (mvtFitter.integral)); - adc.setTimeStamp(mvtFitter.timestamp); - // first one wins: - break; - } - else if(daq.hasEntryByHash(hash)==true){ - int nsa = daq.getIntValueByHash("nsa", hash); - int nsb = daq.getIntValueByHash("nsb", hash); - int tet = daq.getIntValueByHash("tet", hash); + + final DetectorDescriptor desc = data.getDescriptor(); + final DetectorType type = desc.getType(); + + if (!fitterTables.containsKey(type)) continue; + + IndexedTable daqTable = fitterTables.get(type); + + // For Micromegas, assume crate/slot/channel=0/0/0 for table lookup: + if (micromegaTypes.contains(type)) { + final short adcOffset = (short) daqTable.getDoubleValueByHash("adc_offset", hash0); + final double fineTimeStampResolution = (byte) daqTable.getDoubleValueByHash("dream_clock", hash0); + final double samplingTime = (byte) daqTable.getDoubleValueByHash("sampling_time", hash0); + final int sparseSample = daqTable.getIntValueByHash("sparse", hash0); + ADCData adc = data.getADCData(0); + mvtFitter.fit(adcOffset, fineTimeStampResolution, samplingTime, adc.getPulseArray(), adc.getTimeStamp(), sparseSample); + adc.setHeight((short) (mvtFitter.adcMax)); + adc.setTime((int) (mvtFitter.timeMax)); + adc.setIntegral((int) (mvtFitter.integral)); + adc.setTimeStamp(mvtFitter.timestamp); + } + + // Otherwise, use crate/slot/channel to find the table entry: + else { + + final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode( + desc.getCrate(), desc.getSlot(), desc.getChannel()); + + if (daqTable.hasEntryByHash(hash)) { + final int nsa = daqTable.getIntValueByHash("nsa", hash); + final int nsb = daqTable.getIntValueByHash("nsb", hash); + final int tet = daqTable.getIntValueByHash("tet", hash); int ped = 0; - if(data.getDescriptor().getType() == DetectorType.RF && type == DetectorType.RF) { - ped = daq.getIntValueByHash("pedestal", hash); + if (type == DetectorType.RF) { + ped = daqTable.getIntValueByHash("pedestal", hash); } - for(int i = 0; i < data.getADCSize(); i++){ + final int nadc = data.getADCSize(); + for (int i = 0; i < nadc; i++) { ADCData adc = data.getADCData(i); if(adc.getPulseSize()>0){ try { extendedFitter.fit(nsa, nsb, tet, ped, adc.getPulseArray()); } catch (Exception e) { - System.out.println(">>>> error : fitting pulse " - + crate + " / " + slot + " / " + channel); + System.err.println(">>>> error : fitting pulse "+desc.getCrate()+ + " / "+desc.getSlot()+" / "+desc.getChannel()); } - int adc_corrected = extendedFitter.adc + extendedFitter.ped*(nsa+nsb); + adc.setIntegral(extendedFitter.adc + extendedFitter.ped*(nsa+nsb)); adc.setHeight((short) this.extendedFitter.pulsePeakValue); - adc.setIntegral(adc_corrected); adc.setTimeWord(this.extendedFitter.t0); adc.setPedestal((short) this.extendedFitter.ped); } data.getADCData(i).setADC(nsa, nsb); } - // first one wins: - break; } } } From ffcf4d810358f62ac442c02e8b02faf21302a8bf Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 18 Jun 2026 19:14:54 -0400 Subject: [PATCH 2/2] break into smaller functions --- .../detector/decode/DetectorEventDecoder.java | 100 ++++++++---------- 1 file changed, 47 insertions(+), 53 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java index fbe6ce8613..6806abd279 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java @@ -204,67 +204,61 @@ public void translate(List detectorData){ } } - public void fitPulses(List detectorData){ + private void fitPulses(DetectorDataDgtz data, IndexedTable config) { + final DetectorDescriptor desc = data.getDescriptor(); + final DetectorType type = desc.getType(); + final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode( + desc.getCrate(), desc.getSlot(), desc.getChannel()); + final int nsa = config.getIntValueByHash("nsa", hash); + final int nsb = config.getIntValueByHash("nsb", hash); + final int tet = config.getIntValueByHash("tet", hash); + int ped = 0; + if (type == DetectorType.RF) { + ped = config.getIntValueByHash("pedestal", hash); + } + final int nadc = data.getADCSize(); + for (int i = 0; i < nadc; i++) { + ADCData adc = data.getADCData(i); + if(adc.getPulseSize()>0){ + try { + extendedFitter.fit(nsa, nsb, tet, ped, adc.getPulseArray()); + } catch (Exception e) { + System.err.println(">>>> error : fitting pulse "+desc.getCrate()+ + " / "+desc.getSlot()+" / "+desc.getChannel()); + } + adc.setIntegral(extendedFitter.adc + extendedFitter.ped*(nsa+nsb)); + adc.setHeight((short) this.extendedFitter.pulsePeakValue); + adc.setTimeWord(this.extendedFitter.t0); + adc.setPedestal((short) this.extendedFitter.ped); + } + data.getADCData(i).setADC(nsa, nsb); + } + } + private void fitMicromegaPulses(DetectorDataDgtz data, IndexedTable config) { final long hash0 = IndexedTable.DEFAULT_GENERATOR.hashCode(0,0,0); - - for (DetectorDataDgtz data : detectorData) { - - if (data.getADCSize() == 0) continue; - - final DetectorDescriptor desc = data.getDescriptor(); - final DetectorType type = desc.getType(); - - if (!fitterTables.containsKey(type)) continue; - - IndexedTable daqTable = fitterTables.get(type); - - // For Micromegas, assume crate/slot/channel=0/0/0 for table lookup: - if (micromegaTypes.contains(type)) { - final short adcOffset = (short) daqTable.getDoubleValueByHash("adc_offset", hash0); - final double fineTimeStampResolution = (byte) daqTable.getDoubleValueByHash("dream_clock", hash0); - final double samplingTime = (byte) daqTable.getDoubleValueByHash("sampling_time", hash0); - final int sparseSample = daqTable.getIntValueByHash("sparse", hash0); - ADCData adc = data.getADCData(0); + final short adcOffset = (short) config.getDoubleValueByHash("adc_offset", hash0); + final double fineTimeStampResolution = (byte) config.getDoubleValueByHash("dream_clock", hash0); + final double samplingTime = (byte) config.getDoubleValueByHash("sampling_time", hash0); + final int sparseSample = config.getIntValueByHash("sparse", hash0); + ADCData adc = data.getADCData(0); mvtFitter.fit(adcOffset, fineTimeStampResolution, samplingTime, adc.getPulseArray(), adc.getTimeStamp(), sparseSample); adc.setHeight((short) (mvtFitter.adcMax)); adc.setTime((int) (mvtFitter.timeMax)); adc.setIntegral((int) (mvtFitter.integral)); adc.setTimeStamp(mvtFitter.timestamp); - } + } - // Otherwise, use crate/slot/channel to find the table entry: - else { - - final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode( - desc.getCrate(), desc.getSlot(), desc.getChannel()); - - if (daqTable.hasEntryByHash(hash)) { - final int nsa = daqTable.getIntValueByHash("nsa", hash); - final int nsb = daqTable.getIntValueByHash("nsb", hash); - final int tet = daqTable.getIntValueByHash("tet", hash); - int ped = 0; - if (type == DetectorType.RF) { - ped = daqTable.getIntValueByHash("pedestal", hash); - } - final int nadc = data.getADCSize(); - for (int i = 0; i < nadc; i++) { - ADCData adc = data.getADCData(i); - if(adc.getPulseSize()>0){ - try { - extendedFitter.fit(nsa, nsb, tet, ped, adc.getPulseArray()); - } catch (Exception e) { - System.err.println(">>>> error : fitting pulse "+desc.getCrate()+ - " / "+desc.getSlot()+" / "+desc.getChannel()); - } - adc.setIntegral(extendedFitter.adc + extendedFitter.ped*(nsa+nsb)); - adc.setHeight((short) this.extendedFitter.pulsePeakValue); - adc.setTimeWord(this.extendedFitter.t0); - adc.setPedestal((short) this.extendedFitter.ped); - } - data.getADCData(i).setADC(nsa, nsb); - } - } + public void fitPulses(List detectorData){ + for (DetectorDataDgtz data : detectorData) { + if (data.getADCSize() == 0) continue; + final DetectorType type = data.getDescriptor().getType(); + final IndexedTable daqTable = fitterTables.getOrDefault(type,null); + if (daqTable != null) { + if (micromegaTypes.contains(type)) + fitMicromegaPulses(data, daqTable); + else + fitPulses(data, daqTable); } } }