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
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
00336 void tpDataHeader(uint64_t startTime,
00337 const string& execBlockUID,
00338 uint32_t execBlockNum,
00339 uint32_t scanNum,
00340 uint32_t subscanNum,
00341 uint32_t numOfIntegrations,
00342 uint32_t numAntenna,
00343 SDMDataObject::DataStruct& dataStruct);
00344
00359 void addTPSubscan(uint64_t time,
00360 uint64_t interval,
00361 const vector<FLAGSTYPE>& flags,
00362 const vector<ACTUALTIMESTYPE>& actualTimes,
00363 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00364 const vector<AUTODATATYPE>& autoData);
00365
00394 void tpData(uint64_t startTime,
00395 const string& execBlockUID,
00396 uint32_t execBlockNum,
00397 uint32_t scanNum,
00398 uint32_t subscanNum,
00399 uint32_t numOfIntegrations,
00400 uint32_t numAntenna,
00401 const vector<SDMDataObject::Baseband>& basebands,
00402 uint64_t time,
00403 uint64_t interval,
00404 const vector<AxisName>& flagsAxes,
00405 const vector<FLAGSTYPE>& flags,
00406 const vector<AxisName>& actualTimesAxes,
00407 const vector<ACTUALTIMESTYPE>& actualTimes,
00408 const vector<AxisName>& actualDurationsAxes,
00409 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00410 const vector<AxisName>& autoDataAxes,
00411 const vector<AUTODATATYPE>& autoData);
00412
00435 void tpData(uint64_t startTime,
00436 const string& execBlockUID,
00437 uint32_t execBlockNum,
00438 uint32_t scanNum,
00439 uint32_t subscanNum,
00440 uint32_t numOfIntegrations,
00441 uint32_t numAntenna,
00442 const vector<SDMDataObject::Baseband>& basebands,
00443 uint64_t time,
00444 uint64_t interval,
00445 const vector<AxisName>& autoDataAxes,
00446 const vector<AUTODATATYPE>& autoData);
00447
00491 void wvrData (const string & execBlockUID,
00492 uint32_t execBlockNum,
00493 uint32_t scanNum,
00494 uint32_t subscanNum,
00495 uint32_t numTimes,
00496 uint32_t numAntennas,
00497 uint32_t numChannels,
00498 NetSideband netSideband,
00499 uint64_t time,
00500 uint64_t interval,
00501 const vector<AUTODATATYPE>& wvrData,
00502 const vector<FLAGSTYPE>& flags);
00503
00504
00520 void corrDataHeader(uint64_t startime,
00521 const string& execBlockUID,
00522 uint32_t execBlockNum,
00523 uint32_t scanNum,
00524 uint32_t subscanNum,
00525 uint32_t numAntenna,
00526 CorrelationMode correlationMode,
00527 const OptionalSpectralResolutionType& spectralResolutionType,
00528 SDMDataObject::DataStruct& dataStruct);
00529
00530
00553 void addIntegration(uint32_t integrationNum,
00554 uint64_t time,
00555 uint64_t interval,
00556 const vector<FLAGSTYPE>& flags,
00557 const vector<ACTUALTIMESTYPE>& actualTimes,
00558 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00559 const vector<ZEROLAGSTYPE>& zeroLags,
00560 const vector<INTCROSSDATATYPE>& crossData,
00561 const vector<AUTODATATYPE>& autoData);
00562
00563
00586 void addIntegration(uint32_t integrationNum,
00587 uint64_t time,
00588 uint64_t interval,
00589 const vector<FLAGSTYPE>& flags,
00590 const vector<ACTUALTIMESTYPE>& actualTimes,
00591 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00592 const vector<ZEROLAGSTYPE>& zeroLags,
00593 const vector<SHORTCROSSDATATYPE>& crossData,
00594 const vector<AUTODATATYPE>& autoData);
00595
00618 void addIntegration(uint32_t integrationNum,
00619 uint64_t time,
00620 uint64_t interval,
00621 const vector<FLAGSTYPE>& flags,
00622 const vector<ACTUALTIMESTYPE>& actualTimes,
00623 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00624 const vector<ZEROLAGSTYPE>& zeroLags,
00625 const vector<FLOATCROSSDATATYPE>& crossData,
00626 const vector<AUTODATATYPE>& autoData);
00627
00628
00652 void addSubintegration(uint32_t integrationNum,
00653 uint32_t subintegrationNum,
00654 uint64_t time,
00655 uint64_t interval,
00656 const vector<FLAGSTYPE>& flags,
00657 const vector<ACTUALTIMESTYPE>& actualTimes,
00658 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00659 const vector<ZEROLAGSTYPE>& zeroLags,
00660 const vector<INTCROSSDATATYPE>& crossData,
00661 const vector<AUTODATATYPE>& autoData);
00662
00663
00687 void addSubintegration(uint32_t integrationNum,
00688 uint32_t subintegrationNum,
00689 uint64_t time,
00690 uint64_t interval,
00691 const vector<FLAGSTYPE>& flags,
00692 const vector<ACTUALTIMESTYPE>& actualTimes,
00693 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00694 const vector<ZEROLAGSTYPE>& zeroLags,
00695 const vector<SHORTCROSSDATATYPE>& crossData,
00696 const vector<AUTODATATYPE>& autoData);
00697
00721 void addSubintegration(uint32_t integrationNum,
00722 uint32_t subintegrationNum,
00723 uint64_t time,
00724 uint64_t interval,
00725 const vector<FLAGSTYPE>& flags,
00726 const vector<ACTUALTIMESTYPE>& actualTimes,
00727 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00728 const vector<ZEROLAGSTYPE>& zeroLags,
00729 const vector<FLOATCROSSDATATYPE>& crossData,
00730 const vector<AUTODATATYPE>& autoData);
00731
00745 uint64_t numBytes();
00746
00747
00748 void output (const string& s);
00749 void outputln (const string& s);
00750 void output (const float* data, uint32_t numData);
00751 void outputln (const float* data, uint32_t numData);
00752 void outputln (const long long* data, uint32_t numData);
00753
00754 template <class T> void output(const vector<T>& data) {
00755 numBytes_ += data.size()*sizeof(T);
00756 switch (otype_) {
00757
00758 case STDOUT:
00759 cout.write((const char*)&data.at(0), data.size()*sizeof(T));
00760 break;
00761
00762 case MEMORY:
00763 oss_->write((const char*)&data.at(0), data.size()*sizeof(T));
00764 break;
00765
00766 case FILE:
00767 ofs_->write((const char*)&data.at(0), data.size()*sizeof(T));
00768 break;
00769 }
00770 }
00771
00772 template <class T> void outputln (const vector<T>& data) {
00773 output<T>(data);
00774 outputln();
00775 }
00776
00777 void outputln ();
00778
00779 void outputlnLocation(const string& name, const SDMDataSubset& sdmDataSubset);
00780
00781 private:
00782 enum OUTDEST {STDOUT, MEMORY, FILE};
00783 OUTDEST otype_;
00784 ofstream* ofs_;
00785 ostringstream* oss_;
00786
00787
00788 string uid_;
00789
00790
00791 string title_;
00792
00793
00794 string subscanPath_;
00795
00796
00797 SDMDataObject sdmDataObject_;
00798
00799
00800 uint32_t sdmDataSubsetNum_;
00801
00802
00803 static const string MIMEBOUNDARY_1;
00804 static const string MIMEBOUNDARY_2;
00805
00806
00807
00808 static const bool initClass_;
00809 static bool initClass();
00810
00811
00812 static vector<AxisName> WVRDATAAXES, WVRDATAFLAGSAXES;
00813
00814
00815 template <class Enum, class EnumHelper> static vector<Enum> enumvec(const string& strliterals) {
00816 vector<Enum> result;
00817
00818 string strliteral;
00819 stringstream ss(strliterals);
00820
00821 vector<string> tokens;
00822 while (ss >> strliteral)
00823 result.push_back(EnumHelper::literal(strliteral));
00824
00825 return result;
00826 }
00827
00828
00829 void preamble();
00830
00831
00832 void postamble();
00833
00834
00835 void addData(uint32_t integrationNum,
00836 uint32_t subintegrationNum,
00837 uint64_t time,
00838 uint64_t interval,
00839 const vector<FLAGSTYPE>& flags,
00840 const vector<ACTUALTIMESTYPE>& actualTimes,
00841 const vector<ACTUALDURATIONSTYPE>& actualDurations,
00842 const vector<ZEROLAGSTYPE>& zeroLags,
00843 const vector<INTCROSSDATATYPE>& intCrossData,
00844 const vector<SHORTCROSSDATATYPE>& shortCrossData,
00845 const vector<FLOATCROSSDATATYPE>& floatCrossData,
00846 const vector<AUTODATATYPE>& autoData);
00847
00848
00849 bool done_;
00850
00851
00852 uint64_t numBytes_;
00853
00854
00855
00856 enum States {START, S_TPDATA, S_TPDATAHEADER, S_ADDTPSUBSCAN, S_WVRDATA, S_CORRDATAHEADER, S_ADDINTEGRATION, S_ADDSUBINTEGRATION, END};
00857 enum Transitions {T_TPDATA, T_TPDATAHEADER, T_ADDTPSUBSCAN, T_WVRDATA, T_CORRDATAHEADER, T_ADDINTEGRATION, T_ADDSUBINTEGRATION, T_DONE};
00858 States currentState_;
00859
00860 void checkState(Transitions t, const string& methodName);
00861
00862 };
00863 }
00864 #endif // SDMDataObjectWriter_CLASS