[2197] | 1 | #include <iostream>
|
---|
[2208] | 2 | #include <fstream>
|
---|
[2197] | 3 | #include <casa/Utilities/Regex.h>
|
---|
| 4 | #include <casa/Inputs/Input.h>
|
---|
| 5 | #include <casa/BasicSL/String.h>
|
---|
| 6 | #include <casa/Containers/Record.h>
|
---|
| 7 | #include <casa/OS/Directory.h>
|
---|
[2208] | 8 | #include <casa/Logging/LogIO.h>
|
---|
| 9 | #include <casa/Logging/LogSink.h>
|
---|
| 10 | #include <casa/Logging/StreamLogSink.h>
|
---|
| 11 | #include <casa/Logging/LogFilter.h>
|
---|
[2241] | 12 | #include "../../src/Scantable.h"
|
---|
[2197] | 13 | #include "ASDMFiller.h"
|
---|
| 14 |
|
---|
| 15 | using namespace std ;
|
---|
| 16 | using namespace asdm ;
|
---|
| 17 | using namespace casa ;
|
---|
| 18 | using namespace asap ;
|
---|
| 19 |
|
---|
| 20 | int main( int argc, char *argv[] )
|
---|
| 21 | {
|
---|
| 22 | // options
|
---|
| 23 | Input inp ;
|
---|
| 24 | String indent = " " ;
|
---|
[2216] | 25 | String versionInfo = "$Id: asdm2ASAP.cc 2754 2013-01-31 02:14:27Z TakeshiNakazato $\nConverts an ASDM dataset into Scantable.\nUsage:\n"+indent+argv[0]+" -antenna <antenna name or id> -asdm <ASDM directory> -asap <Scantable name> [-apc both|yes|no] [-corr-mode ca|ao|ca,ao] [-ocorr-mode ao] [-time-sampling all|integration|subintegration] [-srt fr|bw|ca|fr,bw|fr,ca|ca,bw|all]" ;
|
---|
[2208] | 26 | Bool helpMode = False ;
|
---|
| 27 | for ( int i = 1 ; i < argc ; i++ ) {
|
---|
| 28 | if ( strncmp( argv[i], "-h", 2 ) == 0
|
---|
| 29 | || strncmp( argv[i], "--help", 6 ) == 0
|
---|
| 30 | || strncmp( argv[i], "-v", 2 ) == 0
|
---|
| 31 | || strncmp( argv[i], "--version", 9 ) == 0 ) {
|
---|
| 32 | helpMode = True ;
|
---|
| 33 | break ;
|
---|
| 34 | }
|
---|
| 35 | }
|
---|
| 36 | if ( helpMode )
|
---|
| 37 | inp.version( versionInfo ) ;
|
---|
| 38 | else
|
---|
| 39 | inp.version( "" ) ;
|
---|
[2197] | 40 |
|
---|
| 41 | inp.create( "antenna", "0", "antenna name or id", "String" ) ;
|
---|
| 42 | inp.create( "asdm", "", "ASDM directory name", "String" ) ;
|
---|
| 43 | inp.create( "asap", "", "Scantable name", "String" ) ;
|
---|
[2208] | 44 | inp.create( "apc", "both", "Retrieve Atm Phase Corrected data or not: both|yes|no", "String" ) ;
|
---|
| 45 | inp.create( "overwrite", "True", "Overwrite existing Scantable or not: True|False", "Bool" ) ;
|
---|
[2248] | 46 | inp.create( "corr-mode", "ca,ao", "Input correlator mode: ca+ao|ca|ao", "String" ) ;
|
---|
[2208] | 47 | inp.create( "ocorr-mode", "ao", "Output correlator mode: ao", "String" ) ;
|
---|
| 48 | inp.create( "time-sampling", "all", "time sampling mode: all|integration|subintegration", "String" ) ;
|
---|
[2216] | 49 | inp.create( "srt", "all", "spectral resolution mode: all|fr(full resolution)|ca(channel average)|bw(baseband wide)|fr+ca|fr+bw|ca+bw", "String" ) ;
|
---|
[2208] | 50 | inp.create( "logfile", "", "logger output", "String" ) ;
|
---|
[2754] | 51 | inp.create( "freq-tolsr", "False", "Convert frequency frame to LSRK or not: True|False", "Bool" ) ;
|
---|
[2197] | 52 | inp.readArguments( argc, argv ) ;
|
---|
| 53 |
|
---|
| 54 | string asdmname = inp.getString( "asdm" ) ;
|
---|
| 55 | string antenna = inp.getString( "antenna" ) ;
|
---|
| 56 | string asapname = inp.getString( "asap" ) ;
|
---|
[2208] | 57 | string apc = inp.getString( "apc" ) ;
|
---|
[2197] | 58 | Bool overwrite = inp.getBool( "overwrite" ) ;
|
---|
[2208] | 59 | string corrMode = inp.getString( "corr-mode" ) ;
|
---|
| 60 | string timeSampling = inp.getString( "time-sampling" ) ;
|
---|
[2215] | 61 | string resolutionType = inp.getString( "srt" ) ;
|
---|
[2208] | 62 | string logfile = inp.getString( "logfile" ) ;
|
---|
[2754] | 63 | Bool freqToLsr = inp.getBool( "freq-tolsr" ) ;
|
---|
[2197] | 64 |
|
---|
[2208] | 65 | int numApc = 1 ;
|
---|
| 66 | Vector<Bool> apcCorrected ;
|
---|
| 67 | apcCorrected.resize( numApc ) ;
|
---|
| 68 | if ( apc == "both" ) {
|
---|
| 69 | numApc = 2 ;
|
---|
| 70 | apcCorrected.resize( numApc ) ;
|
---|
| 71 | apcCorrected[0] = True ;
|
---|
| 72 | apcCorrected[1] = False ;
|
---|
[2197] | 73 | }
|
---|
[2208] | 74 | else if ( apc == "yes" ) {
|
---|
| 75 | apcCorrected.resize( numApc ) ;
|
---|
| 76 | apcCorrected[0] = True ;
|
---|
| 77 | }
|
---|
| 78 | else if ( apc == "no" ) {
|
---|
| 79 | apcCorrected.resize( numApc ) ;
|
---|
| 80 | apcCorrected[0] = False ;
|
---|
| 81 | }
|
---|
[2197] | 82 | else {
|
---|
[2208] | 83 | throw AipsError( "Unrecognized value for -apc option" ) ;
|
---|
[2197] | 84 | }
|
---|
[2208] | 85 |
|
---|
[2197] | 86 |
|
---|
[2208] | 87 | ofstream ofs ;
|
---|
| 88 | CountedPtr<LogSinkInterface> logsink_p ;
|
---|
| 89 | String funcname( argv[0] ) ;
|
---|
| 90 | if ( logfile.size() != 0 ) {
|
---|
| 91 | ofs.open( logfile.c_str(), ios_base::app ) ;
|
---|
| 92 | logsink_p = new StreamLogSink( &ofs ) ;
|
---|
| 93 | logsink_p->cerrToo( false ) ;
|
---|
| 94 | }
|
---|
| 95 | else {
|
---|
| 96 | logsink_p = new StreamLogSink() ;
|
---|
[2197] | 97 | }
|
---|
[2208] | 98 | // create ASDMFiller object
|
---|
| 99 | //logsink_p->postLocally( LogMessage( "numApc = "+String::toString(numApc), LogOrigin(funcname,WHERE) ) ) ;
|
---|
| 100 | for ( int iapc = 0 ; iapc < numApc ; iapc++ ) {
|
---|
| 101 | CountedPtr<Scantable> stable( new Scantable() ) ;
|
---|
| 102 | ASDMFiller *filler = new ASDMFiller( stable ) ;
|
---|
[2197] | 103 |
|
---|
[2208] | 104 | // set logger
|
---|
| 105 | filler->setLogger( logsink_p ) ;
|
---|
[2197] | 106 |
|
---|
[2208] | 107 | // open data
|
---|
| 108 | Record rec ;
|
---|
| 109 | Record asdmRec ;
|
---|
| 110 | Regex reg( "[0-9]+$" ) ;
|
---|
| 111 | //asdmRec.define( "apc", apcCorrected ) ;
|
---|
| 112 | asdmRec.define( "apc", apcCorrected[iapc] ) ;
|
---|
| 113 | asdmRec.define( "corr", corrMode ) ;
|
---|
| 114 | asdmRec.define( "sampling", timeSampling ) ;
|
---|
[2215] | 115 | asdmRec.define( "srt", resolutionType ) ;
|
---|
[2754] | 116 | asdmRec.define( "freq_tolsr", freqToLsr ) ;
|
---|
[2208] | 117 | if ( reg.match( antenna.c_str(), antenna.size() ) != String::npos ) {
|
---|
| 118 | // antenna is specifiec as id
|
---|
| 119 | int aid = atoi( antenna.c_str() ) ;
|
---|
| 120 | asdmRec.define( "antenna", aid ) ;
|
---|
[2197] | 121 | }
|
---|
| 122 | else {
|
---|
[2208] | 123 | // antenna is specified as name
|
---|
| 124 | asdmRec.define( "antenna", antenna ) ;
|
---|
[2197] | 125 | }
|
---|
[2208] | 126 | rec.defineRecord( "asdm", asdmRec ) ;
|
---|
| 127 | filler->open( asdmname, rec ) ;
|
---|
| 128 |
|
---|
| 129 | // output filename
|
---|
| 130 | CountedPtr<ASDMReader> reader = filler->getReader() ;
|
---|
| 131 | string aname = reader->getAntennaName() ;
|
---|
| 132 | string outname = asapname ;
|
---|
| 133 | if ( asapname.size() == 0 ) {
|
---|
| 134 | outname = asdmname + "." + aname + ".asap" ;
|
---|
| 135 | }
|
---|
| 136 | if ( apcCorrected[iapc] == True ) {
|
---|
| 137 | outname += ".wvr-corrected" ;
|
---|
| 138 | }
|
---|
| 139 |
|
---|
| 140 | //logsink_p->postLocally( LogMessage("specified option summary:",LogOrigin(funcname,WHERE)) ) ;
|
---|
[2273] | 141 | //logsink_p->postLocally( LogMessage(" antenna = "+String(aname)+" (ID: "+String::toString(reader->getAntennaId())+")",LogOrigin(funcname,WHERE)) ) ;
|
---|
[2208] | 142 | //logsink_p->postLocally( LogMessage(" asdmname = "+asdmname,LogOrigin(funcname,WHERE)) ) ;
|
---|
| 143 | //logsink_p->postLocally( LogMessage(" asapname = "+outname,LogOrigin(funcname,WHERE)) ) ;
|
---|
| 144 | //logsink_p->postLocally( LogMessage(" apcCorrected = "+String::toString(apcCorrected[iapc]),LogOrigin(funcname,WHERE) ) ) ;
|
---|
| 145 | //logsink_p->postLocally( LogMessage(" timeSampling = "+timeSampling,LogOrigin(funcname,WHERE) ) ) ;
|
---|
| 146 | //logsink_p->postLocally( LogMessage(" corrMode = "+corrMode,LogOrigin(funcname,WHERE) ) ) ;
|
---|
| 147 |
|
---|
| 148 | // save scantable on disk
|
---|
| 149 | Directory dir( outname ) ;
|
---|
| 150 | if ( dir.exists() ) {
|
---|
| 151 | if ( overwrite ) {
|
---|
| 152 | logsink_p->postLocally( LogMessage("Delete existing file "+outname+" ...",LogOrigin(funcname,WHERE)) ) ;
|
---|
| 153 | dir.removeRecursive() ;
|
---|
| 154 | }
|
---|
| 155 | else {
|
---|
| 156 | logsink_p->postLocally( LogMessage("Output file "+outname+" exists.",LogOrigin(funcname,WHERE),LogMessage::WARN) ) ;
|
---|
| 157 | return 1 ;
|
---|
| 158 | }
|
---|
| 159 | }
|
---|
| 160 |
|
---|
| 161 | // fill data
|
---|
| 162 | filler->fill() ;
|
---|
| 163 |
|
---|
| 164 | // close data
|
---|
| 165 | filler->close() ;
|
---|
| 166 |
|
---|
| 167 | // save data only if nrow is not zero
|
---|
| 168 | if ( stable->nrow() > 0 ) {
|
---|
| 169 | logsink_p->postLocally( LogMessage("Creating "+outname+"...",LogOrigin(funcname,WHERE)) ) ;
|
---|
| 170 | stable->makePersistent( outname ) ;
|
---|
| 171 | }
|
---|
| 172 | else {
|
---|
| 173 | logsink_p->postLocally( LogMessage(outname+" will not be created since there are no data associate with the selection",LogOrigin(funcname,WHERE)) ) ;
|
---|
| 174 | }
|
---|
| 175 |
|
---|
| 176 | // finalize
|
---|
| 177 | reader = 0 ;
|
---|
| 178 | delete filler ;
|
---|
| 179 |
|
---|
[2197] | 180 | }
|
---|
[2208] | 181 |
|
---|
| 182 | if ( logfile.size() != 0 )
|
---|
| 183 | ofs.close() ;
|
---|
[2197] | 184 |
|
---|
| 185 | return 0 ;
|
---|
| 186 | }
|
---|