From fbbc4375ae570306f6aa95d31d8969e5348671f6 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Aug 2026 16:48:36 -0400 Subject: [PATCH 01/51] add more helpful helper method --- .../src/main/java/org/jlab/utils/groups/IndexedList.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedList.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedList.java index 384e2cb259..23d440b63e 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedList.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedList.java @@ -345,10 +345,9 @@ public int[] getIndices(long hashcode, int... indices) { * @return */ public int[] getIndices(long hashcode, int nindices) { - int[] ret = new int[nindices]; - for (int i=0; i Date: Wed, 12 Aug 2026 17:00:08 -0400 Subject: [PATCH 02/51] simplify --- .../src/main/java/org/jlab/utils/groups/IndexedList.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedList.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedList.java index 23d440b63e..384e2cb259 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedList.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedList.java @@ -345,9 +345,10 @@ public int[] getIndices(long hashcode, int... indices) { * @return */ public int[] getIndices(long hashcode, int nindices) { - int[] indices = new int[nindices]; - for (int i=0; i Date: Mon, 10 Aug 2026 19:33:08 -0400 Subject: [PATCH 03/51] add occupancy table --- .../detector/calib/utils/OccupancyTable.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java new file mode 100644 index 0000000000..5eb0cbdc8e --- /dev/null +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -0,0 +1,47 @@ +package org.jlab.detector.calib.utils; + +import java.util.Map; +import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; +import org.jlab.utils.groups.IndexedTable; + +/** + * + * @author baltzell + */ +public class OccupancyTable { + + String bankName; + private IndexedTable table; + + public OccupancyTable(String bank, int indexCount) { + bankName = bank; + table = new IndexedTable(indexCount, new String[]{"nhits/I"}); + } + + public void add(int nhits, int... index) { + if (!table.hasEntry(index)) { + table.addEntry(index); + } + table.setIntValue(nhits, "nhits", index); + } + + public void update(DataEvent e) { + DataBank b = e.getBank(bankName); + if (b != null) e.removeBank(bankName); + b = e.createBank(bankName, table.getRowCount()); + Map m = table.getList().getMap(); + int i = 0; + for (Map.Entry entry : m.entrySet()) { + long hash = entry.getKey(); + int sector = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0); + int layer = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1); + int component = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2); + b.setInt("sector", i, sector); + b.setInt("sector", i, layer); + b.setInt("sector", i, component); + b.setInt("nhits", i++, entry.getValue()); + } + e.appendBank(b); + } +} From 72fd63aa84f4590c340ea96898a2f04097b7cbaa Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Aug 2026 21:23:51 -0400 Subject: [PATCH 04/51] complete OccupancyTable class --- .../detector/calib/utils/OccupancyTable.java | 67 +++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 5eb0cbdc8e..94eda12ea4 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -11,37 +11,64 @@ */ public class OccupancyTable { - String bankName; + public static final String[] INDEX_NAMES = {"sector","layer","component","order"}; + + private final int indexCount; + private IndexedTable table; - public OccupancyTable(String bank, int indexCount) { - bankName = bank; - table = new IndexedTable(indexCount, new String[]{"nhits/I"}); + public OccupancyTable(int indexCount) { + if (indexCount != 3 && indexCount != 4) throw new RuntimeException(); + this.indexCount = indexCount; + table = new IndexedTable(indexCount, new String[]{"nhits/D"}); } - public void add(int nhits, int... index) { + public void reset() { + table = new IndexedTable(indexCount, new String[]{"nhits/D"}); + } + + public void add(double weight, int... index) { if (!table.hasEntry(index)) { table.addEntry(index); + table.setDoubleValue(0.0, "nhits", index); } - table.setIntValue(nhits, "nhits", index); + table.setDoubleValue(table.getDoubleValue("nhits",index) + weight, "nhits", index); } - public void update(DataEvent e) { - DataBank b = e.getBank(bankName); - if (b != null) e.removeBank(bankName); - b = e.createBank(bankName, table.getRowCount()); - Map m = table.getList().getMap(); + public void add(int... index) { + add(1, index); + } + + public void add(DataBank b) { + final int rows = b.rows(); + for (int i=0; i m = table.getList().getMap(); for (Map.Entry entry : m.entrySet()) { - long hash = entry.getKey(); - int sector = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0); - int layer = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1); - int component = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2); - b.setInt("sector", i, sector); - b.setInt("sector", i, layer); - b.setInt("sector", i, component); - b.setInt("nhits", i++, entry.getValue()); + b.setInt("sector", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 0)); + b.setInt("layer", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 1)); + b.setInt("component", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 2)); + if (indexCount == 4) + b.setInt("order", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 3)); + b.setInt("nhits", i, entry.getValue()); + i++; } + } + + public void update(DataEvent e, String bankName) { + DataBank b = e.getBank(bankName); + if (b != null) e.removeBank(bankName); + b = e.createBank(bankName, table.getRowCount()); + update(b); e.appendBank(b); } -} + +} \ No newline at end of file From a9f503103b579e0e3e11bfeed4c6d85fd5661346 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Aug 2026 21:38:54 -0400 Subject: [PATCH 05/51] cleanup --- .../java/org/jlab/detector/calib/utils/OccupancyTable.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 94eda12ea4..ce3f95128c 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -20,7 +20,7 @@ public class OccupancyTable { public OccupancyTable(int indexCount) { if (indexCount != 3 && indexCount != 4) throw new RuntimeException(); this.indexCount = indexCount; - table = new IndexedTable(indexCount, new String[]{"nhits/D"}); + reset(); } public void reset() { @@ -49,7 +49,7 @@ else if (indexCount == 4) } } - private void update(DataBank b) { + public void update(DataBank b) { int i = 0; Map m = table.getList().getMap(); for (Map.Entry entry : m.entrySet()) { @@ -71,4 +71,4 @@ public void update(DataEvent e, String bankName) { e.appendBank(b); } -} \ No newline at end of file +} From 25dbc4bb6074fdd5a9ee449820f87bdc97c1d506 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 11 Aug 2026 10:03:27 -0400 Subject: [PATCH 06/51] cleanup --- .../detector/calib/utils/OccupancyTable.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index ce3f95128c..6548833645 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -11,20 +11,18 @@ */ public class OccupancyTable { - public static final String[] INDEX_NAMES = {"sector","layer","component","order"}; - - private final int indexCount; - + private String[] indexNames; private IndexedTable table; - public OccupancyTable(int indexCount) { - if (indexCount != 3 && indexCount != 4) throw new RuntimeException(); - this.indexCount = indexCount; - reset(); + public OccupancyTable(String... index) { + if (index.length != 3 && index.length != 4) + throw new IllegalArgumentException("Invalid index length: "+index.length); + indexNames = index; + table = new IndexedTable(indexNames.length, new String[]{"nhits/D"}); } public void reset() { - table = new IndexedTable(indexCount, new String[]{"nhits/D"}); + table = new IndexedTable(indexNames.length, new String[]{"nhits/D"}); } public void add(double weight, int... index) { @@ -42,10 +40,8 @@ public void add(int... index) { public void add(DataBank b) { final int rows = b.rows(); for (int i=0; i Date: Tue, 11 Aug 2026 13:48:59 -0400 Subject: [PATCH 07/51] add bank --- .../detector/calib/utils/OccupancyTable.java | 73 +++++++++++++------ etc/bankdefs/hipo4/occupancy.json | 14 ++++ 2 files changed, 63 insertions(+), 24 deletions(-) create mode 100644 etc/bankdefs/hipo4/occupancy.json diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 6548833645..aca5de13c2 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -2,68 +2,93 @@ import java.util.Map; import org.jlab.io.base.DataBank; -import org.jlab.io.base.DataEvent; import org.jlab.utils.groups.IndexedTable; /** - * + * Utility class for storing occupancy/multiplicity in an IndexedTable and + * writing it to an occupancy bank with format (index... weight [*]) + * * @author baltzell */ public class OccupancyTable { private String[] indexNames; private IndexedTable table; - + public OccupancyTable(String... index) { if (index.length != 3 && index.length != 4) throw new IllegalArgumentException("Invalid index length: "+index.length); indexNames = index; - table = new IndexedTable(indexNames.length, new String[]{"nhits/D"}); + table = new IndexedTable(indexNames.length, new String[]{"occ/D"}); } + /** + * Reset the occupancy table. + */ public void reset() { - table = new IndexedTable(indexNames.length, new String[]{"nhits/D"}); + table = new IndexedTable(indexNames.length, new String[]{"occ/D"}); } + /** + * Fill occupancy, user-defined weight. + * @param weight + * @param index + */ public void add(double weight, int... index) { + final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(index); if (!table.hasEntry(index)) { table.addEntry(index); - table.setDoubleValue(0.0, "nhits", index); + table.setDoubleValueByHash(0.0, indexNames.length, hash); } - table.setDoubleValue(table.getDoubleValue("nhits",index) + weight, "nhits", index); + table.setDoubleValueByHash(weight + table.getDoubleValueByHash(indexNames.length, hash), indexNames.length, hash); } + /** + * Fill occupancy, unity weight. + * @param index + */ public void add(int... index) { add(1, index); } + /** + * Fill occupancy from hits bank, one per bank row. + * Note, bank index data types are hard-coded here! + * @param b hit bank + */ public void add(DataBank b) { final int rows = b.rows(); for (int i=0; i m = table.getList().getMap(); for (Map.Entry entry : m.entrySet()) { - b.setInt("sector", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 0)); - b.setInt("layer", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 1)); - b.setInt("component", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 2)); - if (indexNames.length == 4) b.setInt("order", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 3)); - b.setInt("nhits", i, entry.getValue()); + b.setInt(0, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 0)); + b.setInt(1, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 1)); + b.setInt(2, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 2)); + if (indexNames.length == 4) + b.setInt(3, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 3)); + b.setInt(indexNames.length, i, entry.getValue()); i++; } } - - public void update(DataEvent e, String bankName) { - DataBank b = e.getBank(bankName); - if (b != null) e.removeBank(bankName); - b = e.createBank(bankName, table.getRowCount()); - update(b); - e.appendBank(b); - } - -} +} \ No newline at end of file diff --git a/etc/bankdefs/hipo4/occupancy.json b/etc/bankdefs/hipo4/occupancy.json new file mode 100644 index 0000000000..82722ec54f --- /dev/null +++ b/etc/bankdefs/hipo4/occupancy.json @@ -0,0 +1,14 @@ +[ + { + "name": "DC::occ", + "group": 20600, + "item": 20, + "info": "Event Header Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"S", "info":"number of hits"} + ] + } +] From dd905d021130b94c15c4fcb1d649fab5fa59c811 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Aug 2026 16:44:42 -0400 Subject: [PATCH 08/51] make it work --- .../detector/calib/utils/OccupancyTable.java | 132 +++++++++++------- etc/bankdefs/hipo4/occupancy.json | 2 +- 2 files changed, 80 insertions(+), 54 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index aca5de13c2..74b489e064 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -2,93 +2,119 @@ import java.util.Map; import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; import org.jlab.utils.groups.IndexedTable; +import org.jlab.utils.groups.IndexedTable.IndexedEntry; -/** - * Utility class for storing occupancy/multiplicity in an IndexedTable and - * writing it to an occupancy bank with format (index... weight [*]) - * - * @author baltzell - */ -public class OccupancyTable { +public abstract class OccupancyTable { - private String[] indexNames; - private IndexedTable table; + public static void main(String[] args) { + DC d = new DC(); + d.add(1,1,1); + d.add(1,2,1); + d.add(1,3,1); + d.add(1,3,1); + IndexedTable o = d.getOccupancy(10); + o.show(); + o.getList().show(); + } + + public static class DC extends OccupancyTable { + public DC() { super("DC::occ","sector","layer"); } + @Override + public void add(DataEvent e) { + DataBank b = e.getBank("DC::tot"); + if (b != null) { + final int rows = b.rows(); + for (int i=0; i)table.getList().getMap()).keySet()) { + t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0), + IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1), + IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2)); + t.setDoubleValueByHash(((double)table.getIntValueByHash(0, hash))/events, 0, hash); } - table.setDoubleValueByHash(weight + table.getDoubleValueByHash(indexNames.length, hash), indexNames.length, hash); + return t; } /** - * Fill occupancy, unity weight. - * @param index + * Reset occupancy table. */ - public void add(int... index) { - add(1, index); + public final void reset() { + table = new IndexedTable(indexNames.length, valueNames); } /** - * Fill occupancy from hits bank, one per bank row. - * Note, bank index data types are hard-coded here! - * @param b hit bank + * Fill occupancy table. + * @param index */ - public void add(DataBank b) { - final int rows = b.rows(); - for (int i=0; i m = table.getList().getMap(); - for (Map.Entry entry : m.entrySet()) { - b.setInt(0, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 0)); - b.setInt(1, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 1)); - b.setInt(2, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 2)); + Map m = table.getList().getMap(); + for (long hash : m.keySet()) { + b.setByte(0, i, (byte)IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0)); + b.setByte(1, i, (byte)IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1)); + b.setShort(2, i, (short)IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2)); if (indexNames.length == 4) - b.setInt(3, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 3)); - b.setInt(indexNames.length, i, entry.getValue()); + b.setByte(3, i, (byte)IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 3)); + b.setInt(indexNames.length, i, m.get(hash).getValue(0).intValue()); i++; } } + + /** + * Fill occupancy from hits bank. + * @param e + */ + protected abstract void add(DataEvent e); } \ No newline at end of file diff --git a/etc/bankdefs/hipo4/occupancy.json b/etc/bankdefs/hipo4/occupancy.json index 82722ec54f..10195ecd32 100644 --- a/etc/bankdefs/hipo4/occupancy.json +++ b/etc/bankdefs/hipo4/occupancy.json @@ -8,7 +8,7 @@ { "name":"sector" , "type":"B", "info":"sector"}, { "name":"layer" , "type":"B", "info":"layer"}, { "name":"component" , "type":"S", "info":"component"}, - { "name":"hits" , "type":"S", "info":"number of hits"} + { "name":"hits" , "type":"I", "info":"number of hits"} ] } ] From e016f69791e51bba37e0ca45d807edb136fd947e Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Aug 2026 17:03:56 -0400 Subject: [PATCH 09/51] cleanup --- .../jlab/detector/calib/utils/OccupancyTable.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 74b489e064..d53fe879c8 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -58,9 +58,7 @@ public OccupancyTable(String bank) { public final IndexedTable getOccupancy(int events) { IndexedTable t = new IndexedTable(indexNames.length, new String[]{"occ/F"}); for (long hash : ((Map)table.getList().getMap()).keySet()) { - t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0), - IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1), - IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2)); + t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length)); t.setDoubleValueByHash(((double)table.getIntValueByHash(0, hash))/events, 0, hash); } return t; @@ -102,11 +100,11 @@ public final void update(DataBank b) { int i = 0; Map m = table.getList().getMap(); for (long hash : m.keySet()) { - b.setByte(0, i, (byte)IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0)); - b.setByte(1, i, (byte)IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1)); - b.setShort(2, i, (short)IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2)); - if (indexNames.length == 4) - b.setByte(3, i, (byte)IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 3)); + int[] indices = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length); + b.setByte(0, i, (byte)indices[0]); + b.setByte(1, i, (byte)indices[1]); + b.setShort(2, i, (short)indices[2]); + if (indexNames.length == 4) b.setByte(3, i, (byte)indices[3]); b.setInt(indexNames.length, i, m.get(hash).getValue(0).intValue()); i++; } From 8d51badd961b7bf06190b6b31916f9bc43e6d32e Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Aug 2026 19:22:52 -0400 Subject: [PATCH 10/51] cleanup --- .../detector/calib/utils/OccupancyTable.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index d53fe879c8..3750cd1550 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -20,32 +20,28 @@ public static void main(String[] args) { } public static class DC extends OccupancyTable { - public DC() { super("DC::occ","sector","layer"); } + public DC() { super("DC::occ","sector","layer","component"); } @Override public void add(DataEvent e) { DataBank b = e.getBank("DC::tot"); - if (b != null) { - final int rows = b.rows(); - for (int i=0; i Date: Wed, 12 Aug 2026 20:19:36 -0400 Subject: [PATCH 11/51] more --- .../detector/calib/utils/OccupancyTable.java | 57 +++++++------------ etc/bankdefs/hipo4/occupancy.json | 2 +- 2 files changed, 23 insertions(+), 36 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 3750cd1550..4d00191d88 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -8,20 +8,8 @@ public abstract class OccupancyTable { - public static void main(String[] args) { - DC d = new DC(); - d.add(1,1,1); - d.add(1,2,1); - d.add(1,3,1); - d.add(1,3,1); - IndexedTable o = d.getOccupancy(10); - o.show(); - o.getList().show(); - } - public static class DC extends OccupancyTable { - public DC() { super("DC::occ","sector","layer","component"); } - @Override + public DC() { super(); } public void add(DataEvent e) { DataBank b = e.getBank("DC::tot"); if (b == null) b = e.getBank("DC::tdc"); @@ -32,16 +20,16 @@ public void add(DataEvent e) { } } - protected String[] valueNames = {"occ/I"}; + protected String[] valueNames = {"occ/F"}; protected String[] indexNames; protected IndexedTable table; - public OccupancyTable(String bank, String... index) { + public OccupancyTable(String... index) { indexNames = index; table = new IndexedTable(indexNames.length, valueNames); } - public OccupancyTable(String bank) { + public OccupancyTable() { indexNames = new String[]{"sector","layer","component"}; table = new IndexedTable(indexNames.length, valueNames); } @@ -55,7 +43,7 @@ public final IndexedTable getOccupancy(int events) { IndexedTable t = new IndexedTable(indexNames.length, new String[]{"occ/F"}); for (long hash : ((Map)table.getList().getMap()).keySet()) { t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length)); - t.setDoubleValueByHash(((double)table.getIntValueByHash(0, hash))/events, 0, hash); + t.setDoubleValueByHash((table.getDoubleValueByHash(0, hash))/events, 0, hash); } return t; } @@ -77,7 +65,7 @@ public final void add(int... index) { table.addEntry(index); table.setIntValueByHash(0, 0, hash); } - table.setIntValueByHash(table.getIntValueByHash(0, hash) + 1, 0, hash); + table.setDoubleValueByHash(table.getDoubleValueByHash(0, hash) + 1, 0, hash); } /** @@ -90,32 +78,31 @@ public final int getRows() { /** * Update an occupancy bank, assuming 3/4-index s/l/c[/o]. - * @param b occupancy bank + * @param bank occupancy bank */ - public final void update(DataBank b) { + public final void update(DataBank bank) { int i = 0; Map m = table.getList().getMap(); for (long hash : m.keySet()) { int[] indices = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length); - b.setByte(0, i, (byte)indices[0]); - b.setByte(1, i, (byte)indices[1]); - b.setShort(2, i, (short)indices[2]); - if (indexNames.length == 4) b.setByte(3, i, (byte)indices[3]); - b.setInt(indexNames.length, i, m.get(hash).getValue(0).intValue()); + bank.setByte(0, i, (byte)indices[0]); + bank.setByte(1, i, (byte)indices[1]); + bank.setShort(2, i, (short)indices[2]); + if (indexNames.length == 4) bank.setByte(3, i, (byte)indices[3]); + bank.setFloat(indexNames.length, i, m.get(hash).getValue(0).intValue()); i++; } } - public final void update(DataEvent e, String bank) { - DataBank b = e.createBank(bank, getRows()); - if (e.hasBank(bank)) e.removeBank(bank); - update(b); - e.appendBank(b); - } - /** - * Fill occupancy from hits bank. - * @param e + * Create occupancy bank, assuming 3/4-indexing, and add it to the event. + * @param event + * @param bank */ - protected abstract void add(DataEvent e); + public final void update(DataEvent event, String bank) { + DataBank b = event.createBank(bank, getRows()); + if (event.hasBank(bank)) event.removeBank(bank); + update(b); + event.appendBank(b); + } } \ No newline at end of file diff --git a/etc/bankdefs/hipo4/occupancy.json b/etc/bankdefs/hipo4/occupancy.json index 10195ecd32..c89164248d 100644 --- a/etc/bankdefs/hipo4/occupancy.json +++ b/etc/bankdefs/hipo4/occupancy.json @@ -8,7 +8,7 @@ { "name":"sector" , "type":"B", "info":"sector"}, { "name":"layer" , "type":"B", "info":"layer"}, { "name":"component" , "type":"S", "info":"component"}, - { "name":"hits" , "type":"I", "info":"number of hits"} + { "name":"hits" , "type":"F", "info":"number of hits"} ] } ] From 06bb8bf6bf7530f7cbd4abadfa999ffbf88bd11b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 14:04:41 -0400 Subject: [PATCH 12/51] claraify it --- .../java/org/jlab/io/clara/Clas12Writer.java | 27 ++++ .../detector/calib/utils/OccupancyTable.java | 135 +++++++++++++----- .../org/jlab/clas/reco/OccupancyEngine.java | 36 +++++ 3 files changed, 162 insertions(+), 36 deletions(-) create mode 100644 common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index a094b939cd..7902ccf55c 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -8,6 +8,7 @@ import org.jlab.analysis.postprocess.Processor; import org.jlab.clara.std.services.EventWriterException; import org.jlab.detector.calib.utils.ConstantsManager; +import org.jlab.detector.calib.utils.OccupancyTable; import org.jlab.detector.decode.CLASDecoder4; import org.jlab.detector.helicity.HelicitySequence; import org.jlab.detector.helicity.HelicitySequenceDelayed; @@ -35,6 +36,9 @@ public class Clas12Writer extends HipoToHipoWriter { static final String[] TAG1BANKS = {"RUN::scaler","HEL::scaler","RAW::scaler","RAW::epics","HEL::flip","COAT::config"}; + int events; + OccupancyTable[] occupancyTables; + Bank[] occupancyBanks; Bank[] tag1banks; Bank runConfig; Bank helicityAdc; @@ -46,6 +50,7 @@ public class Clas12Writer extends HipoToHipoWriter { boolean postprocess; private void init(JSONObject opts) { + events = 0; fullSchema = new SchemaFactory(); fullSchema.initFromDirectory(FileUtils.getEnvironmentPath("CLAS12DIR","etc/bankdefs/hipo4")); runConfig = new Bank(fullSchema.getSchema("RUN::config")); @@ -61,6 +66,10 @@ private void init(JSONObject opts) { tag1banks = new Bank[TAG1BANKS.length]; for (int i=0; i 0 && evno > 0) eventUnix.put(evno, unix); } + for (int i=0; i)table.getList().getMap()).keySet()) { - t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length)); - t.setDoubleValueByHash((table.getDoubleValueByHash(0, hash))/events, 0, hash); - } - return t; - } - /** * Reset occupancy table. */ @@ -56,18 +43,74 @@ public final void reset() { } /** - * Fill occupancy table. + * Fill occupancy table with a weight. + * @param weight * @param index */ - public final void add(int... index) { + public final void fill(float weight, int... index) { final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(index); if (!table.hasEntryByHash(hash)) { table.addEntry(index); table.setIntValueByHash(0, 0, hash); } - table.setDoubleValueByHash(table.getDoubleValueByHash(0, hash) + 1, 0, hash); + table.setDoubleValueByHash(table.getDoubleValueByHash(0, hash) + weight, 0, hash); + } + + /** + * Fill occupancy table. + * @param index + */ + public final void fill(int... index) { + fill(1.0f, index); + } + + /** + * + * @param b + * @param weighted + */ + public void fill(DataBank b, boolean weighted) { + final int rows = b.rows(); + int[] indices = new int[indexNames.length]; + for (int i=0; i m = table.getList().getMap(); for (long hash : m.keySet()) { int[] indices = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length); - bank.setByte(0, i, (byte)indices[0]); - bank.setByte(1, i, (byte)indices[1]); - bank.setShort(2, i, (short)indices[2]); - if (indexNames.length == 4) bank.setByte(3, i, (byte)indices[3]); - bank.setFloat(indexNames.length, i, m.get(hash).getValue(0).intValue()); + for (int j=0; j)table.getList().getMap()).keySet()) { + int[] idx = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length); + for (int j=0; j)table.getList().getMap()).keySet()) { + t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length)); + t.setDoubleValueByHash((table.getDoubleValueByHash(0, hash))/events, 0, hash); + } + return t; + } + } \ No newline at end of file diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java new file mode 100644 index 0000000000..ebce35d6a2 --- /dev/null +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java @@ -0,0 +1,36 @@ +package org.jlab.clas.reco; + +import org.jlab.detector.calib.utils.OccupancyTable; +import org.jlab.io.base.DataEvent; + +/** + * + * @author baltzell + */ +public class OccupancyEngine extends ReconstructionEngine { + + OccupancyTable[] tables = {new OccupancyTable.DC()}; + String[] banks = {"DC::occ"}; + + public OccupancyEngine() { + super("OccE", "baltzell", "0.1"); + } + + @Override + public boolean processDataEventUser(DataEvent event) { + for (int i=0; i Date: Thu, 13 Aug 2026 14:38:29 -0400 Subject: [PATCH 13/51] untagged periodic instead --- .../java/org/jlab/io/clara/Clas12Writer.java | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index 7902ccf55c..2d35ae9873 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -36,7 +36,7 @@ public class Clas12Writer extends HipoToHipoWriter { static final String[] TAG1BANKS = {"RUN::scaler","HEL::scaler","RAW::scaler","RAW::epics","HEL::flip","COAT::config"}; - int events; + int occupancyEvents; OccupancyTable[] occupancyTables; Bank[] occupancyBanks; Bank[] tag1banks; @@ -50,7 +50,7 @@ public class Clas12Writer extends HipoToHipoWriter { boolean postprocess; private void init(JSONObject opts) { - events = 0; + occupancyEvents = 0; fullSchema = new SchemaFactory(); fullSchema.initFromDirectory(FileUtils.getEnvironmentPath("CLAS12DIR","etc/bankdefs/hipo4")); runConfig = new Bank(fullSchema.getSchema("RUN::config")); @@ -95,34 +95,28 @@ protected void writeEvent(Object event) throws EventWriterException { int evno = runConfig.getInt("event",0); if (unix > 0 && evno > 0) eventUnix.put(evno, unix); } + occupancyEvents++; for (int i=0; i Date: Thu, 13 Aug 2026 15:58:10 -0400 Subject: [PATCH 14/51] cleanup --- .../java/org/jlab/io/clara/Clas12Writer.java | 29 +++++++++++-------- .../detector/calib/utils/OccupancyTable.java | 4 +-- .../org/jlab/clas/reco/OccupancyEngine.java | 2 +- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index 2d35ae9873..f654383330 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -85,28 +85,33 @@ protected HipoWriterSorted createWriter(Path file, JSONObject opts) throws Event } } - @Override - protected void writeEvent(Object event) throws EventWriterException { - scalers.add((Event)event); - ((Event)event).read(runConfig); - ((Event)event).read(helicityAdc); - if (runConfig.getRows() > 0) { - int unix = runConfig.getInt("unixtime",0); - int evno = runConfig.getInt("event",0); - if (unix > 0 && evno > 0) eventUnix.put(evno, unix); - } + private void processOccupancy(Event event) { occupancyEvents++; for (int i=0; i 0) { + int unix = runConfig.getInt("unixtime",0); + int evno = runConfig.getInt("event",0); + if (unix > 0 && evno > 0) eventUnix.put(evno, unix); + } + processOccupancy((Event)event); helicities.add(HelicityState.createFromFadcBank(helicityAdc, runConfig, conman)); Event t = CLASDecoder4.createTaggedEvent((Event)event, runConfig, tag1banks); if (!t.isEmpty()) writer.addEvent(t, 1); diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 0fd2d27844..c8739077d6 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -140,7 +140,7 @@ public final DataBank create(DataEvent event, String bank) { * @param events * @param b */ - public final void update(int events, Bank b) { + public final void create(int events, Bank b) { b.setRows(getRows()); int row = 0; for (long hash : ((Map)table.getList().getMap()).keySet()) { @@ -159,7 +159,7 @@ public final void update(int events, Bank b) { * @param events number of events that have been added * @return */ - public final IndexedTable getOccupancy(int events) { + public final IndexedTable create(int events) { IndexedTable t = new IndexedTable(indexNames.length, new String[]{"occ/F"}); for (long hash : ((Map)table.getList().getMap()).keySet()) { t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length)); diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java index ebce35d6a2..3fcb49450e 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java @@ -13,7 +13,7 @@ public class OccupancyEngine extends ReconstructionEngine { String[] banks = {"DC::occ"}; public OccupancyEngine() { - super("OccE", "baltzell", "0.1"); + super("Occupancy", "baltzell", "0.1"); } @Override From 251c6ed08a747c17046905127c273d45a49f2def Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 16:02:08 -0400 Subject: [PATCH 15/51] go long --- .../src/main/java/org/jlab/io/clara/Clas12Writer.java | 3 ++- .../java/org/jlab/detector/calib/utils/OccupancyTable.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index f654383330..66afab0b01 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -36,7 +36,7 @@ public class Clas12Writer extends HipoToHipoWriter { static final String[] TAG1BANKS = {"RUN::scaler","HEL::scaler","RAW::scaler","RAW::epics","HEL::flip","COAT::config"}; - int occupancyEvents; + long occupancyEvents; OccupancyTable[] occupancyTables; Bank[] occupancyBanks; Bank[] tag1banks; @@ -89,6 +89,7 @@ private void processOccupancy(Event event) { occupancyEvents++; for (int i=0; i)table.getList().getMap()).keySet()) { @@ -159,7 +159,7 @@ public final void create(int events, Bank b) { * @param events number of events that have been added * @return */ - public final IndexedTable create(int events) { + public final IndexedTable create(long events) { IndexedTable t = new IndexedTable(indexNames.length, new String[]{"occ/F"}); for (long hash : ((Map)table.getList().getMap()).keySet()) { t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length)); From 36bb1192a6759678fa197323b78c271126b4ee9a Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 16:12:27 -0400 Subject: [PATCH 16/51] cleanup --- .../java/org/jlab/io/clara/Clas12Writer.java | 3 +- .../detector/calib/utils/OccupancyTable.java | 51 ++++++++++--------- .../org/jlab/clas/reco/OccupancyEngine.java | 3 +- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index 66afab0b01..cead1b0607 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -86,13 +86,12 @@ protected HipoWriterSorted createWriter(Path file, JSONObject opts) throws Event } private void processOccupancy(Event event) { - occupancyEvents++; for (int i=0; i)table.getList().getMap()).keySet()) { t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length)); t.setDoubleValueByHash((table.getDoubleValueByHash(0, hash))/events, 0, hash); diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java index 3fcb49450e..1dab369dc1 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java @@ -18,9 +18,8 @@ public OccupancyEngine() { @Override public boolean processDataEventUser(DataEvent event) { - for (int i=0; i Date: Thu, 13 Aug 2026 17:19:54 -0400 Subject: [PATCH 17/51] cleanup --- .../java/org/jlab/io/clara/Clas12Writer.java | 41 ++-- .../detector/calib/utils/OccupancyTable.java | 176 ++++++++++-------- .../org/jlab/clas/reco/OccupancyEngine.java | 35 ---- 3 files changed, 117 insertions(+), 135 deletions(-) delete mode 100644 common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index cead1b0607..dc0b8fc3a4 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -38,7 +38,6 @@ public class Clas12Writer extends HipoToHipoWriter { long occupancyEvents; OccupancyTable[] occupancyTables; - Bank[] occupancyBanks; Bank[] tag1banks; Bank runConfig; Bank helicityAdc; @@ -46,17 +45,17 @@ public class Clas12Writer extends HipoToHipoWriter { TreeMap eventUnix; TreeSet helicities; DaqScalersSequence scalers; - SchemaFactory fullSchema; + SchemaFactory schema; boolean postprocess; private void init(JSONObject opts) { occupancyEvents = 0; - fullSchema = new SchemaFactory(); - fullSchema.initFromDirectory(FileUtils.getEnvironmentPath("CLAS12DIR","etc/bankdefs/hipo4")); - runConfig = new Bank(fullSchema.getSchema("RUN::config")); - helicityAdc = new Bank(fullSchema.getSchema("HEL::adc")); + schema = new SchemaFactory(); + schema.initFromDirectory(FileUtils.getEnvironmentPath("CLAS12DIR","etc/bankdefs/hipo4")); + runConfig = new Bank(schema.getSchema("RUN::config")); + helicityAdc = new Bank(schema.getSchema("HEL::adc")); helicities = new TreeSet<>(); - scalers = new DaqScalersSequence(fullSchema); + scalers = new DaqScalersSequence(schema); conman = new ConstantsManager(); eventUnix = new TreeMap<>(); conman.init("/runcontrol/hwp","/runcontrol/helicity"); @@ -65,11 +64,8 @@ private void init(JSONObject opts) { if (opts.has("timestamp")) conman.setTimeStamp(opts.getString("timestamp")); tag1banks = new Bank[TAG1BANKS.length]; for (int i=0; i 0) event.write(b); + t.reset(); } occupancyEvents = 0; } @@ -120,7 +113,7 @@ protected void writeEvent(Object event) throws EventWriterException { @Override protected void closeWriter() { - HelicitySequence.writeFlips(fullSchema, writer, helicities); + HelicitySequence.writeFlips(schema, writer, helicities); writer.addEvent(getUnixEvent(runConfig),1); super.closeWriter(); if (postprocess) postprocess(); @@ -153,7 +146,7 @@ private int getRunNumber() { * @return */ private Event getUnixEvent(Bank config) { - Bank unix = new Bank(fullSchema.getSchema("RUN::unix")); + Bank unix = new Bank(schema.getSchema("RUN::unix")); unix.setRows(eventUnix.size()); int row = 0; for (int evno : eventUnix.keySet()) { @@ -174,7 +167,7 @@ private void postprocess() { int d = conman.getConstants(getRunNumber(), "/runcontrol/helicity").getIntValue("delay",0,0,0); HelicitySequenceDelayed helicity = new HelicitySequenceDelayed(d); helicity.addStream(helicities); - Processor p = new Processor(List.of(filename), fullSchema, helicity, scalers); + Processor p = new Processor(List.of(filename), schema, helicity, scalers); HipoReader r = new HipoReader(); r.open(filename); Event e = new Event(); diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index bbd5e6339d..a87b5152b7 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -4,41 +4,76 @@ import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.jnp.hipo4.data.Bank; +import org.jlab.jnp.hipo4.data.Event; +import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.groups.IndexedTable.IndexedEntry; -public abstract class OccupancyTable { +public class OccupancyTable { - public static class DC extends OccupancyTable { - public DC() { super(); } - /*public void fill(DataEvent e) { - DataBank b = e.getBank("DC::tot"); - if (b == null) b = e.getBank("DC::tdc"); - if (b == null) return; - final int rows = b.rows(); - for (int i=0; i)table.getList().getMap()).keySet()) { + t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indices.length)); + t.setDoubleValueByHash((table.getDoubleValueByHash(0, hash))/events, 0, hash); + } + return t; } /** @@ -64,113 +99,102 @@ public final void fill(int... index) { } /** - * + * Fill occupancy table from a bank. * @param bank * @param weighted */ - public void fill(DataBank bank, boolean weighted) { - final int rows = bank.rows(); - int[] indices = new int[indexNames.length]; + public void fill(Bank bank, boolean weighted) { + int rows = bank.getRows(); + int[] idx = new int[indices.length]; for (int i=0; i m = table.getList().getMap(); for (long hash : m.keySet()) { - int[] indices = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length); - for (int j=0; j)table.getList().getMap()).keySet()) { - int[] idx = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length); - for (int j=0; j)table.getList().getMap()).keySet()) { - t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indexNames.length)); - t.setDoubleValueByHash((table.getDoubleValueByHash(0, hash))/events, 0, hash); - } - return t; + return b; } } \ No newline at end of file diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java deleted file mode 100644 index 1dab369dc1..0000000000 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/OccupancyEngine.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.jlab.clas.reco; - -import org.jlab.detector.calib.utils.OccupancyTable; -import org.jlab.io.base.DataEvent; - -/** - * - * @author baltzell - */ -public class OccupancyEngine extends ReconstructionEngine { - - OccupancyTable[] tables = {new OccupancyTable.DC()}; - String[] banks = {"DC::occ"}; - - public OccupancyEngine() { - super("Occupancy", "baltzell", "0.1"); - } - - @Override - public boolean processDataEventUser(DataEvent event) { - for (int i=0; i Date: Thu, 13 Aug 2026 17:27:50 -0400 Subject: [PATCH 18/51] cleanup --- .../detector/calib/utils/OccupancyTable.java | 50 ++++++------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index a87b5152b7..e580529483 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -31,14 +31,6 @@ public OccupancyTable(SchemaFactory schema, String hits, String occupancy) { reset(); } - public Bank getHitBank() { - return hitBank; - } - - public Bank getOccupancyBank() { - return occBank; - } - /** * Reset occupancy table. */ @@ -99,7 +91,7 @@ public final void fill(int... index) { } /** - * Fill occupancy table from a bank. + * Fill occupancy table from a user-defined bank. * @param bank * @param weighted */ @@ -126,41 +118,30 @@ public void fill(Event event) { } /** - * Fill occupancy table from a bank. + * Fill occupancy table from a user-defined bank, unweighted. * @param bank - * @param weighted */ - public void fill(DataBank bank, boolean weighted) { - final int rows = bank.rows(); - int[] idx = new int[indices.length]; - for (int i=0; i m = table.getList().getMap(); @@ -170,8 +151,7 @@ public final DataBank create(DataEvent event, boolean weighted) { if (j == 2) b.setShort(j, i, (short)idx[j]); else b.setByte(j, i, (byte)idx[j]); } - if (weighted) b.setFloat(indices.length, i, m.get(hash).getValue(0).intValue()); - else b.setFloat(indices.length, i, m.get(hash).getValue(0).intValue()); + b.setFloat(indices.length, i, ((float)m.get(hash).getValue(0).intValue())/events); i++; } return b; From 009daca21d7a32a211c1e8aca32015f804a3bfd9 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 17:28:59 -0400 Subject: [PATCH 19/51] cleanup --- .../java/org/jlab/detector/calib/utils/OccupancyTable.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index e580529483..b90cd07de6 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -13,10 +13,9 @@ public class OccupancyTable { protected Bank hitBank; protected Bank occBank; - + protected IndexedTable table; protected String[] valueNames = {"occ/F"}; protected int[] indices = {0,1,2}; - protected IndexedTable table; public OccupancyTable(SchemaFactory schema, String hits, String occupancy, int... index) { indices = index; From 69ae7ec019629d40bd1d08e876d2649835d643bb Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 17:30:48 -0400 Subject: [PATCH 20/51] cleanup --- .../java/org/jlab/detector/calib/utils/OccupancyTable.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index b90cd07de6..8c2e32dc2d 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -157,12 +157,12 @@ public final DataBank create(long events, DataEvent event) { } /** - * Modify the user-provided occupancy bank with normalized occupancies. + * Create an occupancy bank. * @param events * @return */ public Bank create(long events) { - Bank b = new Bank(occBank.getSchema()); + Bank b = new Bank(occBank.getSchema(), getRows()); int row = 0; for (long hash : ((Map)table.getList().getMap()).keySet()) { int[] idx = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indices.length); From 7a1e184a1bdb12dadb9c35acd6e97413ad27f2ee Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 17:40:03 -0400 Subject: [PATCH 21/51] doc --- .../java/org/jlab/detector/calib/utils/OccupancyTable.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 8c2e32dc2d..43d135a297 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -9,6 +9,11 @@ import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.groups.IndexedTable.IndexedEntry; +/** + * Occupancy bookkeeper with I/O helpers assuming "indexed" banks. + * + * @author baltzell + */ public class OccupancyTable { protected Bank hitBank; From 4c262705c32ffcdd465e1c30715ce147d3ec7bda Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 10:45:31 -0400 Subject: [PATCH 22/51] cleanup --- .../java/org/jlab/io/clara/Clas12Writer.java | 30 +++++-------------- .../detector/calib/utils/OccupancyTable.java | 26 +++++++++++++++- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index dc0b8fc3a4..43d716b1bb 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -36,8 +36,6 @@ public class Clas12Writer extends HipoToHipoWriter { static final String[] TAG1BANKS = {"RUN::scaler","HEL::scaler","RAW::scaler","RAW::epics","HEL::flip","COAT::config"}; - long occupancyEvents; - OccupancyTable[] occupancyTables; Bank[] tag1banks; Bank runConfig; Bank helicityAdc; @@ -46,10 +44,10 @@ public class Clas12Writer extends HipoToHipoWriter { TreeSet helicities; DaqScalersSequence scalers; SchemaFactory schema; + OccupancyTable.Processor occupancy; boolean postprocess; private void init(JSONObject opts) { - occupancyEvents = 0; schema = new SchemaFactory(); schema.initFromDirectory(FileUtils.getEnvironmentPath("CLAS12DIR","etc/bankdefs/hipo4")); runConfig = new Bank(schema.getSchema("RUN::config")); @@ -65,7 +63,7 @@ private void init(JSONObject opts) { tag1banks = new Bank[TAG1BANKS.length]; for (int i=0; i 0) event.write(b); - t.reset(); - } - occupancyEvents = 0; - } - } - @Override protected void writeEvent(Object event) throws EventWriterException { - scalers.add((Event)event); - ((Event)event).read(runConfig); - ((Event)event).read(helicityAdc); + Event e = (Event)event; + scalers.add(e); + e.read(runConfig); + e.read(helicityAdc); if (runConfig.getRows() > 0) { int unix = runConfig.getInt("unixtime",0); int evno = runConfig.getInt("event",0); if (unix > 0 && evno > 0) eventUnix.put(evno, unix); } - processOccupancy((Event)event); + occupancy.process(e); helicities.add(HelicityState.createFromFadcBank(helicityAdc, runConfig, conman)); - Event t = CLASDecoder4.createTaggedEvent((Event)event, runConfig, tag1banks); + Event t = CLASDecoder4.createTaggedEvent(e, runConfig, tag1banks); if (!t.isEmpty()) writer.addEvent(t, 1); super.writeEvent(event); } diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 43d135a297..d65abec617 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -10,7 +10,7 @@ import org.jlab.utils.groups.IndexedTable.IndexedEntry; /** - * Occupancy bookkeeper with I/O helpers assuming "indexed" banks. + * Occupancy bookkeeper based on IndexedTable with I/O helpers for indexed banks. * * @author baltzell */ @@ -181,4 +181,28 @@ public Bank create(long events) { return b; } + + public static final class Processor { + int events=0,prescale; + OccupancyTable[] tables; + public Processor(SchemaFactory schema, int prescale) { + this.prescale = prescale; + tables = new OccupancyTable[]{ + new OccupancyTable(schema,"DC::tot","DC::occ") + }; + } + public void process(Event event) { + for (OccupancyTable t : tables) + t.fill(event); + if (events++ % prescale == 0) { + for (OccupancyTable t : tables) { + Bank b = t.create(events); + if (b.getRows() > 0) event.write(b); + t.reset(); + } + events = 0; + } + } + } + } \ No newline at end of file From 83c1af1965ac840298cabf3e54fc60ec509f4379 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 10:49:25 -0400 Subject: [PATCH 23/51] rename --- .../src/main/java/org/jlab/io/clara/Clas12Writer.java | 6 +++--- .../java/org/jlab/detector/calib/utils/OccupancyTable.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index 43d716b1bb..95549fbc51 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -8,7 +8,7 @@ import org.jlab.analysis.postprocess.Processor; import org.jlab.clara.std.services.EventWriterException; import org.jlab.detector.calib.utils.ConstantsManager; -import org.jlab.detector.calib.utils.OccupancyTable; +import org.jlab.detector.calib.utils.OccupancyTable.OccupancyProcessor; import org.jlab.detector.decode.CLASDecoder4; import org.jlab.detector.helicity.HelicitySequence; import org.jlab.detector.helicity.HelicitySequenceDelayed; @@ -44,7 +44,7 @@ public class Clas12Writer extends HipoToHipoWriter { TreeSet helicities; DaqScalersSequence scalers; SchemaFactory schema; - OccupancyTable.Processor occupancy; + OccupancyProcessor occupancy; boolean postprocess; private void init(JSONObject opts) { @@ -63,7 +63,7 @@ private void init(JSONObject opts) { tag1banks = new Bank[TAG1BANKS.length]; for (int i=0; i Date: Fri, 14 Aug 2026 10:50:13 -0400 Subject: [PATCH 24/51] cleanup --- .../main/java/org/jlab/detector/calib/utils/OccupancyTable.java | 1 - 1 file changed, 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 29bfeb132e..f513607cd4 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -181,7 +181,6 @@ public Bank create(long events) { return b; } - public static final class OccupancyProcessor { int events=0,prescale; OccupancyTable[] tables; From f94e5c59925cd81d4f8d944ab0b7fac33d3e96ff Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 12:44:13 -0400 Subject: [PATCH 25/51] add more detectors --- .../java/org/jlab/detector/calib/utils/OccupancyTable.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index f513607cd4..a4893fe8f5 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -187,7 +187,11 @@ public static final class OccupancyProcessor { public OccupancyProcessor(SchemaFactory schema, int prescale) { this.prescale = prescale; tables = new OccupancyTable[]{ - new OccupancyTable(schema,"DC::tot","DC::occ") + new OccupancyTable(schema,"DC::tot","DC::occ"), + new OccupancyTable(schema,"ECAL::adc","ECAL::adc:occ"), + new OccupancyTable(schema,"ECAL::tdc","ECAL::tdc:occ"), + new OccupancyTable(schema,"FTOF::adc","FTOF::adc:occ"), + new OccupancyTable(schema,"FTOF::tdc","FTOF::tdc:occ"), }; } public void process(Event event) { From a3c2f29bced7ad603f01f83bb1c7406fea103f56 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 16:42:33 -0400 Subject: [PATCH 26/51] update --- .../java/org/jlab/io/clara/Clas12Writer.java | 4 - ...ccupancyTable.java => OccupanceTable.java} | 67 ++++-- .../org/jlab/clas/reco/EngineProcessor.java | 9 +- etc/bankdefs/hipo4/occupancy.json | 208 +++++++++++++++++- etc/services/rgd-clarode.yml | 2 + reconstruction/calib/pom.xml | 5 + .../calibration/service/OccupanceEngine.java | 33 +++ 7 files changed, 301 insertions(+), 27 deletions(-) rename common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/{OccupancyTable.java => OccupanceTable.java} (69%) create mode 100644 reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index 95549fbc51..ef9942b2a9 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -8,7 +8,6 @@ import org.jlab.analysis.postprocess.Processor; import org.jlab.clara.std.services.EventWriterException; import org.jlab.detector.calib.utils.ConstantsManager; -import org.jlab.detector.calib.utils.OccupancyTable.OccupancyProcessor; import org.jlab.detector.decode.CLASDecoder4; import org.jlab.detector.helicity.HelicitySequence; import org.jlab.detector.helicity.HelicitySequenceDelayed; @@ -44,7 +43,6 @@ public class Clas12Writer extends HipoToHipoWriter { TreeSet helicities; DaqScalersSequence scalers; SchemaFactory schema; - OccupancyProcessor occupancy; boolean postprocess; private void init(JSONObject opts) { @@ -63,7 +61,6 @@ private void init(JSONObject opts) { tag1banks = new Bank[TAG1BANKS.length]; for (int i=0; i 0 && evno > 0) eventUnix.put(evno, unix); } - occupancy.process(e); helicities.add(HelicityState.createFromFadcBank(helicityAdc, runConfig, conman)); Event t = CLASDecoder4.createTaggedEvent(e, runConfig, tag1banks); if (!t.isEmpty()) writer.addEvent(t, 1); diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java similarity index 69% rename from common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java rename to common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index a4893fe8f5..23450eced5 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -14,7 +14,7 @@ * * @author baltzell */ -public class OccupancyTable { +public class OccupanceTable { protected Bank hitBank; protected Bank occBank; @@ -22,14 +22,14 @@ public class OccupancyTable { protected String[] valueNames = {"occ/F"}; protected int[] indices = {0,1,2}; - public OccupancyTable(SchemaFactory schema, String hits, String occupancy, int... index) { + public OccupanceTable(SchemaFactory schema, String hits, String occupancy, int... index) { indices = index; hitBank = schema.getBank(hits); occBank = schema.getBank(occupancy); reset(); } - public OccupancyTable(SchemaFactory schema, String hits, String occupancy) { + public OccupanceTable(SchemaFactory schema, String hits, String occupancy) { hitBank = schema.getBank(hits); occBank = schema.getBank(occupancy); reset(); @@ -139,6 +139,14 @@ public void fill(DataBank bank) { } } + /** + * Fill occupancy table from the hit bank, unweighted. + * @param event + */ + public void fill(DataEvent event) { + fill(event.getBank(hitBank.getSchema().getName())); + } + /** * Create an occupancy bank. * @param events @@ -181,31 +189,56 @@ public Bank create(long events) { return b; } - public static final class OccupancyProcessor { + public static final class OccupanceDriver { int events=0,prescale; - OccupancyTable[] tables; - public OccupancyProcessor(SchemaFactory schema, int prescale) { + OccupanceTable[] tables; + public OccupanceDriver(SchemaFactory schema, int prescale) { this.prescale = prescale; - tables = new OccupancyTable[]{ - new OccupancyTable(schema,"DC::tot","DC::occ"), - new OccupancyTable(schema,"ECAL::adc","ECAL::adc:occ"), - new OccupancyTable(schema,"ECAL::tdc","ECAL::tdc:occ"), - new OccupancyTable(schema,"FTOF::adc","FTOF::adc:occ"), - new OccupancyTable(schema,"FTOF::tdc","FTOF::tdc:occ"), + tables = new OccupanceTable[]{ + new OccupanceTable(schema,"DC::tot","DC::occ"), + new OccupanceTable(schema,"ECAL::adc","ECAL::aocc"), + new OccupanceTable(schema,"ECAL::tdc","ECAL::tocc"), + new OccupanceTable(schema,"FTOF::adc","FTOF::aocc"), + new OccupanceTable(schema,"FTOF::tdc","FTOF::tocc"), + new OccupanceTable(schema,"CTOF::adc","CTOF::aocc"), + new OccupanceTable(schema,"CTOF::tdc","CTOF::tocc"), + new OccupanceTable(schema,"HTCC::adc","HTCC::aocc"), + new OccupanceTable(schema,"HTCC::tdc","HTCC::tocc"), + new OccupanceTable(schema,"LTCC::adc","LTCC::aocc"), + new OccupanceTable(schema,"LTCC::tdc","LTCC::tocc"), + new OccupanceTable(schema,"SVT::adc","SVT::occ"), + new OccupanceTable(schema,"BMT::adc","BMT::occ"), + new OccupanceTable(schema,"FTC::adc","FTC::occ"), + new OccupanceTable(schema,"FTH::adc","FTH::occ"), + new OccupanceTable(schema,"FTT::adc","FTT::occ"), + new OccupanceTable(schema,"RICH::tdc","RICH::occ"), + new OccupanceTable(schema,"BAND::tdc","BAND::occ"), }; } public void process(Event event) { - for (OccupancyTable t : tables) - t.fill(event); + for (OccupanceTable t : tables) t.fill(event); if (events++ % prescale == 0) { - for (OccupancyTable t : tables) { - Bank b = t.create(events); - if (b.getRows() > 0) event.write(b); + for (OccupanceTable t : tables) { + if (t.getRows() > 0) event.write(t.create(events)); t.reset(); } events = 0; } } + public void process(DataEvent event) { + for (OccupanceTable t : tables) t.fill(event); + if (events++ % prescale == 0) { + for (OccupanceTable t : tables) { + if (t.getRows() > 0) event.appendBank(t.create(events, event)); + t.reset(); + } + events = 0; + } + } + public void reset() { + for (OccupanceTable t : tables) t.reset(); + events = 0; + } } } \ No newline at end of file diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/EngineProcessor.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/EngineProcessor.java index b0b4a98542..0c258fa39c 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/EngineProcessor.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/EngineProcessor.java @@ -130,7 +130,7 @@ public void initDefault(){ String[] names = new String[]{ "MAGFIELDS", "DCCR","DCHB","FTOFHB","EC","HTCC","EBHB", - "DCTB","FTOFTB","EBTB","VTX" + "DCTB","FTOFTB","EBTB","OCC" }; String[] services = new String[]{ @@ -144,7 +144,7 @@ public void initDefault(){ "org.jlab.service.dc.DCTBEngine", "org.jlab.service.ftof.FTOFTBEngine", "org.jlab.service.eb.EBTBEngine", - "org.jlab.rec.service.vtx.VTXEngine" + "org.jlab.calibration.service.OccupanceEngine", }; for(int i = 0; i < names.length; i++){ @@ -160,7 +160,7 @@ public void initAll(){ "CVTFP","CTOF","CND","BAND", "HTCC","LTCC","EBHB", "DCTB","FMT","FTOFTB","CVT","EBTB", - "RICHEB","RTPC","AHDC","ATOF","ALERT", "MC","VTX" + "RICHEB","RTPC","AHDC","ATOF","ALERT", "MC","VTX","OCC" }; String[] services = new String[]{ @@ -193,7 +193,8 @@ public void initAll(){ "org.jlab.service.atof.ATOFEngine", "org.jlab.service.alert.ALERTEngine", "org.jlab.service.mc.TruthMatch", - "org.jlab.rec.service.vtx.VTXEngine" + "org.jlab.rec.service.vtx.VTXEngine", + "org.jlab.calibration.service.OccupanceEngine", }; if(names.length!=services.length) LOGGER.log(Level.SEVERE, "initAll : the list of services does not match the list of service names... "); diff --git a/etc/bankdefs/hipo4/occupancy.json b/etc/bankdefs/hipo4/occupancy.json index c89164248d..b446e57b69 100644 --- a/etc/bankdefs/hipo4/occupancy.json +++ b/etc/bankdefs/hipo4/occupancy.json @@ -1,9 +1,213 @@ [ { "name": "DC::occ", - "group": 20600, + "group": 500, + "item": 10, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "ECAL::tocc", + "group": 500, + "item": 11, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "ECAL::aocc", + "group": 500, + "item": 12, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "FTOF:tocc", + "group": 500, + "item": 13, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "FTOF::aocc", + "group": 500, + "item": 14, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "CTOF::tocc", + "group": 500, + "item": 15, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "CTOF::aocc", + "group": 500, + "item": 16, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "HTCC::aocc", + "group": 500, + "item": 17, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "HTCC::tocc", + "group": 500, + "item": 18, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "LTCC::aocc", + "group": 500, + "item": 19, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "LTCC::tocc", + "group": 500, "item": 20, - "info": "Event Header Bank", + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "SVT::occ", + "group": 500, + "item": 21, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "BMT::occ", + "group": 500, + "item": 22, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "FTC::occ", + "group": 500, + "item": 23, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "FTH::occ", + "group": 500, + "item": 24, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "FTT::occ", + "group": 500, + "item": 25, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "RICH::occ", + "group": 500, + "item": 26, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "BAND::occ", + "group": 500, + "item": 27, + "info": "Occupancy Bank", "entries": [ { "name":"sector" , "type":"B", "info":"sector"}, { "name":"layer" , "type":"B", "info":"layer"}, diff --git a/etc/services/rgd-clarode.yml b/etc/services/rgd-clarode.yml index e46daddc7e..f8147c4532 100644 --- a/etc/services/rgd-clarode.yml +++ b/etc/services/rgd-clarode.yml @@ -83,3 +83,5 @@ services: name: VTX - class: org.jlab.calibration.service.CalibBanksEngine name: CALIB + - class: org.jlab.calibration.service.OccupanceEngine + name: OCC diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 9f400c1fe3..caca9e0625 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -34,6 +34,11 @@ clas-reco 14.2.0-SNAPSHOT + + + org.jlab.jnp + jnp-hipo4 + diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java new file mode 100644 index 0000000000..30e59a264c --- /dev/null +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java @@ -0,0 +1,33 @@ +package org.jlab.calibration.service; + +import org.jlab.io.base.DataEvent; +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.detector.calib.utils.OccupanceTable.OccupanceDriver; + +public class OccupanceEngine extends ReconstructionEngine { + + OccupanceDriver occupancy; + + public OccupanceEngine() { + super("Occupance", "baltzell","0.1"); + } + + @Override + public boolean processDataEventUser(DataEvent event) { + occupancy.process(event); + return true; + } + + @Override + public boolean init() { + occupancy = new OccupanceDriver(getSchemaFactory(), + Integer.parseInt(getEngineConfigString("occPrescale","1000"))); + return true; + } + + @Override + public void detectorChanged(int runNumber) { + occupancy.reset(); + } + +} From b370735b26b2508aaf177384b5f038ab88424b81 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 16:45:41 -0400 Subject: [PATCH 27/51] revert unrelated changes --- .../java/org/jlab/io/clara/Clas12Writer.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index ef9942b2a9..a094b939cd 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -42,16 +42,16 @@ public class Clas12Writer extends HipoToHipoWriter { TreeMap eventUnix; TreeSet helicities; DaqScalersSequence scalers; - SchemaFactory schema; + SchemaFactory fullSchema; boolean postprocess; private void init(JSONObject opts) { - schema = new SchemaFactory(); - schema.initFromDirectory(FileUtils.getEnvironmentPath("CLAS12DIR","etc/bankdefs/hipo4")); - runConfig = new Bank(schema.getSchema("RUN::config")); - helicityAdc = new Bank(schema.getSchema("HEL::adc")); + fullSchema = new SchemaFactory(); + fullSchema.initFromDirectory(FileUtils.getEnvironmentPath("CLAS12DIR","etc/bankdefs/hipo4")); + runConfig = new Bank(fullSchema.getSchema("RUN::config")); + helicityAdc = new Bank(fullSchema.getSchema("HEL::adc")); helicities = new TreeSet<>(); - scalers = new DaqScalersSequence(schema); + scalers = new DaqScalersSequence(fullSchema); conman = new ConstantsManager(); eventUnix = new TreeMap<>(); conman.init("/runcontrol/hwp","/runcontrol/helicity"); @@ -60,7 +60,7 @@ private void init(JSONObject opts) { if (opts.has("timestamp")) conman.setTimeStamp(opts.getString("timestamp")); tag1banks = new Bank[TAG1BANKS.length]; for (int i=0; i 0) { int unix = runConfig.getInt("unixtime",0); int evno = runConfig.getInt("event",0); if (unix > 0 && evno > 0) eventUnix.put(evno, unix); } helicities.add(HelicityState.createFromFadcBank(helicityAdc, runConfig, conman)); - Event t = CLASDecoder4.createTaggedEvent(e, runConfig, tag1banks); + Event t = CLASDecoder4.createTaggedEvent((Event)event, runConfig, tag1banks); if (!t.isEmpty()) writer.addEvent(t, 1); super.writeEvent(event); } @Override protected void closeWriter() { - HelicitySequence.writeFlips(schema, writer, helicities); + HelicitySequence.writeFlips(fullSchema, writer, helicities); writer.addEvent(getUnixEvent(runConfig),1); super.closeWriter(); if (postprocess) postprocess(); @@ -128,7 +127,7 @@ private int getRunNumber() { * @return */ private Event getUnixEvent(Bank config) { - Bank unix = new Bank(schema.getSchema("RUN::unix")); + Bank unix = new Bank(fullSchema.getSchema("RUN::unix")); unix.setRows(eventUnix.size()); int row = 0; for (int evno : eventUnix.keySet()) { @@ -149,7 +148,7 @@ private void postprocess() { int d = conman.getConstants(getRunNumber(), "/runcontrol/helicity").getIntValue("delay",0,0,0); HelicitySequenceDelayed helicity = new HelicitySequenceDelayed(d); helicity.addStream(helicities); - Processor p = new Processor(List.of(filename), schema, helicity, scalers); + Processor p = new Processor(List.of(filename), fullSchema, helicity, scalers); HipoReader r = new HipoReader(); r.open(filename); Event e = new Event(); From e5c59d14a7aeb9b5fad35c596a107005051d0d73 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 17:14:26 -0400 Subject: [PATCH 28/51] add occupancy banks to dst (all) schema --- etc/bankdefs/util/bankSplit.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/etc/bankdefs/util/bankSplit.py b/etc/bankdefs/util/bankSplit.py index 52b134174c..591ebad0fd 100755 --- a/etc/bankdefs/util/bankSplit.py +++ b/etc/bankdefs/util/bankSplit.py @@ -1,8 +1,9 @@ #!/usr/bin/env python -import json -import sys import os +import sys +import json +import glob # print usage if len(sys.argv)<2: @@ -54,6 +55,9 @@ def create(dirname, banklist): print("Single json files saved in " + workdirectory + singledirectory) +# occupancy banks: +occ = [os.path.basename(x)[:-5] for x in glob.glob('./singles/occupancy/*.json')] + # these should *always* be kept: mc = ["MC::Event", "MC::GenMatch", "MC::Header", "MC::Lund", "MC::Particle", "MC::RecMatch", "MC::True"] tag1 = ["RUN::config", "RAW::epics", "RAW::scaler", "RUN::scaler", "HEL::scaler", "COAT::config", "HEL::flip", "HEL::online", "HEL::decoder"] @@ -83,7 +87,7 @@ def create(dirname, banklist): trig = ["RAW::vtp","HTCC::rec","ECAL::adc","ECAL::calib","ECAL::clusters","ECAL::hits","ECAL::moments","ECAL::peaks","ECAL::tdc","ECAL::trigger"] # accumulate all the DST banks: -dst = rectbai + rectb + mc + tag1 + dets +dst = rectbai + rectb + mc + tag1 + occ + dets dsthb = dst + rechbai + rechb # generate the calib and mon schema: @@ -112,8 +116,6 @@ def create(dirname, banklist): level3 = list(dst) level3.extend(["DC::tdc", "DC::tot", "ECAL::adc", "ECAL::clusters", "FTOF::tdc", "FTOF::adc", "HitBasedTrkg::HBClusters", "HitBasedTrkg::HBTracks", "HTCC::adc", "RF::adc", "RF::tdc", "RUN::rf", "TimeBasedTrkg::TBClusters", "TimeBasedTrkg::TBTracks"]) -import glob - rgl = glob.glob('./singles/full/ALERT*.json') rgl.extend(glob.glob('./singles/full/AHDC*.json')) rgl.extend(glob.glob('./singles/full/ATOF*.json')) From e0473ebbd208f91f277f2e26327d93e711887b52 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 17:33:24 -0400 Subject: [PATCH 29/51] debug --- .../java/org/jlab/detector/calib/utils/OccupanceTable.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 23450eced5..8347f8a663 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -78,6 +78,9 @@ public final IndexedTable getOccupancy(long events) { * @param index */ public final void fill(float weight, int... index) { + System.err.println(index[0]); + System.err.println(index[1]); + System.err.println(index[2]); final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(index); if (!table.hasEntryByHash(hash)) { table.addEntry(index); @@ -154,6 +157,7 @@ public void fill(DataEvent event) { * @return */ public final DataBank create(long events, DataEvent event) { + System.err.println(occBank.getSchema().getName()); DataBank b = event.createBank(occBank.getSchema().getName(), getRows()); int i = 0; Map m = table.getList().getMap(); From 567d19ab779de0263b1cb664a10f30f1c5798ada Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 18:03:42 -0400 Subject: [PATCH 30/51] fix bank name --- etc/bankdefs/hipo4/occupancy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/bankdefs/hipo4/occupancy.json b/etc/bankdefs/hipo4/occupancy.json index b446e57b69..66cc4ba045 100644 --- a/etc/bankdefs/hipo4/occupancy.json +++ b/etc/bankdefs/hipo4/occupancy.json @@ -36,7 +36,7 @@ ] }, { - "name": "FTOF:tocc", + "name": "FTOF::tocc", "group": 500, "item": 13, "info": "Occupancy Bank", From f022e8d08870acc4c948f293758cb65022574144 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 18:04:18 -0400 Subject: [PATCH 31/51] remove printouts --- .../java/org/jlab/detector/calib/utils/OccupanceTable.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 8347f8a663..23450eced5 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -78,9 +78,6 @@ public final IndexedTable getOccupancy(long events) { * @param index */ public final void fill(float weight, int... index) { - System.err.println(index[0]); - System.err.println(index[1]); - System.err.println(index[2]); final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(index); if (!table.hasEntryByHash(hash)) { table.addEntry(index); @@ -157,7 +154,6 @@ public void fill(DataEvent event) { * @return */ public final DataBank create(long events, DataEvent event) { - System.err.println(occBank.getSchema().getName()); DataBank b = event.createBank(occBank.getSchema().getName(), getRows()); int i = 0; Map m = table.getList().getMap(); From 99e84e7b2cc5b6afa1f1c47edd984201403023f8 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 18:32:45 -0400 Subject: [PATCH 32/51] debug --- .../java/org/jlab/detector/calib/utils/OccupanceTable.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 23450eced5..8347f8a663 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -78,6 +78,9 @@ public final IndexedTable getOccupancy(long events) { * @param index */ public final void fill(float weight, int... index) { + System.err.println(index[0]); + System.err.println(index[1]); + System.err.println(index[2]); final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(index); if (!table.hasEntryByHash(hash)) { table.addEntry(index); @@ -154,6 +157,7 @@ public void fill(DataEvent event) { * @return */ public final DataBank create(long events, DataEvent event) { + System.err.println(occBank.getSchema().getName()); DataBank b = event.createBank(occBank.getSchema().getName(), getRows()); int i = 0; Map m = table.getList().getMap(); From a7797e2bc5155183311a7f5ee5beb027758789b8 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 18:39:26 -0400 Subject: [PATCH 33/51] ignore negative indices (BMT?) --- .../java/org/jlab/detector/calib/utils/OccupanceTable.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 8347f8a663..64f9becc8f 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -78,9 +78,9 @@ public final IndexedTable getOccupancy(long events) { * @param index */ public final void fill(float weight, int... index) { - System.err.println(index[0]); - System.err.println(index[1]); - System.err.println(index[2]); + for (int i=0; i m = table.getList().getMap(); From 4dc4701c361e1f0b7aba042b19f5cf447da72d9b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 14 Aug 2026 18:44:33 -0400 Subject: [PATCH 34/51] cleanup --- .../java/org/jlab/detector/calib/utils/OccupanceTable.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 64f9becc8f..8fcb0fe2e3 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -78,9 +78,8 @@ public final IndexedTable getOccupancy(long events) { * @param index */ public final void fill(float weight, int... index) { - for (int i=0; i Date: Sun, 16 Aug 2026 15:53:07 -0400 Subject: [PATCH 35/51] fix counter, add DC::tdc --- .../detector/calib/utils/OccupanceTable.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 8fcb0fe2e3..cbfd96af4a 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -198,6 +198,7 @@ public OccupanceDriver(SchemaFactory schema, int prescale) { this.prescale = prescale; tables = new OccupanceTable[]{ new OccupanceTable(schema,"DC::tot","DC::occ"), + new OccupanceTable(schema,"DC::tdc","DC::occ"), new OccupanceTable(schema,"ECAL::adc","ECAL::aocc"), new OccupanceTable(schema,"ECAL::tdc","ECAL::tocc"), new OccupanceTable(schema,"FTOF::adc","FTOF::aocc"), @@ -217,11 +218,10 @@ public OccupanceDriver(SchemaFactory schema, int prescale) { new OccupanceTable(schema,"BAND::tdc","BAND::occ"), }; } - public void process(Event event) { - for (OccupanceTable t : tables) t.fill(event); - if (events++ % prescale == 0) { + synchronized public void write(DataEvent event) { + if (++events % prescale == 0) { for (OccupanceTable t : tables) { - if (t.getRows() > 0) event.write(t.create(events)); + if (t.getRows() > 0) event.appendBank(t.create(events, event)); t.reset(); } events = 0; @@ -229,13 +229,7 @@ public void process(Event event) { } public void process(DataEvent event) { for (OccupanceTable t : tables) t.fill(event); - if (events++ % prescale == 0) { - for (OccupanceTable t : tables) { - if (t.getRows() > 0) event.appendBank(t.create(events, event)); - t.reset(); - } - events = 0; - } + write(event); } public void reset() { for (OccupanceTable t : tables) t.reset(); From 9472515d048bfcff483a2cef33054f603f9352b7 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Sun, 16 Aug 2026 15:53:33 -0400 Subject: [PATCH 36/51] change default occupancy prescale to 100 --- .../java/org/jlab/calibration/service/OccupanceEngine.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java index 30e59a264c..a936181eea 100644 --- a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java @@ -21,7 +21,7 @@ public boolean processDataEventUser(DataEvent event) { @Override public boolean init() { occupancy = new OccupanceDriver(getSchemaFactory(), - Integer.parseInt(getEngineConfigString("occPrescale","1000"))); + Integer.parseInt(getEngineConfigString("prescale","100"))); return true; } @@ -29,5 +29,5 @@ public boolean init() { public void detectorChanged(int runNumber) { occupancy.reset(); } - + } From 884c5533b4d7b3746f6147a0166f5700e5c7a256 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Sun, 16 Aug 2026 17:56:31 -0400 Subject: [PATCH 37/51] cleanup --- .../detector/calib/utils/OccupanceTable.java | 123 +++++++----------- .../calibration/service/OccupanceEngine.java | 2 +- 2 files changed, 51 insertions(+), 74 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index cbfd96af4a..f7ca692c12 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -10,76 +10,56 @@ import org.jlab.utils.groups.IndexedTable.IndexedEntry; /** - * Occupancy bookkeeper based on IndexedTable with I/O helpers for indexed banks. + * Occupancy bookkeeper based on IndexedTable, with I/O helpers for indexed banks. * * @author baltzell */ public class OccupanceTable { - protected Bank hitBank; - protected Bank occBank; - protected IndexedTable table; - protected String[] valueNames = {"occ/F"}; - protected int[] indices = {0,1,2}; + IndexedTable table; + Bank hitBank; + Bank occBank; - public OccupanceTable(SchemaFactory schema, String hits, String occupancy, int... index) { - indices = index; + public OccupanceTable(SchemaFactory schema, String hits, String occupancy) { hitBank = schema.getBank(hits); occBank = schema.getBank(occupancy); - reset(); + table = new IndexedTable(3, new String[]{"occ/F"}); } - public OccupanceTable(SchemaFactory schema, String hits, String occupancy) { + public OccupanceTable(SchemaFactory schema, String hits, String occupancy, int indexCount) { hitBank = schema.getBank(hits); occBank = schema.getBank(occupancy); - reset(); + table = new IndexedTable(indexCount, new String[]{"occ/F"}); } /** - * Reset occupancy table. + * Reset the occupancy table. */ public final void reset() { - table = new IndexedTable(indices.length, valueNames); - } - - /** - * Get number of rows for the occupancy table/bank. - * @return rows - */ - public final int getRows() { - return table.getRowCount(); + table = new IndexedTable(table.getList().getIndexSize(), new String[]{"occ/F"}); } /** - * Get the raw occupancy table. - * @return - */ - public final IndexedTable getOccupancy() { - return table; - } - - /** - * Get the normalized occupancy table. + * Get the occupancy table, normalized by number of events. * @param events * @return */ public final IndexedTable getOccupancy(long events) { - IndexedTable t = new IndexedTable(indices.length, valueNames); + IndexedTable t = new IndexedTable(table.getList().getIndexSize(), new String[]{"occ/F"}); for (long hash : ((Map)table.getList().getMap()).keySet()) { - t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indices.length)); + t.addEntry(IndexedTable.DEFAULT_GENERATOR.getIndices(hash, table.getList().getIndexSize())); t.setDoubleValueByHash((table.getDoubleValueByHash(0, hash))/events, 0, hash); } return t; } /** - * Fill occupancy table with a weight. + * Fill the occupancy table. * @param weight * @param index */ public final void fill(float weight, int... index) { - for (int i=0; i m = table.getList().getMap(); for (long hash : m.keySet()) { - int[] idx = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indices.length); - for (int j=0; j)table.getList().getMap()).keySet()) { - int[] idx = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, indices.length); - for (int j=0; j 0) event.appendBank(t.create(events, event)); + if (t.table.getRowCount() > 0) event.appendBank(t.create(events, event)); t.reset(); } events = 0; diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java index a936181eea..63cec499d5 100644 --- a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java @@ -30,4 +30,4 @@ public void detectorChanged(int runNumber) { occupancy.reset(); } -} +} \ No newline at end of file From 23fa50b76797187c33fb1d77a881dd7c77bcdf97 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Sun, 16 Aug 2026 18:13:16 -0400 Subject: [PATCH 38/51] cleanup --- .../detector/calib/utils/OccupanceTable.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index f7ca692c12..6b6bec88e1 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -63,7 +63,7 @@ public final void fill(float weight, int... index) { final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(index); if (!table.hasEntryByHash(hash)) { table.addEntry(index); - table.setIntValueByHash(0, 0, hash); + table.setDoubleValueByHash(0.0d, 0, hash); } table.setDoubleValueByHash(table.getDoubleValueByHash(0, hash) + weight, 0, hash); } @@ -146,7 +146,7 @@ public final DataBank create(long events, DataEvent event) { } /** - * Get an occupancy bank normalized by number of events. + * Get an occupancy bank, normalized by number of events. * @param events * @return */ @@ -195,15 +195,6 @@ public OccupanceDriver(SchemaFactory schema, int prescale) { new OccupanceTable(schema,"BAND::tdc","BAND::occ"), }; } - synchronized public void write(DataEvent event) { - if (++events % prescale == 0) { - for (OccupanceTable t : tables) { - if (t.table.getRowCount() > 0) event.appendBank(t.create(events, event)); - t.reset(); - } - events = 0; - } - } public void process(DataEvent event) { for (OccupanceTable t : tables) t.fill(event); write(event); @@ -212,6 +203,15 @@ public void reset() { for (OccupanceTable t : tables) t.reset(); events = 0; } + synchronized void write(DataEvent event) { + if (++events % prescale == 0) { + for (OccupanceTable t : tables) { + if (t.table.getRowCount() > 0) event.appendBank(t.create(events, event)); + t.reset(); + } + events = 0; + } + } } } \ No newline at end of file From b8e37410f243a6f508a4e638c6d368d3efed2e33 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 17 Aug 2026 10:13:58 -0400 Subject: [PATCH 39/51] rename occupancy banks --- .../detector/calib/utils/OccupanceTable.java | 47 ++++++++------- etc/bankdefs/hipo4/occupancy.json | 60 +++++++++++++------ 2 files changed, 66 insertions(+), 41 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 6b6bec88e1..1388b91e63 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -20,15 +20,15 @@ public class OccupanceTable { Bank hitBank; Bank occBank; - public OccupanceTable(SchemaFactory schema, String hits, String occupancy) { + public OccupanceTable(SchemaFactory schema, String hits) { hitBank = schema.getBank(hits); - occBank = schema.getBank(occupancy); + occBank = schema.getBank("OCC::"+hits); table = new IndexedTable(3, new String[]{"occ/F"}); } - public OccupanceTable(SchemaFactory schema, String hits, String occupancy, int indexCount) { + public OccupanceTable(SchemaFactory schema, String hits, int indexCount) { hitBank = schema.getBank(hits); - occBank = schema.getBank(occupancy); + occBank = schema.getBank("OCC::"+hits); table = new IndexedTable(indexCount, new String[]{"occ/F"}); } @@ -174,25 +174,26 @@ public static final class OccupanceDriver { public OccupanceDriver(SchemaFactory schema, int prescale) { this.prescale = prescale; tables = new OccupanceTable[]{ - new OccupanceTable(schema,"DC::tot","DC::occ"), - new OccupanceTable(schema,"DC::tdc","DC::occ"), - new OccupanceTable(schema,"ECAL::adc","ECAL::aocc"), - new OccupanceTable(schema,"ECAL::tdc","ECAL::tocc"), - new OccupanceTable(schema,"FTOF::adc","FTOF::aocc"), - new OccupanceTable(schema,"FTOF::tdc","FTOF::tocc"), - new OccupanceTable(schema,"CTOF::adc","CTOF::aocc"), - new OccupanceTable(schema,"CTOF::tdc","CTOF::tocc"), - new OccupanceTable(schema,"HTCC::adc","HTCC::aocc"), - new OccupanceTable(schema,"HTCC::tdc","HTCC::tocc"), - new OccupanceTable(schema,"LTCC::adc","LTCC::aocc"), - new OccupanceTable(schema,"LTCC::tdc","LTCC::tocc"), - new OccupanceTable(schema,"SVT::adc","SVT::occ"), - new OccupanceTable(schema,"BMT::adc","BMT::occ"), - new OccupanceTable(schema,"FTC::adc","FTC::occ"), - new OccupanceTable(schema,"FTH::adc","FTH::occ"), - new OccupanceTable(schema,"FTT::adc","FTT::occ"), - new OccupanceTable(schema,"RICH::tdc","RICH::occ"), - new OccupanceTable(schema,"BAND::tdc","BAND::occ"), + new OccupanceTable(schema,"DC::tot"), + new OccupanceTable(schema,"DC::tdc"), + new OccupanceTable(schema,"ECAL::adc"), + new OccupanceTable(schema,"ECAL::tdc"), + new OccupanceTable(schema,"FTOF::adc"), + new OccupanceTable(schema,"FTOF::tdc"), + new OccupanceTable(schema,"CTOF::adc"), + new OccupanceTable(schema,"CTOF::tdc"), + new OccupanceTable(schema,"HTCC::adc"), + new OccupanceTable(schema,"HTCC::tdc"), + new OccupanceTable(schema,"LTCC::adc"), + new OccupanceTable(schema,"LTCC::tdc"), + new OccupanceTable(schema,"SVT::adc"), + new OccupanceTable(schema,"BMT::adc"), + new OccupanceTable(schema,"FTC::adc"), + new OccupanceTable(schema,"FTH::adc"), + new OccupanceTable(schema,"FTT::adc"), + new OccupanceTable(schema,"RICH::tdc"), + new OccupanceTable(schema,"BAND::adc"), + new OccupanceTable(schema,"BAND::tdc"), }; } public void process(DataEvent event) { diff --git a/etc/bankdefs/hipo4/occupancy.json b/etc/bankdefs/hipo4/occupancy.json index 66cc4ba045..94b40cfe8c 100644 --- a/etc/bankdefs/hipo4/occupancy.json +++ b/etc/bankdefs/hipo4/occupancy.json @@ -1,6 +1,6 @@ [ { - "name": "DC::occ", + "name": "OCC::DC::tdc", "group": 500, "item": 10, "info": "Occupancy Bank", @@ -12,7 +12,7 @@ ] }, { - "name": "ECAL::tocc", + "name": "OCC::DC::tot", "group": 500, "item": 11, "info": "Occupancy Bank", @@ -24,7 +24,7 @@ ] }, { - "name": "ECAL::aocc", + "name": "OCC::ECAL::adc", "group": 500, "item": 12, "info": "Occupancy Bank", @@ -36,7 +36,7 @@ ] }, { - "name": "FTOF::tocc", + "name": "OCC::ECAL::tdc", "group": 500, "item": 13, "info": "Occupancy Bank", @@ -48,7 +48,7 @@ ] }, { - "name": "FTOF::aocc", + "name": "OCC::FTOF::adc", "group": 500, "item": 14, "info": "Occupancy Bank", @@ -60,7 +60,7 @@ ] }, { - "name": "CTOF::tocc", + "name": "OCC::FTOF::tdc", "group": 500, "item": 15, "info": "Occupancy Bank", @@ -72,7 +72,7 @@ ] }, { - "name": "CTOF::aocc", + "name": "OCC::CTOF::adc", "group": 500, "item": 16, "info": "Occupancy Bank", @@ -84,7 +84,7 @@ ] }, { - "name": "HTCC::aocc", + "name": "OCC::CTOF::tdc", "group": 500, "item": 17, "info": "Occupancy Bank", @@ -96,7 +96,7 @@ ] }, { - "name": "HTCC::tocc", + "name": "OCC::HTCC::adc", "group": 500, "item": 18, "info": "Occupancy Bank", @@ -108,7 +108,7 @@ ] }, { - "name": "LTCC::aocc", + "name": "OCC::HTCC::tdc", "group": 500, "item": 19, "info": "Occupancy Bank", @@ -120,7 +120,7 @@ ] }, { - "name": "LTCC::tocc", + "name": "OCC::LTCC::adc", "group": 500, "item": 20, "info": "Occupancy Bank", @@ -132,7 +132,7 @@ ] }, { - "name": "SVT::occ", + "name": "OCC::LTCC::tdc", "group": 500, "item": 21, "info": "Occupancy Bank", @@ -144,7 +144,7 @@ ] }, { - "name": "BMT::occ", + "name": "OCC::BST::adc", "group": 500, "item": 22, "info": "Occupancy Bank", @@ -156,7 +156,7 @@ ] }, { - "name": "FTC::occ", + "name": "OCC::BMT::adc", "group": 500, "item": 23, "info": "Occupancy Bank", @@ -168,7 +168,7 @@ ] }, { - "name": "FTH::occ", + "name": "OCC::FTC::adc", "group": 500, "item": 24, "info": "Occupancy Bank", @@ -180,7 +180,7 @@ ] }, { - "name": "FTT::occ", + "name": "OCC::FTH::adc", "group": 500, "item": 25, "info": "Occupancy Bank", @@ -192,7 +192,7 @@ ] }, { - "name": "RICH::occ", + "name": "OCC::FTT::adc", "group": 500, "item": 26, "info": "Occupancy Bank", @@ -204,7 +204,7 @@ ] }, { - "name": "BAND::occ", + "name": "OCC::RICH::tdc", "group": 500, "item": 27, "info": "Occupancy Bank", @@ -214,5 +214,29 @@ { "name":"component" , "type":"S", "info":"component"}, { "name":"hits" , "type":"F", "info":"number of hits"} ] + }, + { + "name": "OCC::BAND::adc", + "group": 500, + "item": 28, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] + }, + { + "name": "OCC::BAND::tdc", + "group": 500, + "item": 29, + "info": "Occupancy Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"F", "info":"number of hits"} + ] } ] From c999bdd6bb0447ecf35967f0cd01aa616426dcad Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 17 Aug 2026 10:17:43 -0400 Subject: [PATCH 40/51] this should be final --- .../main/java/org/jlab/detector/calib/utils/OccupanceTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 1388b91e63..c67a90d558 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -150,7 +150,7 @@ public final DataBank create(long events, DataEvent event) { * @param events * @return */ - public Bank create(long events) { + public final Bank create(long events) { Bank b = new Bank(occBank.getSchema(), table.getRowCount()); int row = 0; for (long hash : ((Map)table.getList().getMap()).keySet()) { From 919766787cdd0f1072d2268d71ad4edfbb2ec88b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 17 Aug 2026 13:24:03 -0400 Subject: [PATCH 41/51] fix bank name --- .../detector/calib/utils/OccupanceTable.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index c67a90d558..187d2ee908 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -20,12 +20,23 @@ public class OccupanceTable { Bank hitBank; Bank occBank; + /** + * A 3-index table. + * @param schema + * @param hits name of the hits bank + */ public OccupanceTable(SchemaFactory schema, String hits) { hitBank = schema.getBank(hits); occBank = schema.getBank("OCC::"+hits); table = new IndexedTable(3, new String[]{"occ/F"}); } + /** + * A N-index table. + * @param schema + * @param hits name of the hits bank + * @param indexCount number of inidices in the hits bank + */ public OccupanceTable(SchemaFactory schema, String hits, int indexCount) { hitBank = schema.getBank(hits); occBank = schema.getBank("OCC::"+hits); @@ -33,7 +44,7 @@ public OccupanceTable(SchemaFactory schema, String hits, int indexCount) { } /** - * Reset the occupancy table. + * Zero the occupancy table. */ public final void reset() { table = new IndexedTable(table.getList().getIndexSize(), new String[]{"occ/F"}); @@ -173,7 +184,7 @@ public static final class OccupanceDriver { OccupanceTable[] tables; public OccupanceDriver(SchemaFactory schema, int prescale) { this.prescale = prescale; - tables = new OccupanceTable[]{ + tables = new OccupanceTable[] { new OccupanceTable(schema,"DC::tot"), new OccupanceTable(schema,"DC::tdc"), new OccupanceTable(schema,"ECAL::adc"), @@ -186,7 +197,7 @@ public OccupanceDriver(SchemaFactory schema, int prescale) { new OccupanceTable(schema,"HTCC::tdc"), new OccupanceTable(schema,"LTCC::adc"), new OccupanceTable(schema,"LTCC::tdc"), - new OccupanceTable(schema,"SVT::adc"), + new OccupanceTable(schema,"BST::adc"), new OccupanceTable(schema,"BMT::adc"), new OccupanceTable(schema,"FTC::adc"), new OccupanceTable(schema,"FTH::adc"), From c06f59e6db3241af0198975eec1e7f5aaf92b698 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 17 Aug 2026 13:31:50 -0400 Subject: [PATCH 42/51] cleanup --- .../detector/calib/utils/OccupanceTable.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 187d2ee908..f854fd5bfc 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -21,25 +21,25 @@ public class OccupanceTable { Bank occBank; /** - * A 3-index table. + * A 3-index table, e.g., sector/layer/component. * @param schema - * @param hits name of the hits bank + * @param hitsBank name of the hits bank */ - public OccupanceTable(SchemaFactory schema, String hits) { - hitBank = schema.getBank(hits); - occBank = schema.getBank("OCC::"+hits); + public OccupanceTable(SchemaFactory schema, String hitsBank) { + hitBank = schema.getBank(hitsBank); + occBank = schema.getBank("OCC::"+hitsBank); table = new IndexedTable(3, new String[]{"occ/F"}); } /** - * A N-index table. + * An N-index table. * @param schema - * @param hits name of the hits bank + * @param hitsBank name of the hits bank * @param indexCount number of inidices in the hits bank */ - public OccupanceTable(SchemaFactory schema, String hits, int indexCount) { - hitBank = schema.getBank(hits); - occBank = schema.getBank("OCC::"+hits); + public OccupanceTable(SchemaFactory schema, String hitsBank, int indexCount) { + hitBank = schema.getBank(hitsBank); + occBank = schema.getBank("OCC::"+hitsBank); table = new IndexedTable(indexCount, new String[]{"occ/F"}); } From 5ace9bacc1ec694d3eb93dc8a46a03ca44b28df1 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 17 Aug 2026 18:36:58 -0400 Subject: [PATCH 43/51] use filtered banks --- .../detector/calib/utils/OccupanceTable.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index f854fd5bfc..ab04481870 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -1,6 +1,9 @@ package org.jlab.detector.calib.utils; import java.util.Map; +import org.jlab.detector.banks.RawBank; +import org.jlab.detector.banks.RawBank.OrderGroups; +import org.jlab.detector.banks.RawDataBank; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.jnp.hipo4.data.Bank; @@ -17,29 +20,32 @@ public class OccupanceTable { IndexedTable table; - Bank hitBank; + RawBank hitBank; + RawDataBank hitDataBank; Bank occBank; /** * A 3-index table, e.g., sector/layer/component. * @param schema - * @param hitsBank name of the hits bank + * @param hitBank name of the hit bank */ - public OccupanceTable(SchemaFactory schema, String hitsBank) { - hitBank = schema.getBank(hitsBank); - occBank = schema.getBank("OCC::"+hitsBank); + public OccupanceTable(SchemaFactory schema, String hitBank) { + this.hitBank = new RawBank(schema.getSchema(hitBank), 1000, OrderGroups.NOMINAL); + hitDataBank = new RawDataBank(hitBank, 1000, OrderGroups.NOMINAL); + occBank = schema.getBank("OCC::"+hitBank); table = new IndexedTable(3, new String[]{"occ/F"}); } /** * An N-index table. * @param schema - * @param hitsBank name of the hits bank - * @param indexCount number of inidices in the hits bank + * @param hitBank name of the hit bank + * @param indexCount number of inidices in the hit bank */ - public OccupanceTable(SchemaFactory schema, String hitsBank, int indexCount) { - hitBank = schema.getBank(hitsBank); - occBank = schema.getBank("OCC::"+hitsBank); + public OccupanceTable(SchemaFactory schema, String hitBank, int indexCount) { + this.hitBank = new RawBank(schema.getSchema(hitBank), 1000, OrderGroups.NOMINAL); + hitDataBank = new RawDataBank(hitBank, 1000, OrderGroups.NOMINAL); + occBank = schema.getBank("OCC::"+hitBank); table = new IndexedTable(indexCount, new String[]{"occ/F"}); } @@ -84,7 +90,7 @@ public final void fill(float weight, int... index) { * @param bank * @param weighted */ - public void fill(Bank bank, boolean weighted) { + public void fill(RawBank bank, boolean weighted) { int rows = bank.getRows(); int[] idx = new int[table.getList().getIndexSize()]; for (int i=0; i Date: Mon, 17 Aug 2026 18:42:14 -0400 Subject: [PATCH 44/51] fix bank names --- .../java/org/jlab/detector/calib/utils/OccupanceTable.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index ab04481870..82514ea959 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -206,9 +206,9 @@ public OccupanceDriver(SchemaFactory schema, int prescale) { new OccupanceTable(schema,"LTCC::tdc"), new OccupanceTable(schema,"BST::adc"), new OccupanceTable(schema,"BMT::adc"), - new OccupanceTable(schema,"FTC::adc"), - new OccupanceTable(schema,"FTH::adc"), - new OccupanceTable(schema,"FTT::adc"), + new OccupanceTable(schema,"FTCAL::adc"), + new OccupanceTable(schema,"FTHODO::adc"), + new OccupanceTable(schema,"FTTRK::adc"), new OccupanceTable(schema,"RICH::tdc"), new OccupanceTable(schema,"BAND::adc"), new OccupanceTable(schema,"BAND::tdc"), From 33c8df300db64a4dbd1afebfd34549783a487b1f Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 21 Aug 2026 20:47:20 -0400 Subject: [PATCH 45/51] add occupancy to uber engine --- .../uber/src/main/java/org/jlab/service/uber/Uber.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reconstruction/uber/src/main/java/org/jlab/service/uber/Uber.java b/reconstruction/uber/src/main/java/org/jlab/service/uber/Uber.java index e3aac26011..9f5c82fbf2 100644 --- a/reconstruction/uber/src/main/java/org/jlab/service/uber/Uber.java +++ b/reconstruction/uber/src/main/java/org/jlab/service/uber/Uber.java @@ -33,6 +33,7 @@ import org.jlab.service.dc.DCTBEngineAI; import org.jlab.service.eb.EBHBAIEngine; import org.jlab.service.eb.EBTBAIEngine; +import org.jlab.calibration.service.OccupanceEngine; /** * A container of engine sequences for shorter YAMLs. @@ -144,7 +145,8 @@ public Last() { add(new RICHEBEngine(), new RTPCEngine(), new VTXEngine(), - new CalibBanksEngine()); + new CalibBanksEngine(), + new OccupanceEngine()); } } } From a43594be740395ae610f76711c8a1f718b75ed35 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 25 Aug 2026 10:29:54 -0400 Subject: [PATCH 46/51] change yaml variable name --- .../main/java/org/jlab/calibration/service/OccupanceEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java index 63cec499d5..52862418a6 100644 --- a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java @@ -21,7 +21,7 @@ public boolean processDataEventUser(DataEvent event) { @Override public boolean init() { occupancy = new OccupanceDriver(getSchemaFactory(), - Integer.parseInt(getEngineConfigString("prescale","100"))); + Integer.parseInt(getEngineConfigString("occupancyPrescale","100"))); return true; } From d361dc3b5935d73dc4e8e9a3d48d4839f2d560ca Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 25 Aug 2026 19:59:47 -0400 Subject: [PATCH 47/51] cleanup, make it thread-safe --- .../detector/calib/utils/OccupanceTable.java | 146 +++--------------- .../calibration/service/OccupanceEngine.java | 46 +++++- 2 files changed, 61 insertions(+), 131 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 82514ea959..44203bc214 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -1,16 +1,12 @@ package org.jlab.detector.calib.utils; import java.util.Map; -import org.jlab.detector.banks.RawBank; -import org.jlab.detector.banks.RawBank.OrderGroups; -import org.jlab.detector.banks.RawDataBank; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; -import org.jlab.jnp.hipo4.data.Bank; -import org.jlab.jnp.hipo4.data.Event; -import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.groups.IndexedTable.IndexedEntry; +import org.jlab.detector.banks.RawDataBank; +import org.jlab.detector.banks.RawBank.OrderGroups; /** * Occupancy bookkeeper based on IndexedTable, with I/O helpers for indexed banks. @@ -19,33 +15,28 @@ */ public class OccupanceTable { + String hitBank; + String occBank; IndexedTable table; - RawBank hitBank; - RawDataBank hitDataBank; - Bank occBank; /** * A 3-index table, e.g., sector/layer/component. - * @param schema * @param hitBank name of the hit bank */ - public OccupanceTable(SchemaFactory schema, String hitBank) { - this.hitBank = new RawBank(schema.getSchema(hitBank), 1000, OrderGroups.NOMINAL); - hitDataBank = new RawDataBank(hitBank, 1000, OrderGroups.NOMINAL); - occBank = schema.getBank("OCC::"+hitBank); + public OccupanceTable(String hitBank) { + this.hitBank = hitBank; + occBank = "OCC::" + hitBank; table = new IndexedTable(3, new String[]{"occ/F"}); } /** * An N-index table. - * @param schema * @param hitBank name of the hit bank * @param indexCount number of inidices in the hit bank */ - public OccupanceTable(SchemaFactory schema, String hitBank, int indexCount) { - this.hitBank = new RawBank(schema.getSchema(hitBank), 1000, OrderGroups.NOMINAL); - hitDataBank = new RawDataBank(hitBank, 1000, OrderGroups.NOMINAL); - occBank = schema.getBank("OCC::"+hitBank); + public OccupanceTable(String hitBank, int indexCount) { + this.hitBank = hitBank; + occBank = "OCC::" + hitBank; table = new IndexedTable(indexCount, new String[]{"occ/F"}); } @@ -70,12 +61,16 @@ public final IndexedTable getOccupancy(long events) { return t; } + public final IndexedTable getTable() { + return table; + } + /** * Fill the occupancy table. * @param weight * @param index */ - public final void fill(float weight, int... index) { + public synchronized final void fill(float weight, int... index) { for (int i=0; i m = table.getList().getMap(); for (long hash : m.keySet()) { @@ -162,75 +131,4 @@ public final DataBank create(long events, DataEvent event) { } return b; } - - /** - * Get an occupancy bank, normalized by number of events. - * @param events - * @return - */ - public final Bank create(long events) { - Bank b = new Bank(occBank.getSchema(), table.getRowCount()); - int row = 0; - for (long hash : ((Map)table.getList().getMap()).keySet()) { - int[] idx = IndexedTable.DEFAULT_GENERATOR.getIndices(hash, table.getList().getIndexSize()); - for (int j=0; j 0) event.appendBank(t.create(events, event)); - t.reset(); - } - events = 0; - } - } - } - -} \ No newline at end of file +} diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java index 52862418a6..a8e0c1c3d0 100644 --- a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java @@ -2,32 +2,64 @@ import org.jlab.io.base.DataEvent; import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.detector.calib.utils.OccupanceTable.OccupanceDriver; +import org.jlab.detector.calib.utils.OccupanceTable; public class OccupanceEngine extends ReconstructionEngine { - OccupanceDriver occupancy; - + int events; + int prescale; + OccupanceTable[] tables; + public OccupanceEngine() { super("Occupance", "baltzell","0.1"); } @Override public boolean processDataEventUser(DataEvent event) { - occupancy.process(event); + for (OccupanceTable t : tables) t.fill(event); + if (++events % prescale == 0) { + for (OccupanceTable t : tables) { + if (t.getTable().getRowCount() > 0) + event.appendBank(t.create(events, event)); + t.reset(); + } + events = 0; + } return true; } @Override public boolean init() { - occupancy = new OccupanceDriver(getSchemaFactory(), - Integer.parseInt(getEngineConfigString("occupancyPrescale","100"))); + prescale = Integer.parseInt(getEngineConfigString("occupancyPrescale","100")); + tables = new OccupanceTable[] { + new OccupanceTable("DC::tot"), + new OccupanceTable("DC::tdc"), + new OccupanceTable("ECAL::adc"), + new OccupanceTable("ECAL::tdc"), + new OccupanceTable("FTOF::adc"), + new OccupanceTable("FTOF::tdc"), + new OccupanceTable("CTOF::adc"), + new OccupanceTable("CTOF::tdc"), + new OccupanceTable("HTCC::adc"), + new OccupanceTable("HTCC::tdc"), + new OccupanceTable("LTCC::adc"), + new OccupanceTable("LTCC::tdc"), + new OccupanceTable("BST::adc"), + new OccupanceTable("BMT::adc"), + new OccupanceTable("FTCAL::adc"), + new OccupanceTable("FTHODO::adc"), + new OccupanceTable("FTTRK::adc"), + new OccupanceTable("RICH::tdc"), + new OccupanceTable("BAND::adc"), + new OccupanceTable("BAND::tdc"), + }; return true; } @Override public void detectorChanged(int runNumber) { - occupancy.reset(); + for (int i=0; i Date: Wed, 26 Aug 2026 13:06:40 -0400 Subject: [PATCH 48/51] fix build --- reconstruction/calib/pom.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index caca9e0625..f16b37dd23 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -36,9 +36,10 @@ - org.jlab.jnp - jnp-hipo4 + org.jlab.clas + clas-utils + 14.1.3-SNAPSHOT - + From b4fe565ed1a817393f09185fc40a32c92107cbf3 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 26 Aug 2026 13:51:48 -0400 Subject: [PATCH 49/51] read banks --- etc/bankdefs/hipo4/occupancy.json | 6 +-- .../calibration/service/OccupanceEngine.java | 43 +++++++++---------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/etc/bankdefs/hipo4/occupancy.json b/etc/bankdefs/hipo4/occupancy.json index 94b40cfe8c..411b8360a3 100644 --- a/etc/bankdefs/hipo4/occupancy.json +++ b/etc/bankdefs/hipo4/occupancy.json @@ -168,7 +168,7 @@ ] }, { - "name": "OCC::FTC::adc", + "name": "OCC::FTCAL::adc", "group": 500, "item": 24, "info": "Occupancy Bank", @@ -180,7 +180,7 @@ ] }, { - "name": "OCC::FTH::adc", + "name": "OCC::FTHODO::adc", "group": 500, "item": 25, "info": "Occupancy Bank", @@ -192,7 +192,7 @@ ] }, { - "name": "OCC::FTT::adc", + "name": "OCC::FTTRK::adc", "group": 500, "item": 26, "info": "Occupancy Bank", diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java index a8e0c1c3d0..346ed1dbf0 100644 --- a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java @@ -1,11 +1,17 @@ package org.jlab.calibration.service; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import org.jlab.io.base.DataEvent; import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.detector.calib.utils.OccupanceTable; +import org.jlab.utils.system.ClasUtilsFile; public class OccupanceEngine extends ReconstructionEngine { + static final String BANKDIR = ClasUtilsFile.getResourceDir("CLAS12DIR","etc/bankdefs/hipo4/singles/occupancy"); + int events; int prescale; OccupanceTable[] tables; @@ -31,34 +37,25 @@ public boolean processDataEventUser(DataEvent event) { @Override public boolean init() { prescale = Integer.parseInt(getEngineConfigString("occupancyPrescale","100")); - tables = new OccupanceTable[] { - new OccupanceTable("DC::tot"), - new OccupanceTable("DC::tdc"), - new OccupanceTable("ECAL::adc"), - new OccupanceTable("ECAL::tdc"), - new OccupanceTable("FTOF::adc"), - new OccupanceTable("FTOF::tdc"), - new OccupanceTable("CTOF::adc"), - new OccupanceTable("CTOF::tdc"), - new OccupanceTable("HTCC::adc"), - new OccupanceTable("HTCC::tdc"), - new OccupanceTable("LTCC::adc"), - new OccupanceTable("LTCC::tdc"), - new OccupanceTable("BST::adc"), - new OccupanceTable("BMT::adc"), - new OccupanceTable("FTCAL::adc"), - new OccupanceTable("FTHODO::adc"), - new OccupanceTable("FTTRK::adc"), - new OccupanceTable("RICH::tdc"), - new OccupanceTable("BAND::adc"), - new OccupanceTable("BAND::tdc"), - }; + try { + tables = Files.list(Paths.get(BANKDIR)) + .filter(Files::isRegularFile) + .map(p -> p.getFileName().toString()) + .map(s -> s.substring(0, s.length()-5)) + .map(s -> s.substring(5, s.length())) + .map(OccupanceTable::new) + .toArray(OccupanceTable[]::new); + } catch (IOException ex) { + System.getLogger(OccupanceEngine.class.getName()).log(System.Logger.Level.ERROR, (String) null, ex); + return false; + } + return true; } @Override public void detectorChanged(int runNumber) { - for (int i=0; i Date: Wed, 26 Aug 2026 14:00:43 -0400 Subject: [PATCH 50/51] cleanup --- .../detector/calib/utils/OccupanceTable.java | 19 ++++------------ .../calibration/service/OccupanceEngine.java | 22 ++++++++++++------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java index 44203bc214..be1fe74ed2 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupanceTable.java @@ -6,7 +6,6 @@ import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.groups.IndexedTable.IndexedEntry; import org.jlab.detector.banks.RawDataBank; -import org.jlab.detector.banks.RawBank.OrderGroups; /** * Occupancy bookkeeper based on IndexedTable, with I/O helpers for indexed banks. @@ -40,6 +39,10 @@ public OccupanceTable(String hitBank, int indexCount) { table = new IndexedTable(indexCount, new String[]{"occ/F"}); } + public String getHitBank() { return hitBank; } + public String getOccBank() { return occBank; } + public final IndexedTable getTable() { return table; } + /** * Zero the occupancy table. */ @@ -61,10 +64,6 @@ public final IndexedTable getOccupancy(long events) { return t; } - public final IndexedTable getTable() { - return table; - } - /** * Fill the occupancy table. * @param weight @@ -100,16 +99,6 @@ public void fill(RawDataBank bank, boolean weighted) { } } - /** - * Fill occupancy table from the hit bank, unweighted. - * @param event - */ - public void fill(DataEvent event) { - RawDataBank b = new RawDataBank(hitBank, 1000, OrderGroups.NOMINAL); - b.read(event); - fill(b, false); - } - /** * Get an occupancy bank, normalized by number of events. * @param events diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java index 346ed1dbf0..8b000fa2a9 100644 --- a/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/service/OccupanceEngine.java @@ -5,6 +5,8 @@ import java.nio.file.Paths; import org.jlab.io.base.DataEvent; import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.detector.banks.RawBank.OrderGroups; +import org.jlab.detector.banks.RawDataBank; import org.jlab.detector.calib.utils.OccupanceTable; import org.jlab.utils.system.ClasUtilsFile; @@ -22,15 +24,19 @@ public OccupanceEngine() { @Override public boolean processDataEventUser(DataEvent event) { - for (OccupanceTable t : tables) t.fill(event); - if (++events % prescale == 0) { - for (OccupanceTable t : tables) { - if (t.getTable().getRowCount() > 0) - event.appendBank(t.create(events, event)); - t.reset(); - } - events = 0; + for (OccupanceTable t : tables) { + RawDataBank b = new RawDataBank(t.getHitBank(), 1000, OrderGroups.NOMINAL); + b.read(event); + t.fill(b, false); + } + if (++events % prescale == 0) { + for (OccupanceTable t : tables) { + if (t.getTable().getRowCount() > 0) + event.appendBank(t.create(events, event)); + t.reset(); } + events = 0; + } return true; } From 40b1c1af4dc35623e0cb3e003af354836dcefa08 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 26 Aug 2026 14:16:54 -0400 Subject: [PATCH 51/51] fix --- reconstruction/calib/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index f16b37dd23..8dcb0829f3 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -38,7 +38,7 @@ org.jlab.clas clas-utils - 14.1.3-SNAPSHOT + 14.2.0-SNAPSHOT