From 6865d4f530b1e8d1a62f4176184aca288f17d608 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 22 Dec 2025 16:49:38 -0500 Subject: [PATCH 1/2] add Clas12Reader --- .../java/org/jlab/io/clara/Clas12Reader.java | 90 +++++++++++++++++++ .../java/org/jlab/io/clara/DecoderWriter.java | 2 +- .../org/jlab/io/clara/Clas12Reader.yaml | 11 +++ 3 files changed, 102 insertions(+), 1 deletion(-) 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..7b10192c4b --- /dev/null +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java @@ -0,0 +1,90 @@ +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; + +/** + * + * @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/java/org/jlab/io/clara/DecoderWriter.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java index 9be013bece..6881bf1928 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java @@ -66,7 +66,7 @@ protected HipoWriterSorted createWriter(Path file, JSONObject opts) throws Event init(opts); HipoWriterSorted w = new HipoWriterSorted(); super.configure(w, opts); - w.open(file.toString()); + w.open(file.toString().endsWith(".hipo") ? file.toString() : file.toString()+".hipo"); return w; } catch (Exception e) { throw new EventWriterException(e); 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 880fa44d44a21676cc4d8629735b9a5ed554be15 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 22 Dec 2025 16:52:34 -0500 Subject: [PATCH 2/2] switch to Clas12Reader --- etc/services/rgd-clarode.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/services/rgd-clarode.yml b/etc/services/rgd-clarode.yml index b3612af29d..0fef0e2016 100644 --- a/etc/services/rgd-clarode.yml +++ b/etc/services/rgd-clarode.yml @@ -19,8 +19,8 @@ configuration: outputBankPrefix: "HB" io-services: reader: - class: org.jlab.io.clara.DecoderReader - name: DecoderReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: class: org.jlab.io.clara.DecoderWriter name: DecoderWriter