From f867b86f5c60cfdcfac5f900d647fc8c68c0944a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Offringa?= <offringa@astron.nl>
Date: Fri, 18 Mar 2011 14:33:56 +0000
Subject: [PATCH] Bug 1491: adding option write-immediately to
 AddStatisticsAction

---
 .../strategy/actions/addstatisticsaction.h    | 23 +++++++++++++++++--
 .../strategy/algorithms/rfistatistics.h       |  6 ++++-
 .../AOFlagger/strategy/control/types.h        |  1 +
 .../src/strategy/algorithms/rfistatistics.cpp | 11 +++++----
 .../src/strategy/control/strategyreader.cpp   |  1 +
 .../src/strategy/control/strategywriter.cpp   |  1 +
 6 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/strategy/actions/addstatisticsaction.h b/CEP/DP3/AOFlagger/include/AOFlagger/strategy/actions/addstatisticsaction.h
index d1e4ceac65a..5fe36add565 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/strategy/actions/addstatisticsaction.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/strategy/actions/addstatisticsaction.h
@@ -36,18 +36,30 @@ namespace rfiStrategy {
 	class AddStatisticsAction : public Action
 	{
 		public:
-			AddStatisticsAction() : _comparison(false), _separateBaselineStatistics(false), _performClassification(true)
+			AddStatisticsAction() : _comparison(false), _separateBaselineStatistics(false), _performClassification(true), _writeImmediately(false)
 			{
 			}
+			
+			virtual ~AddStatisticsAction()
+			{
+				Sync();
+			}
 
 			virtual std::string Description()
 			{
 				return "Add to statistics";
 			}
+			
+			virtual void Sync()
+			{
+				statistics.Save();
+			}
+			
 			virtual void Perform(class ArtifactSet &artifacts, class ProgressListener &)
 			{
 				statistics.SetSeparateBaselineStatistics(_separateBaselineStatistics);
 				statistics.SetPerformClassification(_performClassification);
+				statistics.SetWriteImmediately(_writeImmediately);
 				if(_comparison)
 					statistics.Add(artifacts.ContaminatedData(), artifacts.MetaData(), artifacts.OriginalData().GetSingleMask());
 				else
@@ -72,11 +84,18 @@ namespace rfiStrategy {
 			{
 				_performClassification = performClassification;
 			}
-private:
+
+			bool WriteImmediately() const { return _writeImmediately; }
+			void SetWriteImmediately(bool writeImmediately)
+			{
+				_writeImmediately = writeImmediately;
+			}
+		private:
 			RFIStatistics statistics;
 			bool _comparison;
 			bool _separateBaselineStatistics;
 			bool _performClassification;
+			bool _writeImmediately;
 	};
 }
 
diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/strategy/algorithms/rfistatistics.h b/CEP/DP3/AOFlagger/include/AOFlagger/strategy/algorithms/rfistatistics.h
index 1d4ebd5dd79..1ca31724ca7 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/strategy/algorithms/rfistatistics.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/strategy/algorithms/rfistatistics.h
@@ -220,7 +220,7 @@ class RFIStatistics {
 			RFIStatistics *baselineStatistics;
 		};
 
-		RFIStatistics() : _separateBaselineStatistics(false), _compareFlags(false), _filePrefix(""), _channelCountPerSubband(256), _ignoreFirstChannel(true), _performClassification(true) { }
+		RFIStatistics() : _separateBaselineStatistics(false), _compareFlags(false), _filePrefix(""), _channelCountPerSubband(256), _ignoreFirstChannel(true), _performClassification(true), _writeImmediately(false) { }
 		~RFIStatistics() { }
 		
 		void Add(const TimeFrequencyData &data, TimeFrequencyMetaDataCPtr metaData);
@@ -310,6 +310,9 @@ class RFIStatistics {
 
 		bool IgnoreFirstChannel() const { return _ignoreFirstChannel; }
 		void SetIgnoreFirstChannel(bool value) { _ignoreFirstChannel = value; }
+		
+		bool WriteImmediately() const { return _writeImmediately; }
+		void SetWriteImmediately(bool value) { _writeImmediately = value; }
 	private:
 		struct FeatureInfo {
 			long double amplitudeSum;
@@ -347,6 +350,7 @@ class RFIStatistics {
 		std::string _filePrefix;
 		unsigned _channelCountPerSubband;
 		bool _ignoreFirstChannel, _performClassification;
+		bool _writeImmediately;
 		
 		void addEverything(const TimeFrequencyData &data, TimeFrequencyMetaDataCPtr metaData, Image2DCPtr image, Mask2DCPtr mask, SegmentedImagePtr segmentedMask, SegmentedImagePtr classifiedMask);
 		void addSingleBaseline(const TimeFrequencyData &data, TimeFrequencyMetaDataCPtr metaData, Image2DCPtr image, Mask2DCPtr mask, SegmentedImagePtr segmentedMask, SegmentedImagePtr classifiedMask, bool save);
diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/strategy/control/types.h b/CEP/DP3/AOFlagger/include/AOFlagger/strategy/control/types.h
index c43c3d963b7..e1a39773af2 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/strategy/control/types.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/strategy/control/types.h
@@ -76,6 +76,7 @@ class Observatorium;
 //        hence version renamed to:
 // 3.0 : as 2.10
 // 3.1 : added the CollectNoiseStatisticsAction.
+// 3.2 : added parameter "write-immediately" to the Add Statistics Action.
 #define STRATEGY_FILE_FORMAT_VERSION 3.1
 
 // The earliest format version which can be read by this version of the software
diff --git a/CEP/DP3/AOFlagger/src/strategy/algorithms/rfistatistics.cpp b/CEP/DP3/AOFlagger/src/strategy/algorithms/rfistatistics.cpp
index bed2ba6a1ca..5c4386ed341 100644
--- a/CEP/DP3/AOFlagger/src/strategy/algorithms/rfistatistics.cpp
+++ b/CEP/DP3/AOFlagger/src/strategy/algorithms/rfistatistics.cpp
@@ -57,11 +57,14 @@ void RFIStatistics::Add(const TimeFrequencyData &data, TimeFrequencyMetaDataCPtr
 
 void RFIStatistics::addEverything(const TimeFrequencyData &data, TimeFrequencyMetaDataCPtr metaData, Image2DCPtr image, Mask2DCPtr mask, SegmentedImagePtr segmentedMask, SegmentedImagePtr classifiedMask)
 {
-	addSingleBaseline(data, metaData, image, mask, segmentedMask, classifiedMask, true);
+	addSingleBaseline(data, metaData, image, mask, segmentedMask, classifiedMask, _writeImmediately);
 	addBaselines(data, metaData, image, mask, segmentedMask, classifiedMask);
-	saveBaselines(_filePrefix + "counts-baselines.txt");
-	saveBaselineTimeInfo(_filePrefix + "counts-baseltime.txt");
-	saveBaselineFrequencyInfo(_filePrefix + "counts-baselfreq.txt");
+	if(_writeImmediately)
+	{
+		saveBaselines(_filePrefix + "counts-baselines.txt");
+		saveBaselineTimeInfo(_filePrefix + "counts-baseltime.txt");
+		saveBaselineFrequencyInfo(_filePrefix + "counts-baselfreq.txt");
+	}
 }
 
 void RFIStatistics::addSingleBaseline(const TimeFrequencyData &data, TimeFrequencyMetaDataCPtr metaData, Image2DCPtr image, Mask2DCPtr mask, SegmentedImagePtr segmentedMask, SegmentedImagePtr classifiedMask, bool save)
diff --git a/CEP/DP3/AOFlagger/src/strategy/control/strategyreader.cpp b/CEP/DP3/AOFlagger/src/strategy/control/strategyreader.cpp
index 3aa0465ffe3..bc79f7b499a 100644
--- a/CEP/DP3/AOFlagger/src/strategy/control/strategyreader.cpp
+++ b/CEP/DP3/AOFlagger/src/strategy/control/strategyreader.cpp
@@ -317,6 +317,7 @@ Action *StrategyReader::parseAddStatistics(xmlNode *node)
 	newAction->SetCompareOriginalAndAlternative(getBool(node, "compare-original-and-alternative"));
 	newAction->SetSeparateBaselineStatistics(getBool(node, "separate-baseline-statistics"));
 	newAction->SetPerformClassification(getBool(node, "perform-classification"));
+	newAction->SetWriteImmediately(getBool(node, "write-immediately"));
 	return newAction;
 }
 
diff --git a/CEP/DP3/AOFlagger/src/strategy/control/strategywriter.cpp b/CEP/DP3/AOFlagger/src/strategy/control/strategywriter.cpp
index 4b3951a277a..0f55fd924fe 100644
--- a/CEP/DP3/AOFlagger/src/strategy/control/strategywriter.cpp
+++ b/CEP/DP3/AOFlagger/src/strategy/control/strategywriter.cpp
@@ -218,6 +218,7 @@ namespace rfiStrategy {
 		Write("compare-original-and-alternative", action.CompareOriginalAndAlternative());
 		Write("separate-baseline-statistics", action.SeparateBaselineStatistics());
 		Write("perform-classification", action.PerformClassification());
+		Write("write-immediately", action.WriteImmediately());
 	}
 
 	void StrategyWriter::writeBaselineSelectionAction(const class BaselineSelectionAction &action)
-- 
GitLab