diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/banks/RawBank.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/banks/RawBank.java index fffc360b58..d9b7d6aec0 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/banks/RawBank.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/banks/RawBank.java @@ -74,9 +74,9 @@ public static enum OrderType { BGADDED_NOISE1 ( 70), // background hits retained by level-1 denoising BGADDED_NOISE2 ( 80), // background hits retained by level-2 denoising BGADDED_NOISE3 ( 90), // background hits retained by level-3 denoising - USER1 (100), - USER2 (110), - USER3 (120); + OUTOFTIME (100), // hit excluded during decoding as outside the expected time window + BELOWTHRS (110), // hit excluded during decoding as below threshold + MULTIHIT (120); // hit excluded during decoding as not the first in time private final int rawOrderId; private OrderType(int id){ rawOrderId = id; } public int getTypeId() { return rawOrderId; } diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder4.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder4.java index a11ff73f98..65f87b90f8 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder4.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder4.java @@ -139,6 +139,7 @@ public void initEvent(DataEvent event){ detectorDecoder.translate(dataList); detectorDecoder.fitPulses(dataList); + detectorDecoder.filterTDCs(dataList); if(this.decoderDebugMode>0){ System.out.println("\n>>>>>>>>> TRANSLATED data"); for(DetectorDataDgtz data : dataList){ @@ -308,8 +309,10 @@ public Bank getDataBankTDC(String name, DetectorType type){ tdcBANK.putByte("sector", i, (byte) tdcDGTZ.get(i).getDescriptor().getSector()); tdcBANK.putByte("layer", i, (byte) tdcDGTZ.get(i).getDescriptor().getLayer()); tdcBANK.putShort("component", i, (short) tdcDGTZ.get(i).getDescriptor().getComponent()); - tdcBANK.putByte("order", i, (byte) tdcDGTZ.get(i).getDescriptor().getOrder()); + tdcBANK.putByte("order", i, (byte) (tdcDGTZ.get(i).getDescriptor().getOrder()+tdcDGTZ.get(i).getTDCData(0).getType().getTypeId())); tdcBANK.putInt("TDC", i, tdcDGTZ.get(i).getTDCData(0).getTime()); + if(name == "DC::tdc") + tdcBANK.putShort("ToT", i, (short) tdcDGTZ.get(i).getTDCData(0).getToT()); } return tdcBANK; } diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaEventDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaEventDecoder.java index 4d39ad1077..34ea9ce751 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaEventDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaEventDecoder.java @@ -280,10 +280,13 @@ else if(node.getTag()==57640){ return this.getDataEntries_57640(crate, node, event); } else if(node.getTag()==57622){ - // This is regular integrated pulse mode, used for FTOF - // FTCAL and EC/PCAL + // This is regular DCRB bank with TDCs only return this.getDataEntries_57622(crate, node, event); } + else if(node.getTag()==57648){ + // This is DCRB bank with TDCs and ToTs + return this.getDataEntries_57648(crate, node, event); + } else if(node.getTag()==57636){ // RICH TDC data return this.getDataEntries_57636(crate, node, event); @@ -963,6 +966,53 @@ public List getDataEntries_57622(Integer crate, EvioNode node return entries; } + /** + * Bank TAG=57648 used for DC (Drift Chambers) TDC and width values. + * @param crate + * @param node + * @param event + * @return + */ + public List getDataEntries_57648(Integer crate, EvioNode node, EvioDataEvent event){ + List entries = new ArrayList<>(); + if(node.getTag()==57648){ + try { + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + //List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + int totalSize = cdataitems.size(); + int position = 0; + while( (position + 4) < totalSize){ + Byte slot = (Byte) cdataitems.get(position); + //Integer trig = (Integer) cdataitems.get(position+1); + Long time = (Long) cdataitems.get(position+2); + Integer nchannels = (Integer) cdataitems.get(position+3); + int counter = 0; + position = position + 4; + while(counter ERROR DECODING COMPOSITE DATA FOR ONE EVENT"); + } + + } + return entries; + } + /** * Bank TAG=57636 used for RICH TDC values * @param crate diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorDataDgtz.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorDataDgtz.java index 375c322b3d..bbedd1f747 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorDataDgtz.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorDataDgtz.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import org.jlab.detector.banks.RawBank.OrderType; import org.jlab.detector.base.DetectorDescriptor; import org.jlab.detector.base.DetectorType; import org.jlab.detector.helicity.HelicityBit; @@ -333,6 +334,7 @@ public static class TDCData implements Comparable{ private int tdcOrder = 0; // Used for sorting private int tdcTime = 0; private int tdcToT = 0; // Time over threshold + private OrderType tdcType = OrderType.NOMINAL; public TDCData() {} public TDCData(int time) { this.tdcTime = time;} @@ -340,10 +342,12 @@ public TDCData() {} public int getTime() { return this.tdcTime;} public int getToT() { return this.tdcToT;} public int getOrder() { return tdcOrder;} + public OrderType getType() { return tdcType;} public TDCData setOrder(int order) { tdcOrder = order;return this;} public TDCData setTime(short time) { tdcTime = time;return this;} public TDCData setToT(short ToT) { tdcToT = ToT;return this;} - + public TDCData setType(OrderType type) { tdcType = type; return this;} + @Override public String toString(){ return String.format("TDC (%d) : %5d : %5d", getOrder(),getTime(),getToT()); diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java index 09a4ad7bf5..03cb40652e 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java @@ -1,7 +1,12 @@ package org.jlab.detector.decode; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.jlab.detector.banks.RawBank.OrderType; import org.jlab.detector.base.DetectorType; import org.jlab.detector.calib.utils.ConstantsManager; import org.jlab.detector.decode.DetectorDataDgtz.ADCData; @@ -15,12 +20,15 @@ public class DetectorEventDecoder { ConstantsManager translationManager = new ConstantsManager(); ConstantsManager fitterManager = new ConstantsManager(); + ConstantsManager filterManager = new ConstantsManager(); ConstantsManager scalerManager = new ConstantsManager(); List tablesTrans = null; List keysTrans = null; List tablesFitter = null; List keysFitter = null; + List tablesFilter = null; + List keysFilter = null; private int runNumber = 10; @@ -38,12 +46,14 @@ public DetectorEventDecoder(boolean development){ public void setTimestamp(String timestamp) { translationManager.setTimeStamp(timestamp); fitterManager.setTimeStamp(timestamp); + filterManager.setTimeStamp(timestamp); scalerManager.setTimeStamp(timestamp); } public void setVariation(String variation) { translationManager.setVariation(variation); fitterManager.setVariation(variation); + filterManager.setVariation(variation); scalerManager.setVariation(variation); } @@ -109,6 +119,11 @@ public final void initDecoder(){ }); fitterManager.init(keysFitter, tablesFitter); + // Data filter table + keysFilter = Arrays.asList(new String[]{"DC"}); + tablesFilter = Arrays.asList(new String[]{"/test/dc/tdc"}); + filterManager.init(keysFilter, tablesFilter); + scalerManager.init(Arrays.asList(new String[]{"/runcontrol/fcup","/runcontrol/slm","/runcontrol/hwp", "/runcontrol/helicity","/daq/config/scalers/dsc1"})); } @@ -211,4 +226,59 @@ public void fitPulses(List detectorData){ } } } + + + public void filterTDCs(List detectorData){ + for(String table : keysFilter){ + Map> filteredData = new HashMap<>(); + IndexedTable filter = filterManager.getConstants(runNumber, table); + for(DetectorDataDgtz data : detectorData){ + if(data.getDescriptor().getType()==DetectorType.getType(table)) { + int sector = data.getDescriptor().getSector(); + int layer = data.getDescriptor().getLayer(); + int comp = data.getDescriptor().getComponent(); + int order = data.getDescriptor().getOrder(); + int min = filter.getIntValue("minimum", sector, layer, 1); + int max = filter.getIntValue("maximum", sector, layer, 1); + int trs = filter.getIntValue("threshold", sector, layer, 1); + if(data.getTDCData(0).getTime()max) + data.getTDCData(0).setType(OrderType.OUTOFTIME); + if( data.getTDCData(0).getToT()()); + filteredData.get(key).add(data); + } + } + for(int key : filteredData.keySet()) { + filteredData.get(key).sort(new TDCComparator()); + int sector = filteredData.get(key).get(0).getDescriptor().getSector(); + int layer = filteredData.get(key).get(0).getDescriptor().getLayer(); + int comp = filteredData.get(key).get(0).getDescriptor().getComponent(); + int order = filteredData.get(key).get(0).getDescriptor().getOrder(); + int mult = filter.getIntValue("multiplicity", sector, layer, 1); + if(filteredData.get(key).size()>mult) + for(int i=mult; i { + + // override the compare() method + public int compare(DetectorDataDgtz s1, DetectorDataDgtz s2) + { + if(s1.getTDCSize()>0 && s2.getTDCSize()>0) + return s1.getTDCData(0).getTime()0) + return 1; + else if(s2.getTDCSize()>0) + return -1; + else + return 0; + } + } } diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/ReconstructionEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/ReconstructionEngine.java index cce8c4301b..c04c70b24c 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/ReconstructionEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/ReconstructionEngine.java @@ -188,7 +188,12 @@ public EngineData configure(EngineData ed) { LOGGER.log(Level.INFO,"--- engine configuration is called " + this.getDescription()); try { if (this.getEngineConfigString("rawBankGroup")!=null) { - this.rawBankOrders = RawBank.getFilterGroup(this.getEngineConfigString("rawBankGroup")); + if(this.getEngineConfigString("rawBankGroup").contains(",")) { + this.rawBankOrders = RawBank.createFilterGroup(this.getEngineConfigString("rawBankGroup").replace(" ","").split(",")); + } + else { + this.rawBankOrders = RawBank.getFilterGroup(this.getEngineConfigString("rawBankGroup")); + } } if (this.getEngineConfigString("dropBanks")!=null && this.getEngineConfigString("dropBanks").equals("true")) { diff --git a/etc/bankdefs/hipo4/data.json b/etc/bankdefs/hipo4/data.json index d965ded0bc..a85aba50de 100644 --- a/etc/bankdefs/hipo4/data.json +++ b/etc/bankdefs/hipo4/data.json @@ -210,7 +210,8 @@ { "name":"layer" , "type":"B", "info":"layer (1..36)"}, { "name":"component" , "type":"S", "info":"wire number (1..112)"}, { "name":"order" , "type":"B", "info":"order: 2 - TDCL , 3 - TDCR"}, - { "name":"TDC" , "type":"I", "info":"TDC value"} + { "name":"TDC" , "type":"I", "info":"TDC value"}, + { "name":"ToT" , "type":"S", "info":"Time Over Threshold"} ] }, { diff --git a/reconstruction/dc/src/test/java/org/jlab/service/dc/DCRBFirmware.java b/reconstruction/dc/src/test/java/org/jlab/service/dc/DCRBFirmware.java new file mode 100644 index 0000000000..34a1ad799d --- /dev/null +++ b/reconstruction/dc/src/test/java/org/jlab/service/dc/DCRBFirmware.java @@ -0,0 +1,376 @@ +package org.jlab.service.dc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.jlab.detector.base.DetectorType; +import org.jlab.detector.calib.utils.ConstantsManager; +import org.jlab.groot.base.GStyle; +import org.jlab.groot.data.H1F; +import org.jlab.groot.data.H2F; +import org.jlab.groot.ui.TCanvas; +import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; +import org.jlab.io.hipo.HipoDataSource; +import org.jlab.utils.groups.IndexedTable; + +/** + * Example of analysis code for studying DC readout settings + * @author devita + */ +public class DCRBFirmware { + + public IndexedTable tt = null; + public IndexedTable reverse = null; + + private void getReverseTT(int run) { + ConstantsManager manager = new ConstantsManager(); + manager.init("/daq/tt/dc"); + tt = manager.getConstants(run, "/daq/tt/dc"); + reverse = new IndexedTable(4, "crate/I:slot/I:channel/I"); + for(int row=0; row0) this.getReverseTT(run); + } + } + + public Map getTrackMap(DataEvent event, String mode, H1F[] htracks) { + String hits = "HitBasedTrkg::HBHitTrkId"; + String tracks = "HitBasedTrkg::HBTracks"; + String rtracks = "RECHB::Track"; + String particles = "RECHB::Particle"; + String tid = "tid"; + if(mode == "TB") { + hits = "TimeBasedTrkg::TBHits"; + tracks = "TimeBasedTrkg::TBTracks"; + rtracks = "REC::Track"; + particles = "REC::Particle"; + tid = "trkID"; + } + Map onTrack = new HashMap<>(); + Map goodTracks = new HashMap<>(); + if(event.hasBank(hits) && event.hasBank(tracks) && event.hasBank(rtracks) && event.hasBank(particles)) { + DataBank pBank = event.getBank(particles); + DataBank rBank = event.getBank(rtracks); + DataBank tBank = event.getBank(tracks); + DataBank hBank = event.getBank(hits); + for(int i=0; ihp.tdc()) + hits[2].fill(h.tdc()-hp.tdc()-hp.tot(), weight); + else + hits[2].fill(hp.tdc()-h.tdc()-h.tot(), weight); + } + hits[3].fill(h.order(), weight); + } + + + public void plot(String canvasTitle, H1F[] mult, H1F[][]... hits) { + int nrow = mult.length; + int ncol = hits[0][0].length+1; + TCanvas canvas = new TCanvas(canvasTitle, 1000, 800); + canvas.divide(ncol, nrow); + for(int r=0; r>24; + } + + public static int getLayer(int hashCode) { + return (hashCode&0x00FF0000)>>16; + } + + public static int getComponent(int hashCode) { + return (hashCode&0x0000FFFF); + } + + @Override + public int compareTo(Object o) { + return this.tdc<((Hit)o).tdc() ? -1 :1; + } + + } + + public static void main(String[] args) { + + GStyle.getH1FAttributes().setOptStat("10"); + GStyle.getAxisAttributesX().setTitleFontSize(20); + GStyle.getAxisAttributesX().setLabelFontSize(16); + GStyle.getAxisAttributesY().setTitleFontSize(20); + GStyle.getAxisAttributesY().setLabelFontSize(16); + GStyle.getAxisAttributesZ().setLabelFontSize(12); + GStyle.getAxisAttributesX().setLabelFontName("Arial"); + GStyle.getAxisAttributesY().setLabelFontName("Arial"); + GStyle.getAxisAttributesZ().setLabelFontName("Arial"); + GStyle.getAxisAttributesX().setTitleFontName("Arial"); + GStyle.getAxisAttributesY().setTitleFontName("Arial"); + GStyle.getAxisAttributesZ().setTitleFontName("Arial"); + GStyle.setGraphicsFrameLineWidth(1); + GStyle.getH1FAttributes().setLineWidth(2); + + int[][] hmin = {{-100, -100, -100}, {-100, -100, -100},{-100, -100, -100}, {-50, -50, -50}}; + int[][] hmax = {{600, 1500, 1300}, {1200, 1200, 1200},{600, 600, 600}, {150, 150, 150}}; + String[] title = {"TDC (ns)", "ToT (ns)", "#DeltaT", "Order Type"}; + double[] tmin = {0, 0, -15}; + double[] tmax = {10, 40, 15}; + int[] tbin = {10, 40, 100}; + String[] ttitle = {"Number of tracks", "NDF", "vz(cm)"}; + + H1F[] hMult = new H1F[3]; + H2F[][] h2Mult = new H2F[3][2]; + H1F[] hTrks = new H1F[3]; + H1F[][] hAll = new H1F[3][4]; + H1F[][] hFst = new H1F[3][4]; + H1F[][] hSnd = new H1F[3][4]; + H1F[][] hOn = new H1F[3][4]; + H1F[][] hOff = new H1F[3][4]; + for(int r=0; r<3; r++) { + hTrks[r] = new H1F("hTrks"+r, " ", tbin[r], tmin[r], tmax[r]); + hTrks[r].setTitleX(ttitle[r]); + hTrks[r].setOptStat("110"); + hMult[r] = new H1F("hMult"+r, "Region "+(r+1), 64, 0, 64); + hMult[r].setTitleX("Number of hits per group"); + for(int s=0; s<2; s++) { + h2Mult[r][s] = new H2F("h2Mult"+r+s, "Region "+(r+1) + "- Sector " + (s*3+2), 64, 0, 64, 85, 0, 85); + h2Mult[r][s].setTitleX("Number of hits per group"); + h2Mult[r][s].setTitleY("Slot-Group"); + } + for(int j=0; j<4; j++) { + hAll[r][j] = new H1F("hAll"+r+j, "Region "+(r+1), 100, hmin[j][r], hmax[j][r]); + hFst[r][j] = new H1F("hFst"+r+j, "Region "+(r+1), 100, hmin[j][r], hmax[j][r]); + hSnd[r][j] = new H1F("hSnd"+r+j, "Region "+(r+1), 100, hmin[j][r], hmax[j][r]); + hOn[r][j] = new H1F("hOn"+r+j, "Region "+(r+1), 100, hmin[j][r], hmax[j][r]); + hOff[r][j] = new H1F("hOff"+r+j, "Region "+(r+1), 100, hmin[j][r], hmax[j][r]); + hAll[r][j].setTitleX(title[j]); + hFst[r][j].setTitleX(title[j]); + hFst[r][j].setLineColor(2); + hSnd[r][j].setTitleX(title[j]); + hSnd[r][j].setLineColor(3); + hOn[r][j].setTitleX(title[j]); + hOff[r][j].setTitleX(title[j]); + } + } + DCRBFirmware dcrb = new DCRBFirmware(); + + HipoDataSource reader = new HipoDataSource(); + reader.open("/Users/devita/dcrb/rec_alltdc.hipo"); + while(reader.hasEvent()) { + DataEvent event = reader.getNextEvent(); + + dcrb.getTables(event); + + Map onHBtrack = dcrb.getTrackMap(event, "HB", hTrks); + + Map multiplicity = new HashMap(); + Map> wires = new HashMap(); + if(event.hasBank("DC::tdc")) { + DataBank tdc = event.getBank("DC::tdc"); + for(int i=0; i()); + wires.get(h.hashCode()).add(h); + + int hash = Hit.generateHashCode(crate, slot, group*16); + if(multiplicity.containsKey(hash)) + multiplicity.replace(hash, multiplicity.get(hash)+1); + else + multiplicity.put(hash, 1); + + } + } + + for(List hits : wires.values()) { + Collections.sort(hits); + for(int i=0; i0) hpre = hits.get(i-1); + if(i0 && hits.get(0).tot()<50 && hits.get(i).tot()>50) { + dcrb.fill(hSnd[h.region()-1], h, hpre, 10); + } + if(onHBtrack.containsKey(h.index()+1)) { + dcrb.fill(hOn[h.region()-1], h, hpost); + } + else { + dcrb.fill(hOff[h.region()-1], h, hpre); + } + } + } + for(int key : multiplicity.keySet()) { + int slot = Hit.getLayer(key); + int group = Hit.getComponent(key)/16; + int sector = dcrb.tt.getIntValue("sector", Hit.getSector(key), Hit.getLayer(key),Hit.getComponent(key)); + int layer = dcrb.tt.getIntValue("layer", Hit.getSector(key), Hit.getLayer(key),Hit.getComponent(key)); + int r = (layer-1)/12; + int ybin = slot<10 ? (slot-3)*6+group : (slot-7)*6+group; +// if(sl==0) +// System.out.println(key + " " + ybin + " " + sl + " " + Hit.getSector(key) + " " +Hit.getLayer(key) + " " +Hit.getComponent(key)); + hMult[r].fill(multiplicity.get(key)); + h2Mult[r][(sector-2)/3].fill(multiplicity.get(key),ybin); + } + } + } + + dcrb.plot("All Hits", hMult, hAll, hFst, hSnd); + dcrb.plot("Multiplicity", h2Mult); + dcrb.plot("Hits on track", hTrks, hOn); + dcrb.plot("Hits off track", hTrks, hOff); + } +}