/** * @file aevread.h * * @brief header file for Aera EVent READer library aevread * * @author weindl * * * */ #ifndef AEVREAD_H_ #define AEVREAD_H_ #include "AeraDefs.h" #include "AeraEvent.h" // version has format of: version - release - patch level, each number represented by two digits #define AEVREAD_VERSION_NUMBER 2 #define AEVREAD_RELEASE_NUMBER 0 #define AEVREAD_PATCH_NUMBER 04 #define AEVREAD_VERSION 20004 #define AEVREAD_VERSION_STRING "v02r00p04" #ifdef __x86_64__ #endif // __x86_64__ #ifdef __i386__ #endif // size in count of UINT16 #define EVB_HEADLEN_NL 30 // this is the size of the dutch header_length before 11.02.2011 (without EVENTBODY->version) //#define EVB_HEADLEN_FR XX // as there were no data before 11.02.2011, I assume always a version in eventbody of french data #define EVB_HEADLEN_DU 23 // this is the size of the german header_length before 11.02.2011 (without EVENTBODY->version) // german tracelength may be larger than 2048, then traces are cut in blocks, so the trace data contain sequently a block for each channel in mask, // and than again a block for each channel #define DE_TRACEBLOCK_LENGTH 2048 #define INFO_SIZE_MAX 65536 // use this "arbitrary" number in count of shorts as a limit for size of info in EVENTBODY - used as a check to prevent aevread from crashing #define ADC_SIZE_MAX 65536 // use this "arbitrary" number in count of shorts as a limit for size of adc-samples in EVENTBODY - used as a check to prevent aevread from crashing //#define LS_HWDU 0 // workaround for old german data, where this field has not been set yet #ifdef NOT_USED extern string afilename; extern int runID; extern int fileID; extern int actEvtNumber; #endif // ######### INTERNAL HELPER FUNCTIONS int extractFileIdFileNoFromFilename(const char *filename); int extractRunIdFileNoFromFilename(const char *filename); void freeEvbody(); bool validateAeraFileName(const char *filename); UINT16 get2ComplDE(UINT16 tmp); UINT16 getThresholdNL(char *); bool openAeraEventFile(const char *filename); void closeAeraEventFile(); // ######### GLOBAL FUNCTIONS // initAevread(); void setAevreadLoglevel(int lev); void setAevreadBufferedRead(bool trueFalse); int32_t getAevreadVersion(); const char* getAevreadVersionString(); // for conversion from UTC <-> GPS, a constant time offset is used, as there has been no additional second in the relevant period from mid 2010 to march 2011 #define UTC_GPS_OFFSET 315964800 #define LEAP_SECONDS_UNTIL_032011 15 #define AERA_UTC_GPS_OFFSET (UTC_GPS_OFFSET + LEAP_SECONDS_UNTIL_032011) // gilt nur bis 30.06.2012 23:59:60 UTC // TODO: am 30. Juni 2012 wurde um 23:59:60 UTC eine weitere Schaltsekunde hinzugefügt, die aber AERA nicht betrifft, weil seit März 2011 die Zeiten in GPS geschrieben werden #define LEAP_SECONDS_SINCE_20120701 16 // AW, 02.07.2012: nicht notwendig bisher // EXTRACTING EVENTS bool initAeraEventExtraction(const char* filename); // opens a file with the given filename bool extractAeraEventToFile(); // extracts the actual event to the file bool closeAeraEventExtraction(); // closes the file with the extracted events // ######### FILE HEADER bool readAeraFileHeader(); aera::aera_file_header* getAeraFileHeader(); // returns pointer to file header int32_t getAeraFileHeaderLength(); // length of file header in bytes int32_t getAeraFileHeaderRunId(); // run ID int32_t getAeraFileHeaderRunMode(); // run mode - calibration, test, normal, ... int32_t getAeraFileHeaderFileId(); // ID of file in run int32_t getAeraFileHeaderFirstEventId(); // ID of first event in file uint32_t getAeraFileHeaderFirstEventTime(); // time in seconds of first event in file int32_t getAeraFileHeaderLastEventId(); // ID of last event in file uint32_t getAeraFileHeaderLastEventTime(); // time in seconds of last event in file int32_t getAeraFileHeaderAdditionalInfoSize(); // size in bytes of additional header info int32_t *getAeraFileHeaderAdditionalInfo(); // returns pointer to additional header info // ######### EVENT aera::AeraEvent* getFirstAeraEvent(); aera::AeraEvent* getNextAeraEvent(); bool readAeraEvent(); bool readAeraEventHeader(); // getters for event Aera Event members int32_t getAeraEventLength(); // count of bytes of aera_event without sizeof(length) (( change to "and without lsdata" ???)) int32_t getAeraEventRunId(); // running index of run numbers int32_t getAeraEventVersion(); // include versioning? int32_t getAeraEventEventId(); // number of event in run int32_t getAeraEventRunningEventId(); // running number as created by t3_maker int32_t getAeraEventFirstLsId(); // ID of LS with earliest time //uint32_t getAeraEventSeconds(); // time in seconds of LS with earliest time, UTC based - replaced by getAeraEventGPSSeconds() since aevread-version 1.2.0 uint32_t getAeraEventGPSSeconds(); // time in seconds of LS with earliest time, GPS based int32_t getAeraEventNanoSeconds(); // resolution int32_t getAeraEventEventType(); // self triggered... bool getAeraEventIsSelfTriggered(); // if self triggered bool getAeraEventIsExternalT3Trigger(); // if externally triggered by SD or Gui bool getAeraEventIsExternalElTrigger(); // if externally triggered at ls electronics (signal generator, scintilator bool getAeraEventIsRandomTrigger(); // if randomly triggered (10s, ..) bool getAeraEventIsCalibTrigger(); // if calibration trigger int32_t getAeraEventEventVersion(); // starting with version 1 from 25.01.2011, first data with header field are from march 2011 from dutch electronics with version =2. German electronics uses this field since 6.04.2011 with version =2. int32_t *getAeraEventAdditionalInfo(); // real size calculated by: length - sizeof(... all other final elements ... ) int32_t getAeraEventAdditionalInfoSize(); // size in count of UINT16 of additional info space int32_t getAeraEventLsCount(); // count (N) of LS/datablocks in event (with timebased/runeventno merging, there may be more than one per LS) // ######### DATA bool actEventbodyHasVersion; // it is hard to distinguish which data have the version field in EVENTBODY and which not, so it is done once early on reading data bool readAeraEventData(); EVENTBODY* getAeraEventLsDataFromIndex(int lsindex); // gets index of ls in event, returns pointer to ls data in format struct EVENTBODY EVENTBODY* getAeraEventLsDataFromId(int lspos); // gets ls number/position, returns pointer to ls data in format struct EVENTBODY EVENTBODY* getAeraEventFirstLsData(); // like for AERA events in file, access first ls data in one event EVENTBODY* getAeraEventNextLsData(); // like for AERA events in file, access next ls data in one event UINT16 getAeraEvbLength(); // length in count of UINT16 UINT16 getAeraEvbEventNr(); // running event number created by T3 UINT16 getAeraEvbLsId(); // ID of local station UINT16 getAeraEvbHardwareType(); // hardware type of local station (aevb, dutch, french, german) bool getAeraEvbHardwareIsAevb(); // returns true for aevb (that means it is an empty event), false otherwise bool getAeraEvbHardwareIsDutch(); // returns true for dutch electronics, false otherwise bool getAeraEvbHardwareIsFrench(); // returns true for french electronics, false otherwise bool getAeraEvbHardwareIsGerman(); // returns true for german electronics, false otherwise UINT16 getAeraEvbHardwareVersion(); // returns hardware version of local station UINT16 getAeraEvbHeaderLength(); // returns header length in count of UINT16 uint32_t getAeraEvbGPSseconds(); // event time in seconds from GPS in UTC format uint32_t getAeraEvbGPSnanoseconds(); // event time in nanoseconds int32_t getAeraEvbChannelPresentCount(); // number of channels with data int32_t getAeraEvbInfoSize(); // size of info in count of UINT16 int32_t getAeraEvbAdcSize(); // size of traces in bytes UINT16 getAeraEvbTriggerFlag(); // trigger flag - just the bit mask bool getAeraEvbIsSelfTriggered(); // if self triggered bool getAeraEvbIsExternalT3Trigger(); // if externally triggered by SD OR Gui OR FD, be careful, only bit 0x10=external is checked, not the the separate bits SD, Gui, FD bool getAeraEvbIsExternalSDT3Trigger(); // if externally triggered by SD bool getAeraEvbIsExternalGuiT3Trigger(); // if externally triggered by Gui bool getAeraEvbIsExternalFDT3Trigger(); // if externally triggered by FD bool getAeraEvbIsExternalElTrigger(); // if externally triggered at ls electronics (signal generator, scintilator bool getAeraEvbIsRandomTrigger(); // if randomly triggered (10s, ..) bool getAeraEvbIsCalibTrigger(); // if calibration trigger UINT16 getAeraEvbTriggerPos(); // position of sample of time of request UINT16 getAeraEvbSamplingFreq(); // sampling frequency of ADC UINT16 getAeraEvbChannelMask(); // mask, indicating which of (up to four) channels have data bool getAeraEvbChannelXPresent(int channumber); // returns true, if channel X has data, false otherwise, X is from 1-4 bool getAeraEvbChannel1Present(); //returns true if channel 1 (first channel) has data, false otherwise bool getAeraEvbChannel2Present(); //returns true if channel 2 (second channel) has data, false otherwise bool getAeraEvbChannel3Present(); //returns true if channel 3 (third channel) has data, false otherwise bool getAeraEvbChannel4Present(); //returns true if channel 4 (fourth channel) has data, false otherwise #ifdef NOT_YET_DEFINED // mapping to direction is done via Offline configuration database bool getAeraEvbChannelEWPresent(); bool getAeraEvbChannelNSPresent(); bool getAeraEvbChannelVertPresent(); // bool getAeraEvbChannel...Present(); // what is in the fourth channel???? #endif // NOT_USED UINT16 *getAeraEvbChannelXData(int channumber); // returns pointer to data of channel X UINT16 *getAeraEvbChannel1Data(); // returns pointer to data of channel 1 UINT16 *getAeraEvbChannel2Data(); // returns pointer to data of channel 2 UINT16 *getAeraEvbChannel3Data(); // returns pointer to data of channel 3 UINT16 *getAeraEvbChannel4Data(); // returns pointer to data of channel 4 #ifdef NOT_YET_DEFINED // mapping to direction is done via Offline configuration database UINT16 *getAeraEvbChannelEWData(); UINT16 *getAeraEvbChannelNSData(); UINT16 *getAeraEvbChannelVertData(); // bool getAeraEvbChannel...Data(); #endif // NOT_USED UINT16 getAeraEvbADCresolution(); // resolution of ADC in bits UINT16 getAeraEvbNoiseThresholdX(int channelID); // returns noise threshold for channelID. channelID ranging from 1-4. Threshold may not be available for all channel/hardware combination, then 0xFFFF is returned UINT16 getAeraEvbNoiseThreshold1(); // returns noise threshold for channel 1 UINT16 getAeraEvbNoiseThreshold2(); // returns noise threshold for channel 2 UINT16 getAeraEvbNoiseThreshold3(); // returns noise threshold for channel 3 UINT16 getAeraEvbNoiseThreshold4(); // returns noise threshold for channel 4 UINT16 getAeraEvbSignalThresholdX(int channelID); // returns signal threshold for channelID. channelID ranging from 1-4. Threshold may not be available for all channel/hardware combination, then 0xFFFF is returned UINT16 getAeraEvbSignalThreshold1(); // returns signal threshold for channel 1 UINT16 getAeraEvbSignalThreshold2(); // returns signal threshold for channel 2 UINT16 getAeraEvbSignalThreshold3(); // returns signal threshold for channel 3 UINT16 getAeraEvbSignalThreshold4(); // returns signal threshold for channel 4 UINT16 getAeraEvbTracelength(); // ADtracelength in count of samples UINT16 getAeraEvbVersion(); // returns version of struct eventbody, only available since 11.02.2011 UINT16 *getAeraEvbInfoADCbuffer(); // returns pointer to beginning of Info buffer, to read info UINT16 *getAeraEvbADCbuffer(); // returns pointer to beginning of ADC buffer, to read traces #endif /* AEVREAD_H_ */