From 904f8422277354221d2f9db4755fb2922ea52a48 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 18:01:54 -0400 Subject: [PATCH 01/26] add convenience method --- .../src/main/java/org/jlab/detector/decode/CLASDecoder.java | 4 ++++ 1 file changed, 4 insertions(+) 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 667d8ab586..19374cfac3 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 @@ -792,4 +792,8 @@ public Event getDecodedEvent(EvioDataEvent rawEvent, int run, int counter, Doubl return decodedEvent; } + + public Event getDecodedEvent(EvioDataEvent rawEvent) { + return getDecodedEvent(rawEvent, -1, -1, null, null); + } } From 658f24fc75a926997cf2bd899b884c838ede9742 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 18:06:05 -0400 Subject: [PATCH 02/26] remove unused stuff --- .../main/java/org/jlab/detector/decode/CLASDecoder.java | 8 -------- 1 file changed, 8 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 19374cfac3..4a89b73a91 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 @@ -15,8 +15,6 @@ import org.jlab.io.base.DataEvent; import org.jlab.io.evio.EvioDataEvent; -import org.jlab.io.hipo.HipoDataEvent; -import org.jlab.io.hipo.HipoDataSync; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -38,8 +36,6 @@ public class CLASDecoder { protected SchemaFactory schemaFactory = new SchemaFactory(); private CodaEventDecoder codaDecoder = null; private List dataList = new ArrayList<>(); - private HipoDataSync writer = null; - private HipoDataEvent hipoEvent = null; private boolean isRunNumberFixed = false; private int decoderDebugMode = 0; private ModeAHDC ahdcExtractor = new ModeAHDC(); @@ -48,8 +44,6 @@ public class CLASDecoder { public CLASDecoder(boolean development){ codaDecoder = new CodaEventDecoder(); detectorDecoder = new DetectorEventDecoder(development); - writer = new HipoDataSync(); - hipoEvent = (HipoDataEvent) writer.createEvent(); String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); schemaFactory.initFromDirectory(dir); } @@ -57,8 +51,6 @@ public CLASDecoder(boolean development){ public CLASDecoder(){ codaDecoder = new CodaEventDecoder(); detectorDecoder = new DetectorEventDecoder(); - writer = new HipoDataSync(); - hipoEvent = (HipoDataEvent) writer.createEvent(); String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); schemaFactory.initFromDirectory(dir); } From 062551473d910b395476f22b015f47eabd1b83ae Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 19:37:28 -0400 Subject: [PATCH 03/26] add decoding engine --- .../org/jlab/clas/reco/DecodingEngine.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java new file mode 100644 index 0000000000..cf19e00b14 --- /dev/null +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java @@ -0,0 +1,91 @@ +package org.jlab.clas.reco; + +import java.util.Set; +import java.util.HashSet; +import java.nio.ByteBuffer; +import org.jlab.clara.base.ClaraUtil; +import org.jlab.clara.engine.Engine; +import org.jlab.clara.engine.EngineData; +import org.jlab.clara.engine.EngineDataType; +import org.jlab.clara.engine.EngineStatus; +import org.jlab.detector.decode.CLASDecoder; +import org.jlab.io.evio.EvioDataEvent; +import org.jlab.io.hipo.HipoDataEvent; +import org.jlab.jnp.hipo4.data.SchemaFactory; +import org.json.JSONObject; + +/** + * + * @author baltzell + */ +public class DecodingEngine implements Engine { + + SchemaFactory schema; + CLASDecoder decoder; + + public DecodingEngine() { + schema = new SchemaFactory(); + schema.initFromDirectory(System.getenv("CLAS12DIR") + "/etc/bankdefs/hipo4"); + } + + @Override + public EngineData executeGroup(Set set) { return null; } + @Override + public Set getStates() { return new HashSet<>(); } + @Override + public String getDescription() { return "decoder engine"; } + @Override + public String getVersion() { return "1.0"; } + @Override + public String getAuthor() { return "baltzell"; } + @Override + public void reset() {} + @Override + public void destroy() {} + + @Override + public Set getInputDataTypes() { + return ClaraUtil.buildDataTypes(Clas12Types.EVIO); + } + + @Override + public Set getOutputDataTypes() { + return ClaraUtil.buildDataTypes(Clas12Types.HIPO); + } + + @Override + public EngineData configure(EngineData ed) { + JSONObject j = new JSONObject(ed.getData()); + if (j.has("variation")) decoder.setVariation(j.getString("variation")); + if (j.has("timestamp")) decoder.setVariation(j.getString("timestamp")); + return ed; + } + + @Override + public EngineData execute(EngineData input) { + EngineData output = input; + EvioDataEvent evio; + HipoDataEvent hipo; + try { + ByteBuffer bb = (ByteBuffer) input.getData(); + evio = new EvioDataEvent(bb.array(), bb.order()); + } catch (Exception e) { + String msg = String.format("Error reading input event%n%n%s", ClaraUtil.reportException(e)); + output.setStatus(EngineStatus.ERROR); + output.setDescription(msg); + return output; + } + + try { + hipo = new HipoDataEvent(decoder.getDecodedEvent(evio),schema); + output.setData("binary/data-hipo", hipo.getHipoEvent()); + } catch (Exception e) { + String msg = String.format("Error processing input event%n%n%s", ClaraUtil.reportException(e)); + output.setStatus(EngineStatus.ERROR); + output.setDescription(msg); + return output; + } + return output; + } + +} From 2a35643feecdcfaeda73fb17d12e3eb518161244 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 19:40:54 -0400 Subject: [PATCH 04/26] add it to the clara yaml --- etc/services/rgd-clarode.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/etc/services/rgd-clarode.yml b/etc/services/rgd-clarode.yml index 0fef0e2016..d70e0ec901 100644 --- a/etc/services/rgd-clarode.yml +++ b/etc/services/rgd-clarode.yml @@ -19,12 +19,14 @@ configuration: outputBankPrefix: "HB" io-services: reader: - class: org.jlab.io.clara.Clas12Reader - name: Clas12Reader + class: org.jlab.io.clara.EvioToEvioReader + name: EvioReader writer: class: org.jlab.io.clara.DecoderWriter name: DecoderWriter services: + - class: org.jlab.clas.reco.DecodingEngine + name: DECO - class: org.jlab.service.ai.DCDenoiseEngine name: DCDN - class: org.jlab.clas.swimtools.MagFieldsEngine From ac8e4a0ae67fa238b7da760a96beb3d2c55b25d2 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 20:03:25 -0400 Subject: [PATCH 05/26] use a pool --- .../org/jlab/clas/reco/DecodingEngine.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java index cf19e00b14..31dab691fd 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java @@ -3,6 +3,9 @@ import java.util.Set; import java.util.HashSet; import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; import org.jlab.clara.base.ClaraUtil; import org.jlab.clara.engine.Engine; import org.jlab.clara.engine.EngineData; @@ -21,7 +24,8 @@ public class DecodingEngine implements Engine { SchemaFactory schema; - CLASDecoder decoder; + + BlockingQueue pool; public DecodingEngine() { schema = new SchemaFactory(); @@ -56,8 +60,13 @@ public Set getOutputDataTypes() { @Override public EngineData configure(EngineData ed) { JSONObject j = new JSONObject(ed.getData()); - if (j.has("variation")) decoder.setVariation(j.getString("variation")); - if (j.has("timestamp")) decoder.setVariation(j.getString("timestamp")); + pool = new ArrayBlockingQueue<>(64); + for (int i=0; i<64; i++) { + CLASDecoder d = new CLASDecoder(); + if (j.has("variation")) d.setVariation(j.getString("variation")); + if (j.has("timestamp")) d.setVariation(j.getString("timestamp")); + pool.add(d); + } return ed; } @@ -68,7 +77,8 @@ public EngineData execute(EngineData input) { HipoDataEvent hipo; try { ByteBuffer bb = (ByteBuffer) input.getData(); - evio = new EvioDataEvent(bb.array(), bb.order()); + //evio = new EvioDataEvent(bb.array(), bb.order()); + evio = new EvioDataEvent(bb.array(), ByteOrder.LITTLE_ENDIAN); } catch (Exception e) { String msg = String.format("Error reading input event%n%n%s", ClaraUtil.reportException(e)); output.setStatus(EngineStatus.ERROR); @@ -77,7 +87,9 @@ public EngineData execute(EngineData input) { } try { - hipo = new HipoDataEvent(decoder.getDecodedEvent(evio),schema); + CLASDecoder d = pool.take(); + hipo = new HipoDataEvent(d.getDecodedEvent(evio),schema); + pool.put(d); output.setData("binary/data-hipo", hipo.getHipoEvent()); } catch (Exception e) { String msg = String.format("Error processing input event%n%n%s", ClaraUtil.reportException(e)); From 6fa2c84f1a264cb526d21bf23531e3bd74bea00b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 20:10:29 -0400 Subject: [PATCH 06/26] hmm --- .../src/main/java/org/jlab/io/clara/EvioToEvioReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java index fb8303719a..372bd423a7 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java @@ -39,7 +39,7 @@ public int readEventCount() throws EventReaderException { @Override public ByteOrder readByteOrder() throws EventReaderException { - return reader.getFileByteOrder(); + return ByteOrder.LITTLE_ENDIAN; //reader.getFileByteOrder(); } @Override From e9d18f0d13b4004f5d2b2972185db0d213f07619 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 20:20:03 -0400 Subject: [PATCH 07/26] allow decoder instances to share ConstantsManagers --- .../src/main/java/org/jlab/detector/decode/CLASDecoder.java | 4 ++++ .../java/org/jlab/detector/decode/DetectorEventDecoder.java | 6 ++++++ 2 files changed, 10 insertions(+) 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 4a89b73a91..d537c5ae00 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 @@ -59,6 +59,10 @@ public SchemaFactory getSchemaFactory(){ return schemaFactory; } + public void shareManagers(CLASDecoder d) { + detectorDecoder.shareManagers(d.detectorDecoder); + } + public void setVariation(String variation) { detectorDecoder.setVariation(variation); } 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 84ec0a6cf4..b689c0f854 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 @@ -80,6 +80,12 @@ public float getRcdbSolenoidScale() { getValue()).floatValue(); } + public void shareManagers(DetectorEventDecoder d) { + translationManager = d.translationManager; + fitterManager = d.fitterManager; + scalerManager = d.scalerManager; + } + public DetectorEventDecoder(){ this.initDecoder(); } From f6bcdd769821d2141f4c2cd60ab04a511c1af66f Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 20:20:22 -0400 Subject: [PATCH 08/26] share ConstantsManagers --- .../src/main/java/org/jlab/clas/reco/DecodingEngine.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java index 31dab691fd..a66b1dc164 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java @@ -61,10 +61,12 @@ public Set getOutputDataTypes() { public EngineData configure(EngineData ed) { JSONObject j = new JSONObject(ed.getData()); pool = new ArrayBlockingQueue<>(64); + CLASDecoder d0 = new CLASDecoder(); for (int i=0; i<64; i++) { - CLASDecoder d = new CLASDecoder(); + CLASDecoder d = i==0 ? d0 : new CLASDecoder(); if (j.has("variation")) d.setVariation(j.getString("variation")); if (j.has("timestamp")) d.setVariation(j.getString("timestamp")); + if (i > 0) d.shareManagers(d0); pool.add(d); } return ed; From 3b08261dbc2fbe3320541fba1bdc862e45ad1434 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 20:23:38 -0400 Subject: [PATCH 09/26] kludge test --- .../src/main/java/org/jlab/io/clara/EvioToEvioReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java index 372bd423a7..e4ae442101 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java @@ -53,6 +53,6 @@ public Object readEvent(int eventNumber) throws EventReaderException { @Override protected EngineDataType getDataType() { - return Clas12Types.EVIO; + return Clas12Types.HIPO; } } From d1dce3be33733e1d6d5b33e5274759f9eb43f9c0 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 21:04:29 -0400 Subject: [PATCH 10/26] remove example engine --- .../clas/service/PulseExtractorEngine.java | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java deleted file mode 100644 index 3f2dc5254e..0000000000 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.jlab.clas.service; - -import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.detector.pulse.Mode3; -import org.jlab.detector.pulse.Mode7; -import org.jlab.detector.pulse.ModeAHDC; -import org.jlab.io.base.DataEvent; - -/** - * An example of using a {@link org.jlab.detector.pulse.HipoExtractor} from a - * {@link org.jlab.clas.reco.ReconstructionEngine}. - * - * @author baltzell - */ -public class PulseExtractorEngine extends ReconstructionEngine { - - Mode3 mode3 = new Mode3(); - Mode3 mode7 = new Mode7(); - ModeAHDC mode_ahdc = new ModeAHDC(); - - public PulseExtractorEngine() { - super("PULSE", "baltzell", "0.0"); - } - - @Override - public boolean init() { - // If using a CCDB table, must register it here: - //requireConstants("/daq/config/ahdc"); - return true; - } - - @Override - public boolean processDataEvent(DataEvent event) { - - // No CCDB table, hardcoded parameters in the extractor: - //mode3.update(6, null, event, "BMT::wf", "BMT::adc"); - //mode7.update(80, null, event, "AHDC::wf", "AHDC::adc"); - mode_ahdc.update(30, null, event, "AHDC::wf", "AHDC::adc"); - - /* - // Requiring a CCDB table: - DataBank runConfig = event.getBank("RUN::config"); - if (runConfig.rows()>0) { - IndexedTable it = getConstantsManager().getConstants( - runConfig.getInt("run", 0), "/daq/config/ahdc"); - basic.update(136, it, event, "AHDC::wf", "AHDC::adc"); - } - */ - - return true; - } - -} From b91092e96f16a63ba7849fa4612367214c96f326 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 21:04:48 -0400 Subject: [PATCH 11/26] cleanup --- .../src/main/java/org/jlab/clas/reco/DecodingEngine.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java index a66b1dc164..2f018aafb0 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java @@ -62,10 +62,10 @@ public EngineData configure(EngineData ed) { JSONObject j = new JSONObject(ed.getData()); pool = new ArrayBlockingQueue<>(64); CLASDecoder d0 = new CLASDecoder(); + if (j.has("variation")) d0.setVariation(j.getString("variation")); + if (j.has("timestamp")) d0.setVariation(j.getString("timestamp")); for (int i=0; i<64; i++) { CLASDecoder d = i==0 ? d0 : new CLASDecoder(); - if (j.has("variation")) d.setVariation(j.getString("variation")); - if (j.has("timestamp")) d.setVariation(j.getString("timestamp")); if (i > 0) d.shareManagers(d0); pool.add(d); } From 45e96c88ddebfb12a92cbd0a07313f8a85a1eda4 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 22 Apr 2026 21:39:35 -0400 Subject: [PATCH 12/26] remove unnecessary reader class --- .../java/org/jlab/io/clara/Clas12Reader.java | 91 ------------------- .../org/jlab/io/clara/Clas12Reader.yaml | 11 --- 2 files changed, 102 deletions(-) delete mode 100644 common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java delete mode 100644 common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java deleted file mode 100644 index cd1f39dc95..0000000000 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.jlab.io.clara; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.file.Path; -import org.jlab.clara.engine.EngineDataType; -import org.jlab.clara.std.services.AbstractEventReaderService; -import org.jlab.clara.std.services.EventReaderException; -import org.jlab.coda.jevio.EvioException; -import org.jlab.detector.decode.CLASDecoder4; -import org.jlab.io.evio.EvioDataEvent; -import org.jlab.io.evio.EvioSource; -import org.jlab.jnp.hipo4.data.Event; -import org.jlab.jnp.hipo4.io.HipoReader; -import org.json.JSONObject; - -/** - * Emulate DecoderReader for EVIO files, or HipoToHipoReader for HIPO files. - * - * @author baltzell - */ -public class Clas12Reader extends AbstractEventReaderService { - - boolean evio; - CLASDecoder4 decoder; - private long maxEvents; - private Double torus; - private Double solenoid; - - @Override - protected Object createReader(Path path, JSONObject opts) throws EventReaderException { - if (path.toString().endsWith(".hipo")) { - evio = false; - HipoReader r = new HipoReader(); - r.open(path.toString()); - return r; - } - else { - evio = true; - EvioSource r = new EvioSource(); - r.open(path.toString()); - maxEvents = r.getEventCount(); - decoder = new CLASDecoder4(); - torus = opts.has("torus") ? opts.getDouble("torus") : null; - solenoid = opts.has("solenoid") ? opts.getDouble("solenoid") : null; - if (opts.has("variation")) decoder.setVariation(opts.getString("variation")); - if (opts.has("timestamp")) decoder.setTimestamp(opts.getString("timestamp")); - return r; - } - } - - @Override - protected void closeReader() { - if (evio) ((EvioSource)reader).close(); - else ((HipoReader)reader).close(); - } - - @Override - protected int readEventCount() throws EventReaderException { - if (evio) return ((EvioSource)reader).getEventCount(); - else return ((HipoReader)reader).getEventCount(); - } - - @Override - protected Object readEvent(int eventNumber) throws EventReaderException { - try { - if (evio) { - if (eventNumber++ >= maxEvents) return null; - ByteBuffer b = ((EvioSource)reader).getEventBuffer(eventNumber, true); - EvioDataEvent e = new EvioDataEvent(b.array(), readByteOrder()); - return decoder.getDecodedEvent(e, -1, eventNumber, torus, solenoid); - } - else { - return ((HipoReader)reader).getEvent(new Event(),eventNumber); - } - } catch (EvioException e) { - throw new EventReaderException(e); - } - } - - @Override - public ByteOrder readByteOrder() throws EventReaderException { - return ByteOrder.LITTLE_ENDIAN; - } - - @Override - protected EngineDataType getDataType() { - return Clas12Types.HIPO; - } - -} diff --git a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml deleted file mode 100644 index 30c6e00495..0000000000 --- a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Clas12Reader -engine: org.jlab.io.clara.Clas12Reader -type: java - -author: Nathan Baltzell -email: baltzell@jlab.org - -version: 0.1 -description: - Reads EVIO or HIPO events from a file, converting to HIPO via "decoding" if EVIO. From 6f69b280975abc18d52b6d0f47d18e84e929d56b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 13:53:22 -0400 Subject: [PATCH 13/26] try this --- .../org/jlab/clas/reco/DecodingEngine.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java index 2f018aafb0..f263b1be15 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java @@ -24,14 +24,19 @@ public class DecodingEngine implements Engine { SchemaFactory schema; - BlockingQueue pool; + static Set edtypes = ClaraUtil.buildDataTypes( + Clas12Types.EVIO,Clas12Types.HIPO,EngineDataType.JSON,EngineDataType.STRING); public DecodingEngine() { schema = new SchemaFactory(); schema.initFromDirectory(System.getenv("CLAS12DIR") + "/etc/bankdefs/hipo4"); } - + + @Override + public Set getInputDataTypes() { return edtypes; } + @Override + public Set getOutputDataTypes() { return edtypes; } @Override public EngineData executeGroup(Set set) { return null; } @Override @@ -47,16 +52,6 @@ public void reset() {} @Override public void destroy() {} - @Override - public Set getInputDataTypes() { - return ClaraUtil.buildDataTypes(Clas12Types.EVIO); - } - - @Override - public Set getOutputDataTypes() { - return ClaraUtil.buildDataTypes(Clas12Types.HIPO); - } - @Override public EngineData configure(EngineData ed) { JSONObject j = new JSONObject(ed.getData()); From 071b17669610a931a143c5d880a05b2776507bde Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 14:38:25 -0400 Subject: [PATCH 14/26] inherit ConstantsManagers --- .../org/jlab/detector/decode/CLASDecoder.java | 11 ++++--- .../detector/decode/DetectorEventDecoder.java | 33 +++++++++++-------- .../org/jlab/clas/reco/DecodingEngine.java | 21 ++++++------ 3 files changed, 37 insertions(+), 28 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 d537c5ae00..8f1e5c47c3 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 @@ -55,12 +55,15 @@ public CLASDecoder(){ schemaFactory.initFromDirectory(dir); } - public SchemaFactory getSchemaFactory(){ - return schemaFactory; + public CLASDecoder(CLASDecoder d) { + codaDecoder = new CodaEventDecoder(); + detectorDecoder = new DetectorEventDecoder(d.detectorDecoder); + String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); + schemaFactory.initFromDirectory(dir); } - public void shareManagers(CLASDecoder d) { - detectorDecoder.shareManagers(d.detectorDecoder); + public SchemaFactory getSchemaFactory(){ + return schemaFactory; } public void setVariation(String variation) { 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 b689c0f854..f23295a459 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 @@ -18,6 +18,7 @@ */ public class DetectorEventDecoder { + boolean sharedManagers = false; ConstantsManager translationManager = new ConstantsManager(); ConstantsManager fitterManager = new ConstantsManager(); ConstantsManager scalerManager = new ConstantsManager(); @@ -45,6 +46,18 @@ public DetectorEventDecoder(boolean development){ } } + public DetectorEventDecoder(){ + this.initDecoder(); + } + + public DetectorEventDecoder(DetectorEventDecoder d) { + translationManager = d.translationManager; + fitterManager = d.fitterManager; + scalerManager = d.scalerManager; + sharedManagers = true; + initDecoder(); + } + public void setTimestamp(String timestamp) { translationManager.setTimeStamp(timestamp); fitterManager.setTimeStamp(timestamp); @@ -80,16 +93,6 @@ public float getRcdbSolenoidScale() { getValue()).floatValue(); } - public void shareManagers(DetectorEventDecoder d) { - translationManager = d.translationManager; - fitterManager = d.fitterManager; - scalerManager = d.scalerManager; - } - - public DetectorEventDecoder(){ - this.initDecoder(); - } - public final void initDecoderDev(){ keysTrans = Arrays.asList(new DetectorType[]{ DetectorType.HTCC,DetectorType.BST,DetectorType.RTPC} ); tablesTrans = Arrays.asList(new String[]{ "/daq/tt/clasdev/htcc","/daq/tt/clasdev/svt","/daq/tt/clasdev/rtpc" }); @@ -115,7 +118,6 @@ public final void initDecoder(){ "/daq/tt/rf","/daq/tt/bmt","/daq/tt/fmt","/daq/tt/rich2","/daq/tt/hel","/daq/tt/band","/daq/tt/rtpc", "/daq/tt/raster","/daq/tt/atof","/daq/tt/ahdc" }); - translationManager.init(tablesTrans); // ADC waveform fitter translation table keysFitter = Arrays.asList(new DetectorType[]{DetectorType.FTCAL,DetectorType.FTHODO,DetectorType.FTTRK,DetectorType.FTOF,DetectorType.LTCC, @@ -128,13 +130,16 @@ public final void initDecoder(){ "/daq/config/fmt","/daq/fadc/hel","/daq/fadc/rf","/daq/fadc/band","/daq/fadc/raster", "/daq/config/ahdc" }); - fitterManager.init(tablesFitter); // Data filter list keysFilter = Arrays.asList(new DetectorType[]{DetectorType.DC}); - scalerManager.init(Arrays.asList(new String[]{"/runcontrol/fcup","/runcontrol/slm","/runcontrol/hwp", - "/runcontrol/helicity","/daq/config/scalers/dsc1"})); + if (!sharedManagers) { + translationManager.init(tablesTrans); + fitterManager.init(tablesFitter); + scalerManager.init(Arrays.asList(new String[]{"/runcontrol/fcup","/runcontrol/slm","/runcontrol/hwp", + "/runcontrol/helicity","/daq/config/scalers/dsc1"})); + } keysMicromega = Arrays.asList(new DetectorType[]{DetectorType.BMT,DetectorType.FMT,DetectorType.FTTRK}); diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java index f263b1be15..f5cfa9fd7a 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java @@ -23,10 +23,12 @@ */ public class DecodingEngine implements Engine { + static final int POOL_SIZE = 64; + static final Set ED_TYPES = ClaraUtil.buildDataTypes( + Clas12Types.EVIO,Clas12Types.HIPO,EngineDataType.JSON,EngineDataType.STRING); + SchemaFactory schema; BlockingQueue pool; - static Set edtypes = ClaraUtil.buildDataTypes( - Clas12Types.EVIO,Clas12Types.HIPO,EngineDataType.JSON,EngineDataType.STRING); public DecodingEngine() { schema = new SchemaFactory(); @@ -34,9 +36,9 @@ public DecodingEngine() { } @Override - public Set getInputDataTypes() { return edtypes; } + public Set getInputDataTypes() { return ED_TYPES; } @Override - public Set getOutputDataTypes() { return edtypes; } + public Set getOutputDataTypes() { return ED_TYPES; } @Override public EngineData executeGroup(Set set) { return null; } @Override @@ -55,20 +57,19 @@ public void destroy() {} @Override public EngineData configure(EngineData ed) { JSONObject j = new JSONObject(ed.getData()); - pool = new ArrayBlockingQueue<>(64); + pool = new ArrayBlockingQueue<>(POOL_SIZE); CLASDecoder d0 = new CLASDecoder(); if (j.has("variation")) d0.setVariation(j.getString("variation")); if (j.has("timestamp")) d0.setVariation(j.getString("timestamp")); - for (int i=0; i<64; i++) { - CLASDecoder d = i==0 ? d0 : new CLASDecoder(); - if (i > 0) d.shareManagers(d0); - pool.add(d); + for (int i=0; i Date: Thu, 23 Apr 2026 14:44:38 -0400 Subject: [PATCH 15/26] decouple ubuntu/macos builds to reduce wait --- .github/workflows/ci.yml | 44 ++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43849d9c78..4a9fe83d9e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,14 +61,46 @@ jobs: # build ############################################################################# + build-macos: + strategy: + fail-fast: true + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: ${{ env.java_distribution }} + cache: maven + - name: setup cvmfs + uses: cvmfs-contrib/github-action-cvmfs@v5 + with: + cvmfs_repositories: 'oasis.opensciencegrid.org' + - name: cvmfs + run: ls /cvmfs/oasis.opensciencegrid.org/jlab/hallb/clas12/sw/noarch/data/ccdb/ccdb_latest.sqlite + - name: bump version to tag if tag trigger + if: ${{ github.ref_type == 'tag' }} + run: libexec/version-bump.sh ${{ github.ref_name }} + - name: build + run: | + ./build-coatjava.sh --lfs --no-progress -T${{ env.nthreads }} + ./bin/install-clara -b -c ./coatjava ./clara + - name: tar # tarball to preserve permissions + run: | + tar czvf coatjava.tar.gz coatjava + tar czvf clara.tar.gz clara + - uses: actions/upload-artifact@v7 + with: + name: build_macos-latest + retention-days: 1 + path: | + coatjava.tar.gz + clara.tar.gz + build: strategy: fail-fast: true - matrix: - runner: - - ubuntu-latest - - macos-latest - runs-on: ${{ matrix.runner }} + runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 @@ -95,7 +127,7 @@ jobs: tar czvf clara.tar.gz clara - uses: actions/upload-artifact@v7 with: - name: build_${{ matrix.runner }} + name: build_ubuntu-latest retention-days: 1 path: | coatjava.tar.gz From 02ee6daae11de2cea333b9272330f9c5c48ff406 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 14:49:35 -0400 Subject: [PATCH 16/26] cleanup --- .../src/main/java/org/jlab/clas/reco/DecodingEngine.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java index f5cfa9fd7a..9bde5a9219 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecodingEngine.java @@ -69,7 +69,6 @@ public EngineData configure(EngineData ed) { @Override public EngineData execute(EngineData input) { - EngineData output = input; EvioDataEvent evio; HipoDataEvent hipo; @@ -83,7 +82,6 @@ public EngineData execute(EngineData input) { output.setDescription(msg); return output; } - try { CLASDecoder d = pool.take(); hipo = new HipoDataEvent(d.getDecodedEvent(evio),schema); From 4ba2002e2a5a721b435fb22614afb275fb42326b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 14:49:45 -0400 Subject: [PATCH 17/26] only check tables if not shared --- .../java/org/jlab/detector/decode/DetectorEventDecoder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 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 f23295a459..6a6ee5e309 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 @@ -133,17 +133,17 @@ public final void initDecoder(){ // Data filter list keysFilter = Arrays.asList(new DetectorType[]{DetectorType.DC}); + + keysMicromega = Arrays.asList(new DetectorType[]{DetectorType.BMT,DetectorType.FMT,DetectorType.FTTRK}); if (!sharedManagers) { translationManager.init(tablesTrans); fitterManager.init(tablesFitter); scalerManager.init(Arrays.asList(new String[]{"/runcontrol/fcup","/runcontrol/slm","/runcontrol/hwp", "/runcontrol/helicity","/daq/config/scalers/dsc1"})); + checkTables(); } - keysMicromega = Arrays.asList(new DetectorType[]{DetectorType.BMT,DetectorType.FMT,DetectorType.FTTRK}); - - checkTables(); } public void checkTables() { From a5512a9c531aa723ab5b0a087d71a2ed9f75d9f8 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 14:51:52 -0400 Subject: [PATCH 18/26] fix job name --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a9fe83d9e..b7b7b69a43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: # build ############################################################################# - build-macos: + build_macos: strategy: fail-fast: true runs-on: macos-latest From 3c0135ea67de5252184ebe50556acd775a3b7c72 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 18:02:20 -0400 Subject: [PATCH 19/26] higher ports on macos, cleanup process dpe process --- bin/run-clara | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/run-clara b/bin/run-clara index 798ffd6544..15b7f14ca6 100755 --- a/bin/run-clara +++ b/bin/run-clara @@ -127,7 +127,7 @@ function get_host_ip() { } function get_dpe_port() { local ports - ports=$(seq 7000 20 8000) + ports=$(seq 8000 20 9000) command -v shuf >/dev/null 2>&1 && ports=$(echo "$ports" | shuf) for port in $ports do @@ -152,8 +152,10 @@ then --session recon --max-cores $threads \ --max-sockets 5120 --report 5 \ 2>&1 | tee $CLARA_USER_DATA/log/dpe.log & + pid=$! + trap "kill -9 $pid; exit" EXIT set +v - #echo "Sleeping 7 ......." && sleep 7 + sleep 1 unset JAVA_OPTS set -v $CLARA_HOME/bin/clara-orchestrator \ From a99234fcacd3c19a3ce74237a2685702672f48dd Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 18:42:20 -0400 Subject: [PATCH 20/26] remove ineffective pid trap --- bin/run-clara | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/run-clara b/bin/run-clara index 15b7f14ca6..4263f474dd 100755 --- a/bin/run-clara +++ b/bin/run-clara @@ -152,8 +152,6 @@ then --session recon --max-cores $threads \ --max-sockets 5120 --report 5 \ 2>&1 | tee $CLARA_USER_DATA/log/dpe.log & - pid=$! - trap "kill -9 $pid; exit" EXIT set +v sleep 1 unset JAVA_OPTS From 3b964ea1bcf5326aef89a2d146e48accc12e6d62 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 20:38:31 -0400 Subject: [PATCH 21/26] Revert "higher ports on macos, cleanup process dpe process" This reverts commit 3c0135ea67de5252184ebe50556acd775a3b7c72. --- bin/run-clara | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/run-clara b/bin/run-clara index 4263f474dd..798ffd6544 100755 --- a/bin/run-clara +++ b/bin/run-clara @@ -127,7 +127,7 @@ function get_host_ip() { } function get_dpe_port() { local ports - ports=$(seq 8000 20 9000) + ports=$(seq 7000 20 8000) command -v shuf >/dev/null 2>&1 && ports=$(echo "$ports" | shuf) for port in $ports do @@ -153,7 +153,7 @@ then --max-sockets 5120 --report 5 \ 2>&1 | tee $CLARA_USER_DATA/log/dpe.log & set +v - sleep 1 + #echo "Sleeping 7 ......." && sleep 7 unset JAVA_OPTS set -v $CLARA_HOME/bin/clara-orchestrator \ From 8eafa84aee46a4b297d848559f55437cb08c6f4e Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 21:07:17 -0400 Subject: [PATCH 22/26] Revert "fix job name" This reverts commit a5512a9c531aa723ab5b0a087d71a2ed9f75d9f8. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7b7b69a43..4a9fe83d9e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: # build ############################################################################# - build_macos: + build-macos: strategy: fail-fast: true runs-on: macos-latest From 00b2f6edfac20957f3bf35d9c80ee5600f49dff0 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 21:07:27 -0400 Subject: [PATCH 23/26] Revert "decouple ubuntu/macos builds to reduce wait" This reverts commit 446a6a538e9839b52077796d84c78b73ceb5c88e. --- .github/workflows/ci.yml | 44 ++++++---------------------------------- 1 file changed, 6 insertions(+), 38 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a9fe83d9e..43849d9c78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,46 +61,14 @@ jobs: # build ############################################################################# - build-macos: - strategy: - fail-fast: true - runs-on: macos-latest - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-java@v5 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: ${{ env.java_distribution }} - cache: maven - - name: setup cvmfs - uses: cvmfs-contrib/github-action-cvmfs@v5 - with: - cvmfs_repositories: 'oasis.opensciencegrid.org' - - name: cvmfs - run: ls /cvmfs/oasis.opensciencegrid.org/jlab/hallb/clas12/sw/noarch/data/ccdb/ccdb_latest.sqlite - - name: bump version to tag if tag trigger - if: ${{ github.ref_type == 'tag' }} - run: libexec/version-bump.sh ${{ github.ref_name }} - - name: build - run: | - ./build-coatjava.sh --lfs --no-progress -T${{ env.nthreads }} - ./bin/install-clara -b -c ./coatjava ./clara - - name: tar # tarball to preserve permissions - run: | - tar czvf coatjava.tar.gz coatjava - tar czvf clara.tar.gz clara - - uses: actions/upload-artifact@v7 - with: - name: build_macos-latest - retention-days: 1 - path: | - coatjava.tar.gz - clara.tar.gz - build: strategy: fail-fast: true - runs-on: ubuntu-latest + matrix: + runner: + - ubuntu-latest + - macos-latest + runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 @@ -127,7 +95,7 @@ jobs: tar czvf clara.tar.gz clara - uses: actions/upload-artifact@v7 with: - name: build_ubuntu-latest + name: build_${{ matrix.runner }} retention-days: 1 path: | coatjava.tar.gz From a2276f1c499d6a97ea619ab347256a9006a882b8 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 21:23:44 -0400 Subject: [PATCH 24/26] Revert "remove unnecessary reader class" This reverts commit 45e96c88ddebfb12a92cbd0a07313f8a85a1eda4. --- .../java/org/jlab/io/clara/Clas12Reader.java | 91 +++++++++++++++++++ .../org/jlab/io/clara/Clas12Reader.yaml | 11 +++ 2 files changed, 102 insertions(+) create mode 100644 common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java create mode 100644 common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java new file mode 100644 index 0000000000..cd1f39dc95 --- /dev/null +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java @@ -0,0 +1,91 @@ +package org.jlab.io.clara; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.file.Path; +import org.jlab.clara.engine.EngineDataType; +import org.jlab.clara.std.services.AbstractEventReaderService; +import org.jlab.clara.std.services.EventReaderException; +import org.jlab.coda.jevio.EvioException; +import org.jlab.detector.decode.CLASDecoder4; +import org.jlab.io.evio.EvioDataEvent; +import org.jlab.io.evio.EvioSource; +import org.jlab.jnp.hipo4.data.Event; +import org.jlab.jnp.hipo4.io.HipoReader; +import org.json.JSONObject; + +/** + * Emulate DecoderReader for EVIO files, or HipoToHipoReader for HIPO files. + * + * @author baltzell + */ +public class Clas12Reader extends AbstractEventReaderService { + + boolean evio; + CLASDecoder4 decoder; + private long maxEvents; + private Double torus; + private Double solenoid; + + @Override + protected Object createReader(Path path, JSONObject opts) throws EventReaderException { + if (path.toString().endsWith(".hipo")) { + evio = false; + HipoReader r = new HipoReader(); + r.open(path.toString()); + return r; + } + else { + evio = true; + EvioSource r = new EvioSource(); + r.open(path.toString()); + maxEvents = r.getEventCount(); + decoder = new CLASDecoder4(); + torus = opts.has("torus") ? opts.getDouble("torus") : null; + solenoid = opts.has("solenoid") ? opts.getDouble("solenoid") : null; + if (opts.has("variation")) decoder.setVariation(opts.getString("variation")); + if (opts.has("timestamp")) decoder.setTimestamp(opts.getString("timestamp")); + return r; + } + } + + @Override + protected void closeReader() { + if (evio) ((EvioSource)reader).close(); + else ((HipoReader)reader).close(); + } + + @Override + protected int readEventCount() throws EventReaderException { + if (evio) return ((EvioSource)reader).getEventCount(); + else return ((HipoReader)reader).getEventCount(); + } + + @Override + protected Object readEvent(int eventNumber) throws EventReaderException { + try { + if (evio) { + if (eventNumber++ >= maxEvents) return null; + ByteBuffer b = ((EvioSource)reader).getEventBuffer(eventNumber, true); + EvioDataEvent e = new EvioDataEvent(b.array(), readByteOrder()); + return decoder.getDecodedEvent(e, -1, eventNumber, torus, solenoid); + } + else { + return ((HipoReader)reader).getEvent(new Event(),eventNumber); + } + } catch (EvioException e) { + throw new EventReaderException(e); + } + } + + @Override + public ByteOrder readByteOrder() throws EventReaderException { + return ByteOrder.LITTLE_ENDIAN; + } + + @Override + protected EngineDataType getDataType() { + return Clas12Types.HIPO; + } + +} diff --git a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml new file mode 100644 index 0000000000..30c6e00495 --- /dev/null +++ b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml @@ -0,0 +1,11 @@ +--- +name: Clas12Reader +engine: org.jlab.io.clara.Clas12Reader +type: java + +author: Nathan Baltzell +email: baltzell@jlab.org + +version: 0.1 +description: + Reads EVIO or HIPO events from a file, converting to HIPO via "decoding" if EVIO. From 1ba2e2a24c00a66f4dcab75ed5d88359c26dbc64 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 21:43:59 -0400 Subject: [PATCH 25/26] Revert "remove example engine" This reverts commit d1dce3be33733e1d6d5b33e5274759f9eb43f9c0. --- .../clas/service/PulseExtractorEngine.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java new file mode 100644 index 0000000000..3f2dc5254e --- /dev/null +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java @@ -0,0 +1,53 @@ +package org.jlab.clas.service; + +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.detector.pulse.Mode3; +import org.jlab.detector.pulse.Mode7; +import org.jlab.detector.pulse.ModeAHDC; +import org.jlab.io.base.DataEvent; + +/** + * An example of using a {@link org.jlab.detector.pulse.HipoExtractor} from a + * {@link org.jlab.clas.reco.ReconstructionEngine}. + * + * @author baltzell + */ +public class PulseExtractorEngine extends ReconstructionEngine { + + Mode3 mode3 = new Mode3(); + Mode3 mode7 = new Mode7(); + ModeAHDC mode_ahdc = new ModeAHDC(); + + public PulseExtractorEngine() { + super("PULSE", "baltzell", "0.0"); + } + + @Override + public boolean init() { + // If using a CCDB table, must register it here: + //requireConstants("/daq/config/ahdc"); + return true; + } + + @Override + public boolean processDataEvent(DataEvent event) { + + // No CCDB table, hardcoded parameters in the extractor: + //mode3.update(6, null, event, "BMT::wf", "BMT::adc"); + //mode7.update(80, null, event, "AHDC::wf", "AHDC::adc"); + mode_ahdc.update(30, null, event, "AHDC::wf", "AHDC::adc"); + + /* + // Requiring a CCDB table: + DataBank runConfig = event.getBank("RUN::config"); + if (runConfig.rows()>0) { + IndexedTable it = getConstantsManager().getConstants( + runConfig.getInt("run", 0), "/daq/config/ahdc"); + basic.update(136, it, event, "AHDC::wf", "AHDC::adc"); + } + */ + + return true; + } + +} From c3f28ad88f588a69d49394c7a239a594b8f1f306 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 24 Apr 2026 20:37:50 -0400 Subject: [PATCH 26/26] restore reported data type --- .../src/main/java/org/jlab/io/clara/EvioToEvioReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java index e4ae442101..372bd423a7 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java @@ -53,6 +53,6 @@ public Object readEvent(int eventNumber) throws EventReaderException { @Override protected EngineDataType getDataType() { - return Clas12Types.HIPO; + return Clas12Types.EVIO; } }