Author: [log in to unmask]
Date: Thu Mar 5 09:48:29 2015
New Revision: 2259
Log:
Missed adding the EvioDAQParser class (formerly TriggerConfig).
Added:
java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/daqconfig/EvioDAQParser.java
Added: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/daqconfig/EvioDAQParser.java
=============================================================================
--- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/daqconfig/EvioDAQParser.java (added)
+++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/daqconfig/EvioDAQParser.java Thu Mar 5 09:48:29 2015
@@ -0,0 +1,419 @@
+package org.hps.readout.ecal.daqconfig;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.ecal.EcalChannel;
+import org.hps.conditions.ecal.EcalConditions;
+
+public class EvioDAQParser {
+
+ /*
+ * Read/Parse/Save the DAQ trigger configuration settings.
+ * These settings arrive in multiple banks, but they *should* be in the same event.
+ *
+ * Currently this is set up to read SSP and ECAL configurations,
+ * which is all that is currently available in EVIO as of Feb 28, 2015.
+ *
+ * GTP settings and Prescale factors will need to be added to this class when added to EVIO.
+ *
+ * TODO: Error in EVIO format for Crate 39 for 2014 data requires another JEVIO workaround (realized Feb 16).
+ * ** This was fixed in EVIO for data after run 4044.
+ *
+ * TODO: Manually put in GTP settings based on run number for 2014 data.
+ * TODO: Manually deal with change in format of SSP_HPS_SINGLES_NMIN (at 3312(?)).
+ *
+ * TODO: Restructure, clean up..
+ *
+ * @author <[log in to unmask]>
+ */
+
+ public int nBanks = 0;
+
+ public static final int BANK_TAG = 0xE10E;
+
+ // need to know these in order to interpret DAQ strings:
+ private static final int[] singlesIOsrc = { 20, 21 };
+ private static final int[] pairsIOsrc = { 22, 23 };
+
+ // Dump everything read from the DAQ Configuration Bank, minimal interpretation:
+ public Map<String,List<String>> configMap = new HashMap<String,List<String>>();
+
+ // link ECAL FADC channel settings to EcalChannels:
+ Map<EcalChannel,Float> GAIN = new HashMap<EcalChannel,Float>();
+ Map<EcalChannel,Float> PEDESTAL = new HashMap<EcalChannel,Float>();
+ Map<EcalChannel,Integer> THRESHOLD = new HashMap<EcalChannel,Integer>();
+
+// private boolean debug = true;
+ private boolean debug = false;
+
+ // FADC Config:
+ int fadcNSA = 0;
+ int fadcNSB = 0;
+ int fadcNPEAK = 0;
+ int fadcMODE = 0;
+ int fadcWIDTH = 0;
+ int fadcOFFSET = 0;
+
+ // GTP Clustering Cut Values:
+ int clusterMinSeedEnergy = 0;
+ int clusterMinHitTimeDiff = 0;
+ int clusterMaxHitTimeDiff = 0;
+
+ // Triggers Enabled:
+ boolean[] singlesEn = { false, false };
+ boolean[] pairsEn = { false, false };
+
+ // Singles Cuts Enabled:
+ boolean[] singlesNhitsEn = { false, false };
+ boolean[] singlesEnergyMinEn = { false, false };
+ boolean[] singlesEnergyMaxEn = { false, false };
+
+ // Pairs Cuts Enabled:
+ boolean[] pairsEnergySumMaxMinEn = { false, false };
+ boolean[] pairsEnergyDiffEn = { false, false };
+ boolean[] pairsCoplanarityEn = { false, false };
+ boolean[] pairsEnergyDistEn = { false, false };
+
+ // Singles Cut Values:
+ int[] singlesNhits = { 0, 0 };
+ int[] singlesEnergyMin = { 0, 0 };
+ int[] singlesEnergyMax = { 0, 0 };
+
+ // Pairs Cut Values:
+ int[] pairsNhitsMin = { 0, 0 };
+ int[] pairsEnergyMin = { 0, 0 };
+ int[] pairsEnergyMax = { 0, 0 };
+ int[] pairsEnergySumMin = { 0, 0 };
+ int[] pairsEnergySumMax = { 0, 0 };
+ int[] pairsEnergyDiffMax = { 0, 0 };
+ int[] pairsCoplanarityMax = { 0, 0 };
+ int[] pairsTimeDiffMax = { 0, 0 };
+ int[] pairsEnergyDistMin = { 0, 0 };
+
+ // Pairs Cut Parameters:
+ float[] pairsEnergyDistSlope = { 0, 0 };
+
+ // Have to remember the previous slot line in order to interpret the data:
+ private int thisFadcSlot = 0;
+
+ // Cache local set of EcalChannels:
+ private EcalConditions ecalConditions = null;
+ private List<EcalChannel> channels = new ArrayList<EcalChannel>();
+
+ public EvioDAQParser() {
+ ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions();
+ for (int ii = 0; ii < 442; ii++) {
+ channels.add(findChannel(ii+1));
+ }
+ }
+
+ public void parse(int crate,int runNumber,String[] dump) {
+
+ nBanks++;
+
+ loadConfigMap(crate,dump);
+ if (debug) printMap();
+ fixConfigMap2014Run(runNumber);
+ parseConfigMap();
+
+ if (nBanks>2 && debug) printVars();
+ }
+
+ /*
+ * The first parsing routine. Just dumps the config strings
+ * into a map whose keys are the first column in the config file.
+ * Also treats some special cases.
+ */
+ private void loadConfigMap(int crate,String[] dump) {
+
+ for (String dump1 : dump) {
+ for (String line : dump1.trim().split("\n")) {
+
+ String[] cols=line.trim().split(" +",2);
+ if (cols.length < 2) continue;
+
+ String key=cols[0];
+ List<String> vals=new ArrayList<String>
+ (Arrays.asList(cols[1].trim().split(" +")));
+
+ if (vals.size() < 1) {
+ continue;
+ }
+
+ // SPECIAL CASE:
+ // parse the 16+1 column slot configurations.
+ if (key.startsWith("FADC250")) {
+ parseFADC(crate,key.trim(),vals);
+ }
+
+ // SPECIAL CASE:
+ // figure out which triggers are enabled:
+ else if (key.startsWith("SSP_HPS_SET_IO_SRC")) {
+ int trig = Integer.valueOf(vals.get(1));
+ for (int ii=0; ii<pairsIOsrc.length; ii++)
+ {
+ if (trig == singlesIOsrc[ii]) {
+ singlesEn[ii]=true;
+ }
+ else if (trig == pairsIOsrc[ii]) {
+ pairsEn[ii]=true;
+ }
+ }
+ }
+
+ // GENERAL CASE:
+ // Append trigger# onto key:
+ if (vals.size() > 1 && key.startsWith("SSP"))
+ {
+ key += "_"+vals.remove(0);
+ }
+ // dump it into the map:
+ configMap.put(key,vals);
+ }
+ }
+ }
+ /*
+ * This function parses the config map for the cases where the
+ * config string has a simple format:
+ * TAG VALUE
+ * TAG TRIGGER VALUES
+ */
+ public void parseConfigMap()
+ {
+// System.out.println("PARSECONFIGMAP ..................");
+
+ fadcNSA=Integer.valueOf(getConfig("FADC250_NSA",0));
+ fadcNSB=Integer.valueOf(getConfig("FADC250_NSB",0));
+ fadcNPEAK=Integer.valueOf(getConfig("FADC250_NPEAK",0));
+ fadcMODE=Integer.valueOf(getConfig("FADC250_MODE",0));
+ fadcWIDTH=Integer.valueOf(getConfig("FADC250_W_WIDTH",0));
+ fadcOFFSET=Integer.valueOf(getConfig("FADC250_W_OFFSET",0));
+
+ clusterMinSeedEnergy=Integer.valueOf(getConfig("GTP_CLUSTER_THRESH",0));
+ clusterMinHitTimeDiff=Integer.valueOf(getConfig("GTP_TIMEDIFF",0));
+ clusterMaxHitTimeDiff=Integer.valueOf(getConfig("GTP_TIMEDIFF",1));
+
+ for (int ii=0; ii<2; ii++) {
+
+ singlesNhitsEn[ii]=getBoolConfigSSP(ii,"SINGLES_NMIN",1);
+ singlesEnergyMinEn[ii]=getBoolConfigSSP(ii,"SINGLES_EMIN",1);
+ singlesEnergyMaxEn[ii]=getBoolConfigSSP(ii,"SINGLES_EMAX",1);
+
+ pairsEnergySumMaxMinEn[ii]=getBoolConfigSSP(ii,"PAIRS_SUMMAX_MIN",2);
+ pairsEnergyDiffEn[ii]=getBoolConfigSSP(ii,"PAIRS_DIFFMAX",1);
+ pairsCoplanarityEn[ii]=getBoolConfigSSP(ii,"PAIRS_COPLANARITY",1);
+ pairsEnergyDistEn[ii]=getBoolConfigSSP(ii,"PAIRS_ENERGYDIST",1);
+
+ singlesNhits[ii]=getIntConfigSSP(ii,"SINGLES_NMIN",0);
+ singlesEnergyMin[ii]=getIntConfigSSP(ii,"SINGLES_EMIN",0);
+ singlesEnergyMax[ii]=getIntConfigSSP(ii,"SINGLES_EMAX",0);
+
+ pairsNhitsMin[ii]=getIntConfigSSP(ii,"PAIRS_NMIN",0);
+ pairsEnergyMin[ii]=getIntConfigSSP(ii,"PAIRS_EMIN",0);
+ pairsEnergyMax[ii]=getIntConfigSSP(ii,"PAIRS_EMAX",0);
+ pairsEnergySumMin[ii]=getIntConfigSSP(ii,"PAIRS_SUMMAX_MIN",1);
+ pairsEnergySumMax[ii]=getIntConfigSSP(ii,"PAIRS_SUMMAX_MIN",0);
+ pairsEnergyDiffMax[ii]=getIntConfigSSP(ii,"PAIRS_DIFFMAX",0);
+ pairsCoplanarityMax[ii]=getIntConfigSSP(ii,"PAIRS_COPLANARITY",0);
+ pairsTimeDiffMax[ii]=getIntConfigSSP(ii,"PAIRS_TIMECOINCIDENCE",0);
+ pairsEnergyDistSlope[ii]=getFloatConfigSSP(ii,"PAIRS_ENERGYDIST",0);
+ pairsEnergyDistMin[ii]=getIntConfigSSP(ii,"PAIRS_ENERGYDIST",1);
+ }
+// System.out.println("DONE PARSECONFIGMAP.");
+ }
+
+
+
+ /*
+ * UNFINISHED.
+ * This is a fixer-upper for before we had the full config in EVIO
+ * or when there was a bug in it.
+ */
+ private void fixConfigMap2014Run(int runNumber) {
+ if (runNumber>3470 || runNumber < 3100) return;
+ // TODO: port datacat/python/engrun/engrun_metadata.py
+ // 1. SET GTP SETTINGS MANUALLY BASED ON RUN NUMBER
+ // 2. FIX SINGLES_NMIN prior to 3312
+ for (String key : configMap.keySet()) {
+ }
+ List<String> tmp=new ArrayList<String>();
+ tmp.add("0");
+ tmp.add("0");
+ tmp.add("0");
+ tmp.add("0");
+ configMap.put("GTP_CLUSTER_THRESH",tmp);
+ configMap.put("GTP_TIMEDIFF",tmp);
+ }
+
+
+
+ /*
+ * These treat the FADC config lines with 16+1 columns.
+ * Must keep track of most recent FADC250_SLOT tag, since it's
+ * not on the line with the data.
+ */
+ private void parseFADC(int crate,String key,List<String> vals)
+ {
+// System.out.println(crate);
+ if (key.equals("FADC250_SLOT")) {
+ thisFadcSlot=Integer.valueOf(vals.get(0));
+ }
+ else if (key.equals("FADC250_ALLCH_TET")) {
+ setChannelParsInt(crate,thisFadcSlot,THRESHOLD,vals);
+ }
+ else if (key.equals("FADC250_ALLCH_PED")) {
+ setChannelParsFloat(crate,thisFadcSlot,PEDESTAL,vals);
+ }
+ else if (key.equals("FADC250_ALLCH_GAIN")) {
+ setChannelParsFloat(crate,thisFadcSlot,GAIN,vals);
+ }
+ }
+ private void setChannelParsFloat(int crate,int slot,Map<EcalChannel,Float>map, List<String> vals)
+ {
+ for (int ii=0; ii<16; ii++) {
+ map.put(findChannel(crate,slot,ii),Float.valueOf(vals.get(ii)));
+ }
+ }
+ private void setChannelParsInt(int crate,int slot,Map<EcalChannel,Integer>map, List<String> vals)
+ {
+ for (int ii=0; ii<16; ii++) {
+ map.put(findChannel(crate,slot,ii),Integer.valueOf(vals.get(ii)));
+ }
+ }
+
+
+
+
+ public void printMap() {
+ System.out.print("\nTriggerConfigMap::::::::::::::::::::::::::::\n");
+ for (String key : configMap.keySet()) {
+ System.out.printf("%s: ",key);
+ for (String val : configMap.get(key)) {
+ System.out.printf("%s ",val);
+ }
+ System.out.printf("\n");
+ }
+ System.out.println("::::::::::::::::::::::::::::::::::::::::::::");
+ }
+
+ public void printVars()
+ {
+ System.out.println("\nTriggerConfigVars%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
+ System.out.println();
+ System.out.println(String.format("GTPMINSEED: %d",clusterMinSeedEnergy));
+ System.out.println(String.format("GTPMINHITDT: %d",clusterMinHitTimeDiff));
+ System.out.println(String.format("GTPMAXHITDT: %d",clusterMaxHitTimeDiff));
+ System.out.println();
+ System.out.println(String.format("FADC250_NSA: %d",fadcNSA));
+ System.out.println(String.format("FADC250_NSB: %d",fadcNSB));
+ System.out.println(String.format("FADC250_NPEAK: %d",fadcNPEAK));
+ System.out.println(String.format("FADC250_MODE: %d",fadcMODE));
+ System.out.println(String.format("FADC250_WIDTH: %d",fadcWIDTH));
+ System.out.println(String.format("FADC250_OFFSET: %d",fadcOFFSET));
+ for (EcalChannel cc : ecalConditions.getChannelCollection()) {
+ //System.out.print(String.format("SLOT%d CHAN%d --",cc.getSlot(),cc.getChannel()));
+ if (!PEDESTAL.containsKey(cc)) {
+ System.out.println("\nP !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+ }
+ if (!THRESHOLD.containsKey(cc)) {
+ System.out.println("\nT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+ }
+ if (!GAIN.containsKey(cc)) {
+ System.out.println("\nG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+ }
+ //System.out.println(String.format(" %f %d %f",
+ // PEDESTAL.get(cc),THRESHOLD.get(cc),GAIN.get(cc)));
+ }
+ System.out.println();
+ for (int ii=0; ii<2; ii++)
+ {
+ System.out.println(String.format("SINGLES_EN %d %b ",ii,singlesEn[ii]));
+ System.out.println(String.format("PAIRS_EN %d %b ",ii,pairsEn[ii]));
+
+ System.out.println(String.format("SINGLES_NHITS_EN %d %b: ",ii,singlesNhitsEn[ii]));
+ System.out.println(String.format("SINGLES_EMIN_EN %d %b",ii,singlesEnergyMinEn[ii]));
+ System.out.println(String.format("SINGLES_EMAX_EN %d %b",ii,singlesEnergyMaxEn[ii]));
+
+ System.out.println(String.format("PAIRS_SUMMAXMIN_EN %d %b",ii,pairsEnergySumMaxMinEn[ii]));
+ System.out.println(String.format("PAIRS_ENERGYDIFF_EN %d %b",ii,pairsEnergyDiffEn[ii]));
+ System.out.println(String.format("PAIRS_COP_EN %d %b",ii,pairsCoplanarityEn[ii]));
+ System.out.println(String.format("PAIRS_EDIST_EN %d %b",ii,pairsEnergyDistEn[ii]));
+
+ System.out.println(String.format("SINGLES_NHTIS %d %d",ii,singlesNhits[ii]));
+ System.out.println(String.format("SINGLES_EMIN %d %d",ii,singlesEnergyMin[ii]));
+ System.out.println(String.format("SINGLES_EMAX %d %d",ii,singlesEnergyMax[ii]));
+
+ System.out.println(String.format("PAIRS_NHITS %d %d",ii,pairsNhitsMin[ii]));
+ System.out.println(String.format("PAIRS_SUMMIN %d %d",ii,pairsEnergySumMin[ii]));
+ System.out.println(String.format("PAIRS_SUMMAX %d %d",ii,pairsEnergySumMax[ii]));
+ System.out.println(String.format("PAIRS_ENERGYDIFF %d %d",ii,pairsEnergyDiffMax[ii]));
+ System.out.println(String.format("PAIRS_COPMAX %d %d",ii,pairsCoplanarityMax[ii]));
+ System.out.println(String.format("PAIRS_TDIFFMAAX %d %d",ii,pairsTimeDiffMax[ii]));
+ System.out.println(String.format("PAIRS_EDISTMIN %d %d",ii,pairsEnergyDistMin[ii]));
+ System.out.println(String.format("PAIRS_EDISTSLOP %d %f",ii,pairsEnergyDistSlope[ii]));
+ }
+ System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
+ }
+
+
+
+ /*
+ * Parsing wrappers to make rest of code easier.
+ */
+ public float getFloatConfigSSP(int itrig,String stub,int ival) {
+ return Float.valueOf(getConfigSSP(itrig,stub,ival));
+ }
+ public int getIntConfigSSP(int itrig,String stub,int ival) {
+ return Integer.valueOf(getConfigSSP(itrig,stub,ival));
+ }
+ public boolean getBoolConfigSSP(int itrig,String stub,int ival) {
+ return "1".equals(getConfigSSP(itrig,stub,ival));
+ }
+ public String getConfigSSP(int itrig,String stub,int ival) {
+ String key="SSP_HPS_"+stub+"_"+itrig;
+ return getConfig(key,ival);
+ }
+ public String getConfig(String key, int ival) {
+ if (configMap.containsKey(key)) {
+ List<String> vals=configMap.get(key);
+ if (ival<vals.size()) {
+ return configMap.get(key).get(ival);
+ } else {
+ Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,
+ "ConfigMap TOO SHORT: "+ival+" "+configMap.get(key));
+ return "0";
+ }
+ } else {
+ // this is only necessarily an error if we've read 3 banks:
+ if (nBanks>2) {
+ Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,
+ "ConfigMap MISSING KEY: "+key);
+ }
+ return "0";
+ }
+ }
+
+
+ public EcalChannel findChannel(int crate,int fadcSlot,int fadcChan)
+ {
+ for (EcalChannel cc : channels) {
+ // EcalChannel follows different convention on crate numbering:
+ if ((cc.getCrate()-1)*2 == crate-37 &&
+ cc.getSlot() == fadcSlot && cc.getChannel() == fadcChan)
+ {
+ return cc;
+ }
+ }
+ return null;
+ }
+ public EcalChannel findChannel(int channel_id) {
+ return ecalConditions.getChannelCollection().findChannel(channel_id);
+ }
+}
|