SDMDataObjectWriter.h

Go to the documentation of this file.
00001 #ifndef SDMDataObjectWriter_CLASS
00002 #define SDMDataObjectWriter_CLASS
00003 
00004 #include <string>
00005 #include <map>
00006 #include <set>
00007 #include <vector>
00008 #include <bitset>
00009 //#include <boost/regex.hpp> 
00010 
00011 #include <iostream>
00012 #include <fstream>
00013 #include <sstream>
00014 
00015 #include "SDMDataObject.h"
00016 
00017 #include "CAtmPhaseCorrection.h"
00018 #include "CCorrelationMode.h"
00019 #include "CCorrelatorType.h"
00020 #include "CNetSideband.h"
00021 #include "CProcessorType.h"
00022 
00023 
00024 using namespace std;
00025 
00026 using namespace AtmPhaseCorrectionMod;
00027 using namespace CorrelationModeMod;
00028 using namespace CorrelatorTypeMod;
00029 using namespace NetSidebandMod;
00030 using namespace ProcessorTypeMod;
00031 
00032 namespace asdmbinaries {
00036   class SDMDataObjectWriterException {
00037     
00038   public:
00042     SDMDataObjectWriterException();
00043 
00048     SDMDataObjectWriterException(const string& m);
00049     
00053     virtual ~SDMDataObjectWriterException();
00054 
00059     string getMessage() const;
00060     
00061   protected:
00062     string message;
00063     
00064   };
00065 
00066   inline SDMDataObjectWriterException::SDMDataObjectWriterException() : message ("SDMDataObjectWritererException") {}
00067   inline SDMDataObjectWriterException::SDMDataObjectWriterException(const string& m) : message(m) {}
00068   inline SDMDataObjectWriterException::~SDMDataObjectWriterException() {}
00069   inline string SDMDataObjectWriterException::getMessage() const {
00070     return "SDMDataObjectWriterException : " + message;
00071   }
00072 
00276   class SDMDataObjectWriter {
00277   public:
00278     
00285     SDMDataObjectWriter(const string& uid="uid://X0/X0/X0", const string& title="ALMA Binary Data");
00286 
00287 
00295     SDMDataObjectWriter(ofstream* ofs, const string& uid="uid://X0/X0/X0", const string& title="ALMA Binary Data");
00296 
00305     SDMDataObjectWriter(ostringstream* oss, const string& uid="uid://X0/X0/X0", const string& title="ALMA Binary Data");
00306 
00307 
00312     virtual ~SDMDataObjectWriter();
00313     
00314 
00321     void done();
00322     
00323 
00324     /* /\** */
00325     /*  * Writes a data subset of Total Power binary data. */
00326     /*  * @param time time of the subscan. */
00327     /*  * @param interval duration of the subscan. */
00328     /*  * @param flags the values of flags (see note). */
00329     /*  * @param actualTimes the values of actualTimes (see note). */
00330     /*  * @param actualDurations the values of actualDurations (see note). */
00331     /*  * @param autoData the values of autoData. */
00332     /*  * */
00333     /*  * @throws SDMDataObjectWriterException  */
00334     /*  * */
00335     /*  * @note */
00336     /*  * This method must called only once after a call to tpDataHeader. */
00337     /*  **\/ */
00338     /* void addTPSubscan(uint64_t time, */
00339     /*                uint64_t interval, */
00340     /*                const vector<FLAGSTYPE>& flags, */
00341     /*                const vector<ACTUALTIMESTYPE>& actualTimes, */
00342     /*                const vector<ACTUALDURATIONSTYPE>& actualDurations, */
00343     /*                const vector<AUTODATATYPE>& autoData); */
00344 
00373     void tpData(uint64_t startTime,
00374                 const string& execBlockUID,
00375                 uint32_t execBlockNum,
00376                 uint32_t scanNum,
00377                 uint32_t subscanNum,
00378                 uint32_t numOfIntegrations,
00379                 uint32_t numAntenna,
00380                 const vector<SDMDataObject::Baseband>& basebands,
00381                 uint64_t time,
00382                 uint64_t interval,
00383                 const vector<AxisName>& flagsAxes,
00384                 const vector<FLAGSTYPE>& flags,
00385                 const vector<AxisName>& actualTimesAxes,
00386                 const vector<ACTUALTIMESTYPE>& actualTimes,
00387                 const vector<AxisName>& actualDurationsAxes,
00388                 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00389                 const vector<AxisName>& autoDataAxes,
00390                 const vector<AUTODATATYPE>& autoData);
00391 
00414     void tpData(uint64_t startTime,
00415                 const string& execBlockUID,
00416                 uint32_t execBlockNum,
00417                 uint32_t scanNum,
00418                 uint32_t subscanNum,
00419                 uint32_t numOfIntegrations,
00420                 uint32_t numAntenna,
00421                 const vector<SDMDataObject::Baseband>& basebands,
00422                 uint64_t time,
00423                 uint64_t interval,
00424                 const vector<AxisName>& autoDataAxes,
00425                 const vector<AUTODATATYPE>& autoData);
00426 
00441     void tpDataHeader(uint64_t startTime,
00442                       const string& execBlockUID,
00443                       uint32_t execBlockNum,
00444                       uint32_t scanNum,
00445                       uint32_t subscanNum,
00446                       uint32_t numAntenna,
00447               SDMDataObject::DataStruct& dataStruct);
00448 
00465     void tpAddIntegration(uint32_t integrationNum,
00466                           uint64_t time,
00467                           uint64_t interval,
00468                           const vector<FLAGSTYPE>& flags,
00469                           const vector<ACTUALTIMESTYPE>& actualTimes,
00470                           const vector<ACTUALDURATIONSTYPE>& actualDurations,
00471                           const vector<AUTODATATYPE>& autoData);
00472 
00516     void wvrData (const string & execBlockUID,
00517                   uint32_t execBlockNum,
00518                   uint32_t scanNum,
00519                   uint32_t subscanNum,
00520                   uint32_t numTimes,
00521                   uint32_t numAntennas,
00522                   uint32_t numChannels,
00523                   NetSideband  netSideband,
00524                   uint64_t time,
00525                   uint64_t interval,
00526                   const vector<AUTODATATYPE>& wvrData,
00527                   const vector<FLAGSTYPE>& flags);
00528   
00529   
00545     void corrDataHeader(uint64_t startime,
00546                         const string& execBlockUID,
00547                         uint32_t execBlockNum,
00548                         uint32_t scanNum,
00549                         uint32_t subscanNum,
00550                         uint32_t numAntenna,
00551                         CorrelationMode correlationMode,
00552                         const OptionalSpectralResolutionType& spectralResolutionType,
00553                         SDMDataObject::DataStruct& dataStruct);
00554 
00555 
00578     void addIntegration(uint32_t integrationNum,
00579                         uint64_t time,
00580                         uint64_t interval,
00581                         const vector<FLAGSTYPE>& flags,
00582                         const vector<ACTUALTIMESTYPE>& actualTimes,
00583                         const vector<ACTUALDURATIONSTYPE>& actualDurations,
00584                         const vector<ZEROLAGSTYPE>& zeroLags,
00585                         const vector<INTCROSSDATATYPE>& crossData,
00586                         const vector<AUTODATATYPE>& autoData);
00587     
00588 
00611     void addIntegration(uint32_t integrationNum,
00612                         uint64_t time,
00613                         uint64_t interval,
00614                         const vector<FLAGSTYPE>& flags,
00615                         const vector<ACTUALTIMESTYPE>& actualTimes,
00616                         const vector<ACTUALDURATIONSTYPE>& actualDurations,
00617                         const vector<ZEROLAGSTYPE>& zeroLags,
00618                         const vector<SHORTCROSSDATATYPE>& crossData,
00619                         const vector<AUTODATATYPE>& autoData);
00620 
00643     void addIntegration(uint32_t integrationNum,
00644                         uint64_t time,
00645                         uint64_t interval,
00646                         const vector<FLAGSTYPE>& flags,
00647                         const vector<ACTUALTIMESTYPE>& actualTimes,
00648                         const vector<ACTUALDURATIONSTYPE>& actualDurations,
00649                         const vector<ZEROLAGSTYPE>& zeroLags,
00650                         const vector<FLOATCROSSDATATYPE>& crossData,
00651                         const vector<AUTODATATYPE>& autoData);
00652 
00653 
00677     void addSubintegration(uint32_t integrationNum,
00678                            uint32_t subintegrationNum,
00679                            uint64_t time,
00680                            uint64_t interval,
00681                            const vector<FLAGSTYPE>& flags,
00682                            const vector<ACTUALTIMESTYPE>& actualTimes,
00683                            const vector<ACTUALDURATIONSTYPE>& actualDurations,
00684                            const vector<ZEROLAGSTYPE>& zeroLags,
00685                            const vector<INTCROSSDATATYPE>& crossData,
00686                            const vector<AUTODATATYPE>& autoData);
00687     
00688 
00712     void addSubintegration(uint32_t integrationNum,
00713                            uint32_t subintegrationNum,
00714                            uint64_t time,
00715                            uint64_t interval,
00716                            const vector<FLAGSTYPE>& flags,
00717                            const vector<ACTUALTIMESTYPE>& actualTimes,
00718                            const vector<ACTUALDURATIONSTYPE>& actualDurations,
00719                            const vector<ZEROLAGSTYPE>& zeroLags,
00720                            const vector<SHORTCROSSDATATYPE>& crossData,
00721                            const vector<AUTODATATYPE>& autoData);
00722 
00746     void addSubintegration(uint32_t integrationNum,
00747                            uint32_t subintegrationNum,
00748                            uint64_t time,
00749                            uint64_t interval,
00750                            const vector<FLAGSTYPE>& flags,
00751                            const vector<ACTUALTIMESTYPE>& actualTimes,
00752                            const vector<ACTUALDURATIONSTYPE>& actualDurations,
00753                            const vector<ZEROLAGSTYPE>& zeroLags,
00754                            const vector<FLOATCROSSDATATYPE>& crossData,
00755                            const vector<AUTODATATYPE>& autoData);
00756 
00770     uint64_t numBytes(); 
00771       
00772     
00773     void output   (const string& s);    
00774     void outputln (const string& s);
00775     void output   (const float* data, uint32_t numData);
00776     void outputln (const float* data, uint32_t numData);
00777     void outputln (const long long* data, uint32_t numData);
00778 
00779     template <class T> void output(const vector<T>& data) {
00780       numBytes_ += data.size()*sizeof(T);
00781       switch (otype_) {
00782 
00783       case STDOUT:
00784         cout.write((const char*)&data.at(0), data.size()*sizeof(T));
00785         break;
00786         
00787       case MEMORY:
00788         oss_->write((const char*)&data.at(0), data.size()*sizeof(T));
00789         break;
00790         
00791       case FILE:
00792         ofs_->write((const char*)&data.at(0), data.size()*sizeof(T));
00793         break;
00794       }       
00795     }
00796 
00797     template <class T> void outputln (const vector<T>& data) {
00798       output<T>(data);
00799       outputln();
00800     }
00801     
00802     void outputln ();
00803 
00804     void outputlnLocation(const string& name, const SDMDataSubset& sdmDataSubset);
00805     
00806   private:
00807     enum OUTDEST {STDOUT, MEMORY, FILE};
00808     OUTDEST otype_;
00809     ofstream*       ofs_;
00810     ostringstream*  oss_;
00811 
00812     // The ALMA uid of the MIME message.
00813     string uid_;
00814 
00815     // The title of the binary data.
00816     string title_;
00817 
00818     // The subscan path.
00819     string subscanPath_;
00820 
00821     // An SDMDataObject
00822     SDMDataObject sdmDataObject_;
00823 
00824     // The number of the SDMDataSubset being written
00825     uint32_t sdmDataSubsetNum_;
00826 
00827     // Two strings used as MIME boundaries
00828     static const string MIMEBOUNDARY_1;
00829     static const string MIMEBOUNDARY_2;
00830 
00831 
00832     // Class initialization stuff
00833     static const bool initClass_;
00834     static bool initClass();
00835 
00836     // The axes names definitions for WVR data and their related flags.
00837     static vector<AxisName> WVRDATAAXES, WVRDATAFLAGSAXES;
00838 
00839     // A utility to fill a vector of <Enum> from a an array of c-strings.
00840     template <class Enum, class EnumHelper> static vector<Enum> enumvec(const string& strliterals) {
00841       vector<Enum> result;
00842       
00843       string strliteral;
00844       stringstream ss(strliterals);
00845       
00846       vector<string> tokens;   
00847       while (ss >> strliteral)
00848         result.push_back(EnumHelper::literal(strliteral));
00849       
00850       return result;     
00851     }
00852 
00853     // Writes the very first part of the MIME message.
00854     void preamble();
00855 
00856     // Write the very end of the MIME message.
00857     void postamble();
00858 
00859 
00860     void addData(uint32_t integrationNum,
00861                  uint32_t subintegrationNum,
00862                  uint64_t time,
00863                  uint64_t interval,
00864                  const vector<FLAGSTYPE>& flags,
00865                  const vector<ACTUALTIMESTYPE>& actualTimes,
00866                  const vector<ACTUALDURATIONSTYPE>& actualDurations,
00867                  const vector<ZEROLAGSTYPE>& zeroLags,
00868                  const vector<INTCROSSDATATYPE>& intCrossData,
00869                  const vector<SHORTCROSSDATATYPE>& shortCrossData,
00870                  const vector<FLOATCROSSDATATYPE>& floatCrossData,
00871                  const vector<AUTODATATYPE>& autoData);
00872 
00873     // Are we done with this ?
00874     bool done_;
00875 
00876     // The number of bytes written so far.
00877     uint64_t numBytes_;
00878 
00879 
00880     // A small finite state automaton to control the usage of SDMDataObjectWriter.
00881     enum States {START, S_TPDATA, S_TPDATAHEADER, S_ADDTPSUBSCAN, S_ADDTPINTEGRATION, S_WVRDATA, S_CORRDATAHEADER, S_ADDINTEGRATION, S_ADDSUBINTEGRATION, END};
00882     enum Transitions {T_TPDATA, T_TPDATAHEADER, T_ADDTPSUBSCAN, T_ADDTPINTEGRATION, T_WVRDATA, T_CORRDATAHEADER, T_ADDINTEGRATION, T_ADDSUBINTEGRATION, T_DONE};
00883     States currentState_;
00884 
00885     void checkState(Transitions t, const string& methodName);
00886 
00887   };
00888 } // namespace asdmbinaries
00889 #endif // SDMDataObjectWriter_CLASS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 31 Aug 2016 for casa by  doxygen 1.6.1