aboutsummaryrefslogtreecommitdiff
path: root/src/zdab_utils.h
diff options
context:
space:
mode:
authortlatorre <tlatorre@uchicago.edu>2018-08-14 10:08:27 -0500
committertlatorre <tlatorre@uchicago.edu>2018-08-14 10:08:27 -0500
commit24c8bcfe7f76b20124e2862ea050f815c0f768e7 (patch)
treee5bdbd638a2c7f38f1c094cc9e95cbdfe05b9481 /src/zdab_utils.h
parent0b7f199c0d93074484ea580504485a32dc29f5e2 (diff)
downloadsddm-24c8bcfe7f76b20124e2862ea050f815c0f768e7.tar.gz
sddm-24c8bcfe7f76b20124e2862ea050f815c0f768e7.tar.bz2
sddm-24c8bcfe7f76b20124e2862ea050f815c0f768e7.zip
move everything to src directory
Diffstat (limited to 'src/zdab_utils.h')
-rw-r--r--src/zdab_utils.h202
1 files changed, 202 insertions, 0 deletions
diff --git a/src/zdab_utils.h b/src/zdab_utils.h
new file mode 100644
index 0000000..c5fc2c0
--- /dev/null
+++ b/src/zdab_utils.h
@@ -0,0 +1,202 @@
+#ifndef ZDAB_UTILS
+#define ZDAB_UTILS
+
+#include "Record_Info.h"
+#include <stdint.h>
+#include <stdlib.h> /* for size_t */
+
+// the builder won't put out events with NHIT > 10000
+// (note that these are possible due to hardware problems)
+// but XSNOED can write an event with up to 10240 channels
+#define MAX_NHIT 10240
+
+#ifdef SWAP_BYTES
+#define SWAP_INT32(a,b) swap_int32((int32_t *)(a),(b))
+#define SWAP_INT16(a,b) swap_int16((int16_t *)(a),(b))
+#else
+#define SWAP_INT32(a,b)
+#define SWAP_INT16(a,b)
+#endif
+
+/* Bit masks for the PMT flags field in the PMT bank. */
+#define KPF_DIS 0x00000001
+#define KPF_NOI 0x00000004
+#define KPF_PRP 0x00000008
+#define KPF_AFP 0x00000010
+#define KPF_FECD 0x00000020
+#define KPF_FT_MASK1 0x00000040
+#define KPF_XT 0x04000000
+#define KPF_NO_CAL 0x08000000
+#define KPF_BAD_CAL 0x10000000
+
+typedef struct EVBank {
+ /* Run number. */
+ uint32_t run;
+ /* Event number. */
+ uint32_t evn;
+ /* Data type. */
+ uint32_t dtp;
+ /* Julian date. */
+ uint32_t jdy;
+ /* Universal time (seconds). */
+ uint32_t ut1;
+ /* Universal time (nanoseconds). */
+ uint32_t ut2;
+ /* Date (format: yyyymmdd) */
+ uint32_t dte;
+ /* Time (format: hhmmsscc - cc is centisec). */
+ uint32_t hmsc;
+ /* Global trigger time in nsec (first word). */
+ uint32_t gtr1;
+ /* Second word. */
+ uint32_t gtr2;
+ /* Number of PMTs that fired. */
+ uint32_t npm;
+ /* Integrated charge in the event. */
+ uint32_t nph;
+ /* Sub-run number, or -1 if unknown. Only defined for run number >= 10614. */
+ uint32_t sub_run;
+ /* Packed word. */
+ uint32_t mc_pck;
+ /* ZDAB input/output record type, e.g. PMT, NCD, CMA, RUN, etc. */
+ uint32_t rec;
+ /* ZDAB_PMT format number (x10). */
+ uint32_t vpck;
+ /* Global trigger ID. */
+ uint32_t gtr_id;
+ /* Trigger word. */
+ uint32_t trg_type;
+ /* Digitized peak of analog sum. */
+ uint32_t peak;
+ /* Analog sum derivative. */
+ uint32_t diff;
+ /* Digitized integral of analog sum. */
+ uint32_t integral;
+ /* Trigger error bits plus spares. */
+ uint32_t err;
+ /* Data splitter blindness word. */
+ uint32_t data_set;
+ uint32_t spare1[3];
+ uint32_t ncd_status;
+ /* Number of multiplexer global records. */
+ uint32_t num_muxg;
+ /* Number of multiplexer records. */
+ uint32_t num_mux;
+ /* Number of scope records. */
+ uint32_t num_scope;
+ uint32_t spare2[5];
+ /* Upper 24 bits of flock */
+ uint32_t ncd_clk_up;
+ /* Lower clock register (32 bits). */
+ uint32_t ncd_clk_lw;
+ /* Latch register id. */
+ uint32_t ncd_reg;
+ /* GTID. */
+ uint32_t ncd_gtid;
+ /* Sync clear error. */
+ uint32_t ncd_sync;
+ uint32_t spare3[10];
+} EVBank;
+
+/* PMT Bank struct. This is a struct which mimics the PMT data bank in SNOMAN.
+ * The fields and comments were taken from the SNOMAN companion. */
+typedef struct PMTBank {
+ /* Tube number. For FECD, which has no associated tube number, this word is
+ * a copy of PIN. */
+ uint32_t pn;
+ /* Set of 1-bit flags. All undefined bits are set to zero. The following
+ * bits are defined:
+ *
+ * 0 KPF_DIS Discard hit for all processing including fitting.
+ * 2 KPF_NOI Noise.
+ * 3 KPF_PRP Pre-pulse.
+ * 4 KPF_AFP After-pulse.
+ * 5 KPF_FECD Front-End Card Data i.e. non-PMT channel.
+ * Should only be set on the FECD bank.
+ * 6 KPF_FT_MASK+i Discarded by fitter method i (i = 1,2,..).
+ * For description of fitter methods see the FTx bank.
+ * 26 KPF_XT Crosstalk.
+ * 27 KPF_NO_CAL No calibration.
+ * 28 KPF_BAD_CAL Bad calibration. */
+ uint32_t pf;
+ /* Time in nano-secs relative to event T0 - see EV. */
+ float pt;
+ /* Integrated charge. */
+ float phl;
+ /* Short-time integrated charge. */
+ float phs;
+ /* Low-gain integrated charge. */
+ float plx;
+ /* Time with the PMT jitter removed. */
+ float pt0;
+ /* Set of n-bit flags for the ith hit in list. All undefined bits are set
+ * to zero. The following bits are defined:
+ *
+ * Bit Field DAQ Meaning
+ * 0-3 NCELL (CMOS Cell address 0 to 15)
+ * 4-5 FLAG1 Bit 4 = CGT ES16.
+ * Bit 5 = CGT ES24.
+ * 6-9 FLAG2 Bit 6 = Missed Count
+ * Bit 7 = NC/CC Flag
+ * Bit 8 = LGISELECT (1=long sample)
+ * Bit 9 = CMOS ES16. */
+ uint32_t pif;
+ /* Uncalibrated times. */
+ float pit;
+ /* Uncalibrated high-gain, long int. charge. */
+ float pihl;
+ /* Uncalibrated high-gain, short int. charge. */
+ float pihs;
+ /* Uncalibrated log-gain, long int. charge. */
+ float pilx;
+ /* Uncalibrated unjittered time. */
+ float pit0;
+ /* PMT channel cell number. */
+ uint32_t cell;
+ /* CCC DAQ Circuit Number
+ * = 1024*card + 32*crate + channel.
+ * Before uncalibration it holds the tube no. */
+ uint32_t pin;
+ /* TSLH of PMT. */
+ uint32_t tslh;
+ /* HCA information. */
+ uint32_t hca;
+ /* ECA validation status word. */
+ uint32_t eca_val;
+ /* PCA validation status word. */
+ uint32_t pca_val;
+ /* ANXX validation status word. */
+ uint32_t anxx;
+ /* ECA calibrated time (nsec). */
+ uint32_t ept;
+ /* ECA calibrated QHL (pedestal subtracted). */
+ uint32_t ehl;
+ /* ECA calibrated QHS (pedestal subtracted). */
+ uint32_t ehs;
+ /* ECA calibrated QLX (pedestal subtracted). */
+ uint32_t elx;
+ /* Non-walk corrected PMT time. */
+ uint32_t pt1;
+ /* Multiphoton PCA time. */
+ uint32_t ptm;
+ /* Multiphoton PCA PMT transit time RMS. */
+ uint32_t ptms;
+ /* Best charge (either QHS or QLX). */
+ uint32_t qm;
+ /* Best charge status word. */
+ uint32_t qms;
+ /* Charge correction for rate-dependent shifting. */
+ uint32_t qrc;
+} PMTBank;
+
+void unpack_ev(uint32_t *data, EVBank *b);
+void unpack_pmt(uint32_t *data, PMTBank *b);
+
+int isOrphan(aPmtEventRecord *pmtRecord);
+void swap_int32(int32_t *val_pt, int count);
+void swap_int16(int16_t *val_pt, int count);
+int swap_PmtRecord(aPmtEventRecord *aPmtRecord, size_t size);
+void swap_TrigRecord(struct TriggerInfo *aTrigRecord);
+void swap_RunRecord(struct RunRecord *aRunRecord);
+
+#endif