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 12 : bool SDMDataObject::init() {
38 12 : 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 24 : ByteOrder::ByteOrder(const string& name):
1057 24 : name_(name) {;}
1058 :
1059 0 : ByteOrder::~ByteOrder() {;}
1060 :
1061 12 : 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 12 : 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
|