Line data Source code
1 : //# ExtendFlagger.cc:
2 : //# Copyright (C) 1994,1995,1996,1997,1998,1999,2000,2001,2002,2003-2008
3 : //# Associated Universities, Inc. Washington DC, USA.
4 : //#
5 : //# This library is free software; you can redistribute it and/or modify it
6 : //# under the terms of the GNU Library General Public License as published by
7 : //# the Free Software Foundation; either version 2 of the License, or (at your
8 : //# option) any later version.
9 : //#
10 : //# This library is distributed in the hope that it will be useful, but WITHOUT
11 : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13 : //# License for more details.
14 : //#
15 : //# You should have received a copy of the GNU Library General Public License
16 : //# along with this library; if not, write to the Free Software Foundation,
17 : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18 : //#
19 : //# Correspondence concerning AIPS++ should be addressed as follows:
20 : //# Internet email: aips2-request@nrao.edu.
21 : //# Postal address: AIPS++ Project Office
22 : //# National Radio Astronomy Observatory
23 : //# 520 Edgemont Road
24 : //# Charlottesville, VA 22903-2475 USA
25 : //#
26 : //# $Id$
27 :
28 :
29 : //# Includes
30 :
31 : #include <cmath>
32 :
33 : #include <casacore/casa/Exceptions.h>
34 :
35 : #include <casacore/tables/TaQL/TableParse.h>
36 : #include <casacore/tables/TaQL/TableGram.h>
37 : #include <casacore/tables/Tables/TableDesc.h>
38 : #include <casacore/tables/Tables/TableLock.h>
39 : #include <casacore/tables/Tables/TableIter.h>
40 :
41 : #include <casacore/casa/Arrays/ArrayMath.h>
42 : #include <casacore/casa/Arrays/MatrixMath.h>
43 : #include <casacore/casa/Arrays/ArrayError.h>
44 : #include <casacore/casa/Arrays/Matrix.h>
45 :
46 : #include <casacore/tables/TaQL/ExprMathNode.h>
47 : #include <casacore/tables/TaQL/ExprMathNodeArray.h>
48 : #include <casacore/tables/TaQL/ExprDerNode.h>
49 : #include <casacore/tables/TaQL/ExprDerNodeArray.h>
50 : #include <casacore/tables/TaQL/ExprFuncNode.h>
51 : #include <casacore/tables/TaQL/ExprFuncNodeArray.h>
52 : #include <casacore/tables/TaQL/ExprLogicNode.h>
53 : #include <casacore/tables/TaQL/ExprLogicNodeArray.h>
54 : #include <casacore/tables/TaQL/ExprNodeArray.h>
55 : #include <casacore/tables/TaQL/ExprNodeSet.h>
56 : #include <casacore/tables/TaQL/ExprNodeRep.h>
57 : #include <casacore/tables/TaQL/ExprNodeRecord.h>
58 : #include <casacore/tables/TaQL/ExprRange.h>
59 : #include <casacore/tables/TaQL/RecordGram.h>
60 :
61 : #include <casacore/casa/Utilities/DataType.h>
62 : #include <casacore/casa/Utilities/Sort.h>
63 : #include <casacore/casa/Quanta/MVTime.h>
64 : #include <casacore/casa/System/ProgressMeter.h>
65 :
66 : #include <flagging/Flagging/ExtendFlagger.h>
67 :
68 : #include <iomanip>
69 :
70 : using namespace casacore;
71 : namespace casa { //# NAMESPACE CASA - BEGIN
72 :
73 0 : int FlagID::compare (const void* val1, const void* val2) {
74 0 : const FlagID& t1 = *(FlagID*)val1;
75 0 : const FlagID& t2 = *(FlagID*)val2;
76 0 : if (t1.time < t2.time) return -1;
77 0 : if (t1.time > t2.time) return 1;
78 0 : if (t1.ant1 < t2.ant1) return -1;
79 0 : if (t1.ant1 > t2.ant1) return 1;
80 0 : if (t1.ant2 < t2.ant2) return -1;
81 0 : if (t1.ant2 > t2.ant2) return 1;
82 : //if (t1.field < t2.field) return -1;
83 : //if (t1.field > t2.field) return 1;
84 0 : if (t1.spw < t2.spw) return -1;
85 0 : if (t1.spw > t2.spw) return 1;
86 0 : if (t1.corr < t2.corr) return -1;
87 0 : if (t1.corr > t2.corr) return 1;
88 0 : if (t1.chan < t2.chan) return -1;
89 0 : if (t1.chan > t2.chan) return 1;
90 0 : if (t1.polid < t2.polid) return -1;
91 0 : if (t1.polid > t2.polid) return 1;
92 0 : return 0;
93 : }
94 :
95 0 : int FlagIDS::compareID (const void* val1, const void* val2) {
96 0 : const FlagIDS& t1 = *(FlagIDS*)val1;
97 0 : const FlagIDS& t2 = *(FlagIDS*)val2;
98 : // this condition makes no sense and produces a clang compiler warning
99 : // warning: reference cannot be bound to dereferenced null pointer in well-defined C++ code;
100 : // comparison may be assumed to always evaluate to true [-Wtautological-undefined-compare]
101 : // if (&t1 != 0 && &t2 != 0) {
102 0 : cout << "t1=" << t1.time << " " << t2.time << endl;
103 0 : if (t1.time < t2.time) return -1;
104 0 : if (t1.time > t2.time) return 1;
105 0 : if (t1.bl < t2.bl) return -1;
106 0 : if (t1.bl > t2.bl) return 1;
107 : //if (t1.field < t2.field) return -1;
108 : //if (t1.field > t2.field) return 1;
109 0 : if (t1.spw < t2.spw) return -1;
110 0 : if (t1.spw > t2.spw) return 1;
111 0 : if (t1.corr < t2.corr) return -1;
112 0 : if (t1.corr > t2.corr) return 1;
113 0 : if (t1.chan < t2.chan) return -1;
114 0 : if (t1.chan > t2.chan) return 1;
115 : // }
116 :
117 0 : return 0;
118 : }
119 :
120 :
121 : // Default Constructor
122 0 : ExtendFlagger::ExtendFlagger()
123 : {
124 0 : initdata();
125 0 : clipexpr = "";
126 0 : cliprange.resize(0);
127 0 : clipcolumn = "DATA";
128 0 : outside = false;
129 0 : channelavg = false;
130 0 : quackinterval = 0.0;
131 0 : opmode = "flag";
132 0 : extendCorr = "";
133 0 : extendChan = "";
134 0 : extendAnt = "";
135 0 : extendSpw = "";
136 0 : extendTime = "";
137 0 : ableCorr.resize(0, 0);
138 0 : chanNum.resize(0);
139 0 : }
140 :
141 0 : ExtendFlagger::ExtendFlagger(MeasurementSet& ms, const String& exchan,
142 : const String& excorr, const String& exant,
143 : const String& exspw, const String& time,
144 0 : const Vector<Vector<String> >& corrs, const Vector<Int>& nchan) {
145 0 : initdata();
146 0 : clipexpr = "";
147 0 : cliprange.resize(0);
148 0 : clipcolumn = "DATA";
149 0 : outside = false;
150 0 : channelavg = false;
151 0 : quackinterval = 0.0;
152 0 : opmode = "flag";
153 0 : extendCorr = excorr;
154 0 : extendChan = exchan;
155 0 : extendAnt = exant;
156 0 : extendSpw = exspw;
157 0 : extendTime = time;
158 0 : ableCorr = corrs;
159 0 : chanNum = nchan;
160 :
161 0 : flagger.attach(ms);
162 0 : }
163 :
164 : // Destructor
165 0 : ExtendFlagger::~ExtendFlagger()
166 : {
167 0 : }
168 :
169 : // attach the ms to be flaggered
170 0 : Bool ExtendFlagger::attach(MeasurementSet &ms) {
171 0 : return flagger.attach(ms);
172 : }
173 :
174 : // detach the ms
175 0 : void ExtendFlagger::detach() {
176 0 : flagger.detach();
177 0 : }
178 :
179 : // initialize flagging selection string
180 0 : Bool ExtendFlagger::initdata(const String& field, const String& spw,
181 : const String& array, const String& feed,
182 : const String& scan, const String& baseline,
183 : const String& uvrange, const String& time,
184 : const String& correlation, const String& intent) {
185 :
186 0 : this->field = field;
187 0 : this->spw = spw;
188 0 : this->array = array;
189 0 : this->feed = feed;
190 0 : this->scan = scan;
191 0 : this->baseline = baseline;
192 0 : this->uvrange = uvrange;
193 0 : this->time = time;
194 0 : this->correlation = correlation;
195 0 : this->intent = intent;
196 0 : return true;
197 :
198 : }
199 :
200 : // set flagging selection string
201 0 : Bool ExtendFlagger::setdata() {
202 0 : return flagger.setdata(field, spw, array,
203 0 : feed, scan, baseline, uvrange, time, correlation, intent);
204 : }
205 :
206 : // make data selection
207 0 : Bool ExtendFlagger::selectdata(Bool useoriginalms) {
208 : //cout << "useoriginalms=" << useoriginalms
209 : // << " field=" << field << " spw=" << spw
210 : // << " array=" << array << " feed=" << feed
211 : // << " scan=" << scan << " baseline=" << baseline
212 : // << " uvrange=" << uvrange << " time=" << time
213 : // << " correlation=" << correlation << endl;
214 : //useoriginalms = false;
215 0 : return flagger.selectdata(useoriginalms, field, spw, array,
216 0 : feed, scan, baseline, uvrange, time, correlation, intent);
217 : }
218 :
219 : //
220 0 : Bool ExtendFlagger::setmanualflags(Bool unflag, Bool autocorr) {
221 : //cout << "autocorr=" << autocorr << " rowflag=" << rowflag
222 : // << " unflag=" << unflag
223 : // << " clipexpr=" << clipexpr << " cliprange=" << cliprange
224 : // << " clipcolumn=" << clipcolumn << " outside=" << outside
225 : // << " quackinterval=" << quackinterval << " opmode=" << opmode
226 : // << endl;
227 0 : return flagger.setmanualflags(autocorr, unflag, clipexpr,
228 0 : cliprange, clipcolumn, outside, channelavg, quackinterval, "beg", false, opmode);
229 : }
230 :
231 0 : Bool ExtendFlagger::run(Bool trial, Bool reset) {
232 0 : flagger.run(trial, reset);
233 0 : return true;
234 : }
235 :
236 0 : Bool ExtendFlagger::extend2(const Vector<FlagID>& flagids) {
237 : //cout << " extendCorr=" + extendCorr
238 : // << " extendChan=" + extendChan
239 : // << " extendSpw=" + extendSpw
240 : // << " extendAnt=" + extendAnt
241 : // << " extendTime=" + extendTime
242 : // << endl;
243 0 : Int npts = flagids.size();
244 0 : if (npts == 0) {
245 0 : return false;
246 : }
247 :
248 0 : Vector<FlagIDS> fids(npts);
249 0 : for (Int i = 0; i < npts; i++) {
250 :
251 0 : FlagIDS fid;
252 :
253 : //set chan
254 0 : if (!upcase(extendChan).compare("ALL")) {
255 0 : fid.chan = "";
256 : }
257 : else {
258 0 : fid.chan = flagids(i).chan;
259 : }
260 :
261 : //set spw
262 0 : if (!upcase(extendSpw).compare("ALL")) {
263 0 : fid.spw = ableSpw(flagids(i).spw);
264 : }
265 : else {
266 0 : fid.spw = String::toString(flagids(i).spw);
267 : }
268 :
269 : //set correlation
270 0 : if (!upcase(extendCorr).compare("ALL")) {
271 0 : fid.corr = "";
272 : }
273 0 : else if (!upcase(extendCorr).compare("HALF")) {
274 0 : fid.corr = halfExtendCorr(flagids(i).corr);
275 : }
276 : else {
277 0 : fid.corr = flagids(i).corr;
278 : }
279 :
280 : //set baseline
281 0 : if (!upcase(extendAnt).compare("ALL")) {
282 0 : fid.bl = "";
283 : }
284 : else {
285 0 : fid.bl = String::toString(flagids(i).ant1) +
286 0 : String("&") +
287 0 : String::toString(flagids(i).ant2);
288 : }
289 :
290 : //set time
291 0 : if (!upcase(extendTime).compare("ALL")) {
292 0 : fid.time = "";
293 : }
294 : else {
295 0 : fid.time = flagids(i).time;
296 : }
297 :
298 0 : fid.field = flagids(i).field;
299 :
300 0 : fids(i) = fid;
301 : }
302 :
303 0 : for (Int i = 0; i < npts; i++) {
304 0 : fids[i].show();
305 : }
306 :
307 0 : Vector<uInt> indexV(npts);
308 0 : Vector<uInt> uniqueV(npts);
309 0 : Sort sort;
310 : //sort.sortKey (&fids, &(FlagIDS::compareID), sizeof(FlagIDS));
311 0 : sort.sortKey (&fids[0].spw, TpString, sizeof(FlagIDS));
312 0 : sort.sortKey (&fids[0].time, TpString, sizeof(FlagIDS));
313 0 : sort.sortKey (&fids[0].bl, TpString, sizeof(FlagIDS));
314 0 : sort.sortKey (&fids[0].corr, TpString, sizeof(FlagIDS));
315 0 : sort.sortKey (&fids[0].chan, TpString, sizeof(FlagIDS));
316 :
317 : uInt sr =
318 0 : sort.sort (indexV, npts);
319 :
320 0 : uInt ur = sort.unique (uniqueV, indexV);
321 : cout
322 0 : << "npts=" << npts
323 0 : << " sorted=" << sr
324 0 : << " unique=" << ur
325 0 : << endl;
326 :
327 0 : Bool ret = true;
328 0 : for (uInt i = 0; i < ur; i++) {
329 :
330 0 : FlagIDS usFlag = fids[indexV(uniqueV(i))];
331 : // set spw:chan
332 : // need to be careful of the variable shape spws
333 0 : if (usFlag.chan.length() > 0) {
334 0 : setSpw(usFlag.spw + String(":") + usFlag.chan);
335 : }
336 : else {
337 0 : setSpw(usFlag.spw);
338 : }
339 :
340 : //set correlation
341 0 : setCorrelation(usFlag.corr);
342 :
343 : //set baseline
344 0 : setBaseline(usFlag.bl);
345 :
346 : //set time
347 0 : setTime(usFlag.time);
348 :
349 0 : setField(String::toString(usFlag.field));
350 :
351 0 : selectdata();
352 0 : setmanualflags(unflag);
353 : }
354 : try {
355 0 : ret = run();
356 : }
357 0 : catch (AipsError ex) {
358 0 : LogIO log;
359 0 : log<<LogIO::WARN<< LogOrigin("Flagger")
360 : <<ex.getMesg()
361 0 : <<LogIO::POST;
362 : }
363 :
364 0 : return ret;
365 : }
366 :
367 0 : Bool ExtendFlagger::extend(const Vector<FlagID>& flagids) {
368 : //cout << " extendCorr=" + extendCorr
369 : // << " extendChan=" + extendChan
370 : // << " extendSpw=" + extendSpw
371 : // << " extendAnt=" + extendAnt
372 : // << " extendTime=" + extendTime
373 : // << endl;
374 0 : Int npts = flagids.size();
375 0 : if (npts == 0) {
376 0 : return false;
377 : }
378 :
379 0 : Bool ret = true;
380 0 : for (Int i = 0; i < npts; i++) {
381 0 : String chanstr = flagids(i).chan;
382 0 : if (!upcase(extendChan).compare("ALL")) {
383 0 : chanstr = "";
384 : }
385 :
386 0 : String spwstr = String::toString(flagids(i).spw);
387 0 : if (!upcase(extendSpw).compare("ALL")) {
388 0 : spwstr = ableSpw(flagids(i).spw);
389 : }
390 :
391 : // set spw:chan
392 : // need to be careful of the variable shape spws
393 0 : if (chanstr.length() > 0) {
394 0 : setSpw(spwstr + String(":") + chanstr);
395 : }
396 : else {
397 0 : setSpw(spwstr);
398 : }
399 :
400 : //set correlation
401 0 : if (!upcase(extendCorr).compare("ALL")) {
402 0 : setCorrelation("");
403 : }
404 0 : else if (!upcase(extendCorr).compare("HALF")) {
405 0 : setCorrelation(halfExtendCorr(flagids(i).corr));
406 : }
407 : else {
408 0 : setCorrelation(flagids(i).corr);
409 : }
410 :
411 : //set baseline
412 : // flagids.ant1 is the ant id, we need ant name
413 : //String blstr = String::toString(flagids(i).ant1) +
414 : // String("&") +
415 : // String::toString(flagids(i).ant2);
416 :
417 : //const MSAntennaColumns & antColumn = ms.antenna();
418 : //const ScalarColumn<String> antNames = antColumn.name();
419 : //String blstr = (antColumn.name())(flagids(i).ant1) +
420 : // String("&") +
421 : // (antColumn.name())(flagids(i).ant2);
422 :
423 0 : String blstr = "";
424 : try {
425 0 : Vector<String> ants = flagger.antNames();
426 0 : blstr = ants(flagids(i).ant1) +
427 0 : String("&") +
428 0 : ants(flagids(i).ant2);
429 : }
430 0 : catch(...) {}
431 :
432 0 : if (!upcase(extendAnt).compare("ALL")) {
433 0 : setBaseline("");
434 : }
435 : else {
436 0 : setBaseline(blstr);
437 : }
438 :
439 : //set time
440 0 : String timestr = flagids(i).time;
441 0 : if (!upcase(extendTime).compare("ALL")) {
442 0 : setTime("");
443 : }
444 : else {
445 0 : setTime(timestr);
446 : }
447 :
448 0 : setField(String::toString(flagids(i).field));
449 :
450 0 : selectdata();
451 0 : setmanualflags(unflag);
452 : //ret = run();
453 :
454 : //show();
455 : }
456 : try {
457 0 : ret = run();
458 : }
459 0 : catch (AipsError ex) {
460 0 : LogIO log;
461 0 : log<<LogIO::WARN << LogOrigin("Flagger")
462 : <<ex.getMesg()
463 0 : <<LogIO::POST;
464 : }
465 :
466 :
467 0 : return ret;
468 : }
469 :
470 :
471 0 : void ExtendFlagger::show() {
472 0 : cout << "time=" << time
473 0 : << " spw=" << spw
474 0 : << " field=" << field
475 : //String array;
476 : //String feed;
477 : //String scan;
478 0 : << " baseline=" << baseline
479 : //String uvrange;
480 0 : << " corr=" << correlation
481 0 : << endl;
482 0 : }
483 :
484 0 : void ExtendFlagger::setUnflag(Bool unflg) {
485 0 : this->unflag = unflg;
486 0 : }
487 :
488 0 : void ExtendFlagger::setField(const String& field) {
489 0 : this->field = field;
490 0 : }
491 :
492 0 : void ExtendFlagger::setSpw(const String& spw) {
493 0 : this->spw = spw;
494 0 : }
495 :
496 0 : void ExtendFlagger::setArray(const String& array) {
497 0 : this->array = array;
498 0 : }
499 :
500 0 : void ExtendFlagger::setFeed(const String& feed) {
501 0 : this->feed = feed;
502 0 : }
503 :
504 0 : void ExtendFlagger::setScan(const String& scan) {
505 0 : this->scan = scan;
506 0 : }
507 0 : void ExtendFlagger::setBaseline(const String& baseline) {
508 0 : this->baseline = baseline;
509 0 : }
510 :
511 0 : void ExtendFlagger::setUvrange(const String& uvrange) {
512 0 : this->uvrange = uvrange;
513 0 : }
514 :
515 0 : void ExtendFlagger::setTime(const String& time) {
516 0 : this->time = time;
517 0 : }
518 :
519 0 : void ExtendFlagger::setCorrelation(const String& correlation) {
520 0 : this->correlation = correlation;
521 0 : }
522 :
523 0 : void ExtendFlagger::setIntent(const String& intent) {
524 0 : this->intent = intent;
525 0 : }
526 :
527 0 : void ExtendFlagger::setExtendChan(const String& exchan) {
528 0 : this->extendChan = exchan;
529 0 : }
530 :
531 0 : void ExtendFlagger::setExtendCorr(const String& excorr) {
532 0 : this->extendCorr = excorr;
533 0 : }
534 0 : void ExtendFlagger::setExtendAnt(const String& exant) {
535 0 : this->extendAnt = exant;
536 0 : }
537 :
538 0 : void ExtendFlagger::setExtendSpw(const String& exspw) {
539 0 : this->extendSpw = exspw;
540 0 : }
541 :
542 0 : void ExtendFlagger::setExtendTime(const String& time) {
543 0 : this->extendTime = time;
544 0 : }
545 :
546 0 : void ExtendFlagger::setExtend(const String& exchan, const String& excorr,
547 : const String& exspw, const String& exant, const String& time,
548 : const Vector<Vector<String> >& cname, const Vector<Int>& nchan) {
549 0 : this->extendCorr = excorr;
550 0 : this->extendChan = exchan;
551 0 : this->extendAnt = exant;
552 0 : this->extendSpw = exspw;
553 0 : this->extendTime = time;
554 0 : this->ableCorr = cname;
555 0 : this->chanNum = nchan;
556 0 : }
557 :
558 0 : void ExtendFlagger::setAbleCorr(const Vector<Vector<String> >& corrName) {
559 0 : this->ableCorr = corrName;
560 0 : }
561 :
562 0 : void ExtendFlagger::setChanNum(const Vector<Int>& nchan) {
563 0 : this->chanNum = nchan;
564 0 : }
565 :
566 0 : String ExtendFlagger::halfExtendCorr(const String& corr, const uInt pid) {
567 0 : String ex = corr;
568 0 : if (ableCorr.size() > pid) {
569 0 : uInt corrCount = ableCorr[pid].nelements();
570 0 : if (corrCount == 2) {
571 0 : return corr;
572 : }
573 : //cout << "corr=" << corr << " corrCount=" << corrCount << endl;
574 0 : if (corrCount == 4) {
575 0 : uInt i = 0;
576 0 : for (i = 0; i < corrCount; i++) {
577 0 : if (corr.length() > 0 && !upcase(corr).compare(ableCorr[pid][i])) {
578 0 : break;
579 : }
580 : }
581 0 : if (i == 0) {
582 0 : return ableCorr[pid][0] + "," +
583 0 : ableCorr[pid][1] + "," +
584 0 : ableCorr[pid][2];
585 : }
586 0 : if (i == 1) {
587 0 : return ableCorr[pid][0] + "," +
588 0 : ableCorr[pid][1] + "," +
589 0 : ableCorr[pid][3];
590 : }
591 0 : if (i == 2) {
592 0 : return ableCorr[pid][0] + "," +
593 0 : ableCorr[pid][2] + "," +
594 0 : ableCorr[pid][3];
595 : }
596 0 : if (i == 3) {
597 0 : return ableCorr[pid][1] + "," +
598 0 : ableCorr[pid][2] + "," +
599 0 : ableCorr[pid][3];
600 : }
601 : }
602 : }
603 0 : return "";
604 : }
605 :
606 0 : String ExtendFlagger::ableSpw(const Int spw) {
607 0 : String ex = "";
608 0 : Int nspw = chanNum.nelements();
609 0 : if (nspw > spw) {
610 0 : Int nchan = chanNum[spw];
611 0 : for (Int i = 0; i < nspw; i++) {
612 0 : if (chanNum[i] == nchan) {
613 0 : ex += String(";") + String::toString(i);
614 : }
615 : }
616 0 : return ex.after(";");
617 : }
618 0 : return "";
619 : }
620 :
621 :
622 : } //# NAMESPACE CASA - END
|