Changeset 2443
- Timestamp:
- 03/23/12 18:20:50 (13 years ago)
- Location:
- branches/hpc33/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/hpc33/src/STMath.cpp
r2432 r2443 4450 4450 } 4451 4451 4452 vector<float> STMath::getSpectrumFromTime( double reftime, 4453 CountedPtr<Scantable>& s, 4454 string mode ) 4455 { 4456 LogIO os( LogOrigin( "STMath", "getSpectrumFromTime", WHERE ) ) ; 4457 vector<float> sp ; 4458 4459 if ( s->nrow() == 0 ) { 4460 os << LogIO::SEVERE << "No spectra in the input scantable. Return empty spectrum." << LogIO::POST ; 4461 return sp ; 4462 } 4463 else if ( s->nrow() == 1 ) { 4464 //os << "use row " << 0 << " (scanno = " << s->getScan( 0 ) << ")" << LogIO::POST ; 4465 return s->getSpectrum( 0 ) ; 4466 } 4467 else { 4468 ROScalarColumn<Double> timeCol( s->table(), "TIME" ) ; 4469 Vector<Double> timeVec = timeCol.getColumn() ; 4470 vector<int> idx = getRowIdFromTime( reftime, timeVec ) ; 4471 if ( mode == "before" ) { 4472 int id = -1 ; 4473 if ( idx[0] != -1 ) { 4474 id = idx[0] ; 4475 } 4476 else if ( idx[1] != -1 ) { 4477 os << LogIO::WARN << "Failed to find a scan before reftime. return a spectrum just after the reftime." << LogIO::POST ; 4478 id = idx[1] ; 4479 } 4480 //os << "use row " << id << " (scanno = " << s->getScan( id ) << ")" << LogIO::POST ; 4481 sp = s->getSpectrum( id ) ; 4482 } 4483 else if ( mode == "after" ) { 4484 int id = -1 ; 4485 if ( idx[1] != -1 ) { 4486 id = idx[1] ; 4487 } 4488 else if ( idx[0] != -1 ) { 4489 os << LogIO::WARN << "Failed to find a scan after reftime. return a spectrum just before the reftime." << LogIO::POST ; 4490 id = idx[1] ; 4491 } 4492 //os << "use row " << id << " (scanno = " << s->getScan( id ) << ")" << LogIO::POST ; 4493 sp = s->getSpectrum( id ) ; 4494 } 4495 else if ( mode == "nearest" ) { 4496 int id = -1 ; 4497 if ( idx[0] == -1 ) { 4498 id = idx[1] ; 4499 } 4500 else if ( idx[1] == -1 ) { 4501 id = idx[0] ; 4502 } 4503 else if ( idx[0] == idx[1] ) { 4504 id = idx[0] ; 4505 } 4506 else { 4507 //double t0 = getMJD( s->getTime( idx[0] ) ) ; 4508 //double t1 = getMJD( s->getTime( idx[1] ) ) ; 4509 // double t0 = s->getEpoch( idx[0] ).get( Unit( "d" ) ).getValue() ; 4510 // double t1 = s->getEpoch( idx[1] ).get( Unit( "d" ) ).getValue() ; 4511 double t0 = timeVec[idx[0]] ; 4512 double t1 = timeVec[idx[1]] ; 4513 // cout << "t0-t0c=" << t0-t0c << endl ; 4514 // cout << "t1-t1c=" << t1-t1c << endl ; 4515 // double tref = getMJD( reftime ) ; 4516 double tref = reftime ; 4517 if ( abs( t0 - tref ) > abs( t1 - tref ) ) { 4518 id = idx[1] ; 4519 } 4520 else { 4521 id = idx[0] ; 4522 } 4523 } 4524 //os << "use row " << id << " (scanno = " << s->getScan( id ) << ")" << LogIO::POST ; 4525 sp = s->getSpectrum( id ) ; 4526 } 4527 else if ( mode == "linear" ) { 4528 if ( idx[0] == -1 ) { 4529 // use after 4530 os << LogIO::WARN << "Failed to interpolate. return a spectrum just after the reftime." << LogIO::POST ; 4531 int id = idx[1] ; 4532 //os << "use row " << id << " (scanno = " << s->getScan( id ) << ")" << LogIO::POST ; 4533 sp = s->getSpectrum( id ) ; 4534 } 4535 else if ( idx[1] == -1 ) { 4536 // use before 4537 os << LogIO::WARN << "Failed to interpolate. return a spectrum just before the reftime." << LogIO::POST ; 4538 int id = idx[0] ; 4539 //os << "use row " << id << " (scanno = " << s->getScan( id ) << ")" << LogIO::POST ; 4540 sp = s->getSpectrum( id ) ; 4541 } 4542 else if ( idx[0] == idx[1] ) { 4543 // use before 4544 //os << "No need to interporate." << LogIO::POST ; 4545 int id = idx[0] ; 4546 //os << "use row " << id << " (scanno = " << s->getScan( id ) << ")" << LogIO::POST ; 4547 sp = s->getSpectrum( id ) ; 4548 } 4549 else { 4550 // do interpolation 4551 //os << "interpolate between " << idx[0] << " and " << idx[1] << " (scanno: " << s->getScan( idx[0] ) << ", " << s->getScan( idx[1] ) << ")" << LogIO::POST ; 4552 //double t0 = getMJD( s->getTime( idx[0] ) ) ; 4553 //double t1 = getMJD( s->getTime( idx[1] ) ) ; 4554 // double t0 = s->getEpoch( idx[0] ).get( Unit( "d" ) ).getValue() ; 4555 // double t1 = s->getEpoch( idx[1] ).get( Unit( "d" ) ).getValue() ; 4556 double t0 = timeVec[idx[0]] ; 4557 double t1 = timeVec[idx[1]] ; 4558 // cout << "t0-t0c=" << t0-t0c << endl ; 4559 // cout << "t1-t1c=" << t1-t1c << endl ; 4560 // double tref = getMJD( reftime ) ; 4561 double tref = reftime ; 4562 vector<float> sp0 = s->getSpectrum( idx[0] ) ; 4563 vector<float> sp1 = s->getSpectrum( idx[1] ) ; 4564 for ( unsigned int i = 0 ; i < sp0.size() ; i++ ) { 4565 float v = ( sp1[i] - sp0[i] ) / ( t1 - t0 ) * ( tref - t0 ) + sp0[i] ; 4566 sp.push_back( v ) ; 4567 } 4568 } 4569 } 4570 else { 4571 os << LogIO::SEVERE << "Unknown mode" << LogIO::POST ; 4572 } 4573 return sp ; 4574 } 4575 } 4576 4452 4577 double STMath::getMJD( string strtime ) 4453 4578 { … … 4508 4633 v.push_back( just_before ) ; 4509 4634 v.push_back( just_after ) ; 4635 4636 return v ; 4637 } 4638 4639 vector<int> STMath::getRowIdFromTime( double reftime, Vector<Double> &t ) 4640 { 4641 // double reft = reftime ; 4642 double dtmin = 1.0e100 ; 4643 double dtmax = -1.0e100 ; 4644 // vector<double> dt ; 4645 int just_before = -1 ; 4646 int just_after = -1 ; 4647 //cout << setprecision(24) << reft << endl ; 4648 // ROScalarColumn<Double> timeCol( s->table(), "TIME" ) ; 4649 // for ( int i = 0 ; i < s->nrow() ; i++ ) { 4650 // cout << setprecision(24) << timeCol(i) << endl ; 4651 // //dt.push_back( getMJD( s->getTime( i ) ) - reft ) ; 4652 // dt.push_back( timeCol(i) - reft ) ; 4653 // } 4654 Vector<Double> dt = t - reftime ; 4655 for ( unsigned int i = 0 ; i < dt.size() ; i++ ) { 4656 if ( dt[i] > 0.0 ) { 4657 // after reftime 4658 if ( dt[i] < dtmin ) { 4659 just_after = i ; 4660 dtmin = dt[i] ; 4661 } 4662 } 4663 else if ( dt[i] < 0.0 ) { 4664 // before reftime 4665 if ( dt[i] > dtmax ) { 4666 just_before = i ; 4667 dtmax = dt[i] ; 4668 } 4669 } 4670 else { 4671 // just a reftime 4672 just_before = i ; 4673 just_after = i ; 4674 dtmax = 0 ; 4675 dtmin = 0 ; 4676 break ; 4677 } 4678 } 4679 4680 vector<int> v(2) ; 4681 v[0] = just_before ; 4682 v[1] = just_after ; 4510 4683 4511 4684 return v ; … … 4833 5006 int index ) 4834 5007 { 4835 string reftime = on->getTime( index ) ; 5008 // string reftime = on->getTime( index ) ; 5009 ROTableColumn timeCol( on->table(), "TIME" ) ; 5010 double reftime = timeCol.asdouble(index) ; 4836 5011 vector<int> ii( 1, on->getIF( index ) ) ; 4837 5012 vector<int> ib( 1, on->getBeam( index ) ) ; -
branches/hpc33/src/STMath.h
r2186 r2443 403 403 404 404 vector<float> getSpectrumFromTime( string reftime, casa::CountedPtr<Scantable>& s, string mode = "before" ) ; 405 vector<float> getSpectrumFromTime( double reftime, casa::CountedPtr<Scantable>& s, string mode = "before" ) ; 405 406 vector<float> getTcalFromTime( string reftime, casa::CountedPtr<Scantable>& s, string mode="before" ) ; 406 407 vector<float> getTsysFromTime( string reftime, casa::CountedPtr<Scantable>& s, string mode="before" ) ; 407 408 vector<int> getRowIdFromTime( string reftime, casa::CountedPtr<Scantable>& s ) ; 409 vector<int> getRowIdFromTime( double reftime, casa::Vector<casa::Double>& t ) ; 408 410 409 411 // Chopper-Wheel type calibration
Note:
See TracChangeset
for help on using the changeset viewer.