Changes in trunk/src/STGrid.cpp [2461:2371]
- File:
-
- 1 edited
-
trunk/src/STGrid.cpp (modified) (29 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/STGrid.cpp
r2461 r2371 1 // 2 // C++ Implementation: STGrid 3 // 4 // Description: 5 // 6 // 7 // Author: Takeshi Nakazato <takeshi.nakazato@nao.ac.jp>, (C) 2011 8 // 9 // Copyright: See COPYING file that comes with this distribution 10 // 11 // 1 #include <iostream> 2 #include <fstream> 3 12 4 #include <casa/BasicSL/String.h> 13 5 #include <casa/Arrays/Vector.h> 6 #include <casa/Arrays/Matrix.h> 7 #include <casa/Arrays/Cube.h> 14 8 #include <casa/Arrays/ArrayMath.h> 9 #include <casa/Arrays/ArrayPartMath.h> 15 10 #include <casa/Quanta/Quantum.h> 16 11 #include <casa/Quanta/QuantumHolder.h> … … 20 15 #include <tables/Tables/Table.h> 21 16 #include <tables/Tables/TableRecord.h> 22 #include <tables/Tables/TableRow.h>23 17 #include <tables/Tables/ExprNode.h> 24 18 #include <tables/Tables/ScalarColumn.h> 25 19 #include <tables/Tables/ArrayColumn.h> 26 #include <tables/Tables/TableCopy.h>27 20 28 21 #include <measures/Measures/MDirection.h> 29 22 30 #include "MathUtils.h" 31 #include <atnf/PKSIO/SrcType.h> 23 #include <MathUtils.h> 32 24 33 25 #include "STGrid.h" 34 26 35 27 using namespace std ; 36 using namespace concurrent ;37 28 using namespace casa ; 38 29 using namespace asap ; … … 40 31 namespace asap { 41 32 42 // for performance check43 double eToInt = 0.0 ;44 double eGetWeight = 0.0 ;45 46 33 // constructor 47 34 STGrid::STGrid() 48 : vshape_( 1 ), wshape_( 2 ), dshape_( 2 )49 35 { 50 36 init() ; … … 52 38 53 39 STGrid::STGrid( const string infile ) 54 : vshape_( 1 ), wshape_( 2 ), dshape_( 2 )55 40 { 56 41 init() ; 57 42 58 43 setFileIn( infile ) ; 59 }60 61 STGrid::STGrid( const vector<string> infile )62 {63 init() ;64 65 setFileList( infile ) ;66 44 } 67 45 … … 82 60 userSupport_ = -1 ; 83 61 convSampling_ = 100 ; 84 nprocessed_ = 0 ;85 nchunk_ = 0 ;86 87 // initialize user input88 nxUI_ = -1 ;89 nyUI_ = -1 ;90 cellxUI_ = "" ;91 cellyUI_ = "" ;92 centerUI_ = "" ;93 doclip_ = False ;94 62 } 95 63 96 64 void STGrid::setFileIn( const string infile ) 97 65 { 98 nfile_ = 1 ;99 66 String name( infile ) ; 100 infileList_.resize( nfile_ ) ; 101 infileList_[0] = String(infile) ; 102 } 103 104 void STGrid::setFileList( const vector<string> infile ) 105 { 106 nfile_ = infile.size() ; 107 infileList_.resize( nfile_ ) ; 108 for ( uInt i = 0 ; i < nfile_ ; i++ ) { 109 infileList_[i] = infile[i] ; 67 if ( infile_.compare( name ) != 0 ) { 68 infile_ = String( infile ) ; 69 tab_ = Table( infile_ ) ; 110 70 } 111 71 } … … 114 74 { 115 75 pollist_.assign( Vector<uInt>( pols ) ) ; 76 cout << "pollist_ = " << pollist_ << endl ; 116 77 } 117 78 … … 119 80 { 120 81 scanlist_.assign( Vector<uInt>( scans ) ) ; 82 cout << "scanlist_ = " << scanlist_ << endl ; 121 83 } 122 84 … … 125 87 wtype_ = String( wType ) ; 126 88 wtype_.upcase() ; 89 cout << "wtype_ = " << wtype_ << endl ; 127 90 } 128 91 … … 133 96 string scenter ) 134 97 { 135 nxUI_ = (Int)nx ; 136 nyUI_ = (Int)ny ; 137 cellxUI_ = String( scellx ) ; 138 cellyUI_ = String( scelly ) ; 139 centerUI_ = String( scenter ) ; 98 ROArrayColumn<Double> dirCol( tab_, "DIRECTION" ) ; 99 Matrix<Double> direction = dirCol.getColumn() ; 100 Double rmax, rmin, dmax, dmin ; 101 minMax( rmin, rmax, direction.row( 0 ) ) ; 102 minMax( dmin, dmax, direction.row( 1 ) ) ; 103 104 Int npx = (Int)nx ; 105 Int npy = (Int)ny ; 106 String cellx( scellx ) ; 107 String celly( scelly ) ; 108 String center( scenter ) ; 109 setupGrid( npx, npy, 110 cellx, celly, 111 rmin, rmax, 112 dmin, dmax, 113 center ) ; 140 114 } 141 115 … … 176 150 Double*); 177 151 } 178 void STGrid::call_ggridsd( Array<Double> &xypos, 179 Array<Complex> &spectra, 180 Int &nvispol, 181 Int &nvischan, 182 Array<Int> &flagtra, 183 Array<Int> &flagrow, 184 Array<Float> &weight, 185 Int &nrow, 186 Int &irow, 187 Array<Complex> &gdata, 188 Array<Float> &gwgt, 189 Int &nx, 190 Int &ny, 191 Int &npol, 192 Int &nchan, 193 Int &support, 194 Int &sampling, 195 Vector<Float> &convFunc, 196 Int *chanMap, 197 Int *polMap ) 198 { 199 // parameters for gridding 200 Int idopsf = 0 ; 201 Int len = npol*nchan ; 202 Double *sumw_p = new Double[len] ; 203 { 204 Double *work_p = sumw_p ; 205 for ( Int i = 0 ; i < len ; i++ ) { 206 *work_p = 0.0 ; 207 work_p++ ; 208 } 209 } 210 211 // prepare pointer 212 Bool deletePos, deleteData, deleteWgt, deleteFlag, deleteFlagR, deleteConv, deleteDataG, deleteWgtG ; 213 Double *xy_p = xypos.getStorage( deletePos ) ; 214 const Complex *values_p = spectra.getStorage( deleteData ) ; 215 const Int *flag_p = flagtra.getStorage( deleteFlag ) ; 216 const Int *rflag_p = flagrow.getStorage( deleteFlagR ) ; 217 const Float *wgt_p = weight.getStorage( deleteWgt ) ; 218 Complex *grid_p = gdata.getStorage( deleteDataG ) ; 219 Float *wgrid_p = gwgt.getStorage( deleteWgtG ) ; 220 Float *conv_p = convFunc.getStorage( deleteConv ) ; 221 222 // pass copy of irow to ggridsd since it will be modified in theroutine 223 Int irowCopy = irow ; 224 225 // call ggridsd 226 ggridsd( xy_p, 227 values_p, 228 &nvispol, 229 &nvischan, 230 &idopsf, 231 flag_p, 232 rflag_p, 233 wgt_p, 234 &nrow, 235 &irowCopy, 236 grid_p, 237 wgrid_p, 238 &nx, 239 &ny, 240 &npol, 241 &nchan, 242 &support, 243 &sampling, 244 conv_p, 245 chanMap, 246 polMap, 247 sumw_p ) ; 248 249 // finalization 250 xypos.putStorage( xy_p, deletePos ) ; 251 spectra.freeStorage( values_p, deleteData ) ; 252 flagtra.freeStorage( flag_p, deleteFlag ) ; 253 flagrow.freeStorage( rflag_p, deleteFlagR ) ; 254 weight.freeStorage( wgt_p, deleteWgt ) ; 255 gdata.putStorage( grid_p, deleteDataG ) ; 256 gwgt.putStorage( wgrid_p, deleteWgtG ) ; 257 convFunc.putStorage( conv_p, deleteConv ) ; 258 delete sumw_p ; 259 } 260 261 #define NEED_UNDERSCORES 262 #if defined(NEED_UNDERSCORES) 263 #define ggridsd2 ggridsd2_ 264 #endif 265 extern "C" { 266 void ggridsd2(Double*, 267 const Complex*, 268 Int*, 269 Int*, 270 Int*, 271 const Int*, 272 const Int*, 273 const Float*, 274 Int*, 275 Int*, 276 Complex*, 277 Float*, 278 Int*, 279 Complex*, 280 Float*, 281 Float*, 282 Complex*, 283 Float*, 284 Float*, 285 Int*, 286 Int*, 287 Int *, 288 Int *, 289 Int*, 290 Int*, 291 Float*, 292 Int*, 293 Int*, 294 Double*); 295 } 296 void STGrid::call_ggridsd2( Array<Double> &xypos, 297 Array<Complex> &spectra, 298 Int &nvispol, 299 Int &nvischan, 300 Array<Int> &flagtra, 301 Array<Int> &flagrow, 302 Array<Float> &weight, 303 Int &nrow, 304 Int &irow, 305 Array<Complex> &gdata, 306 Array<Float> &gwgt, 307 Array<Int> &npoints, 308 Array<Complex> &clipmin, 309 Array<Float> &clipwmin, 310 Array<Float> &clipcmin, 311 Array<Complex> &clipmax, 312 Array<Float> &clipwmax, 313 Array<Float> &clipcmax, 314 Int &nx, 315 Int &ny, 316 Int &npol, 317 Int &nchan, 318 Int &support, 319 Int &sampling, 320 Vector<Float> &convFunc, 321 Int *chanMap, 322 Int *polMap ) 323 { 324 // parameters for gridding 325 Int idopsf = 0 ; 326 Int len = npol*nchan ; 327 Double *sumw_p = new Double[len] ; 328 { 329 Double *work_p = sumw_p ; 330 for ( Int i = 0 ; i < len ; i++ ) { 331 *work_p = 0.0 ; 332 work_p++ ; 333 } 334 } 335 336 // prepare pointer 337 Bool deletePos, deleteData, deleteWgt, deleteFlag, deleteFlagR, deleteConv, deleteDataG, deleteWgtG, deleteNpts, deleteCMin, deleteCWMin, deleteCCMin, deleteCMax, deleteCWMax, deleteCCMax ; 338 Double *xy_p = xypos.getStorage( deletePos ) ; 339 const Complex *values_p = spectra.getStorage( deleteData ) ; 340 const Int *flag_p = flagtra.getStorage( deleteFlag ) ; 341 const Int *rflag_p = flagrow.getStorage( deleteFlagR ) ; 342 const Float *wgt_p = weight.getStorage( deleteWgt ) ; 343 Complex *grid_p = gdata.getStorage( deleteDataG ) ; 344 Float *wgrid_p = gwgt.getStorage( deleteWgtG ) ; 345 Float *conv_p = convFunc.getStorage( deleteConv ) ; 346 Int *npts_p = npoints.getStorage( deleteNpts ) ; 347 Complex *cmin_p = clipmin.getStorage( deleteCMin ) ; 348 Float *cwmin_p = clipwmin.getStorage( deleteCWMin ) ; 349 Float *ccmin_p = clipcmin.getStorage( deleteCCMin ) ; 350 Complex *cmax_p = clipmax.getStorage( deleteCMax ) ; 351 Float *cwmax_p = clipwmax.getStorage( deleteCWMax ) ; 352 Float *ccmax_p = clipcmax.getStorage( deleteCCMax ) ; 353 354 // pass copy of irow to ggridsd since it will be modified in theroutine 355 Int irowCopy = irow ; 356 357 // call ggridsd 358 ggridsd2( xy_p, 359 values_p, 360 &nvispol, 361 &nvischan, 362 &idopsf, 363 flag_p, 364 rflag_p, 365 wgt_p, 366 &nrow, 367 &irowCopy, 368 grid_p, 369 wgrid_p, 370 npts_p, 371 cmin_p, 372 cwmin_p, 373 ccmin_p, 374 cmax_p, 375 cwmax_p, 376 ccmax_p, 377 &nx, 378 &ny, 379 &npol, 380 &nchan, 381 &support, 382 &sampling, 383 conv_p, 384 chanMap, 385 polMap, 386 sumw_p ) ; 387 388 // finalization 389 xypos.putStorage( xy_p, deletePos ) ; 390 spectra.freeStorage( values_p, deleteData ) ; 391 flagtra.freeStorage( flag_p, deleteFlag ) ; 392 flagrow.freeStorage( rflag_p, deleteFlagR ) ; 393 weight.freeStorage( wgt_p, deleteWgt ) ; 394 gdata.putStorage( grid_p, deleteDataG ) ; 395 gwgt.putStorage( wgrid_p, deleteWgtG ) ; 396 convFunc.putStorage( conv_p, deleteConv ) ; 397 clipmin.putStorage( cmin_p, deleteCMin ) ; 398 clipwmin.putStorage( cwmin_p, deleteCWMin ) ; 399 clipcmin.putStorage( ccmin_p, deleteCCMin ) ; 400 clipmax.putStorage( cmax_p, deleteCMax ) ; 401 clipwmax.putStorage( cwmax_p, deleteCWMax ) ; 402 clipcmax.putStorage( ccmax_p, deleteCCMax ) ; 403 delete sumw_p ; 404 } 405 406 void STGrid::grid() 152 void STGrid::grid() 407 153 { 408 154 LogIO os( LogOrigin("STGrid", "grid", WHERE) ) ; 409 double t0,t1 ; 410 411 // data selection 155 156 // retrieve data 157 Cube<Float> spectra ; 158 Matrix<Double> direction ; 159 Cube<uChar> flagtra ; 160 Matrix<uInt> rflag ; 161 Matrix<Float> weight ; 162 double t0, t1 ; 412 163 t0 = mathutil::gettimeofday_sec() ; 413 selectData() ;164 getData( spectra, direction, flagtra, rflag, weight ) ; 414 165 t1 = mathutil::gettimeofday_sec() ; 415 os << LogIO::DEBUGGING << "selectData: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 416 417 setupGrid() ; 418 setupArray() ; 419 420 if ( wtype_.compare("UNIFORM") != 0 && 421 wtype_.compare("TINT") != 0 && 422 wtype_.compare("TSYS") != 0 && 423 wtype_.compare("TINTSYS") != 0 ) { 424 LogIO os( LogOrigin("STGrid", "grid", WHERE) ) ; 425 os << LogIO::WARN << "Unsupported weight type '" << wtype_ << "', apply UNIFORM weight" << LogIO::POST ; 426 wtype_ = "UNIFORM" ; 427 } 428 166 os << "getData: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 167 IPosition sshape = spectra.shape() ; 168 //os << "spectra.shape()=" << spectra.shape() << LogIO::POST ; 169 //os << "max(spectra) = " << max(spectra) << LogIO::POST ; 170 //os << "weight = " << weight << LogIO::POST ; 171 172 // flagtra: uChar -> Int 173 // rflag: uInt -> Int 174 Cube<Int> flagI ; 175 Matrix<Int> rflagI ; 176 t0 = mathutil::gettimeofday_sec() ; 177 toInt( &flagtra, &flagI ) ; 178 toInt( &rflag, &rflagI ) ; 179 t1 = mathutil::gettimeofday_sec() ; 180 os << "toInt: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 181 429 182 // grid parameter 430 183 os << LogIO::DEBUGGING ; 431 os << "----------" << endl ;432 os << "Data selection summary" << endl ;433 os << " ifno = " << ifno_ << endl ;434 os << " pollist = " << pollist_ << endl ;435 os << " scanlist = " << scanlist_ << endl ;436 184 os << "----------" << endl ; 437 185 os << "Grid parameter summary" << endl ; … … 439 187 os << " (cellx,celly) = (" << cellx_ << "," << celly_ << ")" << endl ; 440 188 os << " center = " << center_ << endl ; 441 os << " weighting = " << wtype_ << endl ;442 os << " convfunc = " << convType_ << " with support " << convSupport_ << endl ;443 os << " doclip = " << (doclip_?"True":"False") << endl ;444 189 os << "----------" << LogIO::POST ; 445 190 os << LogIO::NORMAL ; 446 191 447 if ( doclip_ ) 448 gridPerRowWithClipping() ; 449 else 450 gridPerRow() ; 451 } 452 453 void STGrid::updateChunkShape() 454 { 455 // TODO: nchunk_ must be determined from nchan_, npol_, and (nx_,ny_) 456 // by considering data size to be allocated for ggridsd input/output 457 nchunk_ = 400 ; 458 nchunk_ = min( nchunk_, nrow_ ) ; 459 vshape_ = IPosition( 1, nchunk_ ) ; 460 wshape_ = IPosition( 2, nchan_, nchunk_ ) ; 461 dshape_ = IPosition( 2, 2, nchunk_ ) ; 462 } 463 464 struct STGChunk { 465 Int nrow ; 466 Array<Complex> spectra; 467 Array<Int> flagtra; 468 Array<Int> rflag; 469 Array<Float> weight; 470 Array<Double> direction; 471 STGChunk(IPosition const &wshape, IPosition const &vshape, 472 IPosition const &dshape) 473 : spectra(wshape), flagtra(wshape), rflag(vshape), weight(wshape), 474 direction(dshape) 475 { } 476 }; 477 478 struct STCommonData { 479 Int gnx; 480 Int gny; 481 Int *chanMap; 192 // convolution kernel 482 193 Vector<Float> convFunc ; 483 Array<Complex> gdataArrC; 484 Array<Float> gwgtArr; 485 STCommonData(IPosition const &gshape, Array<Float> const &data) 486 : gdataArrC(gshape, 0.0), gwgtArr(data) {} 487 }; 488 489 struct STCommonDataWithClipping { 490 Int gnx; 491 Int gny; 492 Int *chanMap; 493 Vector<Float> convFunc ; 494 Array<Complex> gdataArrC; 495 Array<Float> gwgtArr; 496 Array<Int> npoints ; 497 Array<Complex> clipMin ; 498 Array<Float> clipWMin ; 499 Array<Float> clipCMin ; 500 Array<Complex> clipMax ; 501 Array<Float> clipWMax ; 502 Array<Float> clipCMax ; 503 STCommonDataWithClipping(IPosition const &gshape, 504 IPosition const &pshape, 505 Array<Float> const &data) 506 : gdataArrC(gshape, 0.0), 507 gwgtArr(data), 508 npoints(pshape, 0), 509 clipMin(gshape, Complex(FLT_MAX,0.0)), 510 clipWMin(gshape, 0.0), 511 clipCMin(gshape, 0.0), 512 clipMax(gshape, Complex(-FLT_MAX,0.0)), 513 clipWMax(gshape, 0.0), 514 clipCMax(gshape, 0.0) 515 {} 516 }; 517 518 #define DO_AHEAD 3 519 520 struct STContext { 521 STCommonData &common; 522 FIFO<STGChunk *, DO_AHEAD> queue; 523 STGrid *const self; 524 const Int pol; 525 STContext(STGrid *obj, STCommonData &common, Int pol) 526 : self(obj), common(common), pol(pol) {} 527 }; 528 529 struct STContextWithClipping { 530 STCommonDataWithClipping &common; 531 FIFO<STGChunk *, DO_AHEAD> queue; 532 STGrid *const self; 533 const Int pol; 534 STContextWithClipping(STGrid *obj, STCommonDataWithClipping &common, Int pol) 535 : self(obj), common(common), pol(pol) {} 536 }; 537 538 539 bool STGrid::produceChunk(void *ctx) throw(PCException) 540 { 541 STContext &context = *(STContext *)ctx; 542 if ( context.self->nprocessed_ >= context.self->nrow_ ) { 543 return false; 544 } 545 STGChunk *chunk = new STGChunk(context.self->wshape_, 546 context.self->vshape_, 547 context.self->dshape_); 548 549 double t0 = mathutil::gettimeofday_sec() ; 550 chunk->nrow = context.self->getDataChunk( 551 context.self->wshape_, context.self->vshape_, context.self->dshape_, 552 chunk->spectra, chunk->direction, 553 chunk->flagtra, chunk->rflag, chunk->weight); 554 double t1 = mathutil::gettimeofday_sec() ; 555 context.self->eGetData_ += t1-t0 ; 556 557 context.queue.lock(); 558 context.queue.put(chunk); 559 context.queue.unlock(); 560 return true; 561 } 562 563 void STGrid::consumeChunk(void *ctx) throw(PCException) 564 { 565 STContext &context = *(STContext *)ctx; 566 STGChunk *chunk = NULL; 567 try { 568 context.queue.lock(); 569 chunk = context.queue.get(); 570 context.queue.unlock(); 571 } catch (FullException &e) { 572 context.queue.unlock(); 573 // TODO: log error 574 throw PCException(); 575 } 576 577 double t0, t1 ; 194 t0 = mathutil::gettimeofday_sec() ; 195 setConvFunc( convFunc ) ; 196 t1 = mathutil::gettimeofday_sec() ; 197 os << "setConvFunc: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 198 //cout << "convSupport=" << convSupport_ << endl ; 199 //cout << "convFunc=" << convFunc << endl ; 200 578 201 // world -> pixel 579 Array<Double> xypos( context.self->dshape_) ;202 Matrix<Double> xypos( direction.shape(), 0.0 ) ; 580 203 t0 = mathutil::gettimeofday_sec() ; 581 context.self->toPixel( chunk->direction, xypos ) ;204 toPixel( direction, xypos ) ; 582 205 t1 = mathutil::gettimeofday_sec() ; 583 context.self->eToPixel_ += t1-t0 ;584 206 os << "toPixel: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 207 585 208 // call ggridsd 586 Int nvispol = 1 ; 209 Bool deletePos, deleteData, deleteWgt, deleteFlag, deleteFlagR, deleteConv, deleteDataG, deleteWgtG ; 210 Double *xypos_p = xypos.getStorage( deletePos ) ; 211 Cube<Complex> dataC( spectra.shape(), 0.0 ) ; 212 setReal( dataC, spectra ) ; 213 const Complex *data_p = dataC.getStorage( deleteData ) ; 214 const Float *wgt_p = weight.getStorage( deleteWgt ) ; 215 const Int *flag_p = flagI.getStorage( deleteFlag ) ; 216 const Int *rflag_p = rflagI.getStorage( deleteFlagR ) ; 217 Float *conv_p = convFunc.getStorage( deleteConv ) ; 218 // Extend grid plane with convSupport_ 219 Int gnx = nx_ ; 220 Int gny = ny_ ; 221 // Int gnx = nx_+convSupport_*2 ; 222 // Int gny = ny_+convSupport_*2 ; 223 IPosition gshape( 4, gnx, gny, npol_, nchan_ ) ; 224 Array<Complex> gdataArrC( gshape, 0.0 ) ; 225 Array<Float> gwgtArr( gshape, 0.0 ) ; 226 Complex *gdata_p = gdataArrC.getStorage( deleteDataG ) ; 227 Float *wdata_p = gwgtArr.getStorage( deleteWgtG ) ; 228 Int idopsf = 0 ; 229 Int *chanMap = new Int[nchan_] ; 230 { 231 Int *work_p = chanMap ; 232 for ( Int i = 0 ; i < nchan_ ; i++ ) { 233 *work_p = i ; 234 work_p++ ; 235 } 236 } 237 Int *polMap = new Int[npol_] ; 238 { 239 Int *work_p = polMap ; 240 for ( Int i = 0 ; i < npol_ ; i++ ) { 241 *work_p = i ; 242 work_p++ ; 243 } 244 } 245 Double *sumw_p = new Double[npol_*nchan_] ; 246 { 247 Double *work_p = sumw_p ; 248 for ( Int i = 0 ; i < npol_*nchan_ ; i++ ) { 249 *work_p = 0.0 ; 250 work_p++ ; 251 } 252 } 253 t0 = mathutil::gettimeofday_sec() ; 587 254 Int irow = -1 ; 588 t0 = mathutil::gettimeofday_sec() ; 589 context.self->call_ggridsd( xypos, 590 chunk->spectra, 591 nvispol, 592 context.self->nchan_, 593 chunk->flagtra, 594 chunk->rflag, 595 chunk->weight, 596 chunk->nrow, 597 irow, 598 context.common.gdataArrC, 599 context.common.gwgtArr, 600 context.common.gnx, 601 context.common.gny, 602 context.self->npol_, 603 context.self->nchan_, 604 context.self->convSupport_, 605 context.self->convSampling_, 606 context.common.convFunc, 607 context.common.chanMap, 608 (Int*)&context.pol ) ; 255 ggridsd( xypos_p, 256 data_p, 257 &npol_, 258 &nchan_, 259 &idopsf, 260 flag_p, 261 rflag_p, 262 wgt_p, 263 &nrow_, 264 &irow, 265 gdata_p, 266 wdata_p, 267 &gnx, 268 &gny, 269 &npol_, 270 &nchan_, 271 &convSupport_, 272 &convSampling_, 273 conv_p, 274 chanMap, 275 polMap, 276 sumw_p ) ; 609 277 t1 = mathutil::gettimeofday_sec() ; 610 context.self->eGGridSD_ += t1-t0 ; 611 612 delete chunk; 613 } 614 615 void STGrid::gridPerRow() 616 { 617 LogIO os( LogOrigin("STGrid", "gridPerRow", WHERE) ) ; 618 double t0, t1 ; 619 620 621 // grid data 622 // Extend grid plane with convSupport_ 623 // Int gnx = nx_+convSupport_*2 ; 624 // Int gny = ny_+convSupport_*2 ; 625 Int gnx = nx_; 626 Int gny = ny_; 627 628 IPosition gshape( 4, gnx, gny, npol_, nchan_ ) ; 629 // 2011/12/20 TN 630 // data_ and gwgtArr share storage 631 data_.resize( gshape ) ; 632 data_ = 0.0 ; 633 STCommonData common = STCommonData(gshape, data_); 634 common.gnx = gnx ; 635 common.gny = gny ; 636 637 // parameters for gridding 638 Int *chanMap = new Int[nchan_] ; 639 for ( Int i = 0 ; i < nchan_ ; i++ ) { 640 chanMap[i] = i ; 641 } 642 common.chanMap = chanMap; 643 644 // convolution kernel 645 t0 = mathutil::gettimeofday_sec() ; 646 setConvFunc( common.convFunc ) ; 647 t1 = mathutil::gettimeofday_sec() ; 648 os << LogIO::DEBUGGING << "setConvFunc: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 649 650 // for performance check 651 eGetData_ = 0.0 ; 652 eToPixel_ = 0.0 ; 653 eGGridSD_ = 0.0 ; 654 double eInitPol = 0.0 ; 655 656 for ( uInt ifile = 0 ; ifile < nfile_ ; ifile++ ) { 657 initTable( ifile ) ; 658 659 os << "start table " << ifile << ": " << infileList_[ifile] << LogIO::POST ; 660 Broker broker = Broker(produceChunk, consumeChunk); 661 for ( Int ipol = 0 ; ipol < npol_ ; ipol++ ) { 662 t0 = mathutil::gettimeofday_sec() ; 663 initPol( ipol ) ; // set ptab_ and attach() 664 t1 = mathutil::gettimeofday_sec() ; 665 eInitPol += t1-t0 ; 666 667 STContext context(this, common, ipol); 668 669 os << "start pol " << ipol << LogIO::POST ; 670 671 nprocessed_ = 0 ; 672 #if 1 673 broker.runProducerAsMasterThread(&context, DO_AHEAD); 674 #else 675 for (;;) { 676 bool produced = produceChunk(&context); 677 if (! produced) { 678 break; 679 } 680 consumeChunk(&context); 681 } 682 #endif 683 684 os << "end pol " << ipol << LogIO::POST ; 685 686 } 687 os << "end table " << ifile << LogIO::POST ; 688 } 689 os << LogIO::DEBUGGING << "initPol: elapsed time is " << eInitPol << " sec." << LogIO::POST ; 690 os << LogIO::DEBUGGING << "getData: elapsed time is " << eGetData_-eToInt-eGetWeight << " sec." << LogIO::POST ; 691 os << LogIO::DEBUGGING << "toPixel: elapsed time is " << eToPixel_ << " sec." << LogIO::POST ; 692 os << LogIO::DEBUGGING << "ggridsd: elapsed time is " << eGGridSD_ << " sec." << LogIO::POST ; 693 os << LogIO::DEBUGGING << "toInt: elapsed time is " << eToInt << " sec." << LogIO::POST ; 694 os << LogIO::DEBUGGING << "getWeight: elapsed time is " << eGetWeight << " sec." << LogIO::POST ; 695 278 os << "ggridsd: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 279 xypos.putStorage( xypos_p, deletePos ) ; 280 dataC.freeStorage( data_p, deleteData ) ; 281 weight.freeStorage( wgt_p, deleteWgt ) ; 282 flagI.freeStorage( flag_p, deleteFlag ) ; 283 rflagI.freeStorage( rflag_p, deleteFlagR ) ; 284 convFunc.putStorage( conv_p, deleteConv ) ; 285 delete polMap ; 696 286 delete chanMap ; 697 698 // set data 699 setData( common.gdataArrC, common.gwgtArr ) ; 700 701 } 702 703 void STGrid::consumeChunkWithClipping(void *ctx) throw(PCException) 704 { 705 STContextWithClipping &context = *(STContextWithClipping *)ctx; 706 STGChunk *chunk = NULL; 707 try { 708 context.queue.lock(); 709 chunk = context.queue.get(); 710 context.queue.unlock(); 711 } catch (FullException &e) { 712 context.queue.unlock(); 713 // TODO: log error 714 throw PCException(); 715 } 716 717 double t0, t1 ; 718 // world -> pixel 719 Array<Double> xypos( context.self->dshape_ ) ; 720 t0 = mathutil::gettimeofday_sec() ; 721 context.self->toPixel( chunk->direction, xypos ) ; 722 t1 = mathutil::gettimeofday_sec() ; 723 context.self->eToPixel_ += t1-t0 ; 724 725 // call ggridsd 726 Int nvispol = 1 ; 727 Int irow = -1 ; 728 t0 = mathutil::gettimeofday_sec() ; 729 context.self->call_ggridsd2( xypos, 730 chunk->spectra, 731 nvispol, 732 context.self->nchan_, 733 chunk->flagtra, 734 chunk->rflag, 735 chunk->weight, 736 chunk->nrow, 737 irow, 738 context.common.gdataArrC, 739 context.common.gwgtArr, 740 context.common.npoints, 741 context.common.clipMin, 742 context.common.clipWMin, 743 context.common.clipCMin, 744 context.common.clipMax, 745 context.common.clipWMax, 746 context.common.clipCMax, 747 context.common.gnx, 748 context.common.gny, 749 context.self->npol_, 750 context.self->nchan_, 751 context.self->convSupport_, 752 context.self->convSampling_, 753 context.common.convFunc, 754 context.common.chanMap, 755 (Int*)&context.pol ) ; 756 t1 = mathutil::gettimeofday_sec() ; 757 context.self->eGGridSD_ += t1-t0 ; 758 759 delete chunk; 760 } 761 762 void STGrid::gridPerRowWithClipping() 763 { 764 LogIO os( LogOrigin("STGrid", "gridPerRowWithClipping", WHERE) ) ; 765 double t0, t1 ; 766 767 768 // grid data 769 // Extend grid plane with convSupport_ 770 // Int gnx = nx_+convSupport_*2 ; 771 // Int gny = ny_+convSupport_*2 ; 772 Int gnx = nx_; 773 Int gny = ny_; 774 775 IPosition gshape( 4, gnx, gny, npol_, nchan_ ) ; 776 IPosition pshape( 3, gnx, gny, npol_ ) ; 777 // 2011/12/20 TN 778 // data_ and gwgtArr share storage 779 data_.resize( gshape ) ; 780 data_ = 0.0 ; 781 STCommonDataWithClipping common = STCommonDataWithClipping( gshape, 782 pshape, 783 data_ ) ; 784 common.gnx = gnx ; 785 common.gny = gny ; 786 787 // parameters for gridding 788 Int *chanMap = new Int[nchan_] ; 789 for ( Int i = 0 ; i < nchan_ ; i++ ) { 790 chanMap[i] = i ; 791 } 792 common.chanMap = chanMap; 793 794 // convolution kernel 795 t0 = mathutil::gettimeofday_sec() ; 796 setConvFunc( common.convFunc ) ; 797 t1 = mathutil::gettimeofday_sec() ; 798 os << LogIO::DEBUGGING << "setConvFunc: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 799 800 // for performance check 801 eGetData_ = 0.0 ; 802 eToPixel_ = 0.0 ; 803 eGGridSD_ = 0.0 ; 804 double eInitPol = 0.0 ; 805 806 for ( uInt ifile = 0 ; ifile < nfile_ ; ifile++ ) { 807 initTable( ifile ) ; 808 809 os << "start table " << ifile << ": " << infileList_[ifile] << LogIO::POST ; 810 Broker broker = Broker(produceChunk, consumeChunkWithClipping); 811 for ( Int ipol = 0 ; ipol < npol_ ; ipol++ ) { 812 t0 = mathutil::gettimeofday_sec() ; 813 initPol( ipol ) ; // set ptab_ and attach() 814 t1 = mathutil::gettimeofday_sec() ; 815 eInitPol += t1-t0 ; 816 817 STContextWithClipping context(this, common, ipol); 818 819 os << "start pol " << ipol << LogIO::POST ; 820 821 nprocessed_ = 0 ; 822 #if 1 823 broker.runProducerAsMasterThread(&context, DO_AHEAD); 824 #else 825 for (;;) { 826 bool produced = produceChunk(&context); 827 if (! produced) { 828 break; 829 } 830 consumeChunkWithClipping(&context); 831 } 832 #endif 833 834 os << "end pol " << ipol << LogIO::POST ; 835 836 } 837 os << "end table " << ifile << LogIO::POST ; 838 } 839 os << LogIO::DEBUGGING << "initPol: elapsed time is " << eInitPol << " sec." << LogIO::POST ; 840 os << LogIO::DEBUGGING << "getData: elapsed time is " << eGetData_-eToInt-eGetWeight << " sec." << LogIO::POST ; 841 os << LogIO::DEBUGGING << "toPixel: elapsed time is " << eToPixel_ << " sec." << LogIO::POST ; 842 os << LogIO::DEBUGGING << "ggridsd2: elapsed time is " << eGGridSD_ << " sec." << LogIO::POST ; 843 os << LogIO::DEBUGGING << "toInt: elapsed time is " << eToInt << " sec." << LogIO::POST ; 844 os << LogIO::DEBUGGING << "getWeight: elapsed time is " << eGetWeight << " sec." << LogIO::POST ; 845 846 delete chanMap ; 847 848 // clip min and max in each grid 849 // os << "BEFORE CLIPPING" << LogIO::POST ; 850 // os << "gdataArrC=" << common.gdataArrC << LogIO::POST ; 851 // os << "gwgtArr=" << common.gwgtArr << LogIO::POST ; 852 t0 = mathutil::gettimeofday_sec() ; 853 clipMinMax( common.gdataArrC, 854 common.gwgtArr, 855 common.npoints, 856 common.clipMin, 857 common.clipWMin, 858 common.clipCMin, 859 common.clipMax, 860 common.clipWMax, 861 common.clipCMax ) ; 862 t1 = mathutil::gettimeofday_sec() ; 863 os << LogIO::DEBUGGING << "clipMinMax: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 864 // os << "AFTER CLIPPING" << LogIO::POST ; 865 // os << "gdataArrC=" << common.gdataArrC << LogIO::POST ; 866 // os << "gwgtArr=" << common.gwgtArr << LogIO::POST ; 867 868 // set data 869 setData( common.gdataArrC, common.gwgtArr ) ; 870 871 } 872 873 void STGrid::clipMinMax( Array<Complex> &grid, 874 Array<Float> &weight, 875 Array<Int> &npoints, 876 Array<Complex> &clipmin, 877 Array<Float> &clipwmin, 878 Array<Float> &clipcmin, 879 Array<Complex> &clipmax, 880 Array<Float> &clipwmax, 881 Array<Float> &clipcmax ) 882 { 883 //LogIO os( LogOrigin("STGrid","clipMinMax",WHERE) ) ; 884 885 // prepare pointers 886 Bool delG, delW, delNP, delCMin, delCWMin, delCCMin, delCMax, delCWMax, delCCMax ; 887 Complex *grid_p = grid.getStorage( delG ) ; 888 Float *wgt_p = weight.getStorage( delW ) ; 889 const Int *npts_p = npoints.getStorage( delNP ) ; 890 const Complex *cmin_p = clipmin.getStorage( delCMin ) ; 891 const Float *cwmin_p = clipwmin.getStorage( delCWMin ) ; 892 const Float *ccmin_p = clipcmin.getStorage( delCCMin ) ; 893 const Complex *cmax_p = clipmax.getStorage( delCMax ) ; 894 const Float *cwmax_p = clipwmax.getStorage( delCWMax ) ; 895 const Float *ccmax_p = clipcmax.getStorage( delCCMax ) ; 896 897 const IPosition &gshape = grid.shape() ; 898 long offset = gshape[0] * gshape[1] * gshape[2] ; // nx * ny * npol 899 Int nchan = gshape[3] ; 900 long origin = nchan * offset ; 901 for ( long i = 0 ; i < offset ; i++ ) { 902 if ( *npts_p > 2 ) { 903 for ( Int ichan = 0 ; ichan < nchan ; ichan++ ) { 904 // clip minimum and maximum 905 *grid_p -= (*cmin_p)*(*cwmin_p)*(*ccmin_p) 906 + (*cmax_p)*(*cwmax_p)*(*ccmax_p) ; 907 *wgt_p -= (*cwmin_p)*(*ccmin_p) 908 + (*cwmax_p)*(*ccmax_p) ; 909 910 grid_p += offset ; 911 wgt_p += offset ; 912 cmin_p += offset ; 913 cwmin_p += offset ; 914 ccmin_p += offset ; 915 cmax_p += offset ; 916 cwmax_p += offset ; 917 ccmax_p += offset ; 918 } 919 grid_p -= origin ; 920 wgt_p -= origin ; 921 cmin_p -= origin ; 922 cwmin_p -= origin ; 923 ccmin_p -= origin ; 924 cmax_p -= origin ; 925 cwmax_p -= origin ; 926 ccmax_p -= origin ; 927 } 928 grid_p++ ; 929 wgt_p++ ; 930 npts_p++ ; 931 cmin_p++ ; 932 cwmin_p++ ; 933 ccmin_p++ ; 934 cmax_p++ ; 935 cwmax_p++ ; 936 ccmax_p++ ; 937 } 938 grid_p -= offset ; 939 wgt_p -= offset ; 940 npts_p -= offset ; 941 cmin_p -= offset ; 942 cwmin_p -= offset ; 943 ccmin_p -= offset ; 944 cmax_p -= offset ; 945 cwmax_p -= offset ; 946 ccmax_p -= offset ; 947 948 // finalization 949 grid.putStorage( grid_p, delG ) ; 950 weight.putStorage( wgt_p, delW ) ; 951 npoints.freeStorage( npts_p, delNP ) ; 952 clipmin.freeStorage( cmin_p, delCMin ) ; 953 clipwmin.freeStorage( cwmin_p, delCWMin ) ; 954 clipcmin.freeStorage( ccmin_p, delCCMin ) ; 955 clipmax.freeStorage( cmax_p, delCMax ) ; 956 clipwmax.freeStorage( cwmax_p, delCWMax ) ; 957 clipcmax.freeStorage( ccmax_p, delCCMax ) ; 958 } 959 960 void STGrid::initPol( Int ipol ) 961 { 962 LogIO os( LogOrigin("STGrid","initPol",WHERE) ) ; 963 if ( npolOrg_ == 1 ) { 964 os << "single polarization data." << LogIO::POST ; 965 ptab_ = tab_ ; 966 } 967 else 968 ptab_ = tab_( tab_.col("POLNO") == pollist_[ipol] ) ; 969 970 attach( ptab_ ) ; 971 } 972 973 void STGrid::initTable( uInt idx ) 974 { 975 tab_ = tableList_[idx] ; 976 nrow_ = rows_[idx] ; 977 updateChunkShape() ; 978 } 979 980 void STGrid::setData( Array<Complex> &gdata, 287 gdataArrC.putStorage( gdata_p, deleteDataG ) ; 288 gwgtArr.putStorage( wdata_p, deleteWgtG ) ; 289 Array<Float> gdataArr = real( gdataArrC ) ; 290 setData( data_, gdataArr, gwgtArr ) ; 291 //Matrix<Double> sumWeight( IPosition( 2, npol_, nchan_ ), sumw_p, TAKE_OVER ) ; 292 delete sumw_p ; 293 //cout << "sumWeight = " << sumWeight << endl ; 294 // os << "gdataArr = " << gdataArr << LogIO::POST ; 295 // os << "gwgtArr = " << gwgtArr << LogIO::POST ; 296 // os << "data_ " << data_ << LogIO::POST ; 297 } 298 299 void STGrid::setData( Array<Float> &data, 300 Array<Float> &gdata, 981 301 Array<Float> &gwgt ) 982 302 { 983 // 2011/12/20 TN984 // gwgt and data_ share storage985 303 LogIO os( LogOrigin("STGrid","setData",WHERE) ) ; 986 304 double t0, t1 ; 987 305 t0 = mathutil::gettimeofday_sec() ; 988 uInt len = data_.nelements() ; 989 const Complex *w1_p ; 990 Float *w2_p ; 991 Bool b1, b2 ; 992 const Complex *gdata_p = gdata.getStorage( b1 ) ; 993 Float *gwgt_p = data_.getStorage( b2 ) ; 306 data.resize( gdata.shape() ) ; 307 uInt len = data.nelements() ; 308 Float *w0_p ; 309 const Float *w1_p, *w2_p ; 310 Bool b0, b1, b2 ; 311 Float *data_p = data.getStorage( b0 ) ; 312 const Float *gdata_p = gdata.getStorage( b1 ) ; 313 const Float *gwgt_p = gwgt.getStorage( b2 ) ; 314 w0_p = data_p ; 994 315 w1_p = gdata_p ; 995 316 w2_p = gwgt_p ; 996 317 for ( uInt i = 0 ; i < len ; i++ ) { 997 if ( *w2_p > 0.0 ) *w2_p = (*w1_p).real() / *w2_p ; 318 *w0_p = (*w2_p > 0.0) ? (*w1_p / *w2_p) : 0.0 ; 319 w0_p++ ; 998 320 w1_p++ ; 999 321 w2_p++ ; 1000 322 } 323 data.putStorage( data_p, b0 ) ; 1001 324 gdata.freeStorage( gdata_p, b1 ) ; 1002 data_.putStorage( gwgt_p, b2 ) ;325 gwgt.freeStorage( gwgt_p, b2 ) ; 1003 326 t1 = mathutil::gettimeofday_sec() ; 1004 os << LogIO::DEBUGGING << "setData: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 1005 } 1006 1007 void STGrid::setupGrid() 1008 { 1009 Double xmin,xmax,ymin,ymax ; 1010 mapExtent( xmin, xmax, ymin, ymax ) ; 1011 1012 setupGrid( nxUI_, nyUI_, cellxUI_, cellyUI_, 1013 xmin, xmax, ymin, ymax, centerUI_ ) ; 327 os << "setData: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 1014 328 } 1015 329 … … 1024 338 String ¢er ) 1025 339 { 1026 LogIO os( LogOrigin("STGrid","setupGrid",WHERE) ) ;1027 340 //cout << "nx=" << nx << ", ny=" << ny << endl ; 1028 341 … … 1058 371 center_(0) = xcen.getValue( "rad" ) ; 1059 372 center_(1) = ycen.getValue( "rad" ) ; 1060 double base = 0.5 * (xmin + xmax) ; 1061 int maxrotate = 1 ; 1062 int nelem = 2 * maxrotate + 1 ; 1063 double *sep = new double[nelem] ; 1064 for ( int i = 0 ; i < nelem ; i++ ) 1065 sep[i] = abs(base - center_[0] - (i-maxrotate) * C::_2pi) ; 1066 // os << "sep[0]=" << sep[0] << endl 1067 // << "sep[1]=" << sep[1] << endl 1068 // << "sep[2]=" << sep[2] << LogIO::POST ; 1069 int idx = 0 ; 1070 base = sep[0] ; 1071 int nrotate = 0 ; 1072 while ( idx < nelem ) { 1073 if ( base > sep[idx] ) { 1074 base = sep[idx] ; 1075 nrotate = idx ; 1076 } 1077 idx++ ; 1078 } 1079 delete sep ; 1080 nrotate -= maxrotate ; 1081 // os << "nrotate = " << nrotate << LogIO::POST ; 1082 center_[0] += nrotate * C::_2pi ; 1083 } 1084 // os << "xmin=" << xmin << LogIO::POST ; 1085 // os << "center_=" << center_ << LogIO::POST ; 1086 1087 1088 nx_ = nx ; 1089 ny_ = ny ; 1090 if ( nx < 0 && ny > 0 ) { 1091 nx_ = ny ; 1092 ny_ = ny ; 1093 } 1094 if ( ny < 0 && nx > 0 ) { 1095 nx_ = nx ; 1096 ny_ = nx ; 1097 } 373 } 374 1098 375 1099 376 //Double wx = xmax - xmin ; … … 1104 381 wx *= 1.10 ; 1105 382 wy *= 1.10 ; 1106 1107 383 Quantum<Double> qcellx ; 1108 384 Quantum<Double> qcelly ; 385 nx_ = nx ; 386 ny_ = ny ; 387 if ( nx < 0 && ny > 0 ) { 388 nx_ = ny ; 389 ny_ = ny ; 390 } 391 if ( ny < 0 && nx > 0 ) { 392 nx_ = nx ; 393 ny_ = nx ; 394 } 1109 395 //cout << "nx_ = " << nx_ << ", ny_ = " << ny_ << endl ; 1110 396 if ( cellx.size() != 0 && celly.size() != 0 ) { … … 1113 399 } 1114 400 else if ( celly.size() != 0 ) { 1115 os << "Using celly to x-axis..." << LogIO::POST;401 cout << "Using celly to x-axis..." << endl ; 1116 402 readQuantity( qcelly, celly ) ; 1117 403 qcellx = qcelly ; 1118 404 } 1119 405 else if ( cellx.size() != 0 ) { 1120 os << "Using cellx to y-axis..." << LogIO::POST;406 cout << "Using cellx to y-axis..." << endl ; 1121 407 readQuantity( qcellx, cellx ) ; 1122 408 qcelly = qcellx ; … … 1124 410 else { 1125 411 if ( nx_ < 0 ) { 1126 os << "No user preference in grid setting. Using default..." << LogIO::POST;412 cout << "No user preference in grid setting. Using default..." << endl ; 1127 413 readQuantity( qcellx, "1.0arcmin" ) ; 1128 414 qcelly = qcellx ; 1129 415 } 1130 416 else { 1131 if ( wx == 0.0 ) {1132 os << "Using default spatial extent (10arcmin) in x" << LogIO::POST ;1133 wx = 0.00290888 ;1134 }1135 if ( wy == 0.0 ) {1136 os << "Using default spatial extent (10arcmin) in y" << LogIO::POST ;1137 wy = 0.00290888 ;1138 }1139 417 qcellx = Quantum<Double>( wx/nx_, "rad" ) ; 1140 418 qcelly = Quantum<Double>( wy/ny_, "rad" ) ; … … 1142 420 } 1143 421 cellx_ = qcellx.getValue( "rad" ) ; 1144 // DEC correction1145 cellx_ /= cos( center_[1] ) ;1146 422 celly_ = qcelly.getValue( "rad" ) ; 1147 //os << "cellx_=" << cellx_ << ", celly_=" << celly_ << ", cos("<<center_(1)<<")=" << cos(center_(1)) << LogIO::POST ;1148 423 if ( nx_ < 0 ) { 1149 if ( wx == 0.0 ) {1150 os << "Using default spatial extent (10arcmin) in x" << LogIO::POST ;1151 wx = 0.00290888 ;1152 }1153 if ( wy == 0.0 ) {1154 os << "Using default spatial extent (10arcmin) in y" << LogIO::POST ;1155 wy = 0.00290888 ;1156 }1157 424 nx_ = Int( ceil( wx/cellx_ ) ) ; 1158 425 ny_ = Int( ceil( wy/celly_ ) ) ; … … 1160 427 } 1161 428 1162 void STGrid::mapExtent( Double &xmin, Double &xmax, 1163 Double &ymin, Double &ymax ) 1164 { 1165 //LogIO os( LogOrigin("STGrid","mapExtent",WHERE) ) ; 1166 directionCol_.attach( tableList_[0], "DIRECTION" ) ; 1167 Matrix<Double> direction = directionCol_.getColumn() ; 1168 //os << "dirCol.nrow() = " << dirCol.nrow() << LogIO::POST ; 1169 minMax( xmin, xmax, direction.row( 0 ) ) ; 1170 minMax( ymin, ymax, direction.row( 1 ) ) ; 1171 Double amin, amax, bmin, bmax ; 1172 for ( uInt i = 1 ; i < nfile_ ; i++ ) { 1173 directionCol_.attach( tableList_[i], "DIRECTION" ) ; 1174 direction.assign( directionCol_.getColumn() ) ; 1175 //os << "dirCol.nrow() = " << dirCol.nrow() << LogIO::POST ; 1176 minMax( amin, amax, direction.row( 0 ) ) ; 1177 minMax( bmin, bmax, direction.row( 1 ) ) ; 1178 xmin = min( xmin, amin ) ; 1179 xmax = max( xmax, amax ) ; 1180 ymin = min( ymin, bmin ) ; 1181 ymax = max( ymax, bmax ) ; 1182 } 1183 //os << "(xmin,xmax)=(" << xmin << "," << xmax << ")" << LogIO::POST ; 1184 //os << "(ymin,ymax)=(" << ymin << "," << ymax << ")" << LogIO::POST ; 1185 } 1186 1187 void STGrid::selectData() 1188 { 1189 LogIO os( LogOrigin("STGrid","selectData",WHERE) ) ; 429 void STGrid::selectData( Table &tab ) 430 { 1190 431 Int ifno = ifno_ ; 1191 tableList_.resize( nfile_ ) ; 1192 if ( ifno_ == -1 ) { 1193 Table taborg( infileList_[0] ) ; 432 Table taborg( infile_ ) ; 433 if ( ifno == -1 ) { 434 LogIO os( LogOrigin("STGrid","selectData",WHERE) ) ; 435 // os << LogIO::SEVERE 436 // << "Please set IFNO before actual gridding" 437 // << LogIO::EXCEPTION ; 1194 438 ROScalarColumn<uInt> ifnoCol( taborg, "IFNO" ) ; 1195 ifno _= ifnoCol( 0 ) ;439 ifno = ifnoCol( 0 ) ; 1196 440 os << LogIO::WARN 1197 << "IFNO is not given. Using default IFNO: " << ifno_ << LogIO::POST ; 1198 } 1199 for ( uInt i = 0 ; i < nfile_ ; i++ ) { 1200 Table taborg( infileList_[i] ) ; 1201 TableExprNode node ; 1202 if ( ifno != -1 || isMultiIF( taborg ) ) { 1203 os << "apply selection on IFNO" << LogIO::POST ; 1204 node = taborg.col("IFNO") == ifno_ ; 1205 } 1206 if ( scanlist_.size() > 0 ) { 1207 os << "apply selection on SCANNO" << LogIO::POST ; 1208 node = node && taborg.col("SCANNO").in( scanlist_ ) ; 1209 } 1210 if ( node.isNull() ) { 1211 tableList_[i] = taborg ; 441 << "IFNO is not given. Using default IFNO: " << ifno << LogIO::POST ; 442 } 443 // tab = taborg( taborg.col("IFNO") == ifno ) ; 444 TableExprNode node ; 445 node = taborg.col("IFNO") == ifno ; 446 if ( scanlist_.size() > 0 ) { 447 node = node && taborg.col("SCANNO").in( scanlist_ ) ; 448 } 449 tab = taborg( node ) ; 450 if ( tab.nrow() == 0 ) { 451 LogIO os( LogOrigin("STGrid","selectData",WHERE) ) ; 452 os << LogIO::SEVERE 453 << "No corresponding rows for given selection: IFNO " << ifno 454 << " SCANNO " << scanlist_ 455 << LogIO::EXCEPTION ; 456 } 457 } 458 459 void STGrid::getData( Cube<Float> &spectra, 460 Matrix<Double> &direction, 461 Cube<uChar> &flagtra, 462 Matrix<uInt> &rflag, 463 Matrix<Float> &weight ) 464 { 465 Table tab ; 466 selectData( tab ) ; 467 updatePolList( tab ) ; 468 // cout << "npol_ = " << npol_ << endl ; 469 // cout << "nchan_ = " << nchan_ << endl ; 470 // cout << "nrow_ = " << nrow_ << endl ; 471 spectra.resize( npol_, nchan_, nrow_ ) ; 472 flagtra.resize( npol_, nchan_, nrow_ ) ; 473 rflag.resize( npol_, nrow_ ) ; 474 Cube<Float> tsys( npol_, nchan_, nrow_ ) ; 475 Matrix<Double> tint( npol_, nrow_ ) ; 476 // boolean for pointer access 477 Bool bsp, bfl, bfr, bts, bti ; 478 // pointer to the data 479 Float *sp_p = spectra.getStorage( bsp ) ; 480 uChar *fl_p = flagtra.getStorage( bfl ) ; 481 uInt *fr_p = rflag.getStorage( bfr ) ; 482 Float *ts_p = tsys.getStorage( bts ) ; 483 Double *ti_p = tint.getStorage( bti ) ; 484 // working pointer 485 Float *wsp_p = sp_p ; 486 uChar *wfl_p = fl_p ; 487 uInt *wfr_p = fr_p ; 488 Float *wts_p = ts_p ; 489 Double *wti_p = ti_p ; 490 uInt len = nchan_ * nrow_ ; 491 IPosition mshape( 2, nchan_, nrow_ ) ; 492 IPosition vshape( 1, nrow_ ) ; 493 for ( Int ipol = 0 ; ipol < npol_ ; ipol++ ) { 494 Table subt = tab( tab.col("POLNO") == pollist_[ipol] ) ; 495 ROArrayColumn<Float> spectraCol( subt, "SPECTRA" ) ; 496 ROArrayColumn<Double> directionCol( subt, "DIRECTION" ) ; 497 ROArrayColumn<uChar> flagtraCol( subt, "FLAGTRA" ) ; 498 ROScalarColumn<uInt> rflagCol( subt, "FLAGROW" ) ; 499 ROArrayColumn<Float> tsysCol( subt, "TSYS" ) ; 500 ROScalarColumn<Double> tintCol( subt, "INTERVAL" ) ; 501 Matrix<Float> spSlice( mshape, wsp_p, SHARE ) ; 502 Matrix<uChar> flSlice( mshape, wfl_p, SHARE ) ; 503 Vector<uInt> frSlice( vshape, wfr_p, SHARE ) ; 504 spectraCol.getColumn( spSlice ) ; 505 flagtraCol.getColumn( flSlice ) ; 506 rflagCol.getColumn( frSlice ) ; 507 if ( ipol == 0 ) 508 directionCol.getColumn( direction ) ; 509 Vector<Float> tmpF = tsysCol( 0 ) ; 510 Vector<Double> tmpD( vshape, wti_p, SHARE ) ; 511 Matrix<Float> tsSlice( mshape, wts_p, SHARE ) ; 512 if ( tmpF.nelements() == (uInt)nchan_ ) { 513 tsysCol.getColumn( tsSlice ) ; 1212 514 } 1213 515 else { 1214 tableList_[i] = taborg( node ) ; 1215 } 1216 os << LogIO::DEBUGGING << "tableList_[" << i << "].nrow()=" << tableList_[i].nrow() << LogIO::POST ; 1217 if ( tableList_[i].nrow() == 0 ) { 1218 os << LogIO::SEVERE 1219 << "No corresponding rows for given selection: IFNO " << ifno_ ; 1220 if ( scanlist_.size() > 0 ) 1221 os << " SCANNO " << scanlist_ ; 1222 os << LogIO::EXCEPTION ; 1223 } 1224 } 1225 } 1226 1227 Bool STGrid::isMultiIF( Table &tab ) 1228 { 1229 ROScalarColumn<uInt> ifnoCol( tab, "IFNO" ) ; 1230 Vector<uInt> ifnos = ifnoCol.getColumn() ; 1231 return anyNE( ifnos, ifnos[0] ) ; 1232 } 1233 1234 void STGrid::attach( Table &tab ) 1235 { 1236 // attach to table 1237 spectraCol_.attach( tab, "SPECTRA" ) ; 1238 flagtraCol_.attach( tab, "FLAGTRA" ) ; 1239 directionCol_.attach( tab, "DIRECTION" ) ; 1240 flagRowCol_.attach( tab, "FLAGROW" ) ; 1241 tsysCol_.attach( tab, "TSYS" ) ; 1242 intervalCol_.attach( tab, "INTERVAL" ) ; 1243 } 1244 1245 Int STGrid::getDataChunk( 1246 IPosition const &wshape, 1247 IPosition const &vshape, 1248 IPosition const &dshape, 1249 Array<Complex> &spectra, 1250 Array<Double> &direction, 1251 Array<Int> &flagtra, 1252 Array<Int> &rflag, 1253 Array<Float> &weight ) 1254 { 1255 LogIO os( LogOrigin("STGrid","getDataChunk",WHERE) ) ; 1256 1257 Array<Float> spectraF_(wshape); 1258 Array<uChar> flagtraUC_(wshape); 1259 Array<uInt> rflagUI_(vshape); 1260 Int nrow = getDataChunk( spectraF_, direction, flagtraUC_, rflagUI_, weight ) ; 1261 if ( nrow < nchunk_ ) { 1262 spectra.resize( spectraF_.shape() ) ; 1263 flagtra.resize( flagtraUC_.shape() ) ; 1264 rflag.resize( rflagUI_.shape() ) ; 1265 } 1266 double t0, t1 ; 1267 t0 = mathutil::gettimeofday_sec() ; 1268 convertArray( spectra, spectraF_ ) ; 1269 toInt( flagtraUC_, flagtra ) ; 1270 toInt( rflagUI_, rflag ) ; 1271 t1 = mathutil::gettimeofday_sec() ; 1272 eToInt = t1 - t0 ; 1273 1274 return nrow ; 1275 } 1276 1277 #if 0 1278 Int STGrid::getDataChunk( Array<Complex> &spectra, 1279 Array<Double> &direction, 1280 Array<Int> &flagtra, 1281 Array<Int> &rflag, 1282 Array<Float> &weight ) 1283 { 1284 LogIO os( LogOrigin("STGrid","getDataChunk",WHERE) ) ; 1285 Int nrow = getDataChunk( spectraF_, direction, flagtraUC_, rflagUI_, weight ) ; 1286 if ( nrow < nchunk_ ) { 1287 spectra.resize( spectraF_.shape() ) ; 1288 flagtra.resize( flagtraUC_.shape() ) ; 1289 rflag.resize( rflagUI_.shape() ) ; 1290 } 1291 double t0, t1 ; 1292 t0 = mathutil::gettimeofday_sec() ; 1293 convertArray( spectra, spectraF_ ) ; 1294 toInt( flagtraUC_, flagtra ) ; 1295 toInt( rflagUI_, rflag ) ; 1296 t1 = mathutil::gettimeofday_sec() ; 1297 eToInt = t1 - t0 ; 1298 1299 return nrow ; 1300 } 1301 #endif 1302 1303 Int STGrid::getDataChunk( Array<Float> &spectra, 1304 Array<Double> &direction, 1305 Array<uChar> &flagtra, 1306 Array<uInt> &rflag, 1307 Array<Float> &weight ) 1308 { 1309 LogIO os( LogOrigin("STGrid","getDataChunk",WHERE) ) ; 1310 Int nrow = spectra.shape()[1] ; 1311 Int remainingRow = nrow_ - nprocessed_ ; 1312 if ( remainingRow < nrow ) { 1313 nrow = remainingRow ; 1314 IPosition mshape( 2, nchan_, nrow ) ; 1315 IPosition vshape( 1, nrow ) ; 1316 spectra.resize( mshape ) ; 1317 flagtra.resize( mshape ) ; 1318 direction.resize( IPosition(2,2,nrow) ) ; 1319 rflag.resize( vshape ) ; 1320 weight.resize( mshape ) ; 1321 } 1322 // 2011/12/22 TN 1323 // tsys shares its storage with weight 1324 Array<Float> tsys( weight ) ; 1325 Array<Double> tint( rflag.shape() ) ; 1326 1327 Vector<uInt> rflagVec( rflag ) ; 1328 Vector<Double> tintVec( tint ) ; 1329 1330 RefRows rows( nprocessed_, nprocessed_+nrow-1, 1 ) ; 1331 //os<<LogIO::DEBUGGING<<"nprocessed_="<<nprocessed_<<": rows.nrows()="<<rows.nrows()<<LogIO::POST ; 1332 spectraCol_.getColumnCells( rows, spectra ) ; 1333 flagtraCol_.getColumnCells( rows, flagtra ) ; 1334 directionCol_.getColumnCells( rows, direction ) ; 1335 flagRowCol_.getColumnCells( rows, rflagVec ) ; 1336 intervalCol_.getColumnCells( rows, tintVec ) ; 1337 Vector<Float> tsysTemp = tsysCol_( nprocessed_ ) ; 1338 if ( tsysTemp.nelements() == (uInt)nchan_ ) 1339 tsysCol_.getColumnCells( rows, tsys ) ; 1340 else 1341 tsys = tsysTemp[0] ; 1342 1343 double t0,t1 ; 1344 t0 = mathutil::gettimeofday_sec() ; 516 tsSlice = tmpF( 0 ) ; 517 } 518 tintCol.getColumn( tmpD ) ; 519 520 wsp_p += len ; 521 wfl_p += len ; 522 wfr_p += nrow_ ; 523 wts_p += len ; 524 wti_p += nrow_ ; 525 } 526 spectra.putStorage( sp_p, bsp ) ; 527 flagtra.putStorage( fl_p, bfl ) ; 528 rflag.putStorage( fr_p, bfr ) ; 529 tsys.putStorage( ts_p, bts ) ; 530 tint.putStorage( ti_p, bti ) ; 531 1345 532 getWeight( weight, tsys, tint ) ; 1346 t1 = mathutil::gettimeofday_sec() ; 1347 eGetWeight += t1-t0 ; 1348 1349 nprocessed_ += nrow ; 1350 1351 return nrow ; 1352 } 1353 1354 void STGrid::setupArray() 1355 { 1356 LogIO os( LogOrigin("STGrid","setupArray",WHERE) ) ; 1357 ROScalarColumn<uInt> polnoCol( tableList_[0], "POLNO" ) ; 533 } 534 535 void STGrid::updatePolList( Table &tab ) 536 { 537 ROScalarColumn<uInt> polnoCol( tab, "POLNO" ) ; 1358 538 Vector<uInt> pols = polnoCol.getColumn() ; 1359 //os << pols << LogIO::POST ;1360 539 Vector<uInt> pollistOrg ; 1361 npolOrg_= 0 ;540 uInt npolOrg = 0 ; 1362 541 uInt polno ; 1363 542 for ( uInt i = 0 ; i < polnoCol.nrow() ; i++ ) { … … 1365 544 polno = pols( i ) ; 1366 545 if ( allNE( pollistOrg, polno ) ) { 1367 pollistOrg.resize( npolOrg _+1, True ) ;1368 pollistOrg[npolOrg _] = polno ;1369 npolOrg _++ ;546 pollistOrg.resize( npolOrg+1, True ) ; 547 pollistOrg[npolOrg] = polno ; 548 npolOrg++ ; 1370 549 } 1371 550 } … … 1386 565 npol_ = pollist_.size() ; 1387 566 if ( npol_ == 0 ) { 567 LogIO os( LogOrigin("STGrid","updatePolList",WHERE) ) ; 1388 568 os << LogIO::SEVERE << "Empty pollist" << LogIO::EXCEPTION ; 1389 569 } 1390 rows_.resize( nfile_ ) ; 1391 for ( uInt i = 0 ; i < nfile_ ; i++ ) { 1392 rows_[i] = tableList_[i].nrow() / npolOrg_ ; 1393 //if ( nrow_ < rows_[i] ) 1394 // nrow_ = rows_[i] ; 1395 } 1396 flagtraCol_.attach( tableList_[0], "FLAGTRA" ) ; 1397 nchan_ = flagtraCol_( 0 ).nelements() ; 570 nrow_ = tab.nrow() / npolOrg ; 571 ROArrayColumn<uChar> tmpCol( tab, "FLAGTRA" ) ; 572 nchan_ = tmpCol( 0 ).nelements() ; 573 // LogIO os( LogOrigin("STGrid","updatePolList",WHERE) ) ; 1398 574 // os << "npol_ = " << npol_ << "(" << pollist_ << ")" << endl 1399 575 // << "nchan_ = " << nchan_ << endl … … 1401 577 } 1402 578 1403 void STGrid::getWeight( Array<Float> &w,1404 Array<Float> &tsys,1405 Array<Double> &tint )579 void STGrid::getWeight( Matrix<Float> &w, 580 Cube<Float> &tsys, 581 Matrix<Double> &tint ) 1406 582 { 1407 583 LogIO os( LogOrigin("STGrid","getWeight",WHERE) ) ; 1408 1409 // 2011/12/22 TN 1410 // w (weight) and tsys share storage 1411 IPosition refShape = tsys.shape() ; 1412 Int nchan = refShape[0] ; 1413 Int nrow = refShape[1] ; 1414 // os << "nchan=" << nchan << ", nrow=" << nrow << LogIO::POST ; 1415 // os << "w.shape()=" << w.shape() << endl 1416 // << "tsys.shape()=" << tsys.shape() << endl 1417 // << "tint.shape()=" << tint.shape() << LogIO::POST ; 584 double t0, t1 ; 585 t0 = mathutil::gettimeofday_sec() ; 586 // resize 587 w.resize( nchan_, nrow_ ) ; 1418 588 1419 589 // set weight 590 Bool warn = False ; 1420 591 if ( wtype_.compare( "UNIFORM" ) == 0 ) { 1421 592 w = 1.0 ; 1422 593 } 1423 594 else if ( wtype_.compare( "TINT" ) == 0 ) { 595 if ( npol_ > 1 ) warn = True ; 1424 596 Bool b0, b1 ; 1425 597 Float *w_p = w.getStorage( b0 ) ; … … 1427 599 const Double *ti_p = tint.getStorage( b1 ) ; 1428 600 const Double *w1_p = ti_p ; 1429 for ( Int irow = 0 ; irow < nrow ; irow++ ) { 1430 for ( Int ichan = 0 ; ichan < nchan ; ichan++ ) { 1431 *w0_p = *w1_p ; 601 for ( Int irow = 0 ; irow < nrow_ ; irow++ ) { 602 Float val = (Float)(polMean( w1_p )) ; 603 for ( Int ichan = 0 ; ichan < nchan_ ; ichan++ ) { 604 *w0_p = val ; 1432 605 w0_p++ ; 1433 606 } 1434 w1_p++ ;1435 607 } 1436 608 w.putStorage( w_p, b0 ) ; … … 1438 610 } 1439 611 else if ( wtype_.compare( "TSYS" ) == 0 ) { 1440 Bool b0 ; 612 if ( npol_ > 1 ) warn = True ; 613 Bool b0, b1 ; 1441 614 Float *w_p = w.getStorage( b0 ) ; 1442 615 Float *w0_p = w_p ; 1443 for ( Int irow = 0 ; irow < nrow ; irow++ ) { 1444 for ( Int ichan = 0 ; ichan < nchan ; ichan++ ) { 1445 Float temp = *w0_p ; 1446 *w0_p = 1.0 / ( temp * temp ) ; 616 const Float *ts_p = tsys.getStorage( b1 ) ; 617 const Float *w1_p = ts_p ; 618 for ( Int irow = 0 ; irow < nrow_ ; irow++ ) { 619 for ( Int ichan = 0 ; ichan < nchan_ ; ichan++ ) { 620 Float val = polMean( w1_p ) ; 621 *w0_p = 1.0 / ( val * val ) ; 1447 622 w0_p++ ; 1448 623 } 1449 624 } 1450 625 w.putStorage( w_p, b0 ) ; 626 tsys.freeStorage( ts_p, b1 ) ; 1451 627 } 1452 628 else if ( wtype_.compare( "TINTSYS" ) == 0 ) { 1453 Bool b0, b1 ; 629 if ( npol_ > 1 ) warn = True ; 630 Bool b0, b1, b2 ; 1454 631 Float *w_p = w.getStorage( b0 ) ; 1455 632 Float *w0_p = w_p ; 1456 633 const Double *ti_p = tint.getStorage( b1 ) ; 1457 634 const Double *w1_p = ti_p ; 1458 for ( Int irow = 0 ; irow < nrow ; irow++ ) { 1459 Float interval = *w1_p ; 1460 for ( Int ichan = 0 ; ichan < nchan ; ichan++ ) { 1461 Float temp = *w0_p ; 635 const Float *ts_p = tsys.getStorage( b2 ) ; 636 const Float *w2_p = ts_p ; 637 for ( Int irow = 0 ; irow < nrow_ ; irow++ ) { 638 Float interval = (Float)(polMean( w1_p )) ; 639 for ( Int ichan = 0 ; ichan < nchan_ ; ichan++ ) { 640 Float temp = polMean( w2_p ) ; 1462 641 *w0_p = interval / ( temp * temp ) ; 1463 642 w0_p++ ; 1464 643 } 1465 w1_p++ ;1466 644 } 1467 645 w.putStorage( w_p, b0 ) ; 1468 646 tint.freeStorage( ti_p, b1 ) ; 647 tsys.freeStorage( ts_p, b2 ) ; 1469 648 } 1470 649 else { 1471 650 //LogIO os( LogOrigin("STGrid", "getWeight", WHERE) ) ; 1472 //os << LogIO::WARN << "Unsupported weight type '" << wtype_ << "', apply UNIFORM weight" << LogIO::POST ;651 os << LogIO::WARN << "Unsupported weight type '" << wtype_ << "', apply UNIFORM weight" << LogIO::POST ; 1473 652 w = 1.0 ; 1474 653 } 1475 } 1476 1477 void STGrid::toInt( Array<uChar> &u, Array<Int> &v ) 1478 { 1479 uInt len = u.nelements() ; 654 655 if ( npol_ > 1 ) { 656 //LogIO os( LogOrigin("STGrid", "getWeight", WHERE) ) ; 657 os << LogIO::WARN << "STGrid doesn't support assigning polarization-dependent weight. Use averaged weight over polarization." << LogIO::POST ; 658 } 659 t1 = mathutil::gettimeofday_sec() ; 660 os << "getWeight: elapsed time is " << t1-t0 << " sec" << LogIO::POST ; 661 } 662 663 Float STGrid::polMean( const Float *p ) 664 { 665 Float v = 0.0 ; 666 for ( Int i = 0 ; i < npol_ ; i++ ) { 667 v += *p ; 668 p++ ; 669 } 670 v /= npol_ ; 671 return v ; 672 } 673 674 Double STGrid::polMean( const Double *p ) 675 { 676 Double v = 0.0 ; 677 for ( Int i = 0 ; i < npol_ ; i++ ) { 678 v += *p ; 679 p++ ; 680 } 681 v /= npol_ ; 682 return v ; 683 } 684 685 void STGrid::toInt( Array<uChar> *u, Array<Int> *v ) 686 { 687 uInt len = u->nelements() ; 1480 688 Int *int_p = new Int[len] ; 1481 689 Bool deleteIt ; 1482 const uChar *data_p = u .getStorage( deleteIt ) ;690 const uChar *data_p = u->getStorage( deleteIt ) ; 1483 691 Int *i_p = int_p ; 1484 692 const uChar *u_p = data_p ; … … 1488 696 u_p++ ; 1489 697 } 1490 u .freeStorage( data_p, deleteIt ) ;1491 v .takeStorage( u.shape(), int_p, TAKE_OVER ) ;1492 } 1493 1494 void STGrid::toInt( Array<uInt> &u, Array<Int> &v )1495 { 1496 uInt len = u .nelements() ;698 u->freeStorage( data_p, deleteIt ) ; 699 v->takeStorage( u->shape(), int_p, TAKE_OVER ) ; 700 } 701 702 void STGrid::toInt( Array<uInt> *u, Array<Int> *v ) 703 { 704 uInt len = u->nelements() ; 1497 705 Int *int_p = new Int[len] ; 1498 706 Bool deleteIt ; 1499 const uInt *data_p = u .getStorage( deleteIt ) ;707 const uInt *data_p = u->getStorage( deleteIt ) ; 1500 708 Int *i_p = int_p ; 1501 709 const uInt *u_p = data_p ; … … 1505 713 u_p++ ; 1506 714 } 1507 u .freeStorage( data_p, deleteIt ) ;1508 v .takeStorage( u.shape(), int_p, TAKE_OVER ) ;1509 } 1510 1511 void STGrid::toPixel( Array<Double> &world, Array<Double> &pixel )715 u->freeStorage( data_p, deleteIt ) ; 716 v->takeStorage( u->shape(), int_p, TAKE_OVER ) ; 717 } 718 719 void STGrid::toPixel( Matrix<Double> &world, Matrix<Double> &pixel ) 1512 720 { 1513 721 // gridding will be done on (nx_+2*convSupport_) x (ny_+2*convSupport_) 1514 722 // grid plane to avoid unexpected behavior on grid edge 1515 Block<Double> pixc( 2 ) ;1516 pixc [0]= Double( nx_-1 ) * 0.5 ;1517 pixc [1]= Double( ny_-1 ) * 0.5 ;1518 // pixc [0]= Double( nx_+2*convSupport_-1 ) * 0.5 ;1519 // pixc [1]= Double( ny_+2*convSupport_-1 ) * 0.5 ;723 Vector<Double> pixc( 2 ) ; 724 pixc(0) = Double( nx_-1 ) * 0.5 ; 725 pixc(1) = Double( ny_-1 ) * 0.5 ; 726 // pixc(0) = Double( nx_+2*convSupport_-1 ) * 0.5 ; 727 // pixc(1) = Double( ny_+2*convSupport_-1 ) * 0.5 ; 1520 728 uInt nrow = world.shape()[1] ; 1521 Bool bw, bp ; 1522 const Double *w_p = world.getStorage( bw ) ; 1523 Double *p_p = pixel.getStorage( bp ) ; 1524 const Double *ww_p = w_p ; 1525 Double *wp_p = p_p ; 1526 for ( uInt i = 0 ; i < nrow ; i++ ) { 1527 *wp_p = pixc[0] + ( *ww_p - center_[0] ) / cellx_ ; 1528 wp_p++ ; 1529 ww_p++ ; 1530 *wp_p = pixc[1] + ( *ww_p - center_[1] ) / celly_ ; 1531 wp_p++ ; 1532 ww_p++ ; 1533 } 1534 world.freeStorage( w_p, bw ) ; 1535 pixel.putStorage( p_p, bp ) ; 729 Vector<Double> cell( 2 ) ; 730 cell(0) = cellx_ ; 731 cell(1) = celly_ ; 732 for ( uInt irow = 0 ; irow < nrow ; irow++ ) { 733 for ( uInt i = 0 ; i < 2 ; i++ ) { 734 pixel( i, irow ) = pixc(i) + ( world(i, irow) - center_(i) ) / cell(i) ; 735 } 736 } 737 // String gridfile = "grid."+convType_+"."+String::toString(convSupport_)+".dat" ; 738 // ofstream ofs( gridfile.c_str(), ios::out ) ; 739 // ofs << "center " << center_(0) << " " << pixc(0) 740 // << " " << center_(1) << " " << pixc(1) << endl ; 741 // for ( uInt irow = 0 ; irow < nrow ; irow++ ) { 742 // ofs << irow ; 743 // for ( uInt i = 0 ; i < 2 ; i++ ) { 744 // ofs << " " << world(i, irow) << " " << pixel(i, irow) ; 745 // } 746 // ofs << endl ; 747 // } 748 // ofs.close() ; 1536 749 } 1537 750 … … 1599 812 // to take into account Gaussian tail 1600 813 if ( convSupport_ < 0 ) 1601 convSupport_ = 4 ; // 1* 4814 convSupport_ = 12 ; // 3 * 4 1602 815 else { 1603 816 convSupport_ = userSupport_ * 4 ; … … 1626 839 String outfile_ ; 1627 840 if ( outfile.size() == 0 ) { 1628 if ( infile List_[0].lastchar() == '/' ) {1629 outfile_ = infile List_[0].substr( 0, infileList_[0].size()-1 ) ;841 if ( infile_.lastchar() == '/' ) { 842 outfile_ = infile_.substr( 0, infile_.size()-1 ) ; 1630 843 } 1631 844 else { 1632 outfile_ = infile List_[0];845 outfile_ = infile_ ; 1633 846 } 1634 847 outfile_ += ".grid" ; … … 1684 897 1685 898 t1 = mathutil::gettimeofday_sec() ; 1686 os << LogIO::DEBUGGING << "saveData: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 1687 1688 fillMainColumns( tab ) ; 1689 899 os << "saveData: elapsed time is " << t1-t0 << " sec." << LogIO::POST ; 900 1690 901 return outfile_ ; 1691 902 } … … 1693 904 void STGrid::prepareTable( Table &tab, String &name ) 1694 905 { 1695 Table t( infile List_[0], Table::Old ) ;906 Table t( infile_, Table::Old ) ; 1696 907 t.deepCopy( name, Table::New, False, t.endianFormat(), True ) ; 1697 908 tab = Table( name, Table::Update ) ; 1698 // 2012/02/13 TN 1699 // explicitly copy subtables since no rows including subtables are 1700 // copied by Table::deepCopy with noRows=True 1701 TableCopy::copySubTables( tab, t ) ; 1702 } 1703 1704 void STGrid::fillMainColumns( Table &tab ) 1705 { 1706 // values for fill 1707 Table t( infileList_[0], Table::Old ) ; 1708 Table tsel = t( t.col( "IFNO" ) == (uInt)ifno_, 1 ) ; 1709 ROTableRow row( tsel ) ; 1710 row.get( 0 ) ; 1711 const TableRecord &rec = row.record() ; 1712 uInt freqId = rec.asuInt( "FREQ_ID" ) ; 1713 uInt molId = rec.asuInt( "MOLECULE_ID" ) ; 1714 uInt tcalId = rec.asuInt( "TCAL_ID" ) ; 1715 uInt focusId = rec.asuInt( "FOCUS_ID" ) ; 1716 uInt weatherId = rec.asuInt( "WEATHER_ID" ) ; 1717 String srcname = rec.asString( "SRCNAME" ) ; 1718 String fieldname = rec.asString( "FIELDNAME" ) ; 1719 Vector<Float> defaultTsys( 1, 1.0 ) ; 1720 // @todo how to set flagtra for gridded spectra? 1721 Vector<uChar> flagtra = rec.asArrayuChar( "FLAGTRA" ) ; 1722 flagtra = (uChar)0 ; 1723 Float opacity = rec.asFloat( "OPACITY" ) ; 1724 Double srcvel = rec.asDouble( "SRCVELOCITY" ) ; 1725 Vector<Double> srcpm = rec.asArrayDouble( "SRCPROPERMOTION" ) ; 1726 Vector<Double> srcdir = rec.asArrayDouble( "SRCDIRECTION" ) ; 1727 Vector<Double> scanrate = rec.asArrayDouble( "SCANRATE" ) ; 1728 Double time = rec.asDouble( "TIME" ) ; 1729 Double interval = rec.asDouble( "INTERVAL" ) ; 1730 1731 // fill columns 1732 Int nrow = tab.nrow() ; 1733 ScalarColumn<uInt> scannoCol( tab, "SCANNO" ) ; 1734 ScalarColumn<uInt> ifnoCol( tab, "IFNO" ) ; 1735 ScalarColumn<uInt> freqIdCol( tab, "FREQ_ID" ) ; 1736 ScalarColumn<uInt> molIdCol( tab, "MOLECULE_ID" ) ; 1737 ScalarColumn<uInt> tcalidCol( tab, "TCAL_ID" ) ; 1738 ScalarColumn<Int> fitidCol( tab, "FIT_ID" ) ; 1739 ScalarColumn<uInt> focusidCol( tab, "FOCUS_ID" ) ; 1740 ScalarColumn<uInt> weatheridCol( tab, "WEATHER_ID" ) ; 1741 ArrayColumn<uChar> flagtraCol( tab, "FLAGTRA" ) ; 1742 ScalarColumn<uInt> rflagCol( tab, "FLAGROW" ) ; 1743 ArrayColumn<Float> tsysCol( tab, "TSYS" ) ; 1744 ScalarColumn<String> srcnameCol( tab, "SRCNAME" ) ; 1745 ScalarColumn<String> fieldnameCol( tab, "FIELDNAME" ) ; 1746 ScalarColumn<Int> srctypeCol( tab, "SRCTYPE" ) ; 1747 ScalarColumn<Float> opacityCol( tab, "OPACITY" ) ; 1748 ScalarColumn<Double> srcvelCol( tab, "SRCVELOCITY" ) ; 1749 ArrayColumn<Double> srcpmCol( tab, "SRCPROPERMOTION" ) ; 1750 ArrayColumn<Double> srcdirCol( tab, "SRCDIRECTION" ) ; 1751 ArrayColumn<Double> scanrateCol( tab, "SCANRATE" ) ; 1752 ScalarColumn<Double> timeCol( tab, "TIME" ) ; 1753 ScalarColumn<Double> intervalCol( tab, "INTERVAL" ) ; 1754 for ( Int i = 0 ; i < nrow ; i++ ) { 1755 scannoCol.put( i, (uInt)i ) ; 1756 ifnoCol.put( i, (uInt)ifno_ ) ; 1757 freqIdCol.put( i, freqId ) ; 1758 molIdCol.put( i, molId ) ; 1759 tcalidCol.put( i, tcalId ) ; 1760 fitidCol.put( i, -1 ) ; 1761 focusidCol.put( i, focusId ) ; 1762 weatheridCol.put( i, weatherId ) ; 1763 flagtraCol.put( i, flagtra ) ; 1764 rflagCol.put( i, 0 ) ; 1765 tsysCol.put( i, defaultTsys ) ; 1766 srcnameCol.put( i, srcname ) ; 1767 fieldnameCol.put( i, fieldname ) ; 1768 srctypeCol.put( i, (Int)SrcType::PSON ) ; 1769 opacityCol.put( i, opacity ) ; 1770 srcvelCol.put( i, srcvel ) ; 1771 srcpmCol.put( i, srcpm ) ; 1772 srcdirCol.put( i, srcdir ) ; 1773 scanrateCol.put( i, scanrate ) ; 1774 timeCol.put( i, time ) ; 1775 intervalCol.put( i, interval ) ; 1776 } 1777 } 1778 1779 } 909 } 910 }
Note:
See TracChangeset
for help on using the changeset viewer.
