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
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
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
00813 string uid_;
00814
00815
00816 string title_;
00817
00818
00819 string subscanPath_;
00820
00821
00822 SDMDataObject sdmDataObject_;
00823
00824
00825 uint32_t sdmDataSubsetNum_;
00826
00827
00828 static const string MIMEBOUNDARY_1;
00829 static const string MIMEBOUNDARY_2;
00830
00831
00832
00833 static const bool initClass_;
00834 static bool initClass();
00835
00836
00837 static vector<AxisName> WVRDATAAXES, WVRDATAFLAGSAXES;
00838
00839
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
00854 void preamble();
00855
00856
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
00874 bool done_;
00875
00876
00877 uint64_t numBytes_;
00878
00879
00880
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 }
00889 #endif // SDMDataObjectWriter_CLASS