LCOV - code coverage report
Current view: top level - alma/ASDMBinaries - SDMDataObject.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 6 955 0.6 %
Date: 2025-12-12 18:59:20 Functions: 3 176 1.7 %

          Line data    Source code
       1             : #include <alma/ASDMBinaries/SDMDataObject.h>
       2             : #include <alma/ASDMBinaries/SDMDataObjectParser.h>
       3             : #include <algorithm>
       4             : #include <iostream>
       5             : #include <iterator>
       6             : #include <iostream>
       7             : #include <sstream>
       8             : 
       9             : #ifndef WITHOUT_BOOST
      10             : #include <boost/range/iterator_range.hpp>
      11             : #include <boost/algorithm/string/find.hpp>
      12             : #endif
      13             : 
      14             : using namespace AtmPhaseCorrectionMod;
      15             : using namespace AxisNameMod;
      16             : using namespace BasebandNameMod;
      17             : using namespace CorrelationModeMod;
      18             : using namespace CorrelatorTypeMod;
      19             : using namespace NetSidebandMod;
      20             : using namespace PrimitiveDataTypeMod;
      21             : using namespace ProcessorTypeMod;
      22             : using namespace SpectralResolutionTypeMod;
      23             : using namespace StokesParameterMod;
      24             : 
      25             : using namespace std;
      26             : 
      27             : namespace asdmbinaries {
      28             : 
      29             :   // Initialization section.
      30             :   //
      31             :   vector<string> SDMDataObject::axes;
      32             :   vector<string> SDMDataObject::correlationModeRefs;
      33             :   vector<string> SDMDataObject::types;
      34             :   vector<string> SDMDataObject::apcs;
      35             : 
      36             :   const bool SDMDataObject::_init = SDMDataObject::init();
      37          11 :   bool SDMDataObject::init() {
      38          11 :     return true;
      39             :   }
      40             : 
      41             :   // A regular expression to define the syntax of a spectral window identifier.
      42             :   const std::regex SDMDataObject::SPWID("[0-9]+");
      43             :   
      44             :   // SDMDataObject::SpectralWindow:: methods
      45             :   //
      46           0 :   SDMDataObject::SpectralWindow::SpectralWindow():
      47           0 :     scaleFactor_(0.0),
      48           0 :     numSpectralPoint_(0),
      49           0 :     numBin_(0)
      50           0 :   {owner_ = 0; strSw_ = ""; strImage_ = "";}
      51             :   
      52           0 :   SDMDataObject::SpectralWindow::~SpectralWindow() {;}
      53             :   
      54           0 :   SDMDataObject::SpectralWindow::SpectralWindow(const vector<StokesParameter>& crossPolProducts,
      55             :                                                 float scaleFactor, unsigned int numSpectralPoint,
      56             :                                                 unsigned int numBin,
      57           0 :                                                 NetSidebandMod::NetSideband sideband):
      58           0 :     crossPolProducts_(crossPolProducts),
      59           0 :     scaleFactor_(scaleFactor),
      60           0 :     numSpectralPoint_(numSpectralPoint),
      61           0 :     numBin_(numBin),
      62           0 :     sideband_(sideband)
      63           0 :   {owner_ = 0;  strSw_ = ""; strImage_ = "";}
      64             :   
      65           0 :   SDMDataObject::SpectralWindow::SpectralWindow::SpectralWindow(const vector<StokesParameter>& sdPolProducts,
      66             :                                                                 unsigned int numSpectralPoint,
      67             :                                                                 unsigned numBin,
      68           0 :                                                                 NetSidebandMod::NetSideband sideband):
      69           0 :     sdPolProducts_(sdPolProducts),
      70           0 :     numSpectralPoint_(numSpectralPoint),
      71           0 :     numBin_(numBin),
      72           0 :     sideband_(sideband)
      73           0 :   {owner_ = 0; strSw_ = ""; strImage_ = "";}
      74             :   
      75           0 :   SDMDataObject::SpectralWindow::SpectralWindow(const vector<StokesParameter>& crossPolProducts,
      76             :                                                 const vector<StokesParameter>& sdPolProducts,
      77             :                                                 float scaleFactor,
      78             :                                                 unsigned int numSpectralPoint,
      79             :                                                 unsigned int numBin,
      80           0 :                                                 NetSidebandMod::NetSideband sideband):
      81           0 :     crossPolProducts_(crossPolProducts),
      82           0 :     sdPolProducts_(sdPolProducts),
      83           0 :     scaleFactor_(scaleFactor),
      84           0 :     numSpectralPoint_(numSpectralPoint),
      85           0 :     numBin_(numBin),
      86           0 :     sideband_(sideband)
      87           0 :   {owner_ = 0; strSw_ = ""; strImage_ = "";}
      88             :   
      89           0 :   const vector<StokesParameter>& SDMDataObject::SpectralWindow::crossPolProducts() const { 
      90           0 :     if (owner_ && (owner_->isTP() || owner_->correlationMode() == AUTO_ONLY)) Utils::invalidCall("SDMDataObject::SpectralWindow::crossPolProducts", owner_);
      91           0 :     return crossPolProducts_; 
      92             :   }
      93             : 
      94             :   //  void SDMDataObject::SpectralWindow::crossPolProducts(const vector<StokesParameter>& value) { crossPolProducts_ = value; }
      95             : 
      96           0 :   const vector<StokesParameter>& SDMDataObject::SpectralWindow::sdPolProducts() const { 
      97           0 :     if (owner_ && (owner_->correlationMode() == CROSS_ONLY)) Utils::invalidCall("SDMDataObject::SpectralWindow::sdPolProducts", owner_);
      98           0 :     return sdPolProducts_; 
      99             :   }
     100             : 
     101             :   //  void SDMDataObject::SpectralWindow::sdPolProducts(const vector<StokesParameter>& value) { sdPolProducts_ = value; }
     102             : 
     103           0 :   float SDMDataObject::SpectralWindow::scaleFactor() const { 
     104           0 :     if (owner_ && owner_->correlationMode() == AUTO_ONLY) Utils::invalidCall("SDMDataObject::SpectralWindow::scaleFactor", owner_);    
     105           0 :     return scaleFactor_; 
     106             :   }
     107             :   //  void SDMDataObject::SpectralWindow::scaleFactor(float value )  { scaleFactor_ = value; }
     108             :   
     109           0 :   unsigned int SDMDataObject::SpectralWindow::numSpectralPoint() const { return numSpectralPoint_; }
     110             :   //  void SDMDataObject::SpectralWindow::numSpectralPoint(unsigned int value)  { numSpectralPoint_ = value; }
     111             : 
     112           0 :   unsigned int SDMDataObject::SpectralWindow::numBin() const { return numBin_; }
     113             :   //  void SDMDataObject::SpectralWindow::numBin(unsigned int value) { numBin_ = value; }
     114             : 
     115           0 :   void SDMDataObject::SpectralWindow::owner(const SDMDataObject* o) { owner_ = o; }
     116             : 
     117           0 :   NetSidebandMod::NetSideband SDMDataObject::SpectralWindow::sideband() const { return sideband_; }
     118             : 
     119           0 :   void SDMDataObject::SpectralWindow::strImage(const string& s) {
     120           0 :     std::cmatch what;
     121           0 :     if ((s.size() == 0) || regex_match(s.c_str(), what, SDMDataObject::SPWID)) {
     122           0 :       strImage_ = s;
     123             :     }
     124             :     else
     125           0 :       throw SDMDataObjectException("SpectralWindow::strImage : '" + s + "' is an invalid string to identify a spectral window.");
     126           0 :   }
     127             : 
     128           0 :   const string& SDMDataObject::SpectralWindow::strImage() const { return strImage_; }
     129             : 
     130           0 :   void SDMDataObject::SpectralWindow::strSw(const string& s) {
     131           0 :     std::cmatch what;
     132           0 :     if ((s.size() == 0) || regex_match(s.c_str(), what, SDMDataObject::SPWID)) {
     133           0 :       strSw_ = s;
     134             :     }
     135             :     else
     136           0 :       throw SDMDataObjectException("SpectralWindow::strSw :  '" + s + "' is an invalid string to identify a spectral window.");
     137           0 :   }
     138             : 
     139           0 :   const string& SDMDataObject::SpectralWindow::strSw() const { return strSw_; }
     140             : 
     141             :   // SDMDataObject::SpectralWindow::
     142             : 
     143             : 
     144             :   // SDMDataObject::Baseband methods
     145             :   //
     146           0 :   SDMDataObject::Baseband::Baseband() {owner_ = 0;}
     147             :   
     148           0 :   SDMDataObject::Baseband::Baseband(BasebandName name,
     149           0 :                                     const vector<SpectralWindow>& spectralWindows):
     150           0 :     name_(name),
     151           0 :     spectralWindows_(spectralWindows) {owner_ = 0;}
     152             : 
     153             : 
     154           0 :   SDMDataObject::Baseband::~Baseband() {;}
     155             :   
     156           0 :   BasebandName SDMDataObject::Baseband::name() const { 
     157           0 :     return name_; 
     158             :   }
     159             : 
     160             :   //  void SDMDataObject::Baseband::ref(BasebandName value) { ref_ = value; }
     161             :   
     162           0 :   const vector<SDMDataObject::SpectralWindow>& SDMDataObject::Baseband::spectralWindows() const { return spectralWindows_; }
     163           0 :   void SDMDataObject::Baseband::spectralWindows(const vector<SDMDataObject::SpectralWindow>& value) { spectralWindows_ = value; }
     164           0 :   void SDMDataObject::Baseband::owner(const SDMDataObject* o) {owner_ = o; }
     165             :   // SDMDataObject::Baseband::
     166             : 
     167             :   // SDMDataObject::BinaryPart:: methods
     168             :   //
     169           0 :   SDMDataObject::BinaryPart::BinaryPart() {owner_ = 0; size_ = 0;}
     170           0 :   SDMDataObject::BinaryPart::~BinaryPart() {;}
     171             :   
     172             :   
     173           0 :   SDMDataObject::BinaryPart::BinaryPart( unsigned int size,
     174           0 :                                          const vector<AxisName>& axes):
     175           0 :     size_(size),
     176           0 :     axes_(axes){owner_ = 0;}
     177             :   
     178             :   
     179           0 :   unsigned int SDMDataObject::BinaryPart::size() const { return size_; }
     180             :   //  void SDMDataObject::BinaryPart::size (unsigned int value) { size_ = value; }
     181             :   
     182           0 :   const vector<AxisName>& SDMDataObject::BinaryPart::axes() const { return axes_; }
     183             :   //  void SDMDataObject::BinaryPart::axes (const vector<AxisName>& axes) { axes_ = axes; }
     184             : 
     185           0 :   void SDMDataObject::BinaryPart::owner(const SDMDataObject* o) { owner_ = o; }
     186             :   // SDMDataObject::BinaryPart
     187             :   
     188             :   // SDMDataObject::AutoDataBinaryPart:: methods
     189           0 :   SDMDataObject::AutoDataBinaryPart::AutoDataBinaryPart(): BinaryPart() { normalized_ = false; }
     190           0 :   SDMDataObject::AutoDataBinaryPart::~AutoDataBinaryPart() {;}
     191             : 
     192           0 :   SDMDataObject::AutoDataBinaryPart::AutoDataBinaryPart(unsigned int size,
     193             :                                                         const vector<AxisName>& axes,
     194           0 :                                                         bool normalized) : BinaryPart(size, axes) {
     195           0 :     normalized_ = normalized;
     196           0 :   }
     197             : 
     198           0 :   bool SDMDataObject::AutoDataBinaryPart::normalized() const { return normalized_; }
     199             : 
     200             :   // SDMDataObject::AutoDataBinaryPart::
     201             : 
     202             :   // SDMDataObject::ZeroLagsBinaryPart:: methods
     203           0 :   SDMDataObject::ZeroLagsBinaryPart::ZeroLagsBinaryPart(): BinaryPart() { correlatorType_ = XF; }
     204           0 :   SDMDataObject::ZeroLagsBinaryPart::~ZeroLagsBinaryPart() {;}
     205             : 
     206           0 :   SDMDataObject::ZeroLagsBinaryPart::ZeroLagsBinaryPart(unsigned int size,
     207             :                                                         const vector<AxisName>& axes,
     208           0 :                                                         CorrelatorType correlatorType) : BinaryPart(size, axes) {
     209           0 :     correlatorType_ = correlatorType;
     210           0 :   }
     211             : 
     212           0 :   CorrelatorType SDMDataObject::ZeroLagsBinaryPart::correlatorType() const { return correlatorType_; }
     213             : 
     214             :   // SDMDataObject::ZeroLagsBinaryPart::
     215             : 
     216             :   // SDMDataObject::DataStruct:: methods
     217             :   //
     218             : 
     219             :   /**
     220             :    * The empty constructor.
     221             :    *
     222             :    * @note This constructor should never be used.
     223             :    */
     224           0 :   SDMDataObject::DataStruct::DataStruct() {owner_ = 0;}
     225             : 
     226             :   /**
     227             :    * The destructor.
     228             :    */
     229           0 :   SDMDataObject::DataStruct::~DataStruct() {;}
     230             : 
     231             : 
     232             :   /** 
     233             :    * The full constructor.
     234             :    */
     235           0 :   SDMDataObject::DataStruct::DataStruct(const vector<AtmPhaseCorrection>& apc,
     236             :                                         const vector<Baseband>& basebands,
     237             :                                         const BinaryPart& flags,
     238             :                                         const BinaryPart& actualTimes,
     239             :                                         const BinaryPart& actualDurations,
     240             :                                         const ZeroLagsBinaryPart& zeroLags,
     241             :                                         const BinaryPart& crossData,
     242             :                                         const AutoDataBinaryPart& autoData
     243           0 :                                         ):apc_(apc),
     244           0 :                                           basebands_(basebands),
     245           0 :                                           flags_(flags),
     246           0 :                                           actualTimes_(actualTimes),
     247           0 :                                           actualDurations_(actualDurations),
     248           0 :                                           zeroLags_(zeroLags),
     249           0 :                                           crossData_(crossData),
     250           0 :                                           autoData_(autoData)
     251             :   {
     252           0 :     owner_ = 0;
     253           0 :   }      
     254           0 :   const vector<AtmPhaseCorrection>& SDMDataObject::DataStruct::apc() const { return apc_; }
     255             :   //  void SDMDataObject::DataStruct::apc(const vector<AtmPhaseCorrection>& value) { apc_ = value; }
     256             :   
     257           0 :   const vector<SDMDataObject::Baseband>& SDMDataObject::DataStruct::basebands() const { return basebands_; }
     258             :   //  void SDMDataObject::DataStruct::basebands(const vector<SDMDataObject::Baseband>& value) { basebands_ = value; }
     259             :   
     260           0 :   const SDMDataObject::BinaryPart& SDMDataObject::DataStruct::flags() const { return flags_;}
     261             :   //  void SDMDataObject::DataStruct::flags(const SDMDataObject::BinaryPart& value) { flags_ = value; }
     262             :   
     263           0 :   const SDMDataObject::BinaryPart& SDMDataObject::DataStruct::actualTimes() const { return actualTimes_;}
     264             :   //  void SDMDataObject::DataStruct::actualTimes(const SDMDataObject::BinaryPart& value) { actualTimes_ = value; }
     265             :  
     266           0 :   const SDMDataObject::BinaryPart& SDMDataObject::DataStruct::actualDurations() const { return actualDurations_;}
     267             :   //  void SDMDataObject::DataStruct::actualDurations(const SDMDataObject::BinaryPart& value) { actualDurations_ = value; }
     268             :   
     269           0 :   const SDMDataObject::ZeroLagsBinaryPart& SDMDataObject::DataStruct::zeroLags() const { 
     270           0 :     if (owner_ && owner_->isTP()) Utils::invalidCall("SDMDataObject::DataStruct::zeroLags", owner_);
     271           0 :     return zeroLags_;
     272             :   } 
     273             : 
     274             :   //  void SDMDataObject::DataStruct::zeroLags(const SDMDataObject::BinaryPart& value) { 
     275             :   //    if (owner_ && owner_->isTP()) Utils::invalidCall("SDMDataObject::DataStruct::zeroLags", owner_);
     276             :   //    zeroLags_ = value;
     277             :   //  }
     278             : 
     279           0 :   const SDMDataObject::BinaryPart& SDMDataObject::DataStruct::crossData() const { return crossData_;}
     280             :   //  void SDMDataObject::DataStruct::crossData(const SDMDataObject::BinaryPart& value) { crossData_ = value; }
     281             :   
     282           0 :   const SDMDataObject::AutoDataBinaryPart& SDMDataObject::DataStruct::autoData() const { return autoData_;} 
     283             :   //  void SDMDataObject::DataStruct::autoData(const SDMDataObject::BinaryPart& value) { autoData_ = value; }
     284           0 :   void SDMDataObject::DataStruct::owner(const SDMDataObject* o) { owner_ = o; }
     285             : 
     286           0 :   void SDMDataObject::DataStruct::checkCoordinate(unsigned int ibb, unsigned int ispw) const {
     287           0 :     ostringstream oss;
     288             : 
     289           0 :     if (ibb >= basebands_.size()) {
     290           0 :       oss << "In '("<< ibb << "," << ispw <<")' '" << ibb << "' is invalid as a baseband index, it should not exceed '" << basebands_.size()-1 << "'";
     291           0 :       throw SDMDataObjectException(oss.str());
     292             :     }
     293             :      
     294           0 :     if (ispw >= basebands_.at(ibb).spectralWindows().size()) {
     295           0 :       oss << "In '("<< ibb << "," << ispw <<")' '" << ispw << "' is invalid as a spectral window index, it should not exceed '" << basebands_.at(ibb).spectralWindows().size()-1 << "'";
     296             :     }    
     297           0 :   }
     298             : 
     299           0 :   bool SDMDataObject::DataStruct::associatedSPW(unsigned int ibb,
     300             :                                                 unsigned int ispw1,
     301             :                                                 unsigned int ispw2) {
     302           0 :     checkCoordinate(ibb, ispw1);
     303           0 :     checkCoordinate(ibb, ispw2);
     304             : 
     305           0 :     ostringstream oss;
     306           0 :     oss << ibb << " " << ispw1;
     307           0 :     string key = oss.str();
     308             : 
     309           0 :     oss.str("");
     310             :     
     311           0 :     oss << ibb << " " << ispw2;
     312           0 :     string value = oss.str();
     313             :     
     314           0 :     map<string, string>::iterator iter1 = imageSPW_.find(key);
     315           0 :     map<string, string>::iterator iter2 = imageOfSPW_.find(key);
     316             : 
     317           0 :     return ( ((iter1 != imageSPW_.end()) && ((iter1->second).compare(value) == 0))
     318           0 :              ||
     319           0 :              ((iter2 != imageOfSPW_.end()) && ((iter2->second).compare(value) == 0))
     320           0 :              );
     321           0 :   }
     322             : 
     323           0 :   void SDMDataObject::DataStruct::divorceSPW(unsigned int ibb, unsigned int ispw) {
     324           0 :     checkCoordinate(ibb, ispw);
     325             : 
     326           0 :     ostringstream oss;
     327           0 :     oss << ibb << " " << ispw; 
     328           0 :     string key = oss.str();
     329           0 :     map<string, string>::iterator iter0, iter1;
     330           0 :     if ((iter0 = imageSPW_.find(key)) != imageSPW_.end()) {
     331           0 :       if ((iter1 = imageOfSPW_.find(iter0->second)) != imageOfSPW_.end()) {
     332           0 :         imageOfSPW_.erase(iter1);
     333             :       }
     334           0 :       imageSPW_.erase(iter0);
     335             :     }
     336           0 :   }
     337             : 
     338           0 :   void SDMDataObject::DataStruct::imageSPW(unsigned int ibb,
     339             :                                            unsigned int ispw1,
     340             :                                            unsigned int ispw2) {
     341           0 :     checkCoordinate(ibb, ispw1);
     342           0 :     checkCoordinate(ibb, ispw2);
     343             :     
     344           0 :     if (!associatedSPW(ibb, ispw1, ispw2)) {
     345           0 :       divorceSPW(ibb, ispw1);
     346           0 :       divorceSPW(ibb, ispw2);
     347             :     }
     348             : 
     349           0 :     ostringstream oss;
     350             : 
     351           0 :     oss << ibb << " " << ispw1;
     352           0 :     string key = oss.str();
     353             : 
     354           0 :     oss.str("");
     355           0 :     oss << ibb << " " << ispw2;
     356           0 :     string value = oss.str();
     357           0 :     imageSPW_[key] = value;
     358           0 :     imageOfSPW_[value] = key;
     359           0 :   }
     360             : 
     361           0 :   void SDMDataObject::DataStruct::imageOfSPW(unsigned int ibb,
     362             :                                              unsigned int ispw1,
     363             :                                              unsigned int ispw2) {
     364           0 :     imageSPW(ibb,ispw2,ispw1);
     365           0 :   }
     366             : 
     367           0 :   const SDMDataObject::SpectralWindow* SDMDataObject::DataStruct::imageSPW(unsigned int ibb,
     368             :                                                                            unsigned int ispw) const {
     369           0 :     checkCoordinate(ibb, ispw);
     370             : 
     371           0 :     ostringstream oss;
     372             : 
     373           0 :     oss << ibb << " " << ispw;
     374           0 :     string key = oss.str();
     375             : 
     376           0 :     map<string, string>::const_iterator iter;
     377           0 :     if ((iter = imageSPW_.find(key)) == imageSPW_.end())
     378           0 :       return 0;
     379             : 
     380             :     unsigned int ibbImage;
     381             :     unsigned int ispwImage;
     382             : 
     383           0 :     istringstream iss(iter->second);
     384           0 :     iss >> ibbImage;
     385           0 :     iss >> ispwImage;
     386           0 :     checkCoordinate (ibbImage, ispwImage);
     387             : 
     388           0 :     return &(basebands_.at(ibbImage).spectralWindows().at(ispwImage));
     389           0 :   }
     390             : 
     391             : 
     392           0 :   const SDMDataObject::SpectralWindow* SDMDataObject::DataStruct::imageOfSPW(unsigned int ibb,
     393             :                                                                              unsigned int ispw) const {
     394           0 :     checkCoordinate(ibb, ispw);
     395             : 
     396           0 :     ostringstream oss;
     397             : 
     398           0 :     oss << ibb << " " << ispw;
     399           0 :     string key = oss.str();
     400             : 
     401           0 :     map<string, string>::const_iterator iter;
     402           0 :     if ((iter = imageOfSPW_.find(key)) == imageOfSPW_.end())
     403           0 :       return 0;
     404             : 
     405             :     unsigned int ibbOf;
     406             :     unsigned int ispwOf;
     407             : 
     408           0 :     istringstream iss(iter->second);
     409           0 :     iss >> ibbOf;
     410           0 :     iss >> ispwOf;
     411           0 :     checkCoordinate (ibbOf, ispwOf);
     412             :     
     413           0 :     return &(basebands_.at(ibbOf).spectralWindows().at(ispwOf));
     414           0 :   }
     415             :   
     416             : 
     417             :   // SDMDataObject::DataStruct
     418             : 
     419             :   // SDMDataObject:: methods
     420             :   //
     421             : 
     422             : #define TSTVALID() if (valid_ == false) throw SDMDataObjectException("no valid binary data in this SDMDataObject.");
     423             : 
     424             : 
     425           0 :   SDMDataObject::SDMDataObject() {numTime_ = 0; valid_  = false; aborted_ = false; }
     426           0 :   SDMDataObject::SDMDataObject(unsigned long long startTime,
     427             :                                const string& dataOID,
     428             :                                unsigned int dimensionality,
     429             :                                const string& execBlockUID, 
     430             :                                unsigned int execBlockNum,
     431             :                                unsigned int scanNum,
     432             :                                unsigned int subscanNum,
     433             :                                unsigned int numAntenna,
     434             :                                CorrelationMode correlationMode,
     435           0 :                                const SDMDataObject::DataStruct& dataStruct):
     436           0 :     startTime_(startTime),
     437           0 :     dataOID_(dataOID),
     438           0 :     dimensionality_(dimensionality),
     439           0 :     numTime_(0),
     440           0 :     execBlockUID_(execBlockUID),
     441           0 :     execBlockNum_(execBlockNum),
     442           0 :     scanNum_(scanNum),
     443           0 :     subscanNum_(subscanNum),
     444           0 :     numAntenna_(numAntenna),
     445           0 :     correlationMode_(correlationMode),
     446           0 :     dataStruct_(dataStruct){
     447           0 :     valid_ = true;
     448           0 :     aborted_ = false;
     449           0 :   }
     450             :   
     451             :   
     452           0 :   SDMDataObject::SDMDataObject(unsigned long long startTime,
     453             :                                const string& dataOID,
     454             :                                unsigned int dimensionality,
     455             :                                unsigned int numTime,
     456             :                                const string& execBlockUID,
     457             :                                unsigned int execBlockNum,
     458             :                                unsigned int scanNum,
     459             :                                unsigned int subscanNum,
     460             :                                unsigned int numAntenna,
     461           0 :                                const SDMDataObject::DataStruct& dataStruct):
     462           0 :     startTime_(startTime),
     463           0 :     dataOID_(dataOID),
     464           0 :     dimensionality_(dimensionality),
     465           0 :     numTime_(numTime),
     466           0 :     execBlockUID_(execBlockUID),
     467           0 :     execBlockNum_(execBlockNum),
     468           0 :     scanNum_(scanNum),
     469           0 :     subscanNum_(subscanNum),
     470           0 :     numAntenna_(numAntenna),
     471           0 :     dataStruct_(dataStruct)
     472           0 :   { valid_ = true; aborted_ = false;}
     473             :   
     474           0 :   string SDMDataObject::title() const { TSTVALID(); return title_; }
     475           0 :   void SDMDataObject::title(const string& value) { title_ = value; }
     476             : 
     477           0 :   const ByteOrder* SDMDataObject::byteOrder() const { TSTVALID(); return byteOrder_; }
     478             : 
     479           0 :   unsigned long long SDMDataObject::startTime() const {TSTVALID(); return startTime_; }
     480           0 :   void SDMDataObject::startTime(unsigned long long value) { startTime_ = value; }
     481             :   
     482           0 :   unsigned int SDMDataObject::numTime() const  {TSTVALID(); return numTime_; }
     483           0 :   void SDMDataObject::numTime(unsigned int value) { numTime_ = value; }
     484             :   
     485           0 :   string SDMDataObject::dataOID() const {TSTVALID(); return dataOID_; }
     486           0 :   void SDMDataObject::dataOID(const string& value) { dataOID_ = value; }
     487             :   
     488           0 :   unsigned int SDMDataObject::dimensionality() const  {TSTVALID(); return dimensionality_; }
     489           0 :   void SDMDataObject::dimensionality( unsigned int value ) { dimensionality_ = value; }
     490             : 
     491           0 :   string SDMDataObject::execBlockUID() const {TSTVALID(); return execBlockUID_; }
     492           0 :   void SDMDataObject::execBlockUID (const string& value) { execBlockUID_ = value; }
     493             :   
     494           0 :   unsigned int SDMDataObject::execBlockNum() const  {TSTVALID(); return execBlockNum_; }
     495           0 :   void SDMDataObject::execBlockNum (unsigned int value ) { execBlockNum_ = value; }
     496             :   
     497           0 :   unsigned int SDMDataObject::scanNum() const  {TSTVALID(); return scanNum_ ; }
     498           0 :   void SDMDataObject::scanNum( unsigned int value) { scanNum_ = value; }
     499             :   
     500           0 :   unsigned int SDMDataObject::subscanNum() const {TSTVALID(); return subscanNum_; }
     501           0 :   void SDMDataObject::subscanNum(int value) { subscanNum_ = value; }
     502             :   
     503           0 :   string SDMDataObject::projectPath() const {
     504           0 :     TSTVALID();
     505           0 :     ostringstream oss;
     506           0 :     oss << execBlockNum_ << "/" << scanNum_ << "/" << subscanNum_ << "/";
     507           0 :     return oss.str();
     508           0 :   }
     509             : 
     510           0 :   unsigned int SDMDataObject::numAntenna() const  {TSTVALID();  return numAntenna_; }
     511           0 :   void SDMDataObject::numAntenna (unsigned int value) { numAntenna_ = value; }
     512             :   
     513           0 :   const SDMDataObject::DataStruct& SDMDataObject::dataStruct() const {TSTVALID(); return dataStruct_; }
     514           0 :   void SDMDataObject::dataStruct(const SDMDataObject::DataStruct& value) {dataStruct_ = value; }
     515             : 
     516           0 :   CorrelationMode SDMDataObject::correlationMode() const  {TSTVALID(); return correlationMode_; }
     517             : 
     518           0 :   OptionalSpectralResolutionType SDMDataObject::spectralResolutionType() const {TSTVALID(); return spectralResolutionType_; }
     519           0 :   ProcessorType SDMDataObject::processorType() const {TSTVALID(); return processorType_; }
     520           0 :   CorrelatorType SDMDataObject::correlatorType() const {
     521           0 :     TSTVALID(); 
     522           0 :     if (processorType_ == CORRELATOR) 
     523           0 :       return dataStruct_.zeroLags_.correlatorType_ ;
     524             :     else
     525           0 :       throw SDMDataObjectException("no correlator type defined in the current context (processor type = '" +
     526           0 :                                    CProcessorType::name(processorType_));
     527             :   }
     528             : 
     529             : 
     530           0 :   bool SDMDataObject::inTitle(const std::string&  what) const {TSTVALID();
     531             :     // string s(title_);
     532             :     // boost::iterator_range<std::string::iterator> range = boost::algorithm::ifind_first(s, what);
     533             :     // return !range.empty();
     534           0 :     return title_.find(what) != std::string::npos;
     535             :   }
     536             : 
     537             :   /*
     538             :    * Due to the fact that the value of processor type in the global header does not allow to really determine which processor has produced the data
     539             :    * (this is particularly true for ALMA_RADIOMETER and SQUARE_LAW_DETECTOR which fall under the same type PROCESSOR, I decided to use
     540             :    * the content of the title to make a clear distinction. Of course this is based on a non said conventions used to form the title...
     541             :    */ 
     542           0 :   bool SDMDataObject::isTP() const {TSTVALID(); return inTitle("Total Power");}
     543           0 :   bool SDMDataObject::isWVR() const {TSTVALID(); return inTitle("WVR");}
     544           0 :   bool SDMDataObject::isCorrelation() const {TSTVALID(); return processorType() == CORRELATOR;}
     545             : 
     546             : 
     547             :   /*
     548             :    * hasPackedData returns true if all the integrations are grouped in one subset for all the timestamps and conversely false if 
     549             :    * there is one subset per integration (i.e. per timestamp).
     550             :    */
     551           0 :   bool SDMDataObject::hasPackedData() const {TSTVALID(); return dimensionality() == 0;}
     552             :   
     553           0 :   const vector<SDMDataSubset>& SDMDataObject::sdmDataSubsets() const {
     554           0 :     TSTVALID();
     555           0 :     return dataSubsets_;
     556             :   }
     557             : 
     558           0 :   const vector<SDMDataSubset>& SDMDataObject::corrDataSubsets() const {
     559           0 :     TSTVALID();
     560           0 :     if (isTP()) Utils::invalidCall("corrDataSubsets", this);
     561           0 :     return dataSubsets_;
     562             :   }
     563             : 
     564           0 :   const SDMDataSubset& SDMDataObject::sdmDataSubset(const string& projectPath) const {
     565           0 :     TSTVALID();
     566             : 
     567           0 :     map<string, unsigned int>::const_iterator iter;
     568           0 :     iter = str2index_.find(projectPath);
     569           0 :     if (iter == str2index_.end())
     570           0 :       throw SDMDataObjectException("dataSubset with project path '" + projectPath + "' not found.");
     571           0 :     return dataSubsets_.at(iter->second);
     572             :   }
     573             : 
     574             : 
     575             : 
     576           0 :   bool SDMDataObject::aborted() const {
     577           0 :     if (isTP()) Utils::invalidCall("SDMDataObject::aborted", this);
     578             :     
     579           0 :     return aborted_;
     580             :   }
     581             : 
     582           0 :   unsigned long long SDMDataObject::abortTime() const {
     583           0 :     if (isTP()) Utils::invalidCall("SDMDataObject::abortTime", this);
     584             : 
     585           0 :     return abortTime_;
     586             : 
     587             :   }
     588             : 
     589           0 :   string SDMDataObject::abortReason() const {
     590           0 :     if (isTP()) Utils::invalidCall("SDMDataObject::abortReason", this);
     591             : 
     592           0 :     return abortReason_;
     593             : 
     594             :   }
     595             : 
     596           0 :   const SDMDataSubset& SDMDataObject::tpDataSubset() const {
     597           0 :     TSTVALID();
     598           0 :     if (isCorrelation()) Utils::invalidCall("tpDataSubset", this);
     599           0 :     return dataSubsets_.at(0);
     600             :     //return str2index_.begin()->second;
     601             :   }
     602             : 
     603           0 :   void SDMDataObject::tpDataSubset(const SDMDataSubset& value) {
     604           0 :     if (isCorrelation()) Utils::invalidCall("tpDataSubset", this);
     605           0 :     dataSubsets_.push_back(value);
     606             : 
     607           0 :     string projectPath = value.projectPath();
     608           0 :     if (SDMDataObjectParser::trim(projectPath).size() == 0)
     609           0 :       throw (SDMDataObjectException("can't accept a data subset without a project path"));
     610             : 
     611           0 :     str2index_[projectPath] = dataSubsets_.size() - 1;
     612           0 :   }
     613             :   
     614           0 :   vector<string> SDMDataObject::projectPaths() const {
     615           0 :     vector<string> result(str2index_.size());
     616             : 
     617           0 :     map<string, unsigned int>::const_iterator iter = str2index_.begin();
     618             :  
     619           0 :     for ( ; iter != str2index_.end(); iter++)
     620           0 :       result[iter->second] = iter->first;
     621             :     
     622           0 :     return result;
     623           0 :   }
     624             :  
     625           0 :   void SDMDataObject::done() {
     626           0 :     valid_ = false;
     627             :     
     628           0 :     str2index_.clear();
     629           0 :     dataSubsets_.clear();
     630           0 :   }
     631             : 
     632           0 :   void SDMDataObject::append(const SDMDataSubset& value) {
     633           0 :     TSTVALID();
     634           0 :     dataSubsets_.push_back(value);
     635           0 :     str2index_[value.projectPath()] = dataSubsets_.size()-1;
     636           0 :     numTime_ = dataSubsets_.size();
     637           0 :   }
     638             :   
     639           0 :   void SDMDataObject::owns() {
     640             :     // I own my correlationMode
     641           0 :     dataStruct_.owner_ = this;
     642             : 
     643             :     // I own my basebands and their spectral windows
     644           0 :     for (unsigned int i = 0; i < dataStruct_.basebands_.size(); i++) {
     645           0 :       Baseband& bb = dataStruct_.basebands_.at(i);
     646           0 :       bb.owner_ = this;
     647             :       
     648           0 :       for (unsigned int j = 0 ; j < bb.spectralWindows_.size(); j++) {
     649           0 :         bb.spectralWindows_.at(j).owner_ = this;
     650             :       }
     651             :     }
     652             : 
     653             :     // I own my binary part descriptions
     654             :     // (let's all of them, even those which are not relevant)
     655           0 :     dataStruct_.flags_.owner_   = this;
     656           0 :     dataStruct_.actualTimes_.owner_     = this;
     657           0 :     dataStruct_.actualDurations_.owner_ = this;
     658           0 :     dataStruct_.zeroLags_.owner_        = this;
     659           0 :     dataStruct_.crossData_.owner_       = this;
     660           0 :     dataStruct_.autoData_.owner_        = this;
     661             : 
     662             :     // I own my dataSubsets
     663           0 :     for (unsigned int i = 0; i < dataSubsets_.size(); i++)
     664           0 :       dataSubsets_.at(i).owner_ = this;
     665           0 :   }
     666             : 
     667             : 
     668             : #define FIRST_JAN_2007 4674326400000000000LL
     669             :   
     670           0 :   string SDMDataObject::toString() const {
     671           0 :     TSTVALID();
     672           0 :     ostringstream result;
     673             :     //ptime t1(date(2007, Jan, 1), time_duration(0, 0, 0,(startTime_ - FIRST_JAN_2007)/1000 ));
     674           0 :     result << "SDMDataObject at address '" << this << "' :" << endl; 
     675           0 :     result << "XML Schema version = " << schemaVersion_ << endl;
     676           0 :     result << "Byte order = " << byteOrder_->toString() << endl;
     677             :     //result << "startTime = " << startTime_ << " (" << to_simple_string(t1) << ")" << endl;
     678           0 :     result << "startTime = " << startTime_ << endl;
     679           0 :     result << "dataOID = " << dataOID_ << endl;
     680           0 :     result << "title = " << title_ << endl;
     681           0 :     if (dimensionality_==0) 
     682           0 :       result << "numTime = " << numTime_ << endl;
     683             :     else
     684           0 :       result << "dimensionality = " << dimensionality_ << endl;
     685           0 :     result << "execBlockUID = " << execBlockUID_ << endl;
     686           0 :     result << "execBlockNum = " << execBlockNum_ << endl;
     687           0 :     result << "scanNum = " << scanNum_ << endl;
     688           0 :     result << "subscanNum = " << subscanNum_ << endl;
     689           0 :     result << "numAntenna = " << numAntenna_ << endl;
     690           0 :     result << "correlationMode = " << CCorrelationMode::name(correlationMode_) << endl;
     691           0 :     if (spectralResolutionType_.present()) 
     692           0 :       result << "spectralResolutionType = " << CSpectralResolutionType::name(spectralResolutionType_.literal()) << endl;
     693           0 :     result << "processorType = " << CProcessorType::name(processorType_) << endl;
     694           0 :     if ( correlationMode_ != AUTO_ONLY ) {
     695           0 :       result << "atmospheric phase correction = " << TOSTRING<AtmPhaseCorrection, CAtmPhaseCorrection>(dataStruct_.apc_) << endl;
     696             :     } 
     697           0 :     const vector<Baseband>& bbs = dataStruct_.basebands();
     698           0 :     for (unsigned int i = 0; i < bbs.size(); i++) {
     699           0 :       result << "baseband #" << i << ":" << endl;
     700           0 :       result << "\tname = " << CBasebandName::name(bbs.at(i).name()) << endl;
     701           0 :       const vector<SpectralWindow>& spWs = bbs.at(i).spectralWindows();
     702           0 :       for (unsigned int j = 0; j < spWs.size(); j++) {
     703           0 :         result << "\tspectralWindow #" << j << ":" << endl;
     704             :         
     705           0 :         SpectralWindow spW = spWs.at(j);
     706           0 :         result << "\t\t" << "sw = " << spW.strSw() << endl;
     707           0 :         switch (correlationMode_) {
     708           0 :         case CROSS_ONLY :
     709           0 :           result << "\t\t" << "crossPolProducts = " << TOSTRING<StokesParameter, CStokesParameter>(spW.crossPolProducts()) << endl;
     710           0 :           result << "\t\t" << "scaleFactor = " << spW.scaleFactor() << endl;
     711           0 :           result << "\t\t" << "numSpectralPoint = " << spW.numSpectralPoint() << endl;
     712           0 :           result << "\t\t" << "numBin = " << spW.numBin() << endl;
     713           0 :           break;
     714             :           
     715           0 :         case AUTO_ONLY :
     716           0 :           result << "\t\t" << "sPolProducts = " << TOSTRING<StokesParameter, CStokesParameter>(spW.sdPolProducts()) << endl;
     717           0 :           result << "\t\t" << "numSpectralPoint = " << spW.numSpectralPoint() << endl;
     718           0 :           result << "\t\t" << "numBin = " << spW.numBin() << endl;
     719           0 :           break;
     720             : 
     721           0 :         case CROSS_AND_AUTO :
     722           0 :           result << "\t\t" << "crossPolProducts = " << TOSTRING<StokesParameter, CStokesParameter>(spW.crossPolProducts()) << endl;
     723           0 :           result << "\t\t" << "sdPolProducts = " << TOSTRING<StokesParameter, CStokesParameter>(spW.sdPolProducts()) << endl;
     724           0 :           result << "\t\t" << "scaleFactor = " << spW.scaleFactor() << endl;
     725           0 :           result << "\t\t" << "numSpectralPoint = " << spW.numSpectralPoint() << endl;
     726           0 :           result << "\t\t" << "numBin = " << spW.numBin() << endl;
     727             :           
     728           0 :           break;
     729             :           
     730           0 :         default:
     731           0 :           break;
     732             :         }
     733           0 :         result << "\t\t" << "sideband = " << TOSTRING<NetSideband, CNetSideband>(spW.sideband()) << endl;
     734           0 :         if (spW.strSw().size() > 0)    
     735           0 :         if (spW.strImage().size() > 0) result << "\t\t" << "image = " << spW.strImage() << endl;
     736           0 :       }
     737             :     }
     738             :         
     739           0 :     result << "flags:" << endl;
     740           0 :     result << "\tsize = " << dataStruct_.flags().size() << endl;
     741           0 :     result << "\taxes = " << TOSTRING<AxisName, CAxisName>(dataStruct_.flags().axes()) << endl; 
     742             :     
     743           0 :     result << "actualTimes:" << endl;
     744           0 :     result << "\tsize = " << dataStruct_.actualTimes().size() << endl;
     745           0 :     result << "\taxes = " << TOSTRING<AxisName, CAxisName>(dataStruct_.actualTimes().axes()) << endl; 
     746             :     
     747           0 :     result << "actualDurations:" << endl;
     748           0 :     result << "\tsize = " << dataStruct_.actualDurations().size() << endl;
     749           0 :     result << "\taxes = " << TOSTRING<AxisName, CAxisName>(dataStruct_.actualDurations().axes()) << endl;
     750             :     
     751           0 :     if ((processorType_ == CORRELATOR)
     752           0 :         && (dataStruct_.zeroLags_.correlatorType_ != FX)
     753           0 :         && (dataStruct_.zeroLags_.size_ != 0)) {
     754           0 :       result << "zeroLags:" << endl;
     755           0 :       result << "\tsize = " << dataStruct_.zeroLags().size() << endl;
     756           0 :       result << "\taxes = " << TOSTRING<AxisName, CAxisName>(dataStruct_.zeroLags().axes()) << endl;
     757           0 :       result << "\tcorrelatorType = " << TOSTRING<CorrelatorType, CCorrelatorType>(dataStruct_.zeroLags_.correlatorType_) << endl;
     758             :     }
     759             : 
     760           0 :     switch (correlationMode_) {
     761           0 :     case CROSS_ONLY :
     762           0 :       result << "crossData:" << endl;
     763           0 :       result << "\tsize = " << dataStruct_.crossData().size() << endl;
     764           0 :       result << "\taxes = " << TOSTRING<AxisName, CAxisName> (dataStruct_.crossData().axes()) << endl;
     765           0 :       break;
     766             :       
     767           0 :     case AUTO_ONLY :
     768           0 :       result << "autoData:" << endl;
     769           0 :       result << "\tsize = " << dataStruct_.autoData().size() << endl;
     770           0 :       result << "\taxes = " << TOSTRING<AxisName, CAxisName>(dataStruct_.autoData().axes()) << endl;
     771           0 :       result << "\tnormalized = " << (dataStruct_.autoData_.normalized_ ? "true" : "false") << endl;
     772           0 :       break;
     773             :       
     774           0 :     case CROSS_AND_AUTO :
     775           0 :       result << "crossData:" << endl;
     776           0 :       result << "\tsize = " << dataStruct_.crossData().size() << endl;
     777           0 :       result << "\taxes = " << TOSTRING<AxisName, CAxisName>(dataStruct_.crossData().axes()) << endl;
     778             :       
     779           0 :       result << "autoData:" << endl;
     780           0 :       result << "\tsize = " << dataStruct_.autoData().size() << endl;
     781           0 :       result << "\taxes = " << TOSTRING<AxisName, CAxisName>(dataStruct_.autoData().axes()) << endl;
     782           0 :       result << "\tnormalized = " << (dataStruct_.autoData_.normalized_ ? "true" : "false") << endl;
     783           0 :       break;
     784             :         
     785           0 :     default:
     786           0 :       break;
     787             :     }
     788           0 :     return result.str();
     789           0 :   }
     790             : 
     791             : 
     792           0 :   void SDMDataObject::toXML(const BinaryPart& binaryPart, const string& elementName, ostringstream& oss) const {
     793           0 :     oss << "<" << elementName ;
     794           0 :     oss << " " << HeaderParser::SIZE << "=" << QUOTE(binaryPart.size())
     795           0 :         << " " << HeaderParser::AXES << "=" << QUOTE<AxisName, CAxisName>(binaryPart.axes())
     796           0 :         << "/>"
     797           0 :         << endl;
     798           0 :   }
     799             : 
     800           0 :   void SDMDataObject::toXML(const AutoDataBinaryPart& autoDataBinaryPart, const string& elementName, ostringstream& oss) const {
     801           0 :     oss << "<" << elementName ;
     802           0 :     oss << " " << HeaderParser::SIZE << "=" << QUOTE(autoDataBinaryPart.size())
     803           0 :         << " " << HeaderParser::AXES << "=" << QUOTE<AxisName, CAxisName>(autoDataBinaryPart.axes())
     804           0 :         << " " << HeaderParser::NORMALIZED << "=" << QUOTE(autoDataBinaryPart.normalized())
     805           0 :         << "/>"
     806           0 :         << endl;
     807           0 :   }
     808             : 
     809           0 :   void SDMDataObject::toXML(const ZeroLagsBinaryPart& zeroLagsBinaryPart, const string& elementName, ostringstream& oss) const {
     810           0 :     oss << "<" << elementName ;
     811           0 :     oss << " " << HeaderParser::SIZE << "=" << QUOTE(zeroLagsBinaryPart.size())
     812           0 :         << " " << HeaderParser::AXES << "=" << QUOTE<AxisName, CAxisName>(zeroLagsBinaryPart.axes())
     813           0 :         << " " << HeaderParser::CORRELATORTYPE << "=" << QUOTE<CorrelatorType, CCorrelatorType>(zeroLagsBinaryPart.correlatorType())
     814           0 :         << "/>"
     815           0 :         << endl;
     816           0 :   }
     817             : 
     818           0 :   void SDMDataObject::spectralWindowsToXML(const vector<Baseband>& basebands,unsigned int ibb,  ostringstream& oss) const {
     819           0 :     const vector<SDMDataObject::SpectralWindow>& spectralWindows = basebands.at(ibb).spectralWindows();
     820           0 :     for (unsigned int i = 0; i < spectralWindows.size(); i++) {
     821           0 :       const SpectralWindow& spectralWindow = spectralWindows.at(i);
     822           0 :       oss << "<" << HeaderParser::SPECTRALWINDOW;
     823           0 :       oss << " " << HeaderParser::SW << "=" << QUOTE(i+1);
     824           0 :       oss << " " << HeaderParser::SWBB << "=" << QUOTE(CBasebandName::name(basebands.at(ibb).name()));
     825             :       
     826           0 :       switch (correlationMode_) {
     827           0 :       case CROSS_ONLY:
     828           0 :         oss << " " << HeaderParser::CROSSPOLPRODUCTS << "=" << QUOTE<StokesParameter, CStokesParameter>(spectralWindow.crossPolProducts()) ;
     829           0 :         oss << " " << HeaderParser::SCALEFACTOR << "=" << QUOTE(spectralWindow.scaleFactor()) ;
     830           0 :         oss << " " << HeaderParser::NUMSPECTRALPOINT << "=" << QUOTE(spectralWindow.numSpectralPoint()) ;
     831           0 :         oss << " " << HeaderParser::NUMBIN << "=" << QUOTE(spectralWindow.numBin()) ;
     832           0 :         break;
     833             :         
     834           0 :       case AUTO_ONLY:
     835           0 :         oss << " " << HeaderParser::SDPOLPRODUCTS << "=" << QUOTE<StokesParameter, CStokesParameter>(spectralWindow.sdPolProducts()) ;
     836           0 :         oss << " " << HeaderParser::NUMSPECTRALPOINT << "=" << QUOTE(spectralWindow.numSpectralPoint()) ;
     837           0 :         oss << " " << HeaderParser::NUMBIN << "=" << QUOTE(spectralWindow.numBin()) ;
     838           0 :         break;
     839             :         
     840           0 :       case CROSS_AND_AUTO:
     841           0 :         oss << " " << HeaderParser::CROSSPOLPRODUCTS << "=" << QUOTE<StokesParameter, CStokesParameter>(spectralWindow.crossPolProducts()) ;
     842           0 :         oss << " " << HeaderParser::SDPOLPRODUCTS << "=" << QUOTE<StokesParameter, CStokesParameter>(spectralWindow.sdPolProducts()) ;
     843           0 :         oss << " " << HeaderParser::SCALEFACTOR << "=" << QUOTE(spectralWindow.scaleFactor()) ;
     844           0 :         oss << " " << HeaderParser::NUMSPECTRALPOINT << "=" << QUOTE(spectralWindow.numSpectralPoint()) ;
     845           0 :         oss << " " << HeaderParser::NUMBIN << "=" << QUOTE(spectralWindow.numBin()) ;
     846           0 :         break;
     847             :       }
     848             : 
     849           0 :       oss << " " << HeaderParser::SIDEBAND << "=" << QUOTE<NetSideband, CNetSideband>(spectralWindow.sideband());
     850             : 
     851           0 :       if (spectralWindow.strImage().size() > 0) oss << " " << HeaderParser::IMAGE << "=" << QUOTE(::atoi(spectralWindow.strImage().c_str()));
     852             :       
     853           0 :       oss << "/>" << endl;
     854             :     }
     855           0 :   }
     856             : 
     857           0 :   void SDMDataObject::basebandsToXML(ostringstream& oss) const {
     858           0 :     for (unsigned int ibb = 0; ibb < dataStruct_.basebands_.size(); ibb++) {
     859           0 :       oss << "<" << HeaderParser::BASEBAND << " " << HeaderParser::NAME << "=" << QUOTE(CBasebandName::name(dataStruct_.basebands_.at(ibb).name())) << ">" << endl;
     860           0 :       spectralWindowsToXML(dataStruct_.basebands_, ibb, oss);
     861           0 :       oss << "</" << HeaderParser::BASEBAND << ">" << endl;
     862             :     }
     863           0 :   }
     864             : 
     865           0 :   void SDMDataObject::dataStructToXML(ostringstream& oss) {
     866           0 :     oss << "<" << HeaderParser::DATASTRUCT ;
     867             : 
     868             :     // The xsi:type attribute.
     869           0 :     oss << " xsi:type=" ;
     870           0 :     switch (correlationMode_) {
     871           0 :     case CROSS_ONLY:
     872           0 :       oss << QUOTE("CrossDataFullResolution");
     873           0 :       break;
     874           0 :     case AUTO_ONLY:
     875           0 :       oss << QUOTE("AutoDataFullResolution");
     876           0 :       break;
     877           0 :     case CROSS_AND_AUTO:
     878           0 :       oss << QUOTE("CrossAndAutoDataFullResolution");
     879           0 :       break;
     880             :     }
     881             :     
     882             :     // the apc attribute
     883           0 :     switch (correlationMode_) {
     884           0 :     case CROSS_ONLY:
     885             :     case CROSS_AND_AUTO:
     886           0 :       oss << " apc=" ;
     887           0 :       oss << QUOTE<AtmPhaseCorrection, CAtmPhaseCorrection>(dataStruct_.apc_);
     888           0 :       break;
     889           0 :     case AUTO_ONLY: 
     890           0 :       break;
     891             :     }
     892             :     
     893           0 :     oss << ">" << endl;
     894             :     
     895             :     // Before unrolling the basebands let's prepare the id_ and image_ private fields of the spectral windows.
     896           0 :     updateIdImageSPW();
     897             :     
     898             :     // Now unroll the basebands.    
     899           0 :     basebandsToXML(oss);
     900             :     
     901           0 :     if ( dataStruct_.flags_.size() )          toXML(dataStruct_.flags_, HeaderParser::FLAGS, oss);
     902           0 :     if ( dataStruct_.actualTimes_.size() )    toXML(dataStruct_.actualTimes_, HeaderParser::ACTUALTIMES, oss);
     903           0 :     if ( dataStruct_.actualDurations_.size() )toXML(dataStruct_.actualDurations_, HeaderParser::ACTUALDURATIONS, oss);
     904             :     
     905           0 :     switch (correlationMode_) {
     906           0 :     case CROSS_ONLY:
     907           0 :       toXML(dataStruct_.crossData_, HeaderParser::CROSSDATA, oss);
     908           0 :       break;
     909           0 :     case AUTO_ONLY:
     910           0 :       toXML(dataStruct_.autoData_, HeaderParser::AUTODATA, oss);
     911           0 :       break;
     912           0 :     case CROSS_AND_AUTO:
     913           0 :       toXML(dataStruct_.crossData_, HeaderParser::CROSSDATA, oss);
     914           0 :       toXML(dataStruct_.autoData_, HeaderParser::AUTODATA, oss);
     915           0 :       break;
     916           0 :     default:
     917           0 :       break;
     918             :     }
     919             :     
     920             :     /*
     921             :       if (spectralResolutionType_ == FULL_RESOLUTION ) {
     922             :       toXML(dataStruct_.zeroLags_, HeaderParser::ZEROLAGS, oss);
     923             :       }
     924             :     */
     925             :     // zeroLags are optional in any case - Michel Caillat - 24 Jul 2008
     926           0 :     if (dataStruct_.zeroLags().size() != 0) {
     927           0 :       toXML(dataStruct_.zeroLags_, HeaderParser::ZEROLAGS, oss);
     928             :     }
     929             :     
     930           0 :     oss << "</" << HeaderParser::DATASTRUCT << ">" << endl;
     931           0 :   }
     932             : 
     933           0 :   string SDMDataObject::toXML()  {
     934           0 :     TSTVALID();
     935           0 :     ostringstream result;
     936             :   
     937           0 :     result << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
     938             :   
     939             :     result << "<" << HeaderParser::SDMDATAHEADER 
     940           0 :            << " " << HeaderParser::BYTEORDER << "=\"" << byteOrder_->toString() << "\""
     941           0 :            << " " << HeaderParser::SCHEMAVERSION << "=\"" << schemaVersion_ << "\""
     942             :            << " xsi:noNamespaceSchemaLocation=\"binDataHeader9.xsd\"" 
     943             :            << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
     944             :            << " xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" 
     945             :            << " xmlns:xlink=\"http://www.w3.org/1999/xlink\""
     946             :            << " xmlns:xhtml=\"http://www.w3.org/1999/xhtml\""
     947             :            << " xmlns:xvers=\"http://aramis.obspm.fr/~alma/xvers\""
     948           0 :            << " " << HeaderParser::PROJECTPATH << "=" << QUOTE(projectPath())
     949             :            << " " << "xvers:schemaVersion=\"0\""
     950             :            << " " << "xvers:revision=\"0.0.96\""
     951           0 :            << ">" << endl;
     952             :   
     953             :     // startTime...
     954           0 :     TOXML(HeaderParser::STARTTIME, startTime_, result);   
     955             :   
     956             :     // dataOID...
     957             :     result << "<" << HeaderParser::DATAOID
     958             :            << " xlink:type=\"locator\""
     959           0 :            << " xlink:" << HeaderParser::XLINKHREF  << "=" << QUOTE(dataOID_)
     960           0 :            << " xlink:" << HeaderParser::XLINKTITLE << "=" << QUOTE(title_)
     961           0 :            << "/>" << endl;
     962             :   
     963             :     // dimensionality or numTime ...
     964           0 :     if (dimensionality_ == 0) {
     965             :       result << "<" << HeaderParser::NUMTIME
     966           0 :              << ">"
     967           0 :              << numTime_
     968           0 :              << "</" << HeaderParser::NUMTIME << ">"
     969           0 :              << endl;
     970             :     }
     971             :     else { 
     972             :       result << "<" << HeaderParser::DIMENSIONALITY
     973             :              << " axes=\"TIM\""
     974           0 :              << ">"
     975           0 :              << dimensionality_
     976           0 :              << "</" << HeaderParser::DIMENSIONALITY << ">"
     977           0 :              << endl;
     978             :     }
     979             :   
     980             :     // execBlock...
     981           0 :     result << "<" << HeaderParser::EXECBLOCK << " " << HeaderParser::XLINKHREF << "=" << QUOTE(execBlockUID_) << "/>" << endl;
     982             :   
     983             :     // numAntenna
     984           0 :     TOXML(HeaderParser::NUMANTENNA, numAntenna_, result);
     985             :   
     986             :     //correlationMode
     987           0 :     TOXML<CorrelationMode, CCorrelationMode>(HeaderParser::CORRELATIONMODE,
     988             :                                              correlationMode_,
     989             :                                              result);
     990             : 
     991             :     // spectralResolutionType ... if present.
     992           0 :     if (spectralResolutionType_.present())
     993           0 :       TOXML<SpectralResolutionType, CSpectralResolutionType>(HeaderParser::SPECTRALRESOLUTION,
     994             :                                                              spectralResolutionType_.literal(),
     995             :                                                              result);
     996             :   
     997             :     // processorType
     998           0 :     TOXML<ProcessorType, CProcessorType>(HeaderParser::PROCESSORTYPE,
     999             :                                          processorType_,
    1000             :                                          result);
    1001             :   
    1002             :     // dataStruct
    1003           0 :     dataStructToXML(result);
    1004             :   
    1005           0 :     result << "</" << HeaderParser::SDMDATAHEADER << ">";
    1006             :   
    1007             :   
    1008           0 :     return result.str();
    1009           0 :   }
    1010             : 
    1011           0 :   void SDMDataObject::updateIdImageSPW() {
    1012           0 :     ostringstream oss;
    1013           0 :     for (unsigned int ibb = 0; ibb < dataStruct_.basebands_.size(); ibb++) {
    1014           0 :       vector<SDMDataObject::SpectralWindow>& spws = dataStruct_.basebands_.at(ibb).spectralWindows_;
    1015           0 :       for (unsigned int ispw = 0; ispw < spws.size(); ispw++) {
    1016           0 :         oss.str("");
    1017           0 :         oss << ispw+1;
    1018           0 :         spws.at(ispw).strSw(oss.str());
    1019           0 :         spws.at(ispw).strImage("");
    1020             :       }
    1021             :     }
    1022             :     
    1023             :     unsigned int ibbKey;
    1024             :     unsigned int ispwKey;
    1025             :     unsigned int ibbValue;
    1026             :     unsigned int ispwValue;
    1027             :     
    1028           0 :     string key, value;
    1029           0 :     map<string, string>::const_iterator iter;
    1030           0 :     istringstream iss;
    1031             : 
    1032             :     
    1033           0 :     for (iter = dataStruct_.imageSPW_.begin(); iter != dataStruct_.imageSPW_.end(); iter++) {
    1034           0 :       key   = iter->first;
    1035           0 :       iss.clear();
    1036           0 :       iss.str(key);
    1037           0 :       iss >> ibbKey;
    1038           0 :       iss >> ispwKey;
    1039             : 
    1040           0 :       value = iter->second;
    1041           0 :       iss.clear();
    1042           0 :       iss.str(value);
    1043           0 :       iss >> ibbValue;
    1044           0 :       iss >> ispwValue;      
    1045             : 
    1046           0 :       oss.str("");
    1047           0 :       oss << ispwKey;
    1048           0 :       dataStruct_.basebands_.at(ibbKey).spectralWindows_.at(ispwKey).strImage_  = dataStruct_.basebands_.at(ibbKey).spectralWindows_.at(ispwValue).strSw_;
    1049             :     }
    1050           0 :   }
    1051             : 
    1052             :   const ByteOrder* ByteOrder::Little_Endian = new ByteOrder("Little_Endian");
    1053             :   const ByteOrder* ByteOrder::Big_Endian = new ByteOrder("Big_Endian");
    1054             :   const ByteOrder* ByteOrder::Machine_Endianity = ByteOrder::machineEndianity();
    1055             : 
    1056          22 :   ByteOrder::ByteOrder(const string& name):
    1057          22 :     name_(name) {;}
    1058             : 
    1059           0 :   ByteOrder::~ByteOrder() {;}
    1060             : 
    1061          11 :   const ByteOrder* ByteOrder::machineEndianity() {
    1062             : #if defined(__APPLE__)
    1063             :     if (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN)
    1064             : #else 
    1065             :     if (__BYTE_ORDER == __LITTLE_ENDIAN)
    1066             : #endif
    1067          11 :       return Little_Endian;
    1068             :     else
    1069             :       return Big_Endian;
    1070             :   }
    1071             :   
    1072           0 :   string ByteOrder::toString() const {
    1073           0 :     return name_;
    1074             :   }
    1075             : 
    1076             :   // SDMDataObject::
    1077             : 
    1078             :   // SDMDataSubset:: methods
    1079             :   //
    1080           0 :   SDMDataSubset::SDMDataSubset(SDMDataObject* owner) {
    1081           0 :     owner_             = owner ;
    1082           0 :     integrationNum_    = 0;
    1083           0 :     subintegrationNum_ = 0;
    1084           0 :     time_              = 0;
    1085           0 :     interval_          = 0;
    1086           0 :     actualTimes_       = 0;
    1087           0 :     nActualTimes_      = 0;
    1088           0 :     actualDurations_   = 0;
    1089           0 :     nActualDurations_  = 0;
    1090           0 :     zeroLags_          = 0;
    1091           0 :     nZeroLags_         = 0;
    1092           0 :     flags_             = 0;
    1093           0 :     nFlags_            = 0;
    1094           0 :     longCrossData_     = 0;
    1095           0 :     shortCrossData_    = 0;
    1096           0 :     floatCrossData_    = 0;
    1097           0 :     nCrossData_        = 0;
    1098           0 :     autoData_          = 0;
    1099           0 :     nAutoData_         = 0;
    1100           0 :     aborted_           = false;
    1101           0 :   }
    1102             : 
    1103             : 
    1104           0 :   SDMDataSubset::SDMDataSubset(SDMDataObject* owner,
    1105             :                                unsigned long long time,
    1106             :                                unsigned long long interval,
    1107           0 :                                const vector<float>& autoData):
    1108           0 :     owner_(owner),
    1109           0 :     time_(time),
    1110           0 :     interval_(interval) {
    1111           0 :     integrationNum_    = 0;
    1112           0 :     subintegrationNum_ = 0;
    1113           0 :     actualTimes_       = 0;
    1114           0 :     nActualTimes_      = 0;
    1115           0 :     actualDurations_   = 0;
    1116           0 :     nActualDurations_  = 0;
    1117           0 :     zeroLags_          = 0;
    1118           0 :     nZeroLags_         = 0;
    1119           0 :     flags_             = 0;
    1120           0 :     nFlags_            = 0;
    1121           0 :     longCrossData_     = 0;
    1122           0 :     shortCrossData_    = 0;
    1123           0 :     floatCrossData_    = 0;
    1124           0 :     nCrossData_        = 0;
    1125           0 :     if (autoData.size() != 0) {
    1126           0 :       autoData_ = &autoData.at(0);
    1127           0 :       nAutoData_ = autoData.size();
    1128             :     }
    1129             :     else {
    1130           0 :       autoData_ = 0;
    1131           0 :       nAutoData_ = 0;
    1132             :     }
    1133           0 :     aborted_ = false;
    1134           0 :   }
    1135             :   
    1136           0 :   SDMDataSubset::SDMDataSubset(const SDMDataSubset& sdmDataSubset) {
    1137           0 :     owner_             = sdmDataSubset.owner_ ;
    1138           0 :     integrationNum_    = sdmDataSubset.integrationNum_;
    1139           0 :     subintegrationNum_ = sdmDataSubset.subintegrationNum_;
    1140           0 :     ref_               = sdmDataSubset.ref_;
    1141           0 :     time_              = sdmDataSubset.time_;
    1142           0 :     interval_          = sdmDataSubset.interval_;
    1143           0 :     dataStruct_        = sdmDataSubset.dataStruct_;
    1144           0 :     flagsREF_          = sdmDataSubset.flagsREF_;
    1145           0 :     actualTimesREF_    = sdmDataSubset.actualTimesREF_;
    1146           0 :     actualDurationsREF_= sdmDataSubset.actualDurationsREF_;
    1147           0 :     zeroLagsREF_       = sdmDataSubset.zeroLagsREF_;
    1148           0 :     crossDataREF_      = sdmDataSubset.crossDataREF_;
    1149           0 :     crossDataType_     = sdmDataSubset.crossDataType_;
    1150           0 :     autoDataREF_       = sdmDataSubset.autoDataREF_;
    1151           0 :     actualTimes_       = sdmDataSubset.actualTimes_;
    1152           0 :     nActualTimes_      = sdmDataSubset.nActualTimes_;
    1153           0 :     actualDurations_   = sdmDataSubset.actualDurations_;
    1154           0 :     nActualDurations_  = sdmDataSubset.nActualDurations_;
    1155           0 :     zeroLags_          = sdmDataSubset.zeroLags_;
    1156           0 :     nZeroLags_         = sdmDataSubset.nZeroLags_;
    1157           0 :     flags_             = sdmDataSubset.flags_;
    1158           0 :     nFlags_            = sdmDataSubset.nFlags_;
    1159           0 :     longCrossData_     = sdmDataSubset.longCrossData_;
    1160           0 :     shortCrossData_    = sdmDataSubset.shortCrossData_;
    1161           0 :     floatCrossData_    = sdmDataSubset.floatCrossData_;
    1162           0 :     nCrossData_        = sdmDataSubset.nCrossData_;
    1163           0 :     autoData_          = sdmDataSubset.autoData_;
    1164           0 :     nAutoData_         = sdmDataSubset.nAutoData_;
    1165           0 :     aborted_           = sdmDataSubset.aborted_;
    1166           0 :     abortTime_         = sdmDataSubset.abortTime_;
    1167           0 :     abortReason_       = sdmDataSubset.abortReason_;
    1168           0 :   }
    1169             : 
    1170           0 :   SDMDataSubset& SDMDataSubset::operator=(const SDMDataSubset& sdmDataSubset) {
    1171           0 :     owner_             = sdmDataSubset.owner_ ;
    1172           0 :     integrationNum_    = sdmDataSubset.integrationNum_;
    1173           0 :     subintegrationNum_ = sdmDataSubset.subintegrationNum_;
    1174           0 :     ref_               = sdmDataSubset.ref_;
    1175           0 :     time_              = sdmDataSubset.time_;
    1176           0 :     interval_          = sdmDataSubset.interval_;
    1177           0 :     dataStruct_        = sdmDataSubset.dataStruct_;
    1178           0 :     flagsREF_          = sdmDataSubset.flagsREF_;
    1179           0 :     actualTimesREF_    = sdmDataSubset.actualTimesREF_;
    1180           0 :     actualDurationsREF_= sdmDataSubset.actualDurationsREF_;
    1181           0 :     zeroLagsREF_       = sdmDataSubset.zeroLagsREF_;
    1182           0 :     crossDataREF_      = sdmDataSubset.crossDataREF_;
    1183           0 :     crossDataType_     = sdmDataSubset.crossDataType_;
    1184           0 :     autoDataREF_       = sdmDataSubset.autoDataREF_;
    1185           0 :     actualTimes_       = sdmDataSubset.actualTimes_;
    1186           0 :     nActualTimes_      = sdmDataSubset.nActualTimes_;
    1187           0 :     actualDurations_   = sdmDataSubset.actualDurations_;
    1188           0 :     nActualDurations_  = sdmDataSubset.nActualDurations_;
    1189           0 :     zeroLags_          = sdmDataSubset.zeroLags_;
    1190           0 :     nZeroLags_         = sdmDataSubset.nZeroLags_;
    1191           0 :     flags_             = sdmDataSubset.flags_;
    1192           0 :     nFlags_            = sdmDataSubset.nFlags_;
    1193           0 :     longCrossData_     = sdmDataSubset.longCrossData_;
    1194           0 :     shortCrossData_    = sdmDataSubset.shortCrossData_;
    1195           0 :     floatCrossData_    = sdmDataSubset.floatCrossData_;
    1196           0 :     nCrossData_        = sdmDataSubset.nCrossData_;
    1197           0 :     autoData_          = sdmDataSubset.autoData_;
    1198           0 :     nAutoData_         = sdmDataSubset.nAutoData_;
    1199           0 :     aborted_           = sdmDataSubset.aborted_;
    1200           0 :     abortTime_         = sdmDataSubset.abortTime_;
    1201           0 :     abortReason_       = sdmDataSubset.abortReason_;
    1202           0 :     return *this;
    1203             :   }
    1204             : 
    1205           0 :   SDMDataSubset::~SDMDataSubset() {;}
    1206             : 
    1207           0 :   string SDMDataSubset::projectPath() const {
    1208           0 :     if (owner_ == 0) return "";
    1209             : 
    1210           0 :     ostringstream oss;
    1211           0 :     oss << owner_->execBlockNum_ << "/" << owner_->scanNum_ << "/" << owner_->subscanNum_ << "/"; 
    1212             : 
    1213           0 :     if (integrationNum_ > 0) oss << integrationNum_ << "/";
    1214           0 :     if (subintegrationNum_ > 0) oss << subintegrationNum_ << "/";
    1215             : 
    1216           0 :     return oss.str();
    1217           0 :   }
    1218             :   
    1219             : 
    1220           0 :   unsigned int SDMDataSubset::integrationNum() const { return integrationNum_; }
    1221             : 
    1222           0 :   unsigned int SDMDataSubset::subintegrationNum() const { return subintegrationNum_; }
    1223             : 
    1224           0 :   unsigned long long SDMDataSubset::time() const { return time_; }
    1225             :   
    1226           0 :   unsigned long long SDMDataSubset::interval() const { 
    1227             :     // if (owner_ && !owner_->isTP()) Utils::invalidCall("SDMDataSubset::interval", owner_);
    1228           0 :     return interval_; 
    1229             :   }
    1230             : 
    1231             :    
    1232           0 :   unsigned long int SDMDataSubset::actualDurations(const ACTUALDURATIONSTYPE* & ptr) const {ptr = actualDurations_; return nActualDurations_;}
    1233           0 :   uint64_t SDMDataSubset::actualDurationsPosition() const { return actualDurationsPosition_; }
    1234           0 :   unsigned long int SDMDataSubset::actualTimes(const ACTUALTIMESTYPE* & ptr) const { ptr = actualTimes_; return nActualTimes_;}
    1235           0 :   uint64_t SDMDataSubset::actualTimesPosition() const { return actualTimesPosition_; }
    1236           0 :   unsigned long int SDMDataSubset::autoData(const AUTODATATYPE* & ptr)const  { ptr = autoData_; return nAutoData_; }
    1237           0 :   uint64_t SDMDataSubset::autoDataPosition() const { return autoDataPosition_; }
    1238           0 :   unsigned long int SDMDataSubset::crossData(const SHORTCROSSDATATYPE* & ptr) const { 
    1239           0 :     if (owner_ && (owner_->isTP() || owner_->correlationMode() == AUTO_ONLY)) Utils::invalidCall("SDMDataSubset::crossData", owner_);
    1240           0 :     ptr = shortCrossData_; return nCrossData_; 
    1241             :   }
    1242           0 :   PrimitiveDataType SDMDataSubset::crossDataType() const { return crossDataType_; }
    1243           0 :   void SDMDataSubset::crossDataType(PrimitiveDataType value) { crossDataType_ = value;}
    1244             : 
    1245           0 :   unsigned long int SDMDataSubset::crossData(const INTCROSSDATATYPE* & ptr) const { 
    1246           0 :     if (owner_ && (owner_->isTP() || owner_->correlationMode() == AUTO_ONLY)) Utils::invalidCall("SDMDataSubset::crossData", owner_);
    1247           0 :     ptr = longCrossData_; return nCrossData_; 
    1248             :   }
    1249             : 
    1250             : 
    1251           0 :   unsigned long int SDMDataSubset::crossData(const FLOATCROSSDATATYPE* & ptr) const { 
    1252           0 :     if (owner_ && (owner_->isTP() || owner_->correlationMode() == AUTO_ONLY)) Utils::invalidCall("SDMDataSubset::crossData", owner_);
    1253           0 :     ptr = floatCrossData_; return nCrossData_; 
    1254             :   }
    1255             : 
    1256           0 :   uint64_t SDMDataSubset::crossDataPosition() const { return crossDataPosition_; }
    1257           0 :   unsigned long int SDMDataSubset::flags(const FLAGSTYPE* & ptr) const { ptr = flags_; return nFlags_; }
    1258           0 :   uint64_t SDMDataSubset::flagsPosition() const { return flagsPosition_; }
    1259             : 
    1260           0 :   unsigned long int SDMDataSubset::zeroLags(const ZEROLAGSTYPE* & ptr) const { 
    1261           0 :     if (owner_ && owner_->isTP()) Utils::invalidCall("SDMDataSubset::zeroLags", owner_);
    1262           0 :     ptr = zeroLags_; return nZeroLags_;
    1263             :   }
    1264           0 :   uint64_t SDMDataSubset::zeroLagsPosition() const { return zeroLagsPosition_; }
    1265             :   
    1266           0 :   bool SDMDataSubset::aborted() const {return aborted_; }
    1267           0 :   unsigned long long SDMDataSubset::abortTime() const {return abortTime_; }  
    1268           0 :   string SDMDataSubset::abortReason() const {return abortReason_;}
    1269             : 
    1270             : #define MIN_(a,b) ((a<b)?a:b)
    1271             : #define PRINT(_v_, _n_, _nmax_, _out_ ) for (unsigned int i = 0; i < MIN_(_n_, _nmax_); i++) _out_ << " " << _v_[i]; if (_n_ > _nmax_) _out_ << "...";
    1272             :  
    1273           0 :   string SDMDataSubset::toString(unsigned int N ) const {
    1274           0 :     ostringstream result;
    1275             :     //boost::gregorian::date d(2007, Jan, 1);
    1276             :     //ptime t1(date(2007, Jan, 1), time_duration(0, 0, 0,(time_ - FIRST_JAN_2007)/1000 ));
    1277             :     //result << "(owned by '" << owner_ << "')" << endl; 
    1278             :   
    1279           0 :     result << "projectPath = " << projectPath() << endl;
    1280             :     //result << "time = " << time_ << " (" << to_simple_string(t1)  << ")" << endl;
    1281           0 :     result << "time = " << time_ << endl;
    1282             :     //result << "dataStructureDesc = " << dataStructureDesc_ << endl;
    1283           0 :     result << "interval = " << interval_ <<endl;
    1284             :   
    1285             : 
    1286           0 :     if ( aborted_ ) {
    1287             :       // It"s an aborted [sub]integration.
    1288           0 :       result << "Aborted at = " << abortTime_ << endl;
    1289           0 :       result << "Reason = " << abortReason_ << endl;
    1290           0 :       return result.str();
    1291             :     }
    1292             : 
    1293             : 
    1294             :     // It's not an aborted [sub]integration.
    1295           0 :     switch (owner_->dimensionality_) {
    1296           0 :     case 0:
    1297           0 :       break;
    1298             :       
    1299           0 :     case 1:
    1300           0 :       switch (owner_->correlationMode_) {
    1301           0 :       case CROSS_ONLY:
    1302           0 :         result << "crossDataType = " << CPrimitiveDataType::name(crossDataType_) << endl;
    1303           0 :         break;
    1304           0 :       case AUTO_ONLY:
    1305           0 :         break;
    1306           0 :       case CROSS_AND_AUTO:
    1307           0 :         result << "crossDataType = " << CPrimitiveDataType::name(crossDataType_) << endl;
    1308           0 :         break;
    1309             :       }
    1310           0 :       break;
    1311           0 :     default:
    1312           0 :       break;
    1313             :     }
    1314             : 
    1315           0 :     result << "Binary attachments :" << endl;
    1316             :     
    1317           0 :     if (nActualTimes_) {
    1318           0 :       result << "ActualTimes (" << nActualTimes_ << " values ) = "; PRINT(actualTimes_, nActualTimes_, N, result); result << endl;
    1319             :     }
    1320             : 
    1321           0 :     if (nActualDurations_) {
    1322           0 :       result << "ActualDurations (" << nActualDurations_ << " values ) = "; PRINT(actualDurations_, nActualDurations_, N, result); result << endl;
    1323             :     }
    1324             : 
    1325           0 :     if (nFlags_) { 
    1326           0 :       result << "Flags (" << nFlags_ << " values ) = "; PRINT(flags_, nFlags_, N, result); result << endl;
    1327             :     }
    1328             :     
    1329           0 :     if (nCrossData_) { 
    1330           0 :       result << "CrossData (" << nCrossData_ << " values ) = "; 
    1331           0 :       switch (crossDataType_) {
    1332           0 :       case INT32_TYPE :
    1333           0 :         PRINT(longCrossData_, nCrossData_, N, result); result << endl;
    1334           0 :         break;
    1335           0 :       case INT16_TYPE :
    1336           0 :         PRINT(shortCrossData_, nCrossData_, N, result); result << endl;
    1337           0 :         break;
    1338           0 :       case FLOAT32_TYPE:
    1339           0 :         PRINT(floatCrossData_, nCrossData_, N, result); result << endl;
    1340           0 :         break;
    1341             : 
    1342           0 :       default: 
    1343           0 :         throw SDMDataObjectException("'" + CPrimitiveDataType::name(crossDataType_)+"' data are not processed here."); 
    1344             :   
    1345             :       }
    1346             :     }
    1347             : 
    1348           0 :     if (nAutoData_) {
    1349           0 :       result << "AutoData (" << nAutoData_ << " values ) = "; PRINT(autoData_, nAutoData_, N, result); result << endl;
    1350             :     }
    1351             :     
    1352           0 :     if (nZeroLags_) { 
    1353           0 :       result << "ZeroLags (" << nZeroLags_ << " values ) = = "; PRINT(zeroLags_, nZeroLags_, N, result); result << endl;
    1354             :     }
    1355             : 
    1356           0 :     return result.str();
    1357           0 :   }
    1358             : 
    1359             : 
    1360           0 :   void SDMDataSubset::binAttachToXML(const string& name, ostringstream& oss) {
    1361           0 :     oss << "<" << name << " xlink:href= \"" << projectPath() << "/" << name << ".bin\"";
    1362           0 :     if (name == "crossData") 
    1363           0 :       oss << " type=\"" <<  CPrimitiveDataType::name(crossDataType_) << "\"";
    1364           0 :     oss << "/>" << endl;
    1365           0 :   }
    1366             : 
    1367           0 :   void SDMDataSubset::tpBinAttachToXML(ostringstream& oss) {
    1368           0 :     if (nFlags_)
    1369           0 :       binAttachToXML(TPSubsetHeaderParser::FLAGSREF, oss);
    1370           0 :     if (nActualTimes_)
    1371           0 :       binAttachToXML(TPSubsetHeaderParser::ACTUALTIMESREF, oss);
    1372           0 :     if (nActualDurations_)
    1373           0 :       binAttachToXML(TPSubsetHeaderParser::ACTUALDURATIONSREF, oss);
    1374           0 :     binAttachToXML(TPSubsetHeaderParser::AUTODATAREF, oss);
    1375           0 :   }
    1376             : 
    1377           0 :   void SDMDataSubset::corrBinAttachToXML(ostringstream& oss) {    
    1378             :     // The binaryAttachments elements
    1379             : 
    1380           0 :     if (nFlags_)
    1381           0 :       binAttachToXML(CorrSubsetHeaderParser::FLAGSREF, oss);
    1382           0 :     if (nActualTimes_)
    1383           0 :       binAttachToXML(CorrSubsetHeaderParser::ACTUALTIMESREF, oss);
    1384           0 :     if (nActualDurations_)
    1385           0 :       binAttachToXML(CorrSubsetHeaderParser::ACTUALDURATIONSREF, oss);
    1386             : 
    1387           0 :     switch (owner_->correlationMode_) {
    1388           0 :     case CROSS_ONLY:
    1389             :       
    1390           0 :       binAttachToXML(CorrSubsetHeaderParser::CROSSDATAREF, oss);
    1391           0 :       break;
    1392             :       
    1393           0 :     case AUTO_ONLY:
    1394           0 :       binAttachToXML(CorrSubsetHeaderParser::AUTODATAREF, oss);          
    1395           0 :       break;
    1396             : 
    1397           0 :     case CROSS_AND_AUTO:
    1398           0 :       binAttachToXML(CorrSubsetHeaderParser::CROSSDATAREF, oss);            
    1399           0 :       binAttachToXML(CorrSubsetHeaderParser::AUTODATAREF, oss);          
    1400           0 :       break;
    1401             :     }
    1402             : 
    1403           0 :     if ((owner_->processorType_ == CORRELATOR) && (owner_->correlatorType() != FX))
    1404           0 :         binAttachToXML(CorrSubsetHeaderParser::ZEROLAGSREF, oss);            
    1405           0 :   }
    1406             :  
    1407             : 
    1408           0 :   string SDMDataSubset::xsiType() const {
    1409           0 :     string result;
    1410             :     
    1411           0 :     switch (owner_->correlationMode_) {
    1412           0 :     case CROSS_ONLY:     result = "BinaryCrossData" ; break;
    1413           0 :     case AUTO_ONLY:      result = "BinaryAutoData" ; break;
    1414           0 :     case CROSS_AND_AUTO: result = "BinaryCrossAndAutoData" ; break;
    1415             :     }
    1416             :         
    1417           0 :     return result;
    1418           0 :   }
    1419             : 
    1420             : 
    1421           0 :   string SDMDataSubset::toXML() {
    1422           0 :     ostringstream oss;
    1423             :     
    1424             :     //oss << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
    1425           0 :     if (owner_->processorType_ == CORRELATOR) {
    1426             :       oss << "<" << CorrSubsetHeaderParser::SDMDATASUBSETHEADER
    1427             :           << " xmlns:xlink=\"http://www.w3.org/1999/xlink\""
    1428             :           << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
    1429           0 :           << " xsi:type=\"" << xsiType() << "\""
    1430           0 :           << " projectPath="<< QUOTE(projectPath())
    1431           0 :           << ">" << endl;
    1432             :       
    1433           0 :       OXML(CorrSubsetHeaderParser::SCHEDULEPERIODTIME, oss);
    1434           0 :       TOXML(CorrSubsetHeaderParser::TIME, time_, oss);
    1435           0 :       TOXML(CorrSubsetHeaderParser::INTERVAL, interval_, oss);
    1436           0 :       CXML(CorrSubsetHeaderParser::SCHEDULEPERIODTIME, oss);
    1437             :       
    1438           0 :       oss << "<" << CorrSubsetHeaderParser::DATASTRUCT << " ref =" << QUOTE("sdmDataHeader") << "/>" << endl;
    1439           0 :       corrBinAttachToXML(oss);
    1440           0 :       oss << "</" << CorrSubsetHeaderParser::SDMDATASUBSETHEADER << ">";
    1441           0 :       return oss.str();
    1442             :     }
    1443           0 :     else if (owner_->processorType_ == RADIOMETER) {
    1444             :       oss << "<" << TPSubsetHeaderParser::SDMDATASUBSETHEADER
    1445             :           << " xmlns:xlink=\"http://www.w3.org/1999/xlink\""
    1446             :           << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
    1447           0 :           << " xsi:type=\"" << xsiType() << "\""
    1448           0 :           << " projectPath="<< QUOTE(projectPath())
    1449           0 :           << ">" << endl;
    1450             :     
    1451           0 :       OXML(TPSubsetHeaderParser::SCHEDULEPERIODTIME, oss);
    1452           0 :       TOXML(TPSubsetHeaderParser::TIME, time_, oss);
    1453           0 :       TOXML(TPSubsetHeaderParser::INTERVAL, interval_, oss);
    1454           0 :       CXML(TPSubsetHeaderParser::SCHEDULEPERIODTIME, oss);
    1455             :       
    1456           0 :       oss << "<" << TPSubsetHeaderParser::DATASTRUCT << " ref =" << QUOTE("sdmDataHeader") << "/>" << endl;
    1457           0 :       tpBinAttachToXML(oss);
    1458           0 :       oss << "</" << TPSubsetHeaderParser::SDMDATASUBSETHEADER << ">";
    1459           0 :       return oss.str();
    1460             :     }
    1461             :     else
    1462           0 :       throw SDMDataObjectException("no XML representation defined for an SDMDataSubset with a processor type defined as '"
    1463           0 :                                    + CProcessorType::name(owner_->processorType_));
    1464           0 :   }
    1465             :   
    1466             : 
    1467           0 :   const SDMDataObject* SDMDataSubset::owner() const { return owner_; }
    1468             :   // SDMDataSubset::
    1469             : 
    1470             : 
    1471             :   // Utils:: methods
    1472             :   //
    1473             : #define COUTCONTAINER(result, v) (copy(v.begin(), v.end(), ostream_iterator<string>(result, " ")))  
    1474           0 :   string Utils::quote(const string& s) {
    1475           0 :     return "\""+s+"\"";
    1476             :   }
    1477             : 
    1478             : 
    1479           0 :   void Utils::invalidCall(const string & methodName, const SDMDataObject* sdmDataObject) {
    1480           0 :     ostringstream oss;
    1481           0 :     oss << "Invalid call of method '" << methodName << "' in this context :";
    1482             :     
    1483           0 :     if (sdmDataObject->isTP()) 
    1484           0 :       oss << "total power data ('" << CCorrelationMode::name(sdmDataObject->correlationMode()) << "')" << endl;
    1485           0 :     else if (sdmDataObject->isCorrelation()) {
    1486           0 :       oss << "correlator data ('" << CCorrelationMode::name(sdmDataObject->correlationMode()) << "')" << endl; 
    1487             :     }
    1488           0 :     throw SDMDataObjectException(oss.str());
    1489           0 :   }
    1490             : 
    1491           0 :   string Utils::quote(bool b) {
    1492           0 :     ostringstream oss;
    1493           0 :     oss << "\"" << (b?"true":"false") << "\"";
    1494           0 :     return oss.str();
    1495           0 :   }
    1496             : 
    1497           0 :   string Utils::quote(int i) {
    1498           0 :     ostringstream oss;
    1499           0 :     oss << "\"" << i << "\"";
    1500           0 :     return oss.str();
    1501           0 :   }
    1502             : 
    1503           0 :   string Utils::quote(unsigned int ui) {
    1504           0 :     ostringstream oss;
    1505           0 :     oss << "\"" << ui << "\"";
    1506           0 :     return oss.str();
    1507           0 :   }
    1508             : 
    1509             : 
    1510           0 :   string Utils::quote(long long l) {
    1511           0 :     ostringstream oss;
    1512           0 :     oss << "\"" << l << "\"";
    1513           0 :     return oss.str();
    1514           0 :   }
    1515             : 
    1516           0 :   string Utils::quote(float f) {
    1517           0 :     ostringstream oss;
    1518           0 :     oss << "\"" << f << "\"";
    1519           0 :     return oss.str();
    1520           0 :   }
    1521             : 
    1522           0 :   string Utils::quote(const set<string>& s) {
    1523           0 :     ostringstream oss;
    1524           0 :     oss << "\"";
    1525           0 :     COUTCONTAINER(oss, s);
    1526           0 :     oss << "\"";
    1527           0 :     return oss.str();
    1528           0 :   }
    1529             : 
    1530             : 
    1531           0 :   string Utils::quote(const vector<string>& s) {
    1532           0 :     ostringstream oss;
    1533           0 :     oss << "\"";
    1534           0 :     COUTCONTAINER(oss, s);
    1535           0 :     oss << "\"";
    1536           0 :     return oss.str();
    1537           0 :   }
    1538             : 
    1539             : 
    1540           0 :   void  Utils::toXML(const string& elementName, int value, ostringstream& oss){
    1541           0 :     oss << "<" << elementName << ">" << value << "</" << elementName << ">" << endl;
    1542           0 :   }
    1543             : 
    1544           0 :   void  Utils::toXML(const string& elementName, unsigned int value, ostringstream& oss){
    1545           0 :     oss << "<" << elementName << ">" << value << "</" << elementName << ">" << endl;
    1546           0 :   }
    1547             : 
    1548           0 :   void  Utils::toXML(const string& elementName, long long value, ostringstream& oss){
    1549           0 :     oss << "<" << elementName << ">" << value << "</" << elementName << ">" << endl;
    1550           0 :   }
    1551             : 
    1552           0 :   void  Utils::toXML(const string& elementName, unsigned long long value, ostringstream& oss){
    1553           0 :     oss << "<" << elementName << ">" << value << "</" << elementName << ">" << endl;
    1554           0 :   }
    1555             : 
    1556           0 :   void Utils::oXML(const string& elementName, ostringstream& oss) {
    1557           0 :     oss << "<" << elementName << ">" << endl;
    1558           0 :   }
    1559             : 
    1560           0 :   void Utils::cXML(const string& elementName, ostringstream& oss) {
    1561           0 :     oss << "</" << elementName << ">" << endl;
    1562           0 :   }
    1563             : 
    1564             :   // Utils::
    1565             : 
    1566             : 
    1567             : } // asdmbinaries

Generated by: LCOV version 1.16