aboutsummaryrefslogtreecommitdiff
path: root/src/Record_Info.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Record_Info.h')
-rw-r--r--src/Record_Info.h1041
1 files changed, 1041 insertions, 0 deletions
diff --git a/src/Record_Info.h b/src/Record_Info.h
new file mode 100644
index 0000000..91e060f
--- /dev/null
+++ b/src/Record_Info.h
@@ -0,0 +1,1041 @@
+//
+// File: Record_Info.h
+//
+// Description: SNO datastream record definitions
+//
+// Revisions: 02/21/03 - PH Combined varioius versions of this file so now the exact
+// same file is used by the builder, SHaRC, xsnoed and QSNO.
+// 03/03/03 - PH Changed PmtEventRecord definition so it is now
+// swapped like a set of 32-bit integers.
+// 07/13/04 - PH Added new NCD run mask bits
+//
+// Notes: For historical reasons, the structures used by SHaRC can be different
+// from the ones written to the data stream, so be careful which one you
+// are using!
+//
+#ifndef __RECORD_INFO_H__
+#define __RECORD_INFO_H__
+
+#include <stdint.h>
+
+/* version numbers...
+ * as of Feb 1997 (from UW)
+ */
+#define DAQ_CODE_VERSION 0
+#define RUN_RECORD_VERSION 0
+#define PMT_RECORD_VERSION 0
+#define TRIG_RECORD_VERSION 0
+#define PTK_RECORD_VERSIONS 0x50544B30 // 'PTK0'
+#define DAQ_RECORD_VERSIONS 0x44415130 // 'DAQ0'
+
+#define WORD_SIZE(x) (sizeof(x)/sizeof(uint32_t))
+
+// -------------------------------------------------------------------------------------
+// generic information for every header
+// - preceeds ALL dispatcher records, and all records sent by SHaRC
+// - not written to ZDAB files
+//
+typedef struct GenericRecordHeader {
+ uint32_t RecordID;
+ uint32_t RecordLength; // length of record to follow,
+ // NOT INCLUDING generic record header!
+ uint32_t RecordVersion;
+} aGenericRecordHeader;
+
+#define HEADERSIZE sizeof( aGenericRecordHeader ) // 12 uint8_ts generic header.
+
+// -------------------------------------------------------------------------------------
+// SHaRC header for all manipulator records
+//
+
+// local time structure
+typedef struct {
+ uint8_t year; // last 2 digits of year
+ uint8_t month; // month of year (1->12)
+ uint8_t day; // day of month (1->31)
+ uint8_t daylightSavings; // 0 = standard time, 1 = daylight savings time
+ char timeZone; // hours from GMT (-11->11) (signed uint8_t!)
+ uint8_t hour; // hour of day (0->23)
+ uint8_t minute; // minute of hour (0->59)
+ uint8_t second; // second of minute (0->59)
+ uint32_t microsecond; // millionths of a second (0->999999)
+} SDateTime;
+
+// header for all manipulator banks
+typedef struct {
+ uint32_t instanceNumber;
+ uint32_t gtid_ref; // reference GTID for this event
+ SDateTime time;
+} SManipHeader;
+
+// -------------------------------------------------------------------------------------
+// MAST record
+//
+#define MAST_RECORD 0x4d415354 // 'MAST'
+
+// MAST bank structure
+typedef struct MastRecord {
+ float currentVersion; // current SNOMAN version
+ float originalVersion; // original SNOMAN version
+} SBankMAST;
+
+// -------------------------------------------------------------------------------------
+// RHDR record
+//
+#define RHDR_RECORD 0x52484452 // 'RHDR' (as written to ZDAB file)
+#define RUN_RECORD 0x52554E20 // 'RUN ' (as dispatched and sent by SHaRC)
+
+// RHDR bank structure
+typedef struct RunRecord {
+ uint32_t Date;
+ uint32_t Time;
+ uint32_t DAQCodeVersion;
+ uint32_t RunNumber;
+ uint32_t CalibrationTrialNumber;
+ uint32_t SourceMask; // which sources in?
+ uint32_t RunMask; // run conditions
+#ifdef __MWERKS__
+ uint32_t GTCrateMask; // this run's GT crate mask
+#else
+ uint32_t GTCrateMsk; // accomodate misspelling of this for backward compatibility
+#endif
+ uint32_t FirstGTID; // first GTID of this run
+ uint32_t ValidGTID; // first valid GTID (after hardware changes have been made)
+ uint32_t Spares[8]; // spares as per nick's suggestion (Thanks Nick!)
+} SBankRHDR, aRunRecord;
+
+// SourceMask...
+#define NO_SRC 0x00000UL
+#define ROTATING_SRC 0x00001UL
+#define LASER_SRC 0x00002UL
+#define SONO_SRC 0x00004UL
+#define N16_SRC 0x00008UL
+#define N17_SRC 0x00010UL
+#define NAI_SRC 0x00020UL
+#define LI8_SRC 0x00040UL
+#define PT_SRC 0x00080UL
+#define CF_HI_SRC 0x00100UL
+#define CF_LO_SRC 0x00200UL
+#define U_SRC 0x00400UL
+#define TH_SRC 0x00800UL
+#define P_LI7_SRC 0x01000UL
+#define WATER_SAMPLER 0x02000UL
+#define PROP_COUNTER_SRC 0x04000UL
+#define SINGLE_NCD_SRC 0x08000UL
+#define SELF_CALIB_SRC 0x10000UL
+#define Y88_SRC 0x20000UL
+
+// RunMask...
+#define NEUTRINO_RUN 0x0001UL
+#define SOURCE_RUN 0x0002UL
+#define CALIB_RUN 0x0004UL
+#define NCD_RUN 0x0008UL
+#define SALT_RUN 0x0010UL
+#define POISON_RUN 0x0020UL
+#define PARTIAL_FILL_RUN 0x0040UL
+#define AIR_FILL_RUN 0x0080UL
+#define D2O_RUN 0x0100UL
+#define H2O_RUN 0x0200UL
+#define DCR_ACTIVITY_RUN 0x0400UL
+#define TRANSITION_RUN 0x0800UL
+#define SOURCE_MOVING_RUN 0x1000UL
+#define COMP_COILS_RUN 0x2000UL
+#define ECA_RUN 0x4000UL
+#define DIAGNOSTIC_RUN 0x8000UL
+#define SUPERNOVA_RUN 0x10000UL
+#define MAINTENANCE_RUN 0x20000UL
+#define PCA_RUN 0x40000UL
+#define EXPERIMENTAL_RUN 0x80000UL
+#define D2O_CIRC_RUN 0x100000UL
+#define BUBBLERS_RUN 0x200000UL
+#define PMT_OFF_RUN 0x01000000UL
+#define NCD_OFF_RUN 0x02000000UL
+#define NCD_ECA_RUN 0x04000000UL
+
+// -------------------------------------------------------------------------------------
+// TRIG record
+//
+#define TRIG_RECORD 0x54524947 // 'TRIG'
+
+// TRIG bank structure
+typedef struct TriggerInfo {
+ uint32_t TriggerMask; // which triggers were set?
+ uint32_t n100lo; // trigger Threshold settings
+ uint32_t n100med; // these are longs cuz Josh is a weenie.
+ uint32_t n100hi;
+ uint32_t n20;
+ uint32_t n20lb;
+ uint32_t esumlo;
+ uint32_t esumhi;
+ uint32_t owln;
+ uint32_t owlelo;
+ uint32_t owlehi;
+ uint32_t n100lo_zero; // trigger Threshold zeroes
+ uint32_t n100med_zero;
+ uint32_t n100hi_zero;
+ uint32_t n20_zero;
+ uint32_t n20lb_zero;
+ uint32_t esumlo_zero;
+ uint32_t esumhi_zero;
+ uint32_t owln_zero;
+ uint32_t owlelo_zero;
+ uint32_t owlehi_zero;
+ uint32_t PulserRate; // MTC local pulser
+ uint32_t ControlRegister; // MTC control register status
+ uint32_t reg_LockoutWidth; // min. time btwn global triggers
+ uint32_t reg_Prescale; // how many nhit_100_lo triggers to take
+ uint32_t GTID; // to keep track of where I am in the world
+} SBankTRIG, aTriggerInfo, *aTriggerInfoPtr;
+
+// TriggerMask...
+#define TRIG_NHIT_100_LO 0x00000001
+#define TRIG_NHIT_100_MED 0x00000002
+#define TRIG_NHIT_100_HI 0x00000004
+#define TRIG_NHIT_20 0x00000008
+#define TRIG_NHIT_20_LB 0x00000010
+#define TRIG_ESUM_LO 0x00000020
+#define TRIG_ESUM_HI 0x00000040
+#define TRIG_OWLN 0x00000080
+#define TRIG_OWLE_LO 0x00000100
+#define TRIG_OWLE_HI 0x00000200
+#define TRIG_PULSE_GT 0x00000400
+#define TRIG_PRESCALE 0x00000800
+#define TRIG_PEDESTAL 0x00001000
+#define TRIG_PONG 0x00002000
+#define TRIG_SYNC 0x00004000
+#define TRIG_EXT_ASYNC 0x00008000
+#define TRIG_HYDROPHONE 0x00010000
+#define TRIG_EXT3 0x00020000
+#define TRIG_EXT4 0x00040000
+#define TRIG_EXT5 0x00080000
+#define TRIG_EXT6 0x00100000
+#define TRIG_NCD_SHAPER 0x00200000
+#define TRIG_EXT8 0x00400000
+#define TRIG_SPECIAL_RAW 0x00800000
+#define TRIG_NCD_MUX 0x01000000
+#define TRIG_SOFT_GT 0x02000000
+
+// -------------------------------------------------------------------------------------
+// EPED record
+//
+#define EPED_RECORD 0x45504544 // 'EPED'
+
+// EPED bank structure (as seen by SNOMAN)
+typedef struct EpedRecord {
+ uint32_t ped_width;
+ uint32_t ped_delay_coarse;
+ uint32_t ped_delay_fine;
+ uint32_t qinj_dacsetting;
+ uint32_t halfCrateID;
+ uint32_t CalibrationType;
+ uint32_t GTID;
+ uint32_t Flag;
+} SBankEPED;
+
+// EPED record as sent by SHaRC
+// (be very careful here! for backward compatibility this is also
+// defined as EPEDRecord as used by SHaRC. Not to be confused with EpedRecord.)
+typedef struct EPEDRecord {
+ uint32_t Time; // ptk used instead of aDate_Time
+ uint16_t CalibrationType;
+ uint8_t halfCrateID; // which 1/2 crate is enabled for pedestals
+ uint8_t reg_PedestalWidth; // width of pedestal pulse for Qinj
+ uint8_t reg_Ped_GTDel_Coarse;
+ uint8_t reg_Ped_GTDel_Fine; // pedestal delay for T slopes
+ int16_t Qinj_dacsetting; // DAC setting for Qinj
+ uint32_t MTCD_csr;
+ uint32_t GTID; // GT Id validity range
+ uint32_t Flag; // start/stop flag
+ uint32_t RunNumber; // current run number
+ uint32_t Spares[5];
+} SHaRC_BankEPED;
+
+// CalibrationType...
+#define EPED_Q_SLOPE_RUN 1
+#define EPED_T_SLOPE_RUN 2
+#define EPED_PED_RUN 3
+#define EPED_SLOWPED_RUN 4
+
+// Bit mask in halfCrateID...
+#define EPED_FIRST_HALF (uint8_t) 0
+#define EPED_SECOND_HALF (uint8_t) 0x80U
+
+// Flag...
+#define EPED_START_CAL 1ul // start of cali run
+#define EPED_CHANGE_CAL 2ul // change of same
+#define EPED_STOP_CAL 3ul // stop of same, crate
+#define EPED_END_CAL 4ul // end of run, all crates
+
+// -------------------------------------------------------------------------------------
+// VTHR record
+//
+#define VTHR_RECORD 0x56544852 // 'VTHR'
+
+// VTHR bank structure
+typedef struct VThresholdRecord {
+ uint32_t GTID; // GTID
+ uint32_t ncrates; // number of crates = 19 for SNODAQ
+ uint32_t null2; // these are longs cuz Josh is a weenie.
+ uint32_t null3;
+ uint32_t null4;
+ uint32_t null5;
+ uint32_t null6;
+ uint32_t null7;
+ uint32_t null8;
+ uint32_t null9;
+ unsigned char theData[19*16*32];
+} SBankVTHR;
+
+// -------------------------------------------------------------------------------------
+// CAST record
+//
+#define CAST_RECORD 0x43415354 // 'CAST'
+#define CLST_RECORD 0x434C5354 // 'CLST' - obsolete
+
+#define kMaxManipulatorRopes 6
+
+// manipulator rope structure
+typedef struct ManipRopeStatus {
+ uint32_t ropeID; // EManipulatorRopeID
+ float length;
+ float targetLength;
+ float velocity;
+ float tension;
+ float encoderError;
+ float spares[2];
+} aManipRopeStatus;
+
+// CAST bank structure
+typedef struct ManipStatus {
+ uint32_t sourceID;
+ uint32_t status;
+ uint32_t numRopes;
+ float position[3]; // x, y, z position
+ float destination[3];
+ float positionError;
+ float sourceOffset[3];// PH 2018-06-20 (was obsoletePosErr)
+ float orientation; // source orientation (0=unknown, 1=north...)
+ float spare;
+ uint32_t tail;
+ aManipRopeStatus ropeStatus[kMaxManipulatorRopes];
+ float spare2[23];
+} SBankCAST;
+
+// SHaRC CAST bank structure
+typedef struct {
+ uint32_t sourceID;
+ uint32_t status;
+ uint32_t numRopes;
+ float position[3]; // x, y, z position
+ float destination[3];
+ float positionError;
+ float obsoletePosErr[3];
+ float orientation; // source orientation (0=unknown, 1=north...)
+ float spare;
+ uint32_t tail;
+ aManipRopeStatus ropeStatus[4];
+} SHaRC_BankCAST;
+
+// status...
+enum EManipulatorStatus {
+ kStoppedNone = 1,
+ kStoppedLowTension,
+ kStoppedHighTension,
+ kStoppedEndpoint,
+ kStoppedStuck,
+ kStoppedNetForce,
+ kStoppedAxisError,
+ kMovingDirect,
+ kMovingIdle,
+ kMovingAbort
+};
+
+// ropeID...
+enum EManipulatorRopeID {
+ NorthRope = 1,
+ SouthRope,
+ EastRope,
+ WestRope,
+ CentralRope1,
+ CentralRope2,
+ CentralRope3,
+ GuideTubeRope1,
+ GuideTubeRope2,
+ GuideTubeRope3,
+ GuideTubeRope4,
+ GuideTubeRope5,
+ GuideTubeRope6,
+ GasUmbilical,
+ LaserUmbilical,
+ RotatingUmbilical
+};
+
+// -------------------------------------------------------------------------------------
+// CAAC record
+//
+#define CAAC_RECORD 0x43414143 // 'CAAC'
+#define CLAC_RECORD 0x434C4143 // 'CLAC' - obsolete
+
+// CAAC bank structure
+typedef struct AVStatus {
+ float position[3]; // x, y, z
+ float rotation[3]; // roll, pitch, yaw
+ float ropeLength[7]; // seven sense rope lengths
+ float spare[3];
+} SBankCAAC;
+
+// -------------------------------------------------------------------------------------
+// SOSA record
+//
+#define SOSA_RECORD 0x534F5341 // 'SOSA'
+
+// SOSA bank structure
+typedef struct AcceleratorStatus {
+ uint32_t sourceID;
+ uint32_t acceleratorOn;
+ float targetVoltage;
+ float targetCurrent;
+ float anodeVoltage;
+ float anodeCurrent;
+ float getterVoltage;
+ float getterCurrent;
+ float direction[3];
+ float spare;
+} SBankSOSA;
+
+// -------------------------------------------------------------------------------------
+// SOSG record
+//
+#define SOSG_RECORD 0x534F5347 // 'SOSG'
+
+// SOSG bank structure
+typedef struct GasStatus {
+ uint32_t sourceID;
+ uint32_t dtGeneratorOn;
+ float targetVerticalPosition;
+ float pressure1;
+ float pressure2;
+ float pressure3;
+ float pressure4;
+ float pressure5;
+ float pressure6;
+ float vacuum1;
+ float vacuum2;
+ float carbonDioxideFlowRate;
+ float heliumFlowRate;
+ float oxygenFlowRate;
+ float fastNeutronFlux;
+ float neutronRadiationMonitor;
+ float pmtVoltage;
+ float wireVoltage;
+ float direction[3];
+ float spare[2];
+} SBankSOSG;
+
+// -------------------------------------------------------------------------------------
+// SOSL record
+//
+#define SOSL_RECORD 0x534F534C // 'SOSL'
+
+// SOSL bank structure
+typedef struct LaserStatus {
+ uint32_t sourceID;
+ uint32_t status;
+ uint32_t dyeCellNumber;
+ uint32_t filterWheel1Position;
+ uint32_t filterWheel2Position;
+ uint32_t pmtVoltage;
+ float pressure1;
+ float pressure2;
+ float nitrogenFlowRate;
+ float direction[3];
+ float spare;
+} SBankSOSL;
+
+// -------------------------------------------------------------------------------------
+// SOSR record
+//
+#define SOSR_RECORD 0x534F5352 // 'SOSR'
+
+// SOSR bank structure
+typedef struct RotatingStatus {
+ uint32_t sourceID;
+ float direction[3];
+} SBankSOSR;
+
+
+// -------------------------------------------------------------------------------------
+// TASK record
+//
+#define TASK_RECORD 0x5441534B // 'TASK'
+
+// task record -- Task running record
+typedef struct TASKRecord {
+ uint32_t Time; // ptk used instead of aDate_Time
+ uint32_t TasksRunning; //true if any task is running, false if none running.
+ uint32_t GTID;
+ uint32_t RunNumber;
+ uint32_t Spares[5];
+} SBankTASK;
+
+// -------------------------------------------------------------------------------------
+// ZDAB record (event record)
+//
+#define ZDAB_RECORD 0x5a444142 // 'ZDAB' (as written to ZDAB file)
+#define PMT_RECORD 0x504d5420 // 'PMT ' (as dispatched and sent by SHaRC)
+
+/*
+ * pmt record -- variable-length record containing npmt*3 LW of FEC data.
+ * note: Generic Header length indicates only length of the pmt header, and
+ * DOES NOT include the hits!
+ *
+ * Also includes the following info, from ref_packer_zdab_pmt.f
+ *
+ * -> BEWARE: HERE, MSB is 32 ! ! ! ! <-
+ * Also, word number below is SNOMAN WORD NUMBER ONLY!
+ *
+ * o Event Header Record (one per event trigger):
+ * Number
+ * Name WORD LSB Pos. of Bits Description
+ * RECORD_TYPE 1 26 7 Record type (e.g. PMT, NCD, etc).
+ * MC_FLAG 1 25 1 0=Real event, 1= MC event.
+ * VER_NUM 1 17 8 ZDAB_PMT format number number.
+ * DATA_TYPE 1 1 16 Run Type (see id_run_types.doc).
+ * RUN_NUMBER 2 1 32 Run number.
+ * EV_NUMBER 3 1 32 Event number in this Run.
+ * DAQ_STATUS 4 17 16 DAQ status flags.
+ * NHITS 4 1 16 Number of fired PMT's.
+ * PCK_TYPE 5 29 4 MC packing type:
+ * 0= PMT info only
+ * 1= 0 plus source bank info
+ * 2= 1 plus jitter/cerenkov history
+ * CAL_TYPE 5 25 4 MC Calibration type:
+ * 0= simple calibration constants
+ * 1= full calibration constants
+ *
+ * ---- extended PmtEventRecord format (PH 02/25/99) ----
+ *
+ * SUB_FIELD 5 24 1 0= No sub fields
+ * 1= Sub field to follow
+ * FIELD_LEN 5 1 23 Offset in 4-uint8_t words to first sub field
+ * (May be zero if no sub fields)
+ *
+ */
+
+// put flags here, shifted to correct position. See above.
+#define PMT_EVR_RECTYPE ( 0xA << 9 ) // see SNOMAN Docs for these
+#define PMT_EVR_NOT_MC ( 0x0UL << 8 )
+#define PMT_EVR_ZDAB_VER ( 23UL << 0 )
+#define PMT_EVR_DATA_TYPE 0xB
+#define PMT_EVR_DAQ_STAT 0xA
+#define PMT_EVR_PCK_TYPE ( 0x00UL << 28 )
+#define PMT_MC_PCK_TYPE ( 0x01UL << 28 )
+#define PMT_JITTER_PCK_TYPE ( 0x02UL << 28 )
+#define PMT_EVR_CAL_TYPE ( 0x01UL << 24 )
+
+#define PCK_TYPE_MASK ( 0x0fUL << 28 )
+#define CAL_TYPE_MASK ( 0x0fUL << 24 )
+
+#ifdef SWAP_BYTES
+
+// FEC data as read out in 96-bit structure
+typedef struct FECReadoutData {
+ // word 1 (starts from LSB):
+ unsigned GTID1 :16; // lower 16 bits
+ unsigned ChannelID :5;
+ unsigned CrateID :5;
+ unsigned BoardID :4;
+ unsigned CGT_ES16 :1;
+ unsigned CGT_ES24 :1;
+
+ // word 2:
+ unsigned Qlx :11;
+ unsigned SignQlx :1;
+ unsigned CellID :4;
+ unsigned Qhs :11;
+ unsigned SignQhs :1;
+ unsigned MissedCount :1;
+ unsigned NC_CC :1;
+ unsigned LGI_Select :1;
+ unsigned Cmos_ES16 :1;
+
+ // word 3 :
+ unsigned Qhl :11;
+ unsigned SignQhl :1;
+ unsigned GTID2 :4; // bits 17-20
+ unsigned TAC :11;
+ unsigned SignTAC :1;
+ unsigned GTID3 :4; // bits 21-24
+
+} aFECReadoutData, *aFECReadoutDataPtr;
+
+// Master Trigger Card data
+typedef struct MTCReadoutData {
+ // word 0
+ uint32_t Bc10_1 :32;
+ // word 1
+ uint32_t Bc10_2 :21;
+ uint32_t Bc50_1 :11;
+ // word 2
+ uint32_t Bc50_2 :32;
+ // word 3
+ uint32_t BcGT :24; // LSB
+ unsigned Nhit_100_Lo :1;
+ unsigned Nhit_100_Med :1;
+ unsigned Nhit_100_Hi :1;
+ unsigned Nhit_20 :1;
+ unsigned Nhit_20_LB :1;
+ unsigned ESum_Lo :1;
+ unsigned ESum_Hi :1;
+ unsigned Owln :1; // MSB
+
+ // word 4
+ unsigned Owle_Lo :1;
+ unsigned Owle_Hi :1;
+ unsigned Pulse_GT :1;
+ unsigned Prescale :1;
+ unsigned Pedestal :1;
+ unsigned Pong :1;
+ unsigned Sync :1;
+ unsigned Ext_Async :1;
+ unsigned Hydrophone :1;
+ unsigned Ext_3 :1;
+ unsigned Ext_4 :1;
+ unsigned Ext_5 :1;
+ unsigned Ext_6 :1;
+ unsigned NCD_Shaper :1;
+ unsigned Ext_8 :1;
+ unsigned Special_Raw :1;
+ unsigned NCD_Mux :1;
+ unsigned Soft_GT :1;
+ unsigned Miss_Trig :1;
+ unsigned Peak :10;
+ unsigned Diff_1 :3;
+
+ // word 5
+ unsigned Diff_2 :7;
+ unsigned Int :10;
+ unsigned TestGT :1;
+ unsigned Test50 :1;
+ unsigned Test10 :1;
+ unsigned TestMem1 :1;
+ unsigned TestMem2 :1;
+ unsigned SynClr16 :1;
+ unsigned SynClr16_wo_TC16 :1;
+ unsigned SynClr24 :1;
+ unsigned SynClr24_wo_TC24 :1;
+ unsigned FIFOsNotAllEmpty :1;
+ unsigned FIFOsNotAllFull :1;
+ unsigned FIFOsAllFull :1;
+ unsigned Unused1 :1;
+ unsigned Unused2 :1;
+ unsigned Unused3 :1;
+
+} aMTCReadoutData, *aMTCReadoutDataPtr;
+
+#else // SWAP_BYTES
+
+// FEC data as read out in 96-bit structure
+typedef struct FECReadoutData {
+ // word 1 (starts from MSB):
+ unsigned CGT_ES24 :1;
+ unsigned CGT_ES16 :1;
+ unsigned BoardID :4;
+ unsigned CrateID :5;
+ unsigned ChannelID :5;
+ unsigned GTID1 :16; // lower 16 bits
+ // word 2:
+ unsigned Cmos_ES16 :1;
+ unsigned LGI_Select :1;
+ unsigned NC_CC :1;
+ unsigned MissedCount :1;
+ unsigned SignQhs :1;
+ unsigned Qhs :11;
+ unsigned CellID :4;
+ unsigned SignQlx :1;
+ unsigned Qlx :11;
+ // word 3 :
+ unsigned GTID3 :4; // bits 21-24
+ unsigned SignTAC :1;
+ unsigned TAC :11;
+ unsigned GTID2 :4; // bits 17-20
+ unsigned SignQhl :1;
+ unsigned Qhl :11;
+} aFECReadoutData, *aFECReadoutDataPtr;
+
+// Master Trigger Card data
+typedef struct MTCReadoutData {
+ // word 0
+ uint32_t Bc10_1 :32;
+ // word 1
+ uint32_t Bc50_1 :11;
+ uint32_t Bc10_2 :21;
+ // word 2
+ uint32_t Bc50_2 :32;
+ // word 3
+ unsigned Owln :1; // MSB
+ unsigned ESum_Hi :1;
+ unsigned ESum_Lo :1;
+ unsigned Nhit_20_LB :1;
+ unsigned Nhit_20 :1;
+ unsigned Nhit_100_Hi :1;
+ unsigned Nhit_100_Med :1;
+ unsigned Nhit_100_Lo :1;
+ uint32_t BcGT :24; // LSB
+ // word 4
+ unsigned Diff_1 :3;
+ unsigned Peak :10;
+ unsigned Miss_Trig :1;
+ unsigned Soft_GT :1;
+ unsigned NCD_Mux :1;
+ unsigned Special_Raw :1;
+ unsigned Ext_8 :1;
+ unsigned NCD_Shaper :1;
+ unsigned Ext_6 :1;
+ unsigned Ext_5 :1;
+ unsigned Ext_4 :1;
+ unsigned Ext_3 :1;
+ unsigned Hydrophone :1;
+ unsigned Ext_Async :1;
+ unsigned Sync :1;
+ unsigned Pong :1;
+ unsigned Pedestal :1;
+ unsigned Prescale :1;
+ unsigned Pulse_GT :1;
+ unsigned Owle_Hi :1;
+ unsigned Owle_Lo :1;
+ // word 5
+ unsigned Unused3 :1;
+ unsigned Unused2 :1;
+ unsigned Unused1 :1;
+ unsigned FIFOsAllFull :1;
+ unsigned FIFOsNotAllFull :1;
+ unsigned FIFOsNotAllEmpty :1;
+ unsigned SynClr24_wo_TC24 :1;
+ unsigned SynClr24 :1;
+ unsigned SynClr16_wo_TC16 :1;
+ unsigned SynClr16 :1;
+ unsigned TestMem2 :1;
+ unsigned TestMem1 :1;
+ unsigned Test10 :1;
+ unsigned Test50 :1;
+ unsigned TestGT :1;
+ unsigned Int :10;
+ unsigned Diff_2 :7;
+} aMTCReadoutData, *aMTCReadoutDataPtr;
+
+#endif // SWAP_BYTES
+
+// ZDAB bank structure
+typedef struct PmtEventRecord {
+#ifdef SWAP_BYTES
+ uint16_t DataType;
+ uint16_t PmtEventRecordInfo;
+#else
+ uint16_t PmtEventRecordInfo;
+ uint16_t DataType;
+#endif
+ uint32_t RunNumber;
+ uint32_t EvNumber;
+#ifdef SWAP_BYTES
+ uint16_t NPmtHit;
+ uint16_t DaqStatus; // Now used to store sub-run number - PH
+#else
+ uint16_t DaqStatus; // Now used to store sub-run number - PH
+ uint16_t NPmtHit;
+#endif
+ uint32_t CalPckType; // lower 24 bits are now used for extended PmtEventRecord flags
+ aMTCReadoutData TriggerCardData; // 6 LW of MTC data
+ // FECReadoutData follows directly.
+} SBankZDAB, aPmtEventRecord;
+
+// MCHeader - monte carlo event data if CAL_TYPE = 1 or 2 (one per event)
+typedef struct MCHeader {
+ uint16_t mcVersion; // SNOMAN MC version number
+ uint16_t nVertices; // number of source vertices
+ uint32_t mcEvNumber; // MC event number
+ uint32_t julianDate; // Julian Date (01/01/75 = 1)
+ uint32_t sec; // universal time seconds
+ uint32_t nsec; // universal time nanoseconds
+ uint16_t Seed1; // first random number seed
+ uint16_t Seed2; // second random number seed
+ uint32_t randNum; // random number used
+} aMCHeader;
+
+// MCData - monte carlo data (one per source vertex + hanging tracks)
+typedef struct MCData {
+ uint32_t intType; // interaction type
+ uint16_t xPos; // vertex X position (32768 = 1000.0 cm)
+ uint16_t yPos; // vertex Y position
+ uint16_t zPos; // vertex X position
+ uint8_t nTracks; // number of tracks for this vertex
+ uint8_t vClass; // vertex class, (Pre)Source=(1)0
+ uint32_t time0; // first word of double prec time
+ uint32_t time1; // second word of double prec time
+ uint16_t pType; // particle type
+ uint16_t pEnergy0; // first word of 32-bit energy (note: NOT on 32-bit boundary!)
+ uint16_t pEnergy1; // second word of 32-bit energy
+ uint16_t xDir; // track direction x-cosine (32768 = 1.0)
+ uint16_t yDir; // track direction x-cosine
+ uint16_t zDir; // track direction x-cosine
+} aMCData;
+
+// MCJitter - jitter/cherenkov history if CAL_TYPE = 2 (one per PMT)
+typedef struct MCJitter {
+ uint32_t jitterData;
+} aMCJitter;
+
+/* ................... extended PmtEventRecord format (PH 02/25/99) ................... */
+
+#define SUB_NOT_LAST ( 0x00800000UL ) // bit set indicates another sub-field follows
+#define SUB_LENGTH_MASK ( 0x007fffffUL ) // mask for offset to next sub-field
+#define SUB_TYPE_BITNUM 24 // bit position of sub-field type
+
+/* sub-field ID numbers */
+#define SUB_TYPE_CALIBRATED 8UL // calibrated sub-field type
+#define SUB_TYPE_MONTE_CARLO 9UL // monte carlo sub-field
+#define SUB_TYPE_FIT 10UL // fitted event sub-field
+#define SUB_TYPE_HIT_DATA 11UL // extra floating-point hit data
+#define SUB_TYPE_EVENT_DATA 12UL // extra floating-point event data
+#define SUB_TYPE_PACKED_TSLH 13UL // packed time since last hit
+#define SUB_TYPE_CAL_FLAGS 14UL // calibrated data flags (one 32 bit word)
+#define SUB_TYPE_HCA_QUEENS 15UL // Queen's HCA calibration
+#define SUB_TYPE_NCD 16UL // NCD data record
+#define SUB_TYPE_CAEN 32UL // SNO+ CAEN data
+#define SUB_TYPE_TUBII 33UL // SNO+ TUBII trigger word
+
+/* sub-field header */
+typedef struct SubFieldHeader {
+ uint32_t flags; // bits 0-22 = size of this sub-field in 4-uint8_t words (including header)
+ // bit 23 = 0-no more sub-fields, 1=another sub-field follows
+ // bits 24-31 = ID number for this sub-field
+} aSubFieldHeader;
+
+/* sub-field ID number 8 - calibrated PMT data */
+/* -9999 in any of these fields means that no calibration was available. */
+/* Order and number of these correspond exactly to hits in original PmtEventRecord. */
+typedef struct CalibratedPMT {
+ float tac;
+ float qhs;
+ float qhl;
+ float qlx;
+} aCalibratedPMT;
+
+/* sub-field ID number 9 - monte carlo header */
+typedef struct MCHeader MonteCarloHeader;
+
+/* vertex structure for monte-carlo data */
+typedef struct MonteCarloVertex {
+ float x,y,z; // vertex location in cm
+ float u,v,w; // track direction cosines
+ double time; // event time
+ float energy; // energy of particle for outgoing track
+ uint32_t int_code; // vertex interaction code
+ uint16_t flags; // special vertex flags (upper 8 bits reserved for display)
+ uint16_t particle; // outgoing track particle ID
+ int32_t parent; // index of parent vertex in list (-ve if no parent)
+} aMonteCarloVertex;
+
+/* sub-field ID number 10 - fitted event data */
+typedef struct FittedEvent {
+ float x,y,z; // fitted event position in cm
+ float u,v,w; // fitted event direction cosines
+ float time; // fitted event time
+ float quality; // quality of fit
+ uint16_t npmts; // number of PMT's fit
+ uint16_t spare; // extra fit-dependent data
+ char name[32]; // fitter identification string (NULL terminated)
+} aFittedEvent;
+
+/* sub-field ID number 11 - extra floating point hit data */
+#define DATA_NAME_LEN 24
+
+typedef struct ExtraHitData {
+ char name[DATA_NAME_LEN]; // null-terminated data name (see Note 1)
+ // -- followed by NPmtHit float values in the same order as PMT hits
+} aExtraHitData;
+
+// Note 1) The extra hit/event data name may have an optional format specifier.
+// The format specifier is standard C printf style for a floating point number
+// (ie. "%.2f"), and must immediately follow the null terminator of the name.
+
+/* sub-field ID number 12 - extra floating point event data */
+typedef struct ExtraEventData {
+ char name[DATA_NAME_LEN]; // null-terminated data name (see Note 1)
+ float value; // data value
+} aExtraEventData;
+
+/* sub-field ID number 13 - packed TSLH */
+
+/* sub-field ID number 14 - calibration flags (one 32-bit word) */
+#define CAL_FLAG_QSLOPE 0x0001 // flag for charge slopes applied
+
+/* sub-field ID number 15 - Queen's HCA calibration */
+
+/* sub-field ID number 16 - NCD data record (see NcdDataTypes.h) */
+
+/* sub-field ID nubmer 32 - CAEN trigger sum data */
+#define UNPK_CAEN_MAGIC(a) ( (*(a) >> 28) & 0x0000000f )
+#define UNPK_CAEN_WORD_COUNT(a) ( *(a) & 0x0fffffff )
+#define UNPK_CAEN_CHANNEL_MASK(a) ( *((a)+1) & 0x000000ff )
+#define UNPK_CAEN_PATTERN(a) ( (*((a)+1) >> 8) & 0x0000ffff )
+#define UNPK_CAEN_PACK_FLAG(a) ( (*((a)+1) >> 24) & 0x00000001 )
+#define UNPK_CAEN_BOARD_ID(a) ( *((a)+1) >> 25 )
+#define UNPK_CAEN_SYNC16(a) ( (*((a)+1) >> 15) & 0x00000001 )
+#define UNPK_CAEN_SYNC24(a) ( (*((a)+1) >> 16) & 0x00000001 )
+#define UNPK_CAEN_EVENT_COUNT(a) ( *((a)+2) & 0x00ffffff )
+#define UNPK_CAEN_TRIGGER_TIME(a) ( *((a)+3) )
+
+/* sub-field ID number 33 - TUBii record */
+typedef struct TubiiRecord {
+ uint32_t TrigWord;
+ uint32_t GTID;
+} aTubiiRecord;
+
+/* .............................. End extended format .............................. */
+
+/*
+ * unpacking "routines" by definition! Looks awful, but is fast...
+ * "a" in the following is a pointer to 3 longwords as read out from
+ * the FEC32. from SNODAQ distribution
+ */
+#define UNPK_MISSED_COUNT(a) ( (*((a)+1) >> 28) & 0x1 )
+#define UNPK_NC_CC(a) ( (*((a)+1) >> 29) & 0x1 )
+#define UNPK_LGI_SELECT(a) ( (*((a)+1) >> 30) & 0x1 )
+#define UNPK_CMOS_ES_16(a) ( (*((a)+1) >> 31) & 0x1 )
+#define UNPK_CGT_ES_16(a) ( (*(a) >> 30) & 0x1 )
+#define UNPK_CGT_ES_24(a) ( (*(a) >> 31) & 0x1 )
+#define UNPK_QLX(a) ( ( *((a)+1) & 0x00000fff) ^ 0x00000800 )
+#define UNPK_QHS(a) ( ( (*((a)+1) >> 16) & 0x00000fff) ^ 0x00000800 )
+#define UNPK_QHL(a) ( ( *((a)+2) & 0x00000fff) ^ 0x00000800 )
+#define UNPK_TAC(a) ( ( (*((a)+2) >> 16) & 0x00000fff) ^ 0x00000800 )
+
+#define UNPK_CELL_ID(a) ( (*((a)+1) >> 12) & 0x0000000F )
+#define UNPK_CHANNEL_ID(a) ( (*(a) >> 16) & 0x0000001F )
+#define UNPK_BOARD_ID(a) ( (*(a) >> 26) & 0x0000000F )
+#define UNPK_CRATE_ID(a) ( (*(a) >> 21) & 0x0000001F )
+#define UNPK_FEC_GT24_ID(a) ( ( * (a) & 0x0000FFFF ) | \
+ ( (*((a)+2) << 4) & 0x000F0000 ) | \
+ ( (*((a)+2) >> 8) & 0x00F00000 ) )
+#define UNPK_FEC_GT16_ID(a) ( *(a) & 0x0000FFFF )
+#define UNPK_FEC_GT8_ID(a) ( ( (*((a)+2) >> 24) & 0x000000F0 ) | \
+ ( (*((a)+2) >> 12) & 0x0000000F )
+
+#define UNPK_FEC_GT_ID(a) ( ( * (a) & 0x0000FFFF ) | \
+ ( (*((a)+2) << 4) & 0x000F0000 ) | \
+ ( (*((a)+2) >> 8) & 0x00F00000 ) )
+
+// unpacking trigger words by definitions...
+// unpacking "routines" by definition! Looks awful, but is fast...
+// "a" in the following is a pointer to 6 longwords as read out from the MTC.
+#define UNPK_MTC_BC50_1(a) ( (*((a)+1) >> 21) & 0x7FF )
+#define UNPK_MTC_BC50_2(a) ( *((a)+2) )
+#define UNPK_MTC_BC10_1(a) ( *( a ) )
+#define UNPK_MTC_BC10_2(a) ( *((a)+1) & 0x1FFFFF )
+#define UNPK_MTC_GT_ID(a) ( *((a)+3) & 0x00FFFFFF )
+#define UNPK_MTC_DIFF(a) (((*((a)+4) >> 29) & 0x007) | ((*((a)+5) << 3) & 0x3F8))
+#define UNPK_MTC_INT(a) ( (*((a)+5) >> 7) & 0x3FF )
+#define UNPK_MTC_PEAK(a) ( (*((a)+4) >> 19) & 0x3FF )
+#define UNPK_NHIT_100_LO(a) ( *((a)+3) & 0x01000000 )
+#define UNPK_NHIT_100_MED(a) ( *((a)+3) & 0x02000000 )
+#define UNPK_NHIT_100_HI(a) ( *((a)+3) & 0x04000000 )
+#define UNPK_NHIT_20(a) ( *((a)+3) & 0x08000000 )
+#define UNPK_NHIT_20_LB(a) ( *((a)+3) & 0x10000000 )
+#define UNPK_ESUM_LO(a) ( *((a)+3) & 0x20000000 )
+#define UNPK_ESUM_HI(a) ( *((a)+3) & 0x40000000 )
+#define UNPK_OWLN(a) ( *((a)+3) & 0x80000000 )
+#define UNPK_OWLE_LO(a) ( *((a)+4) & 0x00000001 )
+#define UNPK_OWLE_HI(a) ( *((a)+4) & 0x00000002 )
+#define UNPK_PULSE_GT(a) ( *((a)+4) & 0x00000004 )
+#define UNPK_PRESCALE(a) ( *((a)+4) & 0x00000008 )
+#define UNPK_PONG(a) ( *((a)+4) & 0x00000010 )
+#define UNPK_SYNC(a) ( *((a)+4) & 0x00000020 )
+#define UNPK_EXT_ASYNC(a) ( *((a)+4) & 0x00000040 )
+#define UNPK_EXT_2(a) ( *((a)+4) & 0x00000080 )
+#define UNPK_EXT_3(a) ( *((a)+4) & 0x00000100 )
+#define UNPK_EXT_4(a) ( *((a)+4) & 0x00000200 )
+#define UNPK_EXT_5(a) ( *((a)+4) & 0x00000400 )
+#define UNPK_EXT_6(a) ( *((a)+4) & 0x00000800 )
+#define UNPK_EXT_7(a) ( *((a)+4) & 0x00001000 )
+#define UNPK_EXT_8(a) ( *((a)+4) & 0x00002000 )
+#define UNPK_SPECIAL_RAW(a) ( *((a)+4) & 0x00004000 )
+#define UNPK_NCD(a) ( *((a)+4) & 0x00008000 )
+#define UNPK_SOFT_GT(a) ( *((a)+4) & 0x00010000 )
+#define UNPK_MISS_TRIG(a) ( *((a)+4) & 0x00020000 )
+
+// unpack Trigger Error Mask...
+#define UNPK_TESTGT(a) ( *((a)+5) & 0x00020000 )
+#define UNPK_TEST50(a) ( *((a)+5) & 0x00040000 )
+#define UNPK_TEST10(a) ( *((a)+5) & 0x00080000 )
+#define UNPK_TESTMEM1(a) ( *((a)+5) & 0x00100000 )
+#define UNPK_TESTMEM2(a) ( *((a)+5) & 0x00200000 )
+#define UNPK_SYNCLR16(a) ( *((a)+5) & 0x00400000 )
+#define UNPK_SYNCLR16_WO_TC16(a) ( *((a)+5) & 0x00800000 )
+#define UNPK_SYNCLR24(a) ( *((a)+5) & 0x01000000 )
+#define UNPK_SYNCLR24_WO_TC24(a) ( *((a)+5) & 0x02000000 )
+#define UNPK_SOME_FIFOS_EMPTY(a) ( *((a)+5) & 0x04000000 )
+#define UNPK_SOME_FIFOS_FULL(a) ( *((a)+5) & 0x08000000 )
+#define UNPK_ALL_FIFOS_FULL(a) ( *((a)+5) & 0x10000000 )
+
+// unpack the Trigger Word (lowest 27 bits are significant)
+#define UNPK_MTC_TRIGGER(a) ( ( ( *((a)+3) >> 5 ) & 0x7F80000 ) | ( *((a)+4) & 0x7FFFF ) )
+// unpack the Trigger Error bits (lowest 14 bits signficant)
+#define UNPK_MTC_ERROR(a) ( ( *((a)+5) >> 17 ) & 0x3FFF )
+
+
+// -------------------------------------------------------------------------------------
+
+// other records, not defined in this file
+#define CRON_RECORD 0x43524F4E // 'CRON'
+#define VRLY_RECORD 0x56524C59 // 'VRLY'
+#define MSEI_RECORD 0x4D534549 // 'MSEI'
+
+#ifdef __MWERKS__
+// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+// extra code for SHaRC version only
+
+typedef struct MTCReadoutWords {
+ uint32_t Word[6];
+} aMTCReadoutWords, *aMTCReadoutWordsPtr;
+
+typedef struct FECReadoutWords {
+ uint32_t Word[3];
+} aFECReadoutWords, *aFECReadoutWordsPtr;
+
+// (be very careful here! for backward compatibility this is also
+// defined as EpedRecord as used by everyone else. Not to be confused with EPEDRecord.)
+typedef struct EPEDRecord SHaRC_BankEPED;
+
+// SHaRC uses short forms of trigger bit definitions
+#define NHIT_100_LO TRIG_NHIT_100_LO
+#define NHIT_100_MED TRIG_NHIT_100_MED
+#define NHIT_100_HI TRIG_NHIT_100_HI
+#define NHIT_20 TRIG_NHIT_20
+#define NHIT_20_LB TRIG_NHIT_20_LB
+#define ESUM_LO TRIG_ESUM_LO
+#define ESUM_HI TRIG_ESUM_HI
+#define OWLN TRIG_OWLN
+#define OWLE_LO TRIG_OWLE_LO
+#define OWLE_HI TRIG_OWLE_HI
+#define PULSE_GT TRIG_PULSE_GT
+#define PRESCALE TRIG_PRESCALE
+#define PEDESTAL TRIG_PEDESTAL
+#define PONG TRIG_PONG
+#define SYNC TRIG_SYNC
+#define EXT_ASYNC TRIG_EXT_ASYNC
+#define HYDROPHONE TRIG_HYDROPHONE
+#define EXT3 TRIG_EXT3
+#define EXT4 TRIG_EXT4
+#define EXT5 TRIG_EXT5
+#define EXT6 TRIG_EXT6
+#define EXT7 TRIG_EXT7
+#define EXT8 TRIG_EXT8
+#define SPECIAL_RAW TRIG_SPECIAL_RAW
+#define NCD TRIG_NCD_MUX
+#define SOFT_GT TRIG_SOFT_GT
+
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+#endif // __MWERKS__
+
+
+#endif // __RECORD_INFO_H__