00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef IMAGES_ASCIIANNOTATIONFILEPARSER_H
00018 #define IMAGES_ASCIIANNOTATIONFILEPARSER_H
00019
00020 #include <casa/aips.h>
00021 #include <casa/Arrays/Vector.h>
00022 #include <casa/Containers/Record.h>
00023 #include <casa/Logging/LogIO.h>
00024 #include <casa/OS/RegularFile.h>
00025 #include <casa/Utilities/Regex.h>
00026 #include <coordinates/Coordinates/SpectralCoordinate.h>
00027 #include <imageanalysis/Annotations/AnnotationBase.h>
00028 #include <imageanalysis/IO/AsciiAnnotationFileLine.h>
00029
00030
00031 #include <coordinates/Coordinates/CoordinateSystem.h>
00032
00033 namespace casa {
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 class RegionTextParser {
00062
00063 public:
00064
00065 static const Int CURRENT_VERSION;
00066 static const Regex MAGIC;
00067
00068
00069
00070
00071 struct ParamValue {
00072 Double doubleVal;
00073 Int intVal;
00074 String stringVal;
00075 Bool boolVal;
00076 AnnotationBase::LineStyle lineStyleVal;
00077 AnnotationBase::FontStyle fontStyleVal;
00078
00079 SHARED_PTR<std::pair<MFrequency, MFrequency> > freqRange;
00080 Vector<Stokes::StokesTypes> stokes;
00081 AnnotationBase::RGB color;
00082 vector<Int> intVec;
00083 };
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 using ParamSet = std::map<AnnotationBase::Keyword, ParamValue>;
00096
00097 RegionTextParser() = delete;
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 RegionTextParser(
00111 const String& filename, const CoordinateSystem& csys,
00112 const IPosition& imShape, const Int requireAtLeastThisVersion,
00113 const String& prependRegion="",
00114 const String& globalOverrideChans="", const String& globalOverrrideStokes=""
00115 );
00116
00117 RegionTextParser(
00118 const CoordinateSystem& csys, const IPosition& imShape, const String& text,
00119 const String& prependRegion="",
00120 const String& globalOverrideChans="", const String& globalOverrrideStokes=""
00121 );
00122
00123
00124 ~RegionTextParser();
00125
00126 RegionTextParser& operator=(const RegionTextParser&) = delete;
00127
00128 Int getFileVersion() const;
00129
00130 vector<AsciiAnnotationFileLine> getLines() const;
00131
00132
00133 static ParamSet getParamSet(
00134 Bool& spectralParmsUpdated,
00135 LogIO& log, const String& text, const String& preamble,
00136 const CoordinateSystem& csys,
00137 SHARED_PTR<std::pair<MFrequency, MFrequency> > overridingFreqRange,
00138 SHARED_PTR<Vector<Stokes::StokesTypes> > overridingCorrRange
00139 );
00140
00141 private:
00142
00143 const static String sOnePair;
00144 const static String bTwoPair;
00145 const static String sNPair;
00146 const static Regex startOnePair;
00147 const static Regex startNPair;
00148
00149 CoordinateSystem _csys;
00150 std::unique_ptr<LogIO> _log;
00151 ParamSet _currentGlobals;
00152 vector<AsciiAnnotationFileLine> _lines;
00153 Vector<AnnotationBase::Keyword> _globalKeysToApply;
00154 Int _fileVersion;
00155 IPosition _imShape;
00156 uInt _regions;
00157
00158 SHARED_PTR<std::pair<MFrequency, MFrequency> > _overridingFreqRange;
00159 SHARED_PTR<Vector<Stokes::StokesTypes> > _overridingCorrRange;
00160
00161
00162
00163
00164
00165
00166
00167 void _parse(const String& contents, const String& fileDesc);
00168
00169 Array<String> _extractTwoPairs(uInt& end, const String& string) const;
00170
00171
00172 static Vector<String> _extractSinglePair(const String& string);
00173
00174 void _addLine(const AsciiAnnotationFileLine& line);
00175
00176 AnnotationBase::Type _getAnnotationType(
00177 Vector<Quantity>& qDirs,
00178 vector<Quantity>& qunatities,
00179 String& textString,
00180 String& consumeMe, const String& preamble
00181 ) const;
00182
00183 ParamSet _getCurrentParamSet(
00184 Bool& spectralParmsUpdated, ParamSet& newParams,
00185 String& consumeMe, const String& preamble
00186 ) const;
00187
00188 void _createAnnotation(
00189 const AnnotationBase::Type annType,
00190
00191 const Vector<Quantity>& qDirs,
00192 const std::pair<Quantity, Quantity>& qFreqs,
00193 const vector<Quantity>& quantities,
00194 const String& textString,
00195 const ParamSet& currentParamSet,
00196 const Bool annOnly, const Bool isDifference,
00197 const String& preamble
00198 );
00199
00200 std::pair<Quantity, Quantity> _quantitiesFromFrequencyString(
00201 const String& freqString, const String& preamble
00202 ) const;
00203
00204 static String _doLabel(String& consumeMe, const String& logPreamble);
00205
00206 static String _getKeyValue(String& consumeMe, const String& preamble);
00207
00208 Vector<Quantity> _extractQuantityPairAndSingleQuantity(
00209 String& consumeMe, const String& preamble
00210 ) const;
00211
00212 Vector<Quantity> _extractNQuantityPairs(
00213 String& consumeMe, const String& preamble
00214 ) const;
00215
00216 Vector<Quantity> _extractTwoQuantityPairs(
00217 String& consumeMe, const String& preamble
00218 ) const;
00219
00220 std::pair<Quantity, Quantity> _extractSingleQuantityPair(
00221 const String& pair, const String& preamble
00222 ) const;
00223
00224 void _setInitialGlobals();
00225
00226 static Vector<Stokes::StokesTypes> _stokesFromString(
00227 const String& stokes, const String& preamble
00228 );
00229
00230 Vector<Quantity> _extractTwoQuantityPairsAndSingleQuantity(
00231 String& consumeMe, const String& preamble
00232 ) const;
00233
00234 void _extractQuantityPairAndString(
00235 std::pair<Quantity, Quantity>& quantities, String& string,
00236 String& consumeMe, const String& preamble,
00237 const Bool requireQuotesAroundString
00238 ) const;
00239
00240 Vector<Quantity> _extractQuantitiesFromPair(
00241 const String& pair, const String& preamble
00242 ) const;
00243
00244 void _determineVersion(
00245 const String& chunk, const String& filename,
00246 const Int requireAtLeastThisVersion
00247 );
00248
00249
00250
00251 void _setOverridingCorrelations(const String& globalOverrideStokes);
00252
00253
00254
00255 void _setOverridingChannelRange(const String& globalOverrideChans);
00256
00257 };
00258 }
00259
00260 #endif