| 1 | /******************************************************************** | 
|---|
| 2 | DRS.h, S.Ritt, M. Schneebeli - PSI | 
|---|
| 3 |  | 
|---|
| 4 | $Id: DRS.h 14428 2009-10-19 12:59:46Z ritt $ | 
|---|
| 5 |  | 
|---|
| 6 | ********************************************************************/ | 
|---|
| 7 | #ifndef DRS_H | 
|---|
| 8 | #define DRS_H | 
|---|
| 9 | #include <stdio.h> | 
|---|
| 10 | #include <string.h> | 
|---|
| 11 |  | 
|---|
| 12 | #ifdef HAVE_LIBUSB | 
|---|
| 13 | #   ifndef HAVE_USB | 
|---|
| 14 | #      define HAVE_USB | 
|---|
| 15 | #   endif | 
|---|
| 16 | #endif | 
|---|
| 17 |  | 
|---|
| 18 | #ifdef HAVE_USB | 
|---|
| 19 | #   include <musbstd.h> | 
|---|
| 20 | #endif                          // HAVE_USB | 
|---|
| 21 |  | 
|---|
| 22 | #ifdef HAVE_VME | 
|---|
| 23 | #   include <mvmestd.h> | 
|---|
| 24 | #endif                          // HAVE_VME | 
|---|
| 25 |  | 
|---|
| 26 | // Concurrent Technologies VME single board computer | 
|---|
| 27 | #ifdef CT_VME | 
|---|
| 28 | #include "rcc_error/rcc_error.h"   // Error reporting | 
|---|
| 29 | #include "vme_rcc/vme_rcc.h"       // VME access | 
|---|
| 30 | #include "cmem_rcc/cmem_rcc.h"     // Allocation of contiguous memory | 
|---|
| 31 | #endif | 
|---|
| 32 |  | 
|---|
| 33 | /* disable "deprecated" warning */ | 
|---|
| 34 | #ifdef _MSC_VER | 
|---|
| 35 | #pragma warning(disable: 4996) | 
|---|
| 36 | #endif | 
|---|
| 37 |  | 
|---|
| 38 | #ifndef NULL | 
|---|
| 39 | #define NULL 0 | 
|---|
| 40 | #endif | 
|---|
| 41 |  | 
|---|
| 42 | /* transport mode */ | 
|---|
| 43 | #define TR_VME   1 | 
|---|
| 44 | #define TR_USB   2 | 
|---|
| 45 | #define TR_USB2  3 | 
|---|
| 46 |  | 
|---|
| 47 | /* address types */ | 
|---|
| 48 | #ifndef T_CTRL | 
|---|
| 49 | #define T_CTRL   1 | 
|---|
| 50 | #define T_STATUS 2 | 
|---|
| 51 | #define T_RAM    3 | 
|---|
| 52 | #define T_FIFO   4 | 
|---|
| 53 | #endif | 
|---|
| 54 |  | 
|---|
| 55 | /*---- Register addresses ------------------------------------------*/ | 
|---|
| 56 |  | 
|---|
| 57 | #define REG_CTRL                     0x00000    /* 32 bit control reg */ | 
|---|
| 58 | #define REG_DAC_OFS                  0x00004 | 
|---|
| 59 | #define REG_DAC0                     0x00004 | 
|---|
| 60 | #define REG_DAC1                     0x00006 | 
|---|
| 61 | #define REG_DAC2                     0x00008 | 
|---|
| 62 | #define REG_DAC3                     0x0000A | 
|---|
| 63 | #define REG_DAC4                     0x0000C | 
|---|
| 64 | #define REG_DAC5                     0x0000E | 
|---|
| 65 | #define REG_DAC6                     0x00010 | 
|---|
| 66 | #define REG_DAC7                     0x00012 | 
|---|
| 67 | #define REG_CHANNEL_CONFIG           0x00014    // low byte | 
|---|
| 68 | #define REG_CONFIG                   0x00014    // high byte | 
|---|
| 69 | #define REG_CHANNEL_MODE             0x00016 | 
|---|
| 70 | #define REG_ADCCLK_PHASE             0x00016 | 
|---|
| 71 | #define REG_FREQ_SET_HI              0x00018    // DRS2 | 
|---|
| 72 | #define REG_FREQ_SET_LO              0x0001A    // DRS2 | 
|---|
| 73 | #define REG_TRG_DELAY                0x00018    // DRS4 | 
|---|
| 74 | #define REG_FREQ_SET                 0x0001A    // DRS4 | 
|---|
| 75 | #define REG_TRIG_DELAY               0x0001C | 
|---|
| 76 | #define REG_LMK_MSB                  0x0001C    // DRS4 Mezz | 
|---|
| 77 | #define REG_CALIB_TIMING             0x0001E    // DRS2 | 
|---|
| 78 | #define REG_EEPROM_PAGE_EVAL         0x0001E    // DRS4 Eval | 
|---|
| 79 | #define REG_EEPROM_PAGE_MEZZ         0x0001A    // DRS4 Mezz | 
|---|
| 80 | #define REG_LMK_LSB                  0x0001E    // DRS4 Mezz | 
|---|
| 81 | #define REG_WARMUP                   0x00020    // DRS4 Mezz | 
|---|
| 82 | #define REG_COOLDOWN                 0x00022    // DRS4 Mezz | 
|---|
| 83 |  | 
|---|
| 84 | #define REG_MAGIC                    0x00000 | 
|---|
| 85 | #define REG_BOARD_TYPE               0x00002 | 
|---|
| 86 | #define REG_STATUS                   0x00004 | 
|---|
| 87 | #define REG_RDAC_OFS                 0x0000E | 
|---|
| 88 | #define REG_RDAC0                    0x00008 | 
|---|
| 89 | #define REG_STOP_CELL0               0x00008 | 
|---|
| 90 | #define REG_RDAC1                    0x0000A | 
|---|
| 91 | #define REG_STOP_CELL1               0x0000A | 
|---|
| 92 | #define REG_RDAC2                    0x0000C | 
|---|
| 93 | #define REG_STOP_CELL2               0x0000C | 
|---|
| 94 | #define REG_RDAC3                    0x0000E | 
|---|
| 95 | #define REG_STOP_CELL3               0x0000E | 
|---|
| 96 | #define REG_RDAC4                    0x00000 | 
|---|
| 97 | #define REG_RDAC5                    0x00002 | 
|---|
| 98 | #define REG_RDAC6                    0x00014 | 
|---|
| 99 | #define REG_RDAC7                    0x00016 | 
|---|
| 100 | #define REG_EVENTS_IN_FIFO           0x00018 | 
|---|
| 101 | #define REG_EVENT_COUNT              0x0001A | 
|---|
| 102 | #define REG_FREQ1                    0x0001C | 
|---|
| 103 | #define REG_FREQ2                    0x0001E | 
|---|
| 104 | #define REG_TEMPERATURE              0x00020 | 
|---|
| 105 | #define REG_TRIGGER_BUS              0x00022 | 
|---|
| 106 | #define REG_SERIAL_BOARD             0x00024 | 
|---|
| 107 | #define REG_VERSION_FW               0x00026 | 
|---|
| 108 |  | 
|---|
| 109 | /*---- Control register bit definitions ----------------------------*/ | 
|---|
| 110 |  | 
|---|
| 111 | #define BIT_START_TRIG        (1<<0)    // write a "1" to start domino wave | 
|---|
| 112 | #define BIT_REINIT_TRIG       (1<<1)    // write a "1" to stop & reset DRS | 
|---|
| 113 | #define BIT_SOFT_TRIG         (1<<2)    // write a "1" to stop and read data to RAM | 
|---|
| 114 | #define BIT_EEPROM_WRITE_TRIG (1<<3)    // write a "1" to write into serial EEPROM | 
|---|
| 115 | #define BIT_EEPROM_READ_TRIG  (1<<4)    // write a "1" to read from serial EEPROM | 
|---|
| 116 | #define BIT_AUTOSTART        (1<<16) | 
|---|
| 117 | #define BIT_DMODE            (1<<17)    // (*DRS2*) 0: single shot, 1: circular | 
|---|
| 118 | #define BIT_LED              (1<<18)    // 1=on, 0=blink during readout | 
|---|
| 119 | #define BIT_TCAL_EN          (1<<19)    // switch on (1) / off (0) for 33 MHz calib signal | 
|---|
| 120 | #define BIT_TCAL_SOURCE      (1<<20) | 
|---|
| 121 | #define BIT_REFCLK_SOURCE    (1<<20) | 
|---|
| 122 | #define BIT_FREQ_AUTO_ADJ    (1<<21)    // DRS2/3 | 
|---|
| 123 | #define BIT_TRANSP_MODE      (1<<21)    // DRS4 | 
|---|
| 124 | #define BIT_ENABLE_TRIGGER1  (1<<22)    // External LEMO/FP/TRBUS trigger | 
|---|
| 125 | #define BIT_LONG_START_PULSE (1<<23)    // (*DRS2*) 0:short start pulse (>0.8GHz), 1:long start pulse (<0.8GHz) | 
|---|
| 126 | #define BIT_READOUT_MODE     (1<<23)    // (*DRS3*,*DRS4*) 0:start from first bin, 1:start from domino stop | 
|---|
| 127 | #define BIT_DELAYED_START    (1<<24)    // DRS2: start domino wave 400ns after soft trigger, used for waveform | 
|---|
| 128 | // generator startup | 
|---|
| 129 | #define BIT_NEG_TRIGGER      (1<<24)    // DRS4: use high-to-low trigger if set | 
|---|
| 130 | #define BIT_ACAL_EN          (1<<25)    // connect DRS to inputs (0) or to DAC6 (1) | 
|---|
| 131 | #define BIT_TRIGGER_DELAYED  (1<<26)    // select delayed trigger from trigger bus | 
|---|
| 132 | #define BIT_ADCCLK_INVERT    (1<<26)    // invert ADC clock | 
|---|
| 133 | #define BIT_DACTIVE          (1<<27)    // keep domino wave running during readout | 
|---|
| 134 | #define BIT_STANDBY_MODE     (1<<28)    // put chip in standby mode | 
|---|
| 135 | #define BIT_TR_SOURCE1       (1<<29)    // trigger source selection bits | 
|---|
| 136 | #define BIT_TR_SOURCE2       (1<<30)    // trigger source selection bits | 
|---|
| 137 | #define BIT_ENABLE_TRIGGER2  (1<<31)    // analog threshold (internal) trigger | 
|---|
| 138 |  | 
|---|
| 139 | /* DRS4 configuration register bit definitions */ | 
|---|
| 140 | #define BIT_CONFIG_DMODE      (1<<8)    // 0: single shot, 1: circular | 
|---|
| 141 | #define BIT_CONFIG_PLLEN      (1<<9)    // write a "1" to enable the internal PLL | 
|---|
| 142 | #define BIT_CONFIG_WSRLOOP   (1<<10)    // write a "1" to connect WSROUT to WSRIN internally | 
|---|
| 143 |  | 
|---|
| 144 | /*---- Status register bit definitions -----------------------------*/ | 
|---|
| 145 |  | 
|---|
| 146 | #define BIT_RUNNING           (1<<0)    // one if domino wave running or readout in progress | 
|---|
| 147 | #define BIT_NEW_FREQ1         (1<<1)    // one if new frequency measurement available | 
|---|
| 148 | #define BIT_NEW_FREQ2         (1<<2) | 
|---|
| 149 | #define BIT_PLL_LOCKED0       (1<<1)    // 1 if PLL has locked (DRS4 evaluation board only) | 
|---|
| 150 | #define BIT_PLL_LOCKED1       (1<<2)    // 1 if PLL DRS4 B has locked (DRS4 mezzanine board only) | 
|---|
| 151 | #define BIT_PLL_LOCKED2       (1<<3)    // 1 if PLL DRS4 C has locked (DRS4 mezzanine board only) | 
|---|
| 152 | #define BIT_PLL_LOCKED3       (1<<4)    // 1 if PLL DRS4 D has locked (DRS4 mezzanine board only) | 
|---|
| 153 | #define BIT_SERIAL_BUSY       (1<<5)    // 1 if EEPROM operation in progress | 
|---|
| 154 | #define BIT_LMK_LOCKED        (1<<6)    // 1 if PLL of LMK chip has locked (DRS4 mezzanine board only) | 
|---|
| 155 |  | 
|---|
| 156 | enum DRSBoardConstants { | 
|---|
| 157 | kNumberOfChannelsMax         =   10, | 
|---|
| 158 | kNumberOfCalibChannelsV3     =   10, | 
|---|
| 159 | kNumberOfCalibChannelsV4     =    8, | 
|---|
| 160 | kNumberOfBins                = 1024, | 
|---|
| 161 | kNumberOfChipsMax            =    4, | 
|---|
| 162 | kFrequencyCacheSize          =   10, | 
|---|
| 163 | kBSplineOrder                =    4, | 
|---|
| 164 | kPreCaliculatedBSplines      = 1000, | 
|---|
| 165 | kPreCaliculatedBSplineGroups =    5, | 
|---|
| 166 | kNumberOfADCBins             = 4096, | 
|---|
| 167 | kBSplineXMinOffset           =   20, | 
|---|
| 168 | kMaxNumberOfClockCycles      =  100, | 
|---|
| 169 | }; | 
|---|
| 170 |  | 
|---|
| 171 | enum DRSErrorCodes { | 
|---|
| 172 | kSuccess                     =  0, | 
|---|
| 173 | kInvalidTriggerSignal        = -1, | 
|---|
| 174 | kWrongChannelOrChip          = -2, | 
|---|
| 175 | kInvalidTransport            = -3, | 
|---|
| 176 | kZeroSuppression             = -4, | 
|---|
| 177 | kWaveNotAvailable            = -5 | 
|---|
| 178 | }; | 
|---|
| 179 |  | 
|---|
| 180 | /*---- callback class ----*/ | 
|---|
| 181 |  | 
|---|
| 182 | class DRSCallback | 
|---|
| 183 | { | 
|---|
| 184 | public: | 
|---|
| 185 | virtual void Progress(int value) = 0; | 
|---|
| 186 | virtual ~DRSCallback() {}; | 
|---|
| 187 | }; | 
|---|
| 188 |  | 
|---|
| 189 | /*------------------------*/ | 
|---|
| 190 |  | 
|---|
| 191 | class DRSBoard; | 
|---|
| 192 |  | 
|---|
| 193 | class ResponseCalibration { | 
|---|
| 194 | protected: | 
|---|
| 195 |  | 
|---|
| 196 | class CalibrationData { | 
|---|
| 197 | public: | 
|---|
| 198 | class CalibrationDataChannel { | 
|---|
| 199 | public: | 
|---|
| 200 | unsigned char   fLimitGroup[kNumberOfBins];           //! | 
|---|
| 201 | float           fMin[kNumberOfBins];                  //! | 
|---|
| 202 | float           fRange[kNumberOfBins];                //! | 
|---|
| 203 | short           fOffset[kNumberOfBins];               //! | 
|---|
| 204 | short           fGain[kNumberOfBins];                 //! | 
|---|
| 205 | unsigned short  fOffsetADC[kNumberOfBins];            //! | 
|---|
| 206 | short          *fData[kNumberOfBins];                 //! | 
|---|
| 207 | unsigned char  *fLookUp[kNumberOfBins];               //! | 
|---|
| 208 | unsigned short  fLookUpOffset[kNumberOfBins];         //! | 
|---|
| 209 | unsigned char   fNumberOfLookUpPoints[kNumberOfBins]; //! | 
|---|
| 210 | float          *fTempData;                            //! | 
|---|
| 211 |  | 
|---|
| 212 | private: | 
|---|
| 213 | CalibrationDataChannel(const CalibrationDataChannel &c);              // not implemented | 
|---|
| 214 | CalibrationDataChannel &operator=(const CalibrationDataChannel &rhs); // not implemented | 
|---|
| 215 |  | 
|---|
| 216 | public: | 
|---|
| 217 | CalibrationDataChannel(int numberOfGridPoints) | 
|---|
| 218 | :fTempData(new float[numberOfGridPoints]) { | 
|---|
| 219 | int i; | 
|---|
| 220 | for (i = 0; i < kNumberOfBins; i++) { | 
|---|
| 221 | fData[i] = new short[numberOfGridPoints]; | 
|---|
| 222 | } | 
|---|
| 223 | memset(fLimitGroup,           0, sizeof(fLimitGroup)); | 
|---|
| 224 | memset(fMin,                  0, sizeof(fMin)); | 
|---|
| 225 | memset(fRange,                0, sizeof(fRange)); | 
|---|
| 226 | memset(fOffset,               0, sizeof(fOffset)); | 
|---|
| 227 | memset(fGain,                 0, sizeof(fGain)); | 
|---|
| 228 | memset(fOffsetADC,            0, sizeof(fOffsetADC)); | 
|---|
| 229 | memset(fLookUp,               0, sizeof(fLookUp)); | 
|---|
| 230 | memset(fLookUpOffset,         0, sizeof(fLookUpOffset)); | 
|---|
| 231 | memset(fNumberOfLookUpPoints, 0, sizeof(fNumberOfLookUpPoints)); | 
|---|
| 232 | } | 
|---|
| 233 | ~CalibrationDataChannel() { | 
|---|
| 234 | int i; | 
|---|
| 235 | delete fTempData; | 
|---|
| 236 | for (i = 0; i < kNumberOfBins; i++) { | 
|---|
| 237 | delete fData[i]; | 
|---|
| 238 | delete fLookUp[i]; | 
|---|
| 239 | } | 
|---|
| 240 | } | 
|---|
| 241 | }; | 
|---|
| 242 |  | 
|---|
| 243 | bool                    fRead;                                  //! | 
|---|
| 244 | CalibrationDataChannel *fChannel[10];                           //! | 
|---|
| 245 | unsigned char           fNumberOfGridPoints;                    //! | 
|---|
| 246 | int                     fHasOffsetCalibration;                  //! | 
|---|
| 247 | float                   fStartTemperature;                      //! | 
|---|
| 248 | float                   fEndTemperature;                        //! | 
|---|
| 249 | int                    *fBSplineOffsetLookUp[kNumberOfADCBins]; //! | 
|---|
| 250 | float                 **fBSplineLookUp[kNumberOfADCBins];       //! | 
|---|
| 251 | float                   fMin;                                   //! | 
|---|
| 252 | float                   fMax;                                   //! | 
|---|
| 253 | unsigned char           fNumberOfLimitGroups;                   //! | 
|---|
| 254 | static float            fIntRevers[2 * kBSplineOrder - 2]; | 
|---|
| 255 |  | 
|---|
| 256 | private: | 
|---|
| 257 | CalibrationData(const CalibrationData &c);              // not implemented | 
|---|
| 258 | CalibrationData &operator=(const CalibrationData &rhs); // not implemented | 
|---|
| 259 |  | 
|---|
| 260 | public: | 
|---|
| 261 | CalibrationData(int numberOfGridPoints); | 
|---|
| 262 | ~CalibrationData(); | 
|---|
| 263 | static int CalculateBSpline(int nGrid, float value, float *bsplines); | 
|---|
| 264 | void       PreCalculateBSpline(); | 
|---|
| 265 | void       DeletePreCalculatedBSpline(); | 
|---|
| 266 | }; | 
|---|
| 267 |  | 
|---|
| 268 | // General Fields | 
|---|
| 269 | DRSBoard        *fBoard; | 
|---|
| 270 |  | 
|---|
| 271 | double           fPrecision; | 
|---|
| 272 |  | 
|---|
| 273 | // Fields for creating the Calibration | 
|---|
| 274 | bool             fInitialized; | 
|---|
| 275 | bool             fRecorded; | 
|---|
| 276 | bool             fFitted; | 
|---|
| 277 | bool             fOffset; | 
|---|
| 278 | bool             fCalibrationValid[2]; | 
|---|
| 279 |  | 
|---|
| 280 | int              fNumberOfPointsLowVolt; | 
|---|
| 281 | int              fNumberOfPoints; | 
|---|
| 282 | int              fNumberOfMode2Bins; | 
|---|
| 283 | int              fNumberOfSamples; | 
|---|
| 284 | int              fNumberOfGridPoints; | 
|---|
| 285 | int              fNumberOfXConstPoints; | 
|---|
| 286 | int              fNumberOfXConstGridPoints; | 
|---|
| 287 | double           fTriggerFrequency; | 
|---|
| 288 | int              fShowStatistics; | 
|---|
| 289 | FILE            *fCalibFile; | 
|---|
| 290 |  | 
|---|
| 291 | int              fCurrentLowVoltPoint; | 
|---|
| 292 | int              fCurrentPoint; | 
|---|
| 293 | int              fCurrentSample; | 
|---|
| 294 | int              fCurrentFitChannel; | 
|---|
| 295 | int              fCurrentFitBin; | 
|---|
| 296 |  | 
|---|
| 297 | float           *fResponseX[10][kNumberOfBins]; | 
|---|
| 298 | float           *fResponseY; | 
|---|
| 299 | unsigned short **fWaveFormMode3[10]; | 
|---|
| 300 | unsigned short **fWaveFormMode2[10]; | 
|---|
| 301 | short          **fWaveFormOffset[10]; | 
|---|
| 302 | unsigned short **fWaveFormOffsetADC[10]; | 
|---|
| 303 | unsigned short  *fSamples; | 
|---|
| 304 | int             *fSampleUsed; | 
|---|
| 305 |  | 
|---|
| 306 | float           *fPntX[2]; | 
|---|
| 307 | float           *fPntY[2]; | 
|---|
| 308 | float           *fUValues[2]; | 
|---|
| 309 | float           *fRes[kNumberOfBins]; | 
|---|
| 310 | float           *fResX[kNumberOfBins]; | 
|---|
| 311 |  | 
|---|
| 312 | double          *fXXFit; | 
|---|
| 313 | double          *fYYFit; | 
|---|
| 314 | double          *fWWFit; | 
|---|
| 315 | double          *fYYFitRes; | 
|---|
| 316 | double          *fYYSave; | 
|---|
| 317 | double          *fXXSave; | 
|---|
| 318 | double          fGainMin; | 
|---|
| 319 | double          fGainMax; | 
|---|
| 320 |  | 
|---|
| 321 | float          **fStatisticsApprox; | 
|---|
| 322 | float          **fStatisticsApproxExt; | 
|---|
| 323 |  | 
|---|
| 324 | // Fields for applying the Calibration | 
|---|
| 325 | CalibrationData *fCalibrationData[kNumberOfChipsMax]; | 
|---|
| 326 |  | 
|---|
| 327 | private: | 
|---|
| 328 | ResponseCalibration(const ResponseCalibration &c);              // not implemented | 
|---|
| 329 | ResponseCalibration &operator=(const ResponseCalibration &rhs); // not implemented | 
|---|
| 330 |  | 
|---|
| 331 | public: | 
|---|
| 332 | ResponseCalibration(DRSBoard* board); | 
|---|
| 333 | ~ResponseCalibration(); | 
|---|
| 334 |  | 
|---|
| 335 | void   SetCalibrationParameters(int numberOfPointsLowVolt, int numberOfPoints, int numberOfMode2Bins, | 
|---|
| 336 | int numberOfSamples, int numberOfGridPoints, int numberOfXConstPoints, | 
|---|
| 337 | int numberOfXConstGridPoints, double triggerFrequency, int showStatistics = 0); | 
|---|
| 338 | void   ResetCalibration(); | 
|---|
| 339 | bool   RecordCalibrationPoints(int chipNumber); | 
|---|
| 340 | bool   RecordCalibrationPointsV3(int chipNumber); | 
|---|
| 341 | bool   RecordCalibrationPointsV4(int chipNumber); | 
|---|
| 342 | bool   FitCalibrationPoints(int chipNumber); | 
|---|
| 343 | bool   FitCalibrationPointsV3(int chipNumber); | 
|---|
| 344 | bool   FitCalibrationPointsV4(int chipNumber); | 
|---|
| 345 | bool   OffsetCalibration(int chipNumber); | 
|---|
| 346 | bool   OffsetCalibrationV3(int chipNumber); | 
|---|
| 347 | bool   OffsetCalibrationV4(int chipNumber); | 
|---|
| 348 | double GetTemperature(unsigned int chipIndex); | 
|---|
| 349 |  | 
|---|
| 350 | bool   WriteCalibration(unsigned int chipIndex); | 
|---|
| 351 | bool   WriteCalibrationV3(unsigned int chipIndex); | 
|---|
| 352 | bool   WriteCalibrationV4(unsigned int chipIndex); | 
|---|
| 353 | bool   ReadCalibration(unsigned int chipIndex); | 
|---|
| 354 | bool   ReadCalibrationV3(unsigned int chipIndex); | 
|---|
| 355 | bool   ReadCalibrationV4(unsigned int chipIndex); | 
|---|
| 356 | bool   Calibrate(unsigned int chipIndex, unsigned int channel, float *adcWaveform, | 
|---|
| 357 | float *uWaveform, float threshold, bool offsetCalib); | 
|---|
| 358 | bool   Calibrate(unsigned int chipIndex, unsigned int channel, unsigned short *adcWaveform, short *uWaveform, | 
|---|
| 359 | int triggerCell, float threshold, bool offsetCalib); | 
|---|
| 360 | bool   SubtractADCOffset(unsigned int chipIndex, unsigned int channel, unsigned short *adcWaveform, | 
|---|
| 361 | unsigned short *adcCalibratedWaveform, unsigned short newBaseLevel); | 
|---|
| 362 | bool   IsRead(int chipIndex) const { return fCalibrationValid[chipIndex]; } | 
|---|
| 363 | double GetPrecision() const { return fPrecision; }; | 
|---|
| 364 |  | 
|---|
| 365 | double GetOffsetAt(int chip,int chn,int bin) const { return fCalibrationData[chip]->fChannel[chn]->fOffset[bin]; }; | 
|---|
| 366 | double GetGainAt(int chip,int chn,int bin) const { return fCalibrationData[chip]->fChannel[chn]->fGain[bin]; }; | 
|---|
| 367 | double GetMeasPointXAt(int ip) const { return fXXSave[ip]; }; | 
|---|
| 368 | double GetMeasPointYAt(int ip) const { return fYYSave[ip]; }; | 
|---|
| 369 |  | 
|---|
| 370 | protected: | 
|---|
| 371 | void   InitFields(int numberOfPointsLowVolt, int numberOfPoints, int numberOfMode2Bins, int numberOfSamples, | 
|---|
| 372 | int numberOfGridPoints, int numberOfXConstPoints, int numberOfXConstGridPoints, | 
|---|
| 373 | double triggerFrequency, int showStatistics); | 
|---|
| 374 | void   DeleteFields(); | 
|---|
| 375 | void   CalibrationTrigger(int mode, double voltage); | 
|---|
| 376 | void   CalibrationStart(double voltage); | 
|---|
| 377 |  | 
|---|
| 378 | static float  GetValue(float *coefficients, float u, int n); | 
|---|
| 379 | static int    Approx(float *p, float *uu, int np, int nu, float *coef); | 
|---|
| 380 | static void   LeastSquaresAccumulation(float **matrix, int nb, int *ip, int *ir, int mt, int jt); | 
|---|
| 381 | static int    LeastSquaresSolving(float **matrix, int nb, int ip, int ir, float *x, int n); | 
|---|
| 382 | static void   Housholder(int lpivot, int l1, int m, float **u, int iU1, int iU2, float *up, float **c, int iC1, | 
|---|
| 383 | int iC2, int ice, int ncv); | 
|---|
| 384 |  | 
|---|
| 385 | static int    MakeDir(const char *path); | 
|---|
| 386 | static void   Average(int method,float *samples,int numberOfSamples,float &mean,float &error,float sigmaBoundary); | 
|---|
| 387 | }; | 
|---|
| 388 |  | 
|---|
| 389 |  | 
|---|
| 390 | class DRSBoard { | 
|---|
| 391 | protected: | 
|---|
| 392 | class TimeData { | 
|---|
| 393 | public: | 
|---|
| 394 | class FrequencyData { | 
|---|
| 395 | public: | 
|---|
| 396 | int    fFrequency; | 
|---|
| 397 | double fBin[kNumberOfBins]; | 
|---|
| 398 | }; | 
|---|
| 399 |  | 
|---|
| 400 | enum { | 
|---|
| 401 | kMaxNumberOfFrequencies = 4000 | 
|---|
| 402 | }; | 
|---|
| 403 | int            fChip; | 
|---|
| 404 | int            fNumberOfFrequencies; | 
|---|
| 405 | FrequencyData *fFrequency[kMaxNumberOfFrequencies]; | 
|---|
| 406 |  | 
|---|
| 407 | private: | 
|---|
| 408 | TimeData(const TimeData &c);              // not implemented | 
|---|
| 409 | TimeData &operator=(const TimeData &rhs); // not implemented | 
|---|
| 410 |  | 
|---|
| 411 | public: | 
|---|
| 412 | TimeData() | 
|---|
| 413 | :fChip(0) | 
|---|
| 414 | ,fNumberOfFrequencies(0) { | 
|---|
| 415 | } | 
|---|
| 416 | ~TimeData() { | 
|---|
| 417 | int i; | 
|---|
| 418 | for (i = 0; i < fNumberOfFrequencies; i++) { | 
|---|
| 419 | delete fFrequency[i]; | 
|---|
| 420 | } | 
|---|
| 421 | } | 
|---|
| 422 | }; | 
|---|
| 423 |  | 
|---|
| 424 | public: | 
|---|
| 425 | // DAC channels (CMC Version 1 : DAC_COFSA,DAC_COFSB,DAC_DRA,DAC_DSA,DAC_TLEVEL,DAC_ACALIB,DAC_DSB,DAC_DRB) | 
|---|
| 426 | unsigned int         fDAC_COFSA; | 
|---|
| 427 | unsigned int         fDAC_COFSB; | 
|---|
| 428 | unsigned int         fDAC_DRA; | 
|---|
| 429 | unsigned int         fDAC_DSA; | 
|---|
| 430 | unsigned int         fDAC_TLEVEL; | 
|---|
| 431 | unsigned int         fDAC_ACALIB; | 
|---|
| 432 | unsigned int         fDAC_DSB; | 
|---|
| 433 | unsigned int         fDAC_DRB; | 
|---|
| 434 | // DAC channels (CMC Version 2+3 : DAC_COFS,DAC_DSA,DAC_DSB,DAC_TLEVEL,DAC_ADCOFS,DAC_CLKOFS,DAC_ACALIB) | 
|---|
| 435 | unsigned int         fDAC_COFS; | 
|---|
| 436 | unsigned int         fDAC_ADCOFS; | 
|---|
| 437 | unsigned int         fDAC_CLKOFS; | 
|---|
| 438 | // DAC channels (CMC Version 4 : DAC_ROFS_1,DAC_DSA,DAC_DSB,DAC_ROFS_2,DAC_ADCOFS,DAC_ACALIB,DAC_INOFS,DAC_BIAS) | 
|---|
| 439 | unsigned int         fDAC_ROFS_1; | 
|---|
| 440 | unsigned int         fDAC_ROFS_2; | 
|---|
| 441 | unsigned int         fDAC_INOFS; | 
|---|
| 442 | unsigned int         fDAC_BIAS; | 
|---|
| 443 | // DAC channels (USB EVAL1 (Version 5) : DAC_ROFS_1,DAC_CMOFS,DAC_CALN,DAC_CALP,DAC_BIAS,DAC_TLEVEL,DAC_ONOFS) | 
|---|
| 444 | unsigned int         fDAC_CMOFS; | 
|---|
| 445 | unsigned int         fDAC_CALN; | 
|---|
| 446 | unsigned int         fDAC_CALP; | 
|---|
| 447 | unsigned int         fDAC_ONOFS; | 
|---|
| 448 | // DAC channels (DRS4 MEZZ1 (Version 6) : DAC_ONOFS,DAC_CMOFSP,DAC_CALN,DAC_CALP,DAC_BIAS,DAC_CMOFSN,DAC_ROFS_1) | 
|---|
| 449 | unsigned int         fDAC_CMOFSP; | 
|---|
| 450 | unsigned int         fDAC_CMOFSN; | 
|---|
| 451 |  | 
|---|
| 452 | protected: | 
|---|
| 453 | // Fields for DRS | 
|---|
| 454 | int                  fDRSType; | 
|---|
| 455 | int                  fBoardType; | 
|---|
| 456 | int                  fNumberOfChips; | 
|---|
| 457 | int                  fNumberOfChannels; | 
|---|
| 458 | int                  fRequiredFirmwareVersion; | 
|---|
| 459 | int                  fFirmwareVersion; | 
|---|
| 460 | int                  fBoardSerialNumber; | 
|---|
| 461 | unsigned int         fTransport; | 
|---|
| 462 | unsigned int         fCtrlBits; | 
|---|
| 463 | int                  fNumberOfReadoutChannels; | 
|---|
| 464 | int                  fReadoutChannelConfig; | 
|---|
| 465 | int                  fADCClkPhase; | 
|---|
| 466 | bool                 fADCClkInvert; | 
|---|
| 467 | double               fExternalClockFrequency; | 
|---|
| 468 | #ifdef HAVE_USB | 
|---|
| 469 | MUSB_INTERFACE      *fUsbInterface; | 
|---|
| 470 | #endif | 
|---|
| 471 | #ifdef HAVE_VME | 
|---|
| 472 | MVME_INTERFACE      *fVmeInterface; | 
|---|
| 473 | mvme_addr_t          fBaseAddress; | 
|---|
| 474 | #endif | 
|---|
| 475 | #ifdef CT_VME | 
|---|
| 476 | VME_ErrorCode_t          ErrorCode; | 
|---|
| 477 | VME_BlockTransferList_t  BLT_List; | 
|---|
| 478 | char                 ErrorString[VME_MAXSTRING]; | 
|---|
| 479 | int                  CMEM_SegIdentifier; | 
|---|
| 480 | unsigned long        PCIAddress;        // Physical address of contiguous buffer | 
|---|
| 481 | unsigned long        VirtualAddress;    // Virtual address of contiguous buffer | 
|---|
| 482 | unsigned int         fBaseAddress; | 
|---|
| 483 | unsigned int         fBoardAddress; | 
|---|
| 484 | int                  fMasterMapping; | 
|---|
| 485 |  | 
|---|
| 486 | unsigned int GetBaseAddress() const {return fBaseAddress; } | 
|---|
| 487 | unsigned int GetBoardAddress() const {return fBoardAddress; } | 
|---|
| 488 |  | 
|---|
| 489 | int          AllocateSegmentCMEM(unsigned int SegSize, int *CMEM_SegIdentifier); | 
|---|
| 490 | int          AssignPhysicalSegAddressCMEM(int CMEM_SegIdentifier, unsigned long* PCIAddress); | 
|---|
| 491 | int          AssignVirtualSegAddressCMEM(int CMEM_SegIdentifier, unsigned long* VirtualAddress); | 
|---|
| 492 | int          FreeSegmentCMEM(int CMEM_SegIdentifier); | 
|---|
| 493 | #endif | 
|---|
| 494 |  | 
|---|
| 495 | int                  fSlotNumber; | 
|---|
| 496 | double               fFrequency; | 
|---|
| 497 | double               fTCALFrequency; | 
|---|
| 498 | double               fRefClock; | 
|---|
| 499 | int                  fDominoMode; | 
|---|
| 500 | int                  fDominoActive; | 
|---|
| 501 | int                  fChannelConfig; | 
|---|
| 502 | int                  fWSRLoop; | 
|---|
| 503 | int                  fReadoutMode; | 
|---|
| 504 | int                  fTriggerEnable1; | 
|---|
| 505 | int                  fTriggerEnable2; | 
|---|
| 506 | int                  fTriggerSource; | 
|---|
| 507 | int                  fTriggerDelay; | 
|---|
| 508 | int                  fDelayedStart; | 
|---|
| 509 | int                  fTranspMode; | 
|---|
| 510 | unsigned short       fStopCell[4]; | 
|---|
| 511 | double               fROFS; | 
|---|
| 512 | double               fRange; | 
|---|
| 513 | double               fCommonMode; | 
|---|
| 514 | int                  fAcalMode; | 
|---|
| 515 | int                  fbkAcalMode; | 
|---|
| 516 | double               fAcalVolt; | 
|---|
| 517 | double               fbkAcalVolt; | 
|---|
| 518 | int                  fTcalFreq; | 
|---|
| 519 | int                  fbkTcalFreq; | 
|---|
| 520 | int                  fTcalLevel; | 
|---|
| 521 | int                  fbkTcalLevel; | 
|---|
| 522 | int                  fTcalPhase; | 
|---|
| 523 | int                  fTcalSource; | 
|---|
| 524 |  | 
|---|
| 525 | unsigned char        fWaveforms[kNumberOfChipsMax * kNumberOfChannelsMax * 2 * kNumberOfBins]; | 
|---|
| 526 |  | 
|---|
| 527 | // Fields for Calibration | 
|---|
| 528 | int                  fMaxChips; | 
|---|
| 529 | char                 fCalibDirectory[1000]; | 
|---|
| 530 |  | 
|---|
| 531 | // Fields for Response Calibration old method | 
|---|
| 532 | ResponseCalibration *fResponseCalibration; | 
|---|
| 533 |  | 
|---|
| 534 | // Fields for Calibration new method | 
|---|
| 535 | bool                 fCellCalibrationValid; | 
|---|
| 536 | double               fCellCalibratedRange; | 
|---|
| 537 | unsigned short       fCellOffset[kNumberOfChipsMax * kNumberOfChannelsMax][kNumberOfBins]; | 
|---|
| 538 | unsigned short       fCellOffset2[kNumberOfChipsMax * kNumberOfChannelsMax][kNumberOfBins]; | 
|---|
| 539 | double               fCellGain[kNumberOfChipsMax * kNumberOfChannelsMax][kNumberOfBins]; | 
|---|
| 540 |  | 
|---|
| 541 | bool                 fTimingCalibrationValid; | 
|---|
| 542 | double               fTimingCalibratedFrequency; | 
|---|
| 543 | double               fCellT[kNumberOfChipsMax][kNumberOfBins]; | 
|---|
| 544 | signed short         fCellDT[kNumberOfChipsMax * kNumberOfChannelsMax][kNumberOfBins]; | 
|---|
| 545 |  | 
|---|
| 546 | // Fields for Time Calibration | 
|---|
| 547 | TimeData           **fTimeData; | 
|---|
| 548 | int                  fNumberOfTimeData; | 
|---|
| 549 |  | 
|---|
| 550 | // General debugging flag | 
|---|
| 551 | int fDebug; | 
|---|
| 552 |  | 
|---|
| 553 | // Fields for wave transfer | 
|---|
| 554 | bool                 fWaveTransferred[kNumberOfChipsMax * kNumberOfChannelsMax]; | 
|---|
| 555 |  | 
|---|
| 556 | // Waveform Rotation | 
|---|
| 557 | int                  fTriggerStartBin; // Start Bin of the trigger | 
|---|
| 558 |  | 
|---|
| 559 | private: | 
|---|
| 560 | DRSBoard(const DRSBoard &c);              // not implemented | 
|---|
| 561 | DRSBoard &operator=(const DRSBoard &rhs); // not implemented | 
|---|
| 562 |  | 
|---|
| 563 | public: | 
|---|
| 564 | // Public Methods | 
|---|
| 565 | #ifdef HAVE_USB | 
|---|
| 566 | DRSBoard(MUSB_INTERFACE * musb_interface, int usb_slot); | 
|---|
| 567 | #endif | 
|---|
| 568 | #ifdef HAVE_VME | 
|---|
| 569 | DRSBoard(MVME_INTERFACE * mvme_interface, mvme_addr_t base_address, int slot_number); | 
|---|
| 570 |  | 
|---|
| 571 | MVME_INTERFACE *GetVMEInterface() const { return fVmeInterface; }; | 
|---|
| 572 | #endif | 
|---|
| 573 | #ifdef CT_VME | 
|---|
| 574 | DRSBoard(int MasterMapping, unsigned int BaseAddress, unsigned int BoardAddress, int SlotNumber); | 
|---|
| 575 | #endif | 
|---|
| 576 |  | 
|---|
| 577 | ~DRSBoard(); | 
|---|
| 578 |  | 
|---|
| 579 | int          SetBoardSerialNumber(unsigned short serialNumber); | 
|---|
| 580 | int          GetBoardSerialNumber() const { return fBoardSerialNumber; } | 
|---|
| 581 | int          GetFirmwareVersion() const { return fFirmwareVersion; } | 
|---|
| 582 | int          GetRequiredFirmwareVersion() const { return fRequiredFirmwareVersion; } | 
|---|
| 583 | int          GetDRSType() const { return fDRSType; } | 
|---|
| 584 | int          GetBoardType() const { return fBoardType; } | 
|---|
| 585 | int          GetNumberOfChips() const { return fNumberOfChips; } | 
|---|
| 586 | int          GetNumberOfChannels() const { return fNumberOfChannels; } | 
|---|
| 587 | int          GetSlotNumber() const { return fSlotNumber; } | 
|---|
| 588 | int          InitFPGA(void); | 
|---|
| 589 | int          Write(int type, unsigned int addr, void *data, int size); | 
|---|
| 590 | int          Read(int type, void *data, unsigned int addr, int size); | 
|---|
| 591 | int          GetTransport() const { return fTransport; } | 
|---|
| 592 | void         RegisterTest(void); | 
|---|
| 593 | int          RAMTest(int flag); | 
|---|
| 594 | int          ChipTest(); | 
|---|
| 595 | unsigned int GetCtrlReg(void); | 
|---|
| 596 | unsigned short GetConfigReg(void); | 
|---|
| 597 | unsigned int GetStatusReg(void); | 
|---|
| 598 | void         SetLED(int state); | 
|---|
| 599 | void         SetChannelConfig(int firstChannel, int lastChannel, int nConfigChannels); | 
|---|
| 600 | void         SetADCClkPhase(int phase, bool invert); | 
|---|
| 601 | void         SetWarmup(unsigned int ticks); | 
|---|
| 602 | void         SetCooldown(unsigned int ticks); | 
|---|
| 603 | int          GetReadoutChannelConfig() { return fReadoutChannelConfig; } | 
|---|
| 604 | void         SetNumberOfChannels(int nChannels); | 
|---|
| 605 | int          EnableTrigger(int flag1, int flag2); | 
|---|
| 606 | int          GetTriggerEnable(int i) { return i?fTriggerEnable2:fTriggerEnable1; } | 
|---|
| 607 | int          SetDelayedTrigger(int flag); | 
|---|
| 608 | int          SetTriggerDelay(int delay); | 
|---|
| 609 | int          GetTriggerDelay() { return fTriggerDelay; } | 
|---|
| 610 | int          SetTriggerLevel(double value, bool negative); | 
|---|
| 611 | int          SetTriggerSource(int source); | 
|---|
| 612 | int          GetTriggerSource() { return fTriggerSource; } | 
|---|
| 613 | int          SetDelayedStart(int flag); | 
|---|
| 614 | int          SetTranspMode(int flag); | 
|---|
| 615 | int          SetStandbyMode(int flag); | 
|---|
| 616 | int          IsBusy(void); | 
|---|
| 617 | int          IsPLLLocked(void); | 
|---|
| 618 | int          IsLMKLocked(void); | 
|---|
| 619 | int          IsNewFreq(unsigned char chipIndex); | 
|---|
| 620 | int          SetDAC(unsigned char channel, double value); | 
|---|
| 621 | int          ReadDAC(unsigned char channel, double *value); | 
|---|
| 622 | int          GetRegulationDAC(double *value); | 
|---|
| 623 | int          StartDomino(); | 
|---|
| 624 | int          StartClearCycle(); | 
|---|
| 625 | int          FinishClearCycle(); | 
|---|
| 626 | int          Reinit(); | 
|---|
| 627 | int          Init(); | 
|---|
| 628 | void         SetDebug(int debug) { fDebug = debug; } | 
|---|
| 629 | int          Debug() { return fDebug; } | 
|---|
| 630 | int          SetDominoMode(unsigned char mode); | 
|---|
| 631 | int          SetDominoActive(unsigned char mode); | 
|---|
| 632 | int          SetReadoutMode(unsigned char mode); | 
|---|
| 633 | int          SoftTrigger(void); | 
|---|
| 634 | int          ReadFrequency(unsigned char chipIndex, double *f); | 
|---|
| 635 | int          SetFrequency(double freq, bool wait); | 
|---|
| 636 | double       VoltToFreq(double volt); | 
|---|
| 637 | double       FreqToVolt(double freq); | 
|---|
| 638 | double       GetFrequency() const { return fFrequency; } | 
|---|
| 639 | int          RegulateFrequency(double freq); | 
|---|
| 640 | int          SetExternalClockFrequency(double frequencyMHz); | 
|---|
| 641 | double       GetExternalClockFrequency(); | 
|---|
| 642 | void         SetVoltageOffset(double offset1, double offset2); | 
|---|
| 643 | int          SetInputRange(double center); | 
|---|
| 644 | double       GetInputRange(void) { return fRange; } | 
|---|
| 645 | double       GetCalibratedInputRange(void) { return fCellCalibratedRange; } | 
|---|
| 646 | double       GetCalibratedFrequency(void) { return fTimingCalibratedFrequency; } | 
|---|
| 647 | int          TransferWaves(int numberOfChannels = kNumberOfChipsMax * kNumberOfChannelsMax); | 
|---|
| 648 | int          TransferWaves(unsigned char *p, int numberOfChannels = kNumberOfChipsMax * kNumberOfChannelsMax); | 
|---|
| 649 | int          TransferWaves(int firstChannel, int lastChannel); | 
|---|
| 650 | int          TransferWaves(unsigned char *p, int firstChannel, int lastChannel); | 
|---|
| 651 | int          DecodeWave(unsigned char *waveforms, unsigned int chipIndex, unsigned char channel, | 
|---|
| 652 | unsigned short *waveform); | 
|---|
| 653 | int          DecodeWave(unsigned int chipIndex, unsigned char channel, unsigned short *waveform); | 
|---|
| 654 | int          GetWave(unsigned char *waveforms, unsigned int chipIndex, unsigned char channel, short *waveform, | 
|---|
| 655 | bool responseCalib = false, int triggerCell = -1, bool adjustToClock = false, | 
|---|
| 656 | float threshold = 0, bool offsetCalib = true); | 
|---|
| 657 | int          GetWave(unsigned char *waveforms, unsigned int chipIndex, unsigned char channel, float *waveform, | 
|---|
| 658 | bool responseCalib = false, int triggerCell = -1, bool adjustToClock = false, | 
|---|
| 659 | float threshold = 0, bool offsetCalib = true); | 
|---|
| 660 | int          GetWave(unsigned int chipIndex, unsigned char channel, short *waveform, bool responseCalib = false, | 
|---|
| 661 | int triggerCell = -1, bool adjustToClock = false, float threshold = 0, bool offsetCalib = true); | 
|---|
| 662 | int          GetWave(unsigned int chipIndex, unsigned char channel, float *waveform, bool responseCalib, | 
|---|
| 663 | int triggerCell = -1, bool adjustToClock = false, float threshold = 0, bool offsetCalib = true); | 
|---|
| 664 | int          GetWave(unsigned int chipIndex, unsigned char channel, float *waveform); | 
|---|
| 665 | int          GetRawWave(unsigned int chipIndex, unsigned char channel, unsigned short *waveform, bool adjustToClock = false); | 
|---|
| 666 | int          GetRawWave(unsigned char *waveforms,unsigned int chipIndex, unsigned char channel, | 
|---|
| 667 | unsigned short *waveform, bool adjustToClock = false); | 
|---|
| 668 | int          GetTime(unsigned int chipIndex, double freq, float *time, bool tcalibrated=true, bool rotated=true); | 
|---|
| 669 | int          GetTime(unsigned int chipIndex, float *time, bool tcalibrated=true, bool rotated=true); | 
|---|
| 670 | int          GetTriggerCell(unsigned int chipIndex); | 
|---|
| 671 | int          GetStopCell(unsigned int chipIndex); | 
|---|
| 672 | int          GetTriggerCell(unsigned char *waveforms,unsigned int chipIndex); | 
|---|
| 673 | void         TestDAC(int channel); | 
|---|
| 674 | void         MeasureSpeed(); | 
|---|
| 675 | void         InteractSpeed(); | 
|---|
| 676 | void         MonitorFrequency(); | 
|---|
| 677 | int          TestShift(int n); | 
|---|
| 678 | int          EnableAcal(int mode, double voltage); | 
|---|
| 679 | int          GetAcalMode() { return fAcalMode; } | 
|---|
| 680 | double       GetAcalVolt() { return fAcalVolt; } | 
|---|
| 681 | int          EnableTcal(int freq, int level=0, int phase=0); | 
|---|
| 682 | int          SelectClockSource(int source); | 
|---|
| 683 | int          SetRefclk(int source); | 
|---|
| 684 | int          GetTcalFreq() { return fTcalFreq; } | 
|---|
| 685 | int          GetTcalLevel() { return fTcalLevel; } | 
|---|
| 686 | int          GetTcalPhase() { return fTcalPhase; } | 
|---|
| 687 | int          GetTcalSource() { return fTcalSource; } | 
|---|
| 688 | int          SetCalibVoltage(double value); | 
|---|
| 689 | int          SetCalibTiming(int t1, int t2); | 
|---|
| 690 | double       GetTemperature(); | 
|---|
| 691 | int          GetTriggerBus(); | 
|---|
| 692 | int          ReadEEPROM(unsigned short page, void *buffer, int size); | 
|---|
| 693 | int          WriteEEPROM(unsigned short page, void *buffer, int size); | 
|---|
| 694 | bool         HasCorrectFirmware(); | 
|---|
| 695 | int          ConfigureLMK(double sampFreq, bool freqChange, int calFreq, int calPhase); | 
|---|
| 696 |  | 
|---|
| 697 | bool         InitTimeCalibration(unsigned int chipIndex); | 
|---|
| 698 | void         SetCalibrationDirectory(const char *calibrationDirectoryPath); | 
|---|
| 699 | void         GetCalibrationDirectory(char *calibrationDirectoryPath); | 
|---|
| 700 |  | 
|---|
| 701 | ResponseCalibration *GetResponseCalibration() const { return fResponseCalibration; } | 
|---|
| 702 |  | 
|---|
| 703 | double       GetPrecision() const { return fResponseCalibration ? fResponseCalibration->GetPrecision() : 0.1; } | 
|---|
| 704 | int          CalibrateWaveform(unsigned int chipIndex, unsigned char channel, unsigned short *adcWaveform, | 
|---|
| 705 | short *waveform, bool responseCalib, int triggerCell, bool adjustToClock, | 
|---|
| 706 | float threshold, bool offsetCalib); | 
|---|
| 707 |  | 
|---|
| 708 | static void  LinearRegression(double *x, double *y, int n, double *a, double *b); | 
|---|
| 709 |  | 
|---|
| 710 | void         ReadSingleWaveform(int nChips, int nChan, | 
|---|
| 711 | unsigned short wfu[kNumberOfChipsMax][kNumberOfChannelsMax][kNumberOfBins], bool rotated); | 
|---|
| 712 | int          AverageWaveforms(DRSCallback *pcb, int chipIndex, int nChan, int prog1, int prog2, unsigned short *awf, int n, bool rotated); | 
|---|
| 713 | int          RobustAverageWaveforms(DRSCallback *pcb, int chipIndex, int nChan, int prog1, int prog2, unsigned short *awf, int n, bool rotated); | 
|---|
| 714 | int          CalibrateVolt(DRSCallback *pcb); | 
|---|
| 715 | int          AnalyzeWF(int nIter, float wf[kNumberOfBins], int tCell, double cellT[kNumberOfBins]); | 
|---|
| 716 | int          CalibrateTiming(DRSCallback *pcb); | 
|---|
| 717 | bool         IsCalibrationValid() { return fCellCalibrationValid; } | 
|---|
| 718 | bool         IsTimingCalibrationValid() { return fTimingCalibrationValid; } | 
|---|
| 719 | static void  RemoveSymmetricSpikes(short **wf, int nwf, | 
|---|
| 720 | short diffThreshold, int spikeWidth, | 
|---|
| 721 | short maxPeakToPeak, short spikeVoltage, | 
|---|
| 722 | int nTimeRegionThreshold); | 
|---|
| 723 | protected: | 
|---|
| 724 | // Protected Methods | 
|---|
| 725 | void         ConstructBoard(); | 
|---|
| 726 | void         ReadSerialNumber(); | 
|---|
| 727 | void         ReadCalibration(void); | 
|---|
| 728 |  | 
|---|
| 729 | TimeData    *GetTimeCalibration(unsigned int chipIndex, bool reinit = false); | 
|---|
| 730 |  | 
|---|
| 731 | int          GetStretchedTime(float *time, float *measurement, int numberOfMeasurements, float period); | 
|---|
| 732 | }; | 
|---|
| 733 |  | 
|---|
| 734 | class DRS { | 
|---|
| 735 | protected: | 
|---|
| 736 | // constants | 
|---|
| 737 | enum { | 
|---|
| 738 | kMaxNumberOfBoards = 40 | 
|---|
| 739 | }; | 
|---|
| 740 |  | 
|---|
| 741 | protected: | 
|---|
| 742 | DRSBoard       *fBoard[kMaxNumberOfBoards]; | 
|---|
| 743 | int             fNumberOfBoards; | 
|---|
| 744 | char            fError[256]; | 
|---|
| 745 | #ifdef HAVE_VME | 
|---|
| 746 | MVME_INTERFACE *fVmeInterface; | 
|---|
| 747 | #endif | 
|---|
| 748 |  | 
|---|
| 749 | private: | 
|---|
| 750 | DRS(const DRS &c);              // not implemented | 
|---|
| 751 | DRS &operator=(const DRS &rhs); // not implemented | 
|---|
| 752 |  | 
|---|
| 753 | #ifdef CT_VME | 
|---|
| 754 | VME_MasterMap_t  MasterMap; | 
|---|
| 755 | VME_ErrorCode_t  ErrorCode; | 
|---|
| 756 | char             ErrorString[VME_MAXSTRING]; | 
|---|
| 757 | int              MasterMapping[kMaxNumberOfBoards]; | 
|---|
| 758 |  | 
|---|
| 759 | int OpenVME(); | 
|---|
| 760 | int MasterMapVME(int* MMap); | 
|---|
| 761 | int MasterUnMapVME(int MMap); | 
|---|
| 762 | int CloseVME(); | 
|---|
| 763 | int OpenCMEM(); | 
|---|
| 764 | int CloseCMEM(); | 
|---|
| 765 | #endif | 
|---|
| 766 |  | 
|---|
| 767 | public: | 
|---|
| 768 | // Public Methods | 
|---|
| 769 | DRS(); | 
|---|
| 770 | ~DRS(); | 
|---|
| 771 |  | 
|---|
| 772 | DRSBoard        *GetBoard(int i) { return fBoard[i]; } | 
|---|
| 773 | DRSBoard       **GetBoards() { return fBoard; } | 
|---|
| 774 | int              GetNumberOfBoards() const { return fNumberOfBoards; } | 
|---|
| 775 | bool             GetError(char *str, int size); | 
|---|
| 776 | #ifdef HAVE_VME | 
|---|
| 777 | MVME_INTERFACE *GetVMEInterface() const { return fVmeInterface; }; | 
|---|
| 778 | #endif | 
|---|
| 779 | }; | 
|---|
| 780 |  | 
|---|
| 781 | #endif                          // DRS_H | 
|---|