From a37ed5801f9bbcc05fd13d5f4afb23bc5fa8257d Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Aug 2026 16:48:36 -0400 Subject: [PATCH 01/17] add more helpful helper method --- .../java/org/jlab/utils/groups/IndexedList.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 21b9aca355..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 @@ -334,10 +334,22 @@ public int getIndex(long hashcode, int order) { public int[] getIndices(long hashcode, int... indices) { int[] ret = new int[indices.length]; for (int i=0; i Date: Wed, 12 Aug 2026 17:00:08 -0400 Subject: [PATCH 02/17] 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/17] 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 8a9d35bb5e55d9030d464252e8b67e508616ae93 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Aug 2026 21:23:51 -0400 Subject: [PATCH 04/17] 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 4111458b8791080b62dd88fd73929d47237ba6c4 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Aug 2026 21:38:54 -0400 Subject: [PATCH 05/17] 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 e2e74ce93c51f5847ec2644eff519d5d6a1abda9 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 11 Aug 2026 10:03:27 -0400 Subject: [PATCH 06/17] 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 11:12:45 -0400 Subject: [PATCH 07/17] add missing method --- .../src/main/java/org/jlab/utils/groups/IndexedTable.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedTable.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedTable.java index 28dcdf629d..a82bd23715 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedTable.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedTable.java @@ -167,6 +167,10 @@ public void setIntValueByHash(Integer value, int column, long hash) { this.entries.getItemByHash(hash).setValue(column, value); } + public void setDoubleValueByHash(Double value, int column, long hash) { + this.entries.getItemByHash(hash).setValue(column, value); + } + public int getIntValueByHash(int index, long hash) { return entries.getItemByHash(hash).getValue(index).intValue(); } From f8bea7727fac5e6e6852041ef0db99eef7bc0a55 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 11 Aug 2026 13:48:59 -0400 Subject: [PATCH 08/17] 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 bf9ad640e11e092995a9eb4fce2383f2cdb5cdfe Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Aug 2026 16:44:42 -0400 Subject: [PATCH 09/17] 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 1afbb6eb7b7e80c010f9de12dd0125d2756a9bb5 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Aug 2026 17:03:56 -0400 Subject: [PATCH 10/17] 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 6716e44e8a4208b826f175d231dffb177ee9afbe Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Aug 2026 19:22:52 -0400 Subject: [PATCH 11/17] 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 12/17] 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 eac41f08d7a0d0ea3b8a581ce3f30fe12dacb535 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 14:04:41 -0400 Subject: [PATCH 13/17] 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 14/17] 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 15/17] 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 0893a0ee54e1ca4409681cd3039195f599964306 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 16:02:08 -0400 Subject: [PATCH 16/17] 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 e85cced58bf453a01c6edb6bb4acbf18519282bb Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Aug 2026 16:12:27 -0400 Subject: [PATCH 17/17] 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