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..4d00191d88 --- /dev/null +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -0,0 +1,108 @@ +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; +import org.jlab.utils.groups.IndexedTable.IndexedEntry; + +public abstract class OccupancyTable { + + public static class DC extends OccupancyTable { + public DC() { super(); } + public void add(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, indexNames.length)); + t.setDoubleValueByHash((table.getDoubleValueByHash(0, hash))/events, 0, hash); + } + return t; + } + + /** + * Reset occupancy table. + */ + public final void reset() { + table = new IndexedTable(indexNames.length, valueNames); + } + + /** + * Fill occupancy table. + * @param index + */ + public final void add(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); + } + + /** + * Get number of rows for the occupancy bank. + * @return rows + */ + public final int getRows() { + return table.getRowCount(); + } + + /** + * Update an occupancy bank, assuming 3/4-index s/l/c[/o]. + * @param bank occupancy bank + */ + 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); + 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++; + } + } + + /** + * Create occupancy bank, assuming 3/4-indexing, and add it to the event. + * @param event + * @param bank + */ + 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/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..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 @@ -334,6 +334,19 @@ 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