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..aca5de13c2 --- /dev/null +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -0,0 +1,94 @@ +package org.jlab.detector.calib.utils; + +import java.util.Map; +import org.jlab.io.base.DataBank; +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[]{"occ/D"}); + } + + /** + * Reset the occupancy table. + */ + public void reset() { + 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.setDoubleValueByHash(0.0, indexNames.length, hash); + } + 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(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++; + } + } +} \ No newline at end of file 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(); } 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"} + ] + } +]