diff --git a/CEP/DP3/DPPP/include/DPPP/AORFlagger.h b/CEP/DP3/DPPP/include/DPPP/AORFlagger.h index 86bcc5d6cd01e6987cb1c0d362187a895f247dea..1d9a71928fafb144afabf975c62e98179a41c149 100644 --- a/CEP/DP3/DPPP/include/DPPP/AORFlagger.h +++ b/CEP/DP3/DPPP/include/DPPP/AORFlagger.h @@ -31,6 +31,7 @@ #include <DPPP/DPBuffer.h> #include <DPPP/FlagCounter.h> #include <Common/lofar_vector.h> +#include <Common/lofar_smartptr.h> #include <AOFlagger/strategy/actions/strategyaction.h> #include <AOFlagger/util/progresslistener.h> #include <AOFlagger/quality/statisticscollection.h> @@ -115,7 +116,7 @@ namespace LOFAR { int bl, uint polarization); // Fill the rfi strategy. - void fillStrategy (rfiStrategy::Strategy&); + void fillStrategy (boost::shared_ptr<rfiStrategy::Strategy>&); //# Data members. DPInput* itsInput; @@ -123,6 +124,7 @@ namespace LOFAR { uint itsBufIndex; uint itsNTimes; uint itsNTimesToDo; + string itsStrategyName; uint itsWindowSize; uint itsOverlap; //# extra time slots on both sides double itsOverlapPerc; @@ -141,7 +143,7 @@ namespace LOFAR { double itsMoveTime; //# data move timer (sum all threads) double itsFlagTime; //# flag timer (sum of all threads) double itsQualTime; //# quality timer (sum of all threads) - rfiStrategy::Strategy itsStrategy; + boost::shared_ptr<rfiStrategy::Strategy> itsStrategy; DummyProgressListener itsProgressListener; StatisticsCollection itsRfiStats; casa::Vector<double> itsFreqs; diff --git a/CEP/DP3/DPPP/src/AORFlagger.cc b/CEP/DP3/DPPP/src/AORFlagger.cc index df947a4a382af06c3acfb5de58383fa7d7db7482..e8637509da39485ff122673b6140e34286e249d4 100644 --- a/CEP/DP3/DPPP/src/AORFlagger.cc +++ b/CEP/DP3/DPPP/src/AORFlagger.cc @@ -29,6 +29,7 @@ #include <Common/LofarLogger.h> #include <casa/OS/HostInfo.h> +#include <casa/OS/File.h> #include <AOFlagger/msio/image2d.h> #include <AOFlagger/msio/mask2d.h> @@ -46,10 +47,12 @@ #include <AOFlagger/strategy/actions/sumthresholdaction.h> #include <AOFlagger/strategy/actions/timeselectionaction.h> #include <AOFlagger/strategy/control/artifactset.h> +#include <AOFlagger/strategy/control/strategyreader.h> #include <AOFlagger/quality/qualitytablesformatter.h> #include <Common/StreamUtil.h> #include <Common/LofarLogger.h> +#include <Common/OpenMP.h> #include <casa/Arrays/ArrayMath.h> #include <casa/Containers/Record.h> #include <casa/Containers/RecordField.h> @@ -58,10 +61,6 @@ #include <iostream> #include <algorithm> -#ifdef _OPENMP -# include <omp.h> -#endif - using namespace casa; using namespace rfiStrategy; @@ -82,20 +81,21 @@ namespace LOFAR { itsQualTime (0), itsRfiStats (4) { - itsWindowSize = parset.getUint (prefix+"timewindow", 0); - itsMemory = parset.getUint (prefix+"memorymax", 0); - itsMemoryPerc = parset.getUint (prefix+"memoryperc", 0); - itsOverlap = parset.getUint (prefix+"overlapmax", 0); + itsStrategyName = parset.getString (prefix+"strategy", string()); + itsWindowSize = parset.getUint (prefix+"timewindow", 0); + itsMemory = parset.getUint (prefix+"memorymax", 0); + itsMemoryPerc = parset.getUint (prefix+"memoryperc", 0); + itsOverlap = parset.getUint (prefix+"overlapmax", 0); // Also look for keyword overlap for backward compatibility. if (itsOverlap == 0) { - itsOverlap = parset.getUint (prefix+"overlap", 0); + itsOverlap = parset.getUint (prefix+"overlap", 0); } - itsOverlapPerc = parset.getDouble (prefix+"overlapperc", -1); - itsPulsarMode = parset.getBool (prefix+"pulsar", false); - itsPedantic = parset.getBool (prefix+"pedantic", false); - itsDoAutoCorr = parset.getBool (prefix+"autocorr", true); - itsDoRfiStats = parset.getBool (prefix+"keepstatistics", true); - // Fill the strategy. + itsOverlapPerc = parset.getDouble (prefix+"overlapperc", -1); + itsPulsarMode = parset.getBool (prefix+"pulsar", false); + itsPedantic = parset.getBool (prefix+"pedantic", false); + itsDoAutoCorr = parset.getBool (prefix+"autocorr", true); + itsDoRfiStats = parset.getBool (prefix+"keepstatistics", true); + // Fill the strategy for all possible threads. fillStrategy (itsStrategy); } @@ -111,12 +111,7 @@ namespace LOFAR { os << " pedantic: " << itsPedantic << std::endl; os << " keepstatistics: " << itsDoRfiStats << std::endl; os << " autocorr: " << itsDoAutoCorr << std::endl; -#ifdef _OPENMP - uint nthread = omp_get_max_threads(); -#else - uint nthread = 1; -#endif - os << " nthreads (omp) " << nthread << std::endl; + os << " nthreads (omp) " << OpenMP::maxThreads() << std::endl; os << " max memory used " << itsMemoryNeeded << std::endl; } @@ -126,11 +121,7 @@ namespace LOFAR { info().setNeedVisData(); info().setNeedWrite(); // Get nr of threads. -#ifdef _OPENMP - uint nthread = omp_get_max_threads(); -#else - uint nthread = 1; -#endif + uint nthread = OpenMP::maxThreads(); // Determine available memory. double availMemory = HostInfo::memoryTotal() * 1024.; // Determine how much memory can be used. @@ -301,7 +292,7 @@ namespace LOFAR { // Create thread-private counter object. FlagCounter counter (itsFlagCounter); // Create thread-private strategy object. - rfiStrategy::Strategy strategy; + boost::shared_ptr<Strategy> strategy; fillStrategy (strategy); // Create a statistics object for all polarizations. StatisticsCollection rfiStats(4); @@ -318,11 +309,11 @@ namespace LOFAR { if (ant1[ib] == ant2[ib]) { if (itsDoAutoCorr) { flagBaseline (0, itsWindowSize+rightOverlap, 0, ib, - counter, strategy, rfiStats); + counter, *strategy, rfiStats); } } else { flagBaseline (0, itsWindowSize+rightOverlap, 0, ib, - counter, strategy, rfiStats); + counter, *strategy, rfiStats); } } // end of OMP for #pragma omp critical(aorflagger_updatecounts) @@ -360,7 +351,7 @@ namespace LOFAR { void AORFlagger::flagBaseline (uint leftOverlap, uint windowSize, uint rightOverlap, uint bl, FlagCounter& counter, - rfiStrategy::Strategy& strategy, + Strategy& strategy, StatisticsCollection& rfiStats) { NSTimer moveTimer, flagTimer, qualTimer; @@ -415,9 +406,9 @@ namespace LOFAR { revData.SetIndividualPolarisationMasks (falseMask, falseMask, falseMask, falseMask); //// boost::mutex mutex; - //// rfiStrategy::ArtifactSet artifacts(&mutex); + //// ArtifactSet artifacts(&mutex); // Create and fill the artifact set. A mutex is not needed. - rfiStrategy::ArtifactSet artifacts(0); + ArtifactSet artifacts(0); artifacts.SetOriginalData (origData); artifacts.SetContaminatedData (contData); artifacts.SetRevisedData (revData); @@ -498,8 +489,23 @@ namespace LOFAR { } } - void AORFlagger::fillStrategy (rfiStrategy::Strategy& strategy) + void AORFlagger::fillStrategy (boost::shared_ptr<Strategy>& pstrategy) { + string fileName = itsStrategyName; + if (! fileName.empty()) { + if (! File(fileName).exists()) { + fileName = "$LOFARROOT/share/rfistrategies/" + fileName; + if (! File(fileName).exists()) { + THROW (Exception, "Unknown rfistrategy file " << itsStrategyName); + } + } + StrategyReader reader; + pstrategy = boost::shared_ptr<Strategy> + (reader.CreateStrategyFromFile(fileName)); + return; + } + pstrategy = boost::shared_ptr<Strategy> (new Strategy); + Strategy& strategy = *pstrategy; strategy.Add(new SetFlaggingAction()); ForEachPolarisationBlock* fepBlock = new ForEachPolarisationBlock(); strategy.Add(fepBlock);