From 8444f0f900c7aa0ca7868a16f5fcc9ae92ba7be7 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 17:02:33 -0400 Subject: [PATCH 01/16] add multi-hit fadc option --- .../detector/decode/ExtendedFADCFitter.java | 57 ++++++++++++++++++- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index 245c5c84d8..e4c486fdc6 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -1,5 +1,8 @@ package org.jlab.detector.decode; +import java.util.ArrayList; +import java.util.List; + /** * * @author gavalian @@ -17,9 +20,7 @@ public class ExtendedFADCFitter implements IFADCFitter { public double baseline, rms; private int tcourse, tfine; - public ExtendedFADCFitter(){ - - } + public ExtendedFADCFitter(){} public void fitCourseTime(int nsa, int nsb, int tet, int pedr, short[] pulse) { pedsum=0;adc=0;mmsum=0;summing_in_progress=0; @@ -162,4 +163,54 @@ public void fit(DetectorDataDgtz.ADCData data) { } } + public ExtendedFADCFitter[] multiFit(int nsa, int nsb, int tet, int ped, short[] pulse) { + List hits = new ArrayList<>(); + fit(nsa, nsb, tet, ped, pulse); + boolean belowThreshold = false; + for (int bin=pulsePeakPosition+1; bin halfMax) { + int a0 = pulse[halfBinUp]; + int a1 = pulse[halfBinUp+1]; + f.tcourse = halfBinUp; + f.tfine = ((int) ((halfMax - a0)/(a1-a0) * 64)); + f.t0 = (tcourse << 6) + tfine; + // find the half-max crossing downwards: + for (int halfBinDown = halfBinUp; halfBinDown halfMax && pulse[halfBinDown+1] <= halfMax) { + f.pulseWidth = halfBinDown - halfBinUp; + break; + } + } + break; + } + } + hits.add(f); + // move search bin forward: + bin = hits.getLast().pulsePeakPosition; + break; + } + } + // if we didn't generate a hit, stop: + if (hits.isEmpty()) break; + } + } + return hits.stream().toArray(ExtendedFADCFitter[]::new); + } } From ab8c1d9fb8e8623b7ed681c5d2188a4be895880b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 17:06:06 -0400 Subject: [PATCH 02/16] finish it --- .../detector/decode/ExtendedFADCFitter.java | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index e4c486fdc6..53fd249100 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -166,49 +166,52 @@ public void fit(DetectorDataDgtz.ADCData data) { public ExtendedFADCFitter[] multiFit(int nsa, int nsb, int tet, int ped, short[] pulse) { List hits = new ArrayList<>(); fit(nsa, nsb, tet, ped, pulse); - boolean belowThreshold = false; - for (int bin=pulsePeakPosition+1; bin halfMax) { - int a0 = pulse[halfBinUp]; - int a1 = pulse[halfBinUp+1]; - f.tcourse = halfBinUp; - f.tfine = ((int) ((halfMax - a0)/(a1-a0) * 64)); - f.t0 = (tcourse << 6) + tfine; - // find the half-max crossing downwards: - for (int halfBinDown = halfBinUp; halfBinDown halfMax && pulse[halfBinDown+1] <= halfMax) { - f.pulseWidth = halfBinDown - halfBinUp; - break; + hits.add(this); + if (pulsePeakPosition > 0) { + boolean belowThreshold = false; + for (int bin=pulsePeakPosition+1; bin halfMax) { + int a0 = pulse[halfBinUp]; + int a1 = pulse[halfBinUp+1]; + f.tcourse = halfBinUp; + f.tfine = ((int) ((halfMax - a0)/(a1-a0) * 64)); + f.t0 = (tcourse << 6) + tfine; + // find the half-max crossing downwards: + for (int halfBinDown = halfBinUp; halfBinDown halfMax && pulse[halfBinDown+1] <= halfMax) { + f.pulseWidth = halfBinDown - halfBinUp; + break; + } } + break; } - break; } + hits.add(f); + // move search bin forward: + bin = hits.getLast().pulsePeakPosition; + break; } - hits.add(f); - // move search bin forward: - bin = hits.getLast().pulsePeakPosition; - break; } + // if we didn't generate a hit, stop: + if (hits.isEmpty()) break; } - // if we didn't generate a hit, stop: - if (hits.isEmpty()) break; } } return hits.stream().toArray(ExtendedFADCFitter[]::new); From 29f9513439217faec6ef5c09525073a313e26c8b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 17:15:38 -0400 Subject: [PATCH 03/16] use multi-hit fadcs --- .../detector/decode/DetectorEventDecoder.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 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 20a2a64739..cc48775051 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 @@ -217,19 +217,29 @@ private void fitPulses(DetectorDataDgtz data, IndexedTable cfg) { final int nadc = data.getADCSize(); for (int i = 0; i < nadc; i++) { ADCData adc = data.getADCData(i); - if(adc.getPulseSize()>0){ + if (adc.getPulseSize() > 0) { + adc.setADC(nsa, nsb); try { - extendedFitter.fit(nsa, nsb, tet, ped, adc.getPulseArray()); + ExtendedFADCFitter[] f = extendedFitter.multiFit(nsa, nsb, tet, ped, adc.getPulseArray()); + adc.setIntegral(f[0].adc + f[0].ped*(nsa+nsb)); + adc.setHeight((short) f[0].pulsePeakValue); + adc.setTimeWord(f[0].t0); + adc.setPedestal((short) f[0].ped); + for (int j = 0; j < f.length; j++) { + ADCData a = new ADCData(); + a.setOrder(adc.getOrder()); + a.setIntegral(f[j].adc + f[j].ped*(nsa+nsb)); + a.setHeight((short) f[j].pulsePeakValue); + a.setTimeWord(f[j].t0); + a.setPedestal((short) f[j].ped); + a.setADC(nsa, nsb); + data.addADC(a); + } } catch (Exception e) { System.err.println(">>>> error : fitting pulse "+dd.getCrate()+ " / "+dd.getSlot()+" / "+dd.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); } } From b98e57cfc584ff63f89306003e8d6dd5ff91a7f4 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 17:19:04 -0400 Subject: [PATCH 04/16] cleanup --- .../detector/decode/DetectorEventDecoder.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 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 cc48775051..bc72c0b16c 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 @@ -218,21 +218,21 @@ private void fitPulses(DetectorDataDgtz data, IndexedTable cfg) { for (int i = 0; i < nadc; i++) { ADCData adc = data.getADCData(i); if (adc.getPulseSize() > 0) { - adc.setADC(nsa, nsb); try { - ExtendedFADCFitter[] f = extendedFitter.multiFit(nsa, nsb, tet, ped, adc.getPulseArray()); - adc.setIntegral(f[0].adc + f[0].ped*(nsa+nsb)); - adc.setHeight((short) f[0].pulsePeakValue); - adc.setTimeWord(f[0].t0); - adc.setPedestal((short) f[0].ped); - for (int j = 0; j < f.length; j++) { + ExtendedFADCFitter[] hits = extendedFitter.multiFit(nsa, nsb, tet, ped, adc.getPulseArray()); + adc.setADC(nsa, nsb); + adc.setIntegral(hits[0].adc + hits[0].ped*(nsa+nsb)); + adc.setHeight((short) hits[0].pulsePeakValue); + adc.setTimeWord(hits[0].t0); + adc.setPedestal((short) hits[0].ped); + for (int j = 0; j < hits.length; j++) { ADCData a = new ADCData(); - a.setOrder(adc.getOrder()); - a.setIntegral(f[j].adc + f[j].ped*(nsa+nsb)); - a.setHeight((short) f[j].pulsePeakValue); - a.setTimeWord(f[j].t0); - a.setPedestal((short) f[j].ped); a.setADC(nsa, nsb); + a.setOrder(adc.getOrder()); + a.setIntegral(hits[j].adc + hits[j].ped*(nsa+nsb)); + a.setHeight((short) hits[j].pulsePeakValue); + a.setTimeWord(hits[j].t0); + a.setPedestal((short) hits[j].ped); data.addADC(a); } } catch (Exception e) { From 97874d6e7087a58e93f16805157cdb027dcb698b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 17:22:34 -0400 Subject: [PATCH 05/16] cleanup --- .../java/org/jlab/detector/decode/ExtendedFADCFitter.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index 53fd249100..991d34f461 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -203,13 +203,14 @@ else if (belowThreshold) { break; } } + // add the new hit we just made: hits.add(f); // move search bin forward: - bin = hits.getLast().pulsePeakPosition; + bin = f.pulsePeakPosition; break; } } - // if we didn't generate a hit, stop: + // if we didn't generate a new hit, stop: if (hits.isEmpty()) break; } } From d910bf0e09165672098a9e8395228ae013c42df3 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 17:42:41 -0400 Subject: [PATCH 06/16] fix --- .../java/org/jlab/detector/decode/ExtendedFADCFitter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index 991d34f461..87b5c1c1a7 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -163,9 +163,9 @@ public void fit(DetectorDataDgtz.ADCData data) { } } - public ExtendedFADCFitter[] multiFit(int nsa, int nsb, int tet, int ped, short[] pulse) { + public ExtendedFADCFitter[] multiFit(int nsa, int nsb, int tet, int pedr, short[] pulse) { List hits = new ArrayList<>(); - fit(nsa, nsb, tet, ped, pulse); + fit(nsa, nsb, tet, pedr, pulse); hits.add(this); if (pulsePeakPosition > 0) { boolean belowThreshold = false; From 68059b1628c8d77dd0dde3712c26717c99b12e55 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 17:45:36 -0400 Subject: [PATCH 07/16] cleanup --- .../org/jlab/detector/decode/ExtendedFADCFitter.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index 87b5c1c1a7..b366fdd8d2 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -170,29 +170,38 @@ public ExtendedFADCFitter[] multiFit(int nsa, int nsb, int tet, int pedr, short[ if (pulsePeakPosition > 0) { boolean belowThreshold = false; for (int bin=pulsePeakPosition+1; bin halfMax) { + + // define timing: int a0 = pulse[halfBinUp]; int a1 = pulse[halfBinUp+1]; f.tcourse = halfBinUp; f.tfine = ((int) ((halfMax - a0)/(a1-a0) * 64)); f.t0 = (tcourse << 6) + tfine; + // find the half-max crossing downwards: for (int halfBinDown = halfBinUp; halfBinDown halfMax && pulse[halfBinDown+1] <= halfMax) { @@ -203,6 +212,7 @@ else if (belowThreshold) { break; } } + // add the new hit we just made: hits.add(f); // move search bin forward: From 3a490c10e3c36e8101ec819f883b6aafcd9d67b2 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 17:53:23 -0400 Subject: [PATCH 08/16] comments --- .../java/org/jlab/detector/decode/ExtendedFADCFitter.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index b366fdd8d2..45997a31ee 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -164,9 +164,14 @@ public void fit(DetectorDataDgtz.ADCData data) { } public ExtendedFADCFitter[] multiFit(int nsa, int nsb, int tet, int pedr, short[] pulse) { + List hits = new ArrayList<>(); + + // start with our conventional pulse fitting: fit(nsa, nsb, tet, pedr, pulse); hits.add(this); + + // and look for more later pulses: if (pulsePeakPosition > 0) { boolean belowThreshold = false; for (int bin=pulsePeakPosition+1; bin Date: Thu, 3 Sep 2026 19:44:41 -0400 Subject: [PATCH 09/16] fix --- .../detector/decode/DetectorEventDecoder.java | 5 +++- .../detector/decode/ExtendedFADCFitter.java | 28 ++++++++++++------- 2 files changed, 22 insertions(+), 11 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 bc72c0b16c..d93b507e6d 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 @@ -220,12 +220,14 @@ private void fitPulses(DetectorDataDgtz data, IndexedTable cfg) { if (adc.getPulseSize() > 0) { try { ExtendedFADCFitter[] hits = extendedFitter.multiFit(nsa, nsb, tet, ped, adc.getPulseArray()); + // the first hit is treated conventionally: adc.setADC(nsa, nsb); adc.setIntegral(hits[0].adc + hits[0].ped*(nsa+nsb)); adc.setHeight((short) hits[0].pulsePeakValue); adc.setTimeWord(hits[0].t0); adc.setPedestal((short) hits[0].ped); - for (int j = 0; j < hits.length; j++) { + // and extra hits get a new object here: + for (int j = 1; j < hits.length; j++) { ADCData a = new ADCData(); a.setADC(nsa, nsb); a.setOrder(adc.getOrder()); @@ -236,6 +238,7 @@ private void fitPulses(DetectorDataDgtz data, IndexedTable cfg) { data.addADC(a); } } catch (Exception e) { + e.printStackTrace(); System.err.println(">>>> error : fitting pulse "+dd.getCrate()+ " / "+dd.getSlot()+" / "+dd.getChannel()); } diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index 45997a31ee..09208b3aeb 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -167,37 +167,44 @@ public ExtendedFADCFitter[] multiFit(int nsa, int nsb, int tet, int pedr, short[ List hits = new ArrayList<>(); - // start with our conventional pulse fitting: + // initialize with our conventional pulse fitting: fit(nsa, nsb, tet, pedr, pulse); hits.add(this); // and look for more later pulses: if (pulsePeakPosition > 0) { + + // start at the first pulse's maximum and look forward: boolean belowThreshold = false; - for (int bin=pulsePeakPosition+1; bin halfMax) { // define timing: @@ -220,8 +227,9 @@ else if (belowThreshold) { // add the new hit we just made: hits.add(f); + // move search bin forward: - bin = f.pulsePeakPosition; + crossBin = f.pulsePeakPosition; break; } } From 3cc9d200b16169199208e4d4799726d7baaaf917 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 20:08:46 -0400 Subject: [PATCH 10/16] bugfix --- .../main/java/org/jlab/detector/decode/ExtendedFADCFitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index 09208b3aeb..b18138b44c 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -234,7 +234,7 @@ else if (belowThreshold) { } } // if we didn't generate a new hit, stop: - if (hits.isEmpty()) break; + if (hits.size() < 2) break; } } } From c8e10f5f7e6199e8ef4e2862b609e760d5c5c983 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 20:09:11 -0400 Subject: [PATCH 11/16] gotta "setADC" afterwards --- .../java/org/jlab/detector/decode/DetectorEventDecoder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 d93b507e6d..2265b36259 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 @@ -221,20 +221,20 @@ private void fitPulses(DetectorDataDgtz data, IndexedTable cfg) { try { ExtendedFADCFitter[] hits = extendedFitter.multiFit(nsa, nsb, tet, ped, adc.getPulseArray()); // the first hit is treated conventionally: - adc.setADC(nsa, nsb); adc.setIntegral(hits[0].adc + hits[0].ped*(nsa+nsb)); adc.setHeight((short) hits[0].pulsePeakValue); adc.setTimeWord(hits[0].t0); adc.setPedestal((short) hits[0].ped); + adc.setADC(nsa, nsb); // and extra hits get a new object here: for (int j = 1; j < hits.length; j++) { ADCData a = new ADCData(); - a.setADC(nsa, nsb); a.setOrder(adc.getOrder()); a.setIntegral(hits[j].adc + hits[j].ped*(nsa+nsb)); a.setHeight((short) hits[j].pulsePeakValue); a.setTimeWord(hits[j].t0); a.setPedestal((short) hits[j].ped); + a.setADC(nsa, nsb); data.addADC(a); } } catch (Exception e) { From bf36153fd2e90cdb12d3da2a16bfc9f8b17a1c58 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 3 Sep 2026 20:18:07 -0400 Subject: [PATCH 12/16] actually write out the extra hits to banks --- .../org/jlab/detector/decode/CLASDecoder.java | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java index 3d32f87807..ae6ec8062b 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java @@ -217,34 +217,36 @@ public Bank getDataBankADC(String name, DetectorType type){ List adcDGTZ = this.getEntriesADC(type); if (adcDGTZ.isEmpty()) return null; - Bank adcBANK = new Bank(schemaFactory.getSchema(name), adcDGTZ.size()); - + Bank adcBANK = new Bank(schemaFactory.getSchema(name), + adcDGTZ.stream().mapToInt(b -> b.getADCSize()).sum()); + for(int i = 0; i < adcDGTZ.size(); i++){ - adcBANK.putByte( 0, i, (byte) adcDGTZ.get(i).getDescriptor().getSector()); - adcBANK.putByte( 1, i, (byte) adcDGTZ.get(i).getDescriptor().getLayer()); - adcBANK.putShort(2, i, (short) adcDGTZ.get(i).getDescriptor().getComponent()); - adcBANK.putByte( 3, i, (byte) adcDGTZ.get(i).getDescriptor().getOrder()); - adcBANK.putInt( 4, i, adcDGTZ.get(i).getADCData(0).getADC()); - if (type == DetectorType.BMT || type == DetectorType.FMT || type == DetectorType.FTTRK) { - adcBANK.putInt( 4, i, adcDGTZ.get(i).getADCData(0).getHeight()); - adcBANK.putInt( 7, i, adcDGTZ.get(i).getADCData(0).getIntegral()); - adcBANK.putLong(8, i, adcDGTZ.get(i).getADCData(0).getTimeStamp()); - } - if(type == DetectorType.BAND) { - adcBANK.putInt( 5, i, adcDGTZ.get(i).getADCData(0).getHeight()); - adcBANK.putFloat(6, i, (float) adcDGTZ.get(i).getADCData(0).getTime()); - adcBANK.putShort(7, i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); - } - else { - adcBANK.putFloat(5, i, (float) adcDGTZ.get(i).getADCData(0).getTime()); - adcBANK.putShort(6, i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); + for (int j = 0; j tdcDGTZ = this.getEntriesTDC(type); From 82f567198004bb102c817920dc3800eb79543cfe Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 4 Sep 2026 10:57:07 -0400 Subject: [PATCH 13/16] actually fill all the rows ... --- .../org/jlab/detector/decode/CLASDecoder.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java index ae6ec8062b..275b434dae 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java @@ -219,29 +219,31 @@ public Bank getDataBankADC(String name, DetectorType type){ Bank adcBANK = new Bank(schemaFactory.getSchema(name), adcDGTZ.stream().mapToInt(b -> b.getADCSize()).sum()); - + + int row = 0; for(int i = 0; i < adcDGTZ.size(); i++){ for (int j = 0; j Date: Mon, 26 Oct 2026 19:31:48 -0400 Subject: [PATCH 14/16] new one --- .../detector/decode/ExtendedFADCFitter1.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter1.java diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter1.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter1.java new file mode 100644 index 0000000000..deae6b7184 --- /dev/null +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter1.java @@ -0,0 +1,114 @@ +package org.jlab.detector.decode; + +import java.util.ArrayList; +import java.util.List; + +public class ExtendedFADCFitter1 implements IFADCFitter { + + static final int PED_BIN1=1; + static final int PED_BIN2=15; + public int t0,adc,ped,pedsum; + public int thresholdCrossing,pulsePeakValue, pulsePeakPosition, pulseWidth; + public double baseline,rms; + private int tcourse, tfine; + + public ExtendedFADCFitter1(){} + + public ExtendedFADCFitter1[] multiFit(int nsa, int nsb, int tet, int pedr, short[] pulse) { + + t0=0; adc=0; ped=0; pedsum=0; baseline=0; rms=0; tcourse=0; tfine=0; + thresholdCrossing=0; pulsePeakValue=0; pulsePeakPosition=0; pulseWidth=0; + double noise = 0; + if (pedr == 0) { + // not enough samples, just set pedestal and abort: + if (pulse.length hits = null; + + boolean belowThreshold = false; + for (int crossBin = 0; crossBin halfMax) { + + // define timing: + int a0 = pulse[halfBinUp]; + int a1 = pulse[halfBinUp+1]; + f.tcourse = halfBinUp; + f.tfine = ((int) ((halfMax - a0)/(a1-a0) * 64)); + f.t0 = (tcourse << 6) + tfine; + + // find the half-max crossing downwards: + for (int halfBinDown = halfBinUp; halfBinDown halfMax && pulse[halfBinDown+1] <= halfMax) { + f.pulseWidth = halfBinDown - halfBinUp; + break; + } + } + break; + } + } + + // add the new hit we just made: + if (hits == null ) hits = new ArrayList<>(); + hits.add(f); + + // move search bin forward: + crossBin = f.pulsePeakPosition; + break; + } + } + // if we didn't generate a new hit, stop: + if (hits == null) break; + } + } + return hits == null ? null : hits.stream().toArray(ExtendedFADCFitter1[]::new); + } + + @Override + public void fit(DetectorDataDgtz.ADCData data) { + throw new UnsupportedOperationException("Not supported yet."); + } +} From 3dceb5bc16915e047e33ff6add9b4ceef25be351 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 29 Oct 2026 13:26:13 -0400 Subject: [PATCH 15/16] cleanup --- .../detector/decode/ExtendedFADCFitter.java | 119 +----------------- 1 file changed, 2 insertions(+), 117 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java index b18138b44c..1c513d56b7 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter.java @@ -1,8 +1,5 @@ package org.jlab.detector.decode; -import java.util.ArrayList; -import java.util.List; - /** * * @author gavalian @@ -122,122 +119,10 @@ public void fit(int nsa, int nsb, int tet, int pedr, short[] pulse) { } } } - - private double findPedestal(DetectorDataDgtz.ADCData data){ - int ped = 0; - for(int i = this.pedistalMinBin; i < this.pedistalMaxBin; i++){ - ped += data.getPulseValue(i); - } - double ped_norm = ((double) ped) / (Math.abs(this.pedistalMaxBin-this.pedistalMinBin)); - return ped_norm; - } - - private int findMaximumADC(DetectorDataDgtz.ADCData data){ - int bin = this.pedistalMaxBin ; - int max = data.getPulseValue(pedistalMaxBin); - - for(int i = this.pedistalMaxBin; i < data.getPulseSize(); i++){ - if(data.getPulseValue(i)>max){ - max = data.getPulseValue(i); - bin = i; - } - } - return bin; - } - - private int findPulseIntegral(DetectorDataDgtz.ADCData data, int maxValueBin, int nsa, int nsb){ - int min_bin = maxValueBin - nsb; - int max_bin = maxValueBin + nsa; - if(min_bin>=0&&max_binthis.pedistalMaxBin){ - double ped = this.findPedestal(data); - } - } - - public ExtendedFADCFitter[] multiFit(int nsa, int nsb, int tet, int pedr, short[] pulse) { - - List hits = new ArrayList<>(); - - // initialize with our conventional pulse fitting: - fit(nsa, nsb, tet, pedr, pulse); - hits.add(this); - - // and look for more later pulses: - if (pulsePeakPosition > 0) { - - // start at the first pulse's maximum and look forward: - boolean belowThreshold = false; - for (int crossBin=pulsePeakPosition+1; crossBin halfMax) { - - // define timing: - int a0 = pulse[halfBinUp]; - int a1 = pulse[halfBinUp+1]; - f.tcourse = halfBinUp; - f.tfine = ((int) ((halfMax - a0)/(a1-a0) * 64)); - f.t0 = (tcourse << 6) + tfine; - - // find the half-max crossing downwards: - for (int halfBinDown = halfBinUp; halfBinDown halfMax && pulse[halfBinDown+1] <= halfMax) { - f.pulseWidth = halfBinDown - halfBinUp; - break; - } - } - break; - } - } - - // add the new hit we just made: - hits.add(f); - - // move search bin forward: - crossBin = f.pulsePeakPosition; - break; - } - } - // if we didn't generate a new hit, stop: - if (hits.size() < 2) break; - } - } - } - return hits.stream().toArray(ExtendedFADCFitter[]::new); + throw new UnsupportedOperationException("Not supported yet."); } + } From d951fabf7a695986b056c9e5088aefdd56dc0bcd Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 29 Oct 2026 13:26:24 -0400 Subject: [PATCH 16/16] cleanup --- .../detector/decode/ExtendedFADCFitter1.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter1.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter1.java index deae6b7184..1e5eed8d51 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter1.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/ExtendedFADCFitter1.java @@ -7,10 +7,10 @@ public class ExtendedFADCFitter1 implements IFADCFitter { static final int PED_BIN1=1; static final int PED_BIN2=15; - public int t0,adc,ped,pedsum; - public int thresholdCrossing,pulsePeakValue, pulsePeakPosition, pulseWidth; - public double baseline,rms; - private int tcourse, tfine; + + public int t0, adc, ped, pedsum, tcourse, tfine; + public int thresholdCrossing, pulsePeakValue, pulsePeakPosition, pulseWidth; + public double baseline, rms; public ExtendedFADCFitter1(){} @@ -18,8 +18,12 @@ public ExtendedFADCFitter1[] multiFit(int nsa, int nsb, int tet, int pedr, short t0=0; adc=0; ped=0; pedsum=0; baseline=0; rms=0; tcourse=0; tfine=0; thresholdCrossing=0; pulsePeakValue=0; pulsePeakPosition=0; pulseWidth=0; - double noise = 0; - if (pedr == 0) { + + if (pedr != 0) { + // user-defined pedestal: + ped = pedr; + } + else { // not enough samples, just set pedestal and abort: if (pulse.length hits = null; - boolean belowThreshold = false; - for (int crossBin = 0; crossBin