Ignore:
Timestamp:
08/24/12 10:52:04 (12 years ago)
Author:
ShinnosukeKawakami
Message:

hpc34 to trunk 24th Aug. 2012

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/external-alma

  • trunk/external-alma/atnf/PKSIO/NRODataset.cc

    r2434 r2643  
    5858NRODataset::NRODataset( string name )
    5959{
    60   LogIO os( LogOrigin( "NRODataset", "NRODataset()", WHERE ) ) ;
    61 
    6260  // memory allocation
    6361  initialize() ;
     
    243241NRODataRecord *NRODataset::getRecord( int i )
    244242{
    245   LogIO os( LogOrigin( "NRODataset", "getRecord()", WHERE ) ) ;
    246 
    247243  // DEBUG
    248244  //cout << "NRODataset::getRecord()  Start " << i << endl ;
    249245  //
    250246  if ( i < 0 || i >= rowNum_ ) {
     247    LogIO os( LogOrigin( "NRODataset", "getRecord()", WHERE ) ) ;
    251248    //cerr << "NRODataset::getRecord()  data index out of range." << endl ;
    252249    os << LogIO::SEVERE << "data index " << i << " out of range. return NULL." << LogIO::POST ;
     
    267264  }
    268265  else {
     266    LogIO os( LogOrigin( "NRODataset", "getRecord()", WHERE ) ) ;
    269267    //cerr << "NRODataset::getRecord()  error while reading data " << i << endl ;
    270268    os << LogIO::SEVERE << "error while reading data " << i << ". return NULL." << LogIO::POST ;
     
    278276int NRODataset::fillRecord( int i )
    279277{
    280   LogIO os( LogOrigin( "NRODataset", "fillRecord()", WHERE ) ) ;
    281 
    282278  int status = 0 ;
    283279
     
    295291  if ( (int)fread( record_, 1, SCAN_HEADER_SIZE, fp_ ) != SCAN_HEADER_SIZE ) {
    296292    //cerr << "Failed to read scan header: " << i << endl ;
     293    LogIO os( LogOrigin( "NRODataset", "fillRecord()", WHERE ) ) ;
    297294    os << LogIO::SEVERE << "Failed to read scan header for " << i << "th row." << LogIO::POST ;
    298295    return -1 ;
     
    300297  if ( (int)fread( record_->LDATA, 1, dataLen_, fp_ ) != dataLen_ ) {
    301298    //cerr << "Failed to read spectral data: " << i << endl ;
     299    LogIO os( LogOrigin( "NRODataset", "fillRecord()", WHERE ) ) ;
    302300    os << LogIO::SEVERE << "Failed to read spectral data for " << i << "th row." << LogIO::POST ;
    303301    return -1 ;
     
    354352vector<double> NRODataset::getSpectrum( int i )
    355353{
    356   LogIO os( LogOrigin( "NRODataset", "getSpectrum", WHERE ) ) ;
    357  
    358354  // DEBUG
    359355  //cout << "NRODataset::getSpectrum() start process (" << i << ")" << endl ;
     
    361357  // size of spectrum is not chmax_ but dataset_->getNCH() after binding
    362358  const int nchan = NUMCH ;
    363   vector<double> bspec( nchan, 0.0 ) ;  // spectrum "after" binding
     359  vector<double> spec( chmax_ ) ;  // spectrum "before" binding
    364360  // DEBUG
    365361  //cout << "NRODataset::getSpectrum()  nchan = " << nchan << " chmax_ = " << chmax_ << endl ;
     
    379375  if ( ( scale == 0.0 ) && ( offset == 0.0 ) ) {
    380376    //cerr << "NRODataset::getSpectrum()  zero spectrum (" << i << ")" << endl ;
    381     return bspec ;
     377    LogIO os( LogOrigin("NRODataset","getSpectrum",WHERE) ) ;
     378    os << LogIO::WARN << "zero spectrum for row " << i << LogIO::POST ;
     379    if ( spec.size() != nchan )
     380      spec.resize( nchan ) ;
     381    for ( vector<double>::iterator i = spec.begin() ;
     382          i != spec.end() ; i++ )
     383      *i = 0.0 ;
     384    return spec ;
    382385  }
    383386  unsigned char *cdata = (unsigned char *)record->LDATA ;
     
    387390  int chmin = CHMIN ;
    388391
    389   // char -> int
    390   vector<int> ispec( chmax_, 0 ) ;
     392  // char -> int -> double
     393  vector<double>::iterator iter = spec.begin() ;
    391394
    392395  static const int shift_right[] = {
     
    401404  int j = 0 ;
    402405  for ( int i = 0 ; i < chmax_ ; i++ ) {
     406    // char -> int
    403407    int ivalue = 0 ;
    404408    if ( bit == 12 ) {  // 12 bit qunatization
    405       const int idx = j + start_pos[i & 1];
     409      const int ialt = i & 1 ;
     410      const int idx = j + start_pos[ialt];
    406411      const unsigned tmp = unsigned(cdata[idx]) << 8 | cdata[idx + 1];
    407       ivalue = int((tmp >> shift_right[i & 1]) & 0xFFF);
    408       j += incr[i & 1];
    409     }
    410 
    411     ispec[i] = ivalue ;
    412     if ( ( ispec[i] < 0 ) || ( ispec[i] > 4096 ) ) {
     412      ivalue = int((tmp >> shift_right[ialt]) & 0xFFF);
     413      j += incr[ialt];
     414    }
     415
     416    if ( ( ivalue < 0 ) || ( ivalue > 4096 ) ) {
    413417      //cerr << "NRODataset::getSpectrum()  ispec[" << i << "] is out of range" << endl ;
    414       os << LogIO::SEVERE << "ispec[" << i << "] is out of range" << LogIO::EXCEPTION ;
    415       return bspec ;
     418      LogIO os( LogOrigin( "NRODataset", "getSpectrum", WHERE ) ) ;
     419      os << LogIO::SEVERE << "ivalue for row " << i << " is out of range" << LogIO::EXCEPTION ;
     420      if ( spec.size() != nchan )
     421        spec.resize( nchan ) ;
     422      for ( vector<double>::iterator i = spec.begin() ;
     423            i != spec.end() ; i++ )
     424        *i = 0.0 ;
     425      return spec ;
    416426    }
    417427    // DEBUG
    418428    //cout << "NRODataset::getSpectrum()  ispec[" << i << "] = " << ispec[i] << endl ;
    419429    //
    420   }
    421 
    422   double *const spec = new double[ chmax_ ] ;  // spectrum "before" binding
    423   // int -> double
    424   for ( int i = 0 ; i < chmax_ ; i++ ) {
    425     spec[i] = (double)( ispec[i] * scale + offset ) * dscale ;
     430
     431    // int -> double
     432    *iter = (double)( ivalue * scale + offset ) * dscale ;
    426433    // DEBUG
    427     //cout << "NRODataset::getSpectrum()  spec[" << i << "] = " << spec[i] << endl ;
     434    //cout << "NRODataset::getSpectrum()  spec[" << i << "] = " << *iter << endl ;
    428435    //
    429   }
    430 
    431   // channel binding
     436    iter++ ;
     437  }
     438
     439  // channel binding if necessary
    432440  if ( cbind != 1 ) {
    433     int k = chmin ;
    434     double sum0 = 0 ;
    435     double sum1 = 0 ;
     441    iter = spec.begin() ;
     442    advance( iter, chmin ) ;
     443    vector<double>::iterator iter2 = spec.begin() ;
    436444    for ( int i = 0 ; i < nchan ; i++ ) {
    437       for ( int j = k ; j < k + cbind ; j++ ) {
    438         sum0 += spec[k] ;
    439         sum1++ ;
     445      double sum0 = 0 ;
     446      double sum1 = 0 ;
     447      for ( int j = 0 ; j < cbind ; j++ ) {
     448        sum0 += *iter ;
     449        sum1 += 1.0 ;
     450        iter++ ;
    440451      }
    441       bspec[i] = sum0 / sum1 ;
    442       k += cbind ;
     452      *iter2 = sum0 / sum1 ;
     453      iter2++ ;
    443454      // DEBUG
    444455      //cout << "NRODataset::getSpectrum()  bspec[" << i << "] = " << bspec[i] << endl ;
    445456      //
    446457    }
    447   }
    448   else {
    449     for ( int i = 0 ; i < nchan ; i++ )
    450       bspec[i] = spec[i] ;
    451   }
    452   delete[] spec;
     458    spec.resize( nchan ) ;
     459  }
    453460
    454461  // DEBUG
     
    456463  //
    457464
    458   return bspec ;
     465  return spec ;
    459466}
    460467
Note: See TracChangeset for help on using the changeset viewer.