Changeset 2595
- Timestamp:
- 07/11/12 12:29:28 (12 years ago)
- Location:
- trunk/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/STMath.cpp
r2580 r2595 3072 3072 "Use merge first.")); 3073 3073 3074 // 2012/02/17 TN3075 // Since STGrid is implemented, average doesn't consider direction3076 // when accumulating3077 // check if OTF observation3078 // String obstype = in[0]->getHeader().obstype ;3079 // Double tol = 0.0 ;3080 // if ( obstype.find( "OTF" ) != String::npos ) {3081 // tol = TOL_OTF ;3082 // }3083 // else {3084 // tol = TOL_POINT ;3085 // }3086 3087 3074 CountedPtr<Scantable> out ; // processed result 3088 3075 if ( compel ) { … … 3090 3077 uInt insize = in.size() ; // number of input scantables 3091 3078 3092 // TEST: do normal average in each table before IF grouping 3093 os << "Do preliminary averaging" << LogIO::POST ; 3094 vector< CountedPtr<Scantable> > tmpin( insize ) ; 3079 // setup newin 3080 bool oldInsitu = insitu_ ; 3081 setInsitu( false ) ; 3082 newin.resize( insize ) ; 3095 3083 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3096 vector< CountedPtr<Scantable> > v( 1, in[itable]) ;3097 tmpin[itable] = average( v, mask, weight, avmode ) ;3098 }3084 newin[itable] = getScantable( in[itable], false ) ; 3085 } 3086 setInsitu( oldInsitu ) ; 3099 3087 3100 3088 // warning … … 3107 3095 oldinfo[itable] = coordinfo[0] ; 3108 3096 coordinfo[0] = "Hz" ; 3109 tmpin[itable]->setCoordInfo( coordinfo ) ; 3110 } 3111 3112 // columns 3113 ScalarColumn<uInt> freqIDCol ; 3114 ScalarColumn<uInt> ifnoCol ; 3115 ScalarColumn<uInt> scannoCol ; 3116 3097 newin[itable]->setCoordInfo( coordinfo ) ; 3098 } 3099 3100 ostringstream oss ; 3117 3101 3118 3102 // check IF frequency coverage … … 3134 3118 vector< vector<double> > iffreq( insize ) ; 3135 3119 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3136 uInt rows = tmpin[itable]->nrow() ; 3137 uInt freqnrows = tmpin[itable]->frequencies().table().nrow() ; 3138 freqIDCol.attach( tmpin[itable]->table(), "FREQ_ID" ) ; 3139 //ifnoCol.attach( tmpin[itable]->table(), "IFNO" ) ; 3140 for ( uInt irow = 0 ; irow < rows ; irow++ ) { 3141 if ( freqid[itable].size() == freqnrows ) { 3142 break ; 3143 } 3144 else { 3145 uInt id = freqIDCol( irow ) ; 3146 if ( freqid[itable].size() == 0 || count( freqid[itable].begin(), freqid[itable].end(), id ) == 0 ) { 3147 //os << "itable = " << itable << ": IF " << id << " is included in the list" << LogIO::POST ; 3148 vector<double> abcissa = tmpin[itable]->getAbcissa( irow ) ; 3149 double lbedge, rbedge; 3150 freqid[itable].push_back( id ) ; 3151 lbedge = abcissa[0] - 0.5 * ( abcissa[1] - abcissa[0] ); 3152 rbedge = abcissa[abcissa.size()-1] + 0.5 * ( abcissa[1] - abcissa[0] ); 3153 iffreq[itable].push_back( min(lbedge, rbedge) ) ; 3154 iffreq[itable].push_back( max(lbedge, rbedge) ) ; 3155 } 3156 } 3120 Vector<uInt> freqIds = newin[itable]->mfreqidCol_.getColumn() ; 3121 vector<uInt> uniqueFreqId = newin[itable]->getNumbers(newin[itable]->mfreqidCol_) ; 3122 for ( vector<uInt>::iterator i = uniqueFreqId.begin() ; 3123 i != uniqueFreqId.end() ; i++ ) { 3124 //os << "itable = " << itable << ": IF " << id << " is included in the list" << LogIO::POST ; 3125 uInt target = 0 ; 3126 while ( freqIds[target] != *i ) 3127 target++ ; 3128 vector<double> abcissa = newin[itable]->getAbcissa( target ) ; 3129 freqid[itable].push_back( *i ) ; 3130 double incr = abs( abcissa[1] - abcissa[0] ) ; 3131 iffreq[itable].push_back( (*min_element(abcissa.begin(),abcissa.end()))-0.5*incr ) ; 3132 iffreq[itable].push_back( (*max_element(abcissa.begin(),abcissa.end()))+0.5*incr ) ; 3157 3133 } 3158 3134 } 3159 3135 3160 3136 // debug 3161 //os << "IF settings summary:" << endl ;3162 //for ( uInt i = 0 ; i < freqid.size() ; i++ ) {3163 //os << " Table" << i << endl ;3164 //for ( uInt j = 0 ; j < freqid[i].size() ; j++ ) {3165 //os << " id = " << freqid[i][j] << " (min,max) = (" << iffreq[i][2*j] << "," << iffreq[i][2*j+1] << ")" << endl ;3166 //}3167 //}3168 //os << endl ;3169 //os.post() ;3137 // os << "IF settings summary:" << endl ; 3138 // for ( uInt i = 0 ; i < freqid.size() ; i++ ) { 3139 // os << " Table" << i << endl ; 3140 // for ( uInt j = 0 ; j < freqid[i].size() ; j++ ) { 3141 // os << " id = " << freqid[i][j] << " (min,max) = (" << iffreq[i][2*j] << "," << iffreq[i][2*j+1] << ")" << endl ; 3142 // } 3143 // } 3144 // os << endl ; 3145 // os.post() ; 3170 3146 3171 3147 // IF grouping based on their frequency coverage 3172 // ifgrp: list of table index and FREQ_ID for all members in each IF group 3173 // ifgfreq: list of minimum and maximum frequency in each IF group 3174 // ifgrp[numgrp][nummember*2] 3175 // ifgrp: [[table00, freqrow00, table01, freqrow01, ...], 3176 // [table10, freqrow10, table11, freqrow11, ...], 3177 // ... 3178 // [tablen0, freqrown0, tablen1, freqrown1, ...]] 3179 // ifgfreq[numgrp*2] 3180 // ifgfreq: [min0_grp0, max0_grp0, min1_grp1, max1_grp1, ...] 3148 // ifgrp: number of member in each IF group 3149 // ifgrp[numgrp] 3150 // ifgrp: [n0, n1, ...] 3181 3151 //os << "IF grouping based on their frequency coverage" << LogIO::POST ; 3182 vector< vector<uInt> > ifgrp ;3183 vector<double> ifgfreq ;3184 3152 3185 3153 // parameter for IF grouping … … 3202 3170 } 3203 3171 sort( sortedfreq.begin(), sortedfreq.end() ) ; 3204 for ( vector<double>::iterator i = sortedfreq.begin() ; i != sortedfreq.end()-1 ; i++ ) { 3205 ifgfreq.push_back( *i ) ; 3206 ifgfreq.push_back( *(i+1) ) ; 3207 } 3208 ifgrp.resize( ifgfreq.size()/2 ) ; 3172 vector<uInt> ifgrp( sortedfreq.size()-1, 0 ) ; 3209 3173 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3210 3174 for ( uInt iif = 0 ; iif < freqid[itable].size() ; iif++ ) { 3211 3175 double range0 = iffreq[itable][2*iif] ; 3212 3176 double range1 = iffreq[itable][2*iif+1] ; 3213 for ( uInt j = 0 ; j < ifgrp.size() ; j++ ) { 3214 double fmin = max( range0, ifgfreq[2*j] ) ; 3215 double fmax = min( range1, ifgfreq[2*j+1] ) ; 3216 if ( fmin < fmax ) { 3217 ifgrp[j].push_back( itable ) ; 3218 ifgrp[j].push_back( freqid[itable][iif] ) ; 3219 } 3220 } 3221 } 3222 } 3223 vector< vector<uInt> >::iterator fiter = ifgrp.begin() ; 3224 vector<double>::iterator giter = ifgfreq.begin() ; 3225 while( fiter != ifgrp.end() ) { 3226 if ( fiter->size() <= sizecr ) { 3227 fiter = ifgrp.erase( fiter ) ; 3228 giter = ifgfreq.erase( giter ) ; 3229 giter = ifgfreq.erase( giter ) ; 3230 } 3231 else { 3232 fiter++ ; 3233 advance( giter, 2 ) ; 3177 for ( uInt j = 0 ; j < sortedfreq.size()-1 ; j++ ) { 3178 double fmin = max( range0, sortedfreq[j] ) ; 3179 double fmax = min( range1, sortedfreq[j+1] ) ; 3180 if ( fmin < fmax ) { 3181 ifgrp[j]++ ; 3182 } 3183 } 3234 3184 } 3235 3185 } … … 3242 3192 // ... 3243 3193 // [ifgrpn0, ifgrpn1, ifgrpn2, ...]] 3194 // grprange[2*numgrp] 3195 // grprange: [fmin0,fmax0,fmin1,fmax1,...] 3244 3196 vector< vector<uInt> > freqgrp ; 3245 double freqrange = 0.0 ; 3246 uInt grpnum = 0 ; 3247 for ( uInt i = 0 ; i < ifgrp.size() ; i++ ) { 3248 // Assumed that ifgfreq was sorted 3249 if ( grpnum != 0 && freqrange == ifgfreq[2*i] ) { 3250 freqgrp[grpnum-1].push_back( i ) ; 3251 } 3252 else { 3253 vector<uInt> grp0( 1, i ) ; 3254 freqgrp.push_back( grp0 ) ; 3255 grpnum++ ; 3256 } 3257 freqrange = ifgfreq[2*i+1] ; 3258 } 3259 3260 3261 // print IF groups 3262 ostringstream oss ; 3263 oss << "IF Group summary: " << endl ; 3264 oss << " GROUP_ID [FREQ_MIN, FREQ_MAX]: (TABLE_ID, FREQ_ID)" << endl ; 3265 for ( uInt i = 0 ; i < ifgrp.size() ; i++ ) { 3266 oss << " GROUP " << setw( 2 ) << i << " [" << ifgfreq[2*i] << "," << ifgfreq[2*i+1] << "]: " ; 3267 for ( uInt j = 0 ; j < ifgrp[i].size()/2 ; j++ ) { 3268 oss << "(" << ifgrp[i][2*j] << "," << ifgrp[i][2*j+1] << ") " ; 3269 } 3270 oss << endl ; 3271 } 3272 oss << endl ; 3273 os << oss.str() << LogIO::POST ; 3274 3197 vector<double> grprange ; 3198 vector<uInt> grpedge ; 3199 for ( uInt igrp = 0 ; igrp < ifgrp.size() ; igrp++ ) { 3200 if ( ifgrp[igrp] <= sizecr ) { 3201 grpedge.push_back( igrp ) ; 3202 } 3203 } 3204 grpedge.push_back( ifgrp.size() ) ; 3205 uInt itmp = 0 ; 3206 for ( uInt i = 0 ; i < grpedge.size() ; i++ ) { 3207 int n = grpedge[i] - itmp ; 3208 if ( n > 0 ) { 3209 vector<uInt> members( n ) ; 3210 for ( int j = 0 ; j < n ; j++ ) { 3211 members[j] = itmp+j ; 3212 } 3213 freqgrp.push_back( members ) ; 3214 grprange.push_back( sortedfreq[itmp] ) ; 3215 grprange.push_back( sortedfreq[grpedge[i]] ) ; 3216 } 3217 itmp += n + 1 ; 3218 } 3219 3275 3220 // print frequency group 3276 3221 oss.str("") ; 3277 3222 oss << "Frequency Group summary: " << endl ; 3278 oss << " GROUP_ID [FREQ_MIN, FREQ_MAX]: IF_GROUP_ID" << endl ;3223 oss << " GROUP_ID: [FREQ_MIN, FREQ_MAX]" << endl ; 3279 3224 for ( uInt i = 0 ; i < freqgrp.size() ; i++ ) { 3280 oss << " GROUP " << setw( 2 ) << i << " [" << ifgfreq[2*freqgrp[i][0]] << "," << ifgfreq[2*freqgrp[i][freqgrp[i].size()-1]+1] << "]: " ; 3281 for ( uInt j = 0 ; j < freqgrp[i].size() ; j++ ) { 3282 oss << freqgrp[i][j] << " " ; 3283 } 3225 oss << " GROUP " << setw( 2 ) << i << ": [" << grprange[2*i] << "," << grprange[2*i+1] << "]" ; 3284 3226 oss << endl ; 3285 3227 } … … 3287 3229 os << oss.str() << LogIO::POST ; 3288 3230 3289 // membership check 3290 // groups: list of IF group indexes whose frequency range overlaps with 3291 // that of each table and IF 3292 // groups[numtable][numIF][nummembership] 3293 // groups: [[[grp, grp,...], [grp, grp,...],...], 3294 // [[grp, grp,...], [grp, grp,...],...], 3231 // groups: list of frequency group index whose frequency range overlaps 3232 // with that of each table and IF 3233 // groups[numtable][numIF] 3234 // groups: [[grpx, grpy,...], 3235 // [grpa, grpb,...], 3295 3236 // ... 3296 // [ [grp, grp,...], [grp, grp,...],...]]3297 vector< vector< vector<uInt>> > groups( insize ) ;3237 // [grpk, grpm,...]] 3238 vector< vector<uInt> > groups( insize ) ; 3298 3239 for ( uInt i = 0 ; i < insize ; i++ ) { 3299 3240 groups[i].resize( freqid[i].size() ) ; 3300 3241 } 3301 for ( uInt igrp = 0 ; igrp < ifgrp.size() ; igrp++ ) { 3302 for ( uInt imem = 0 ; imem < ifgrp[igrp].size()/2 ; imem++ ) { 3303 uInt tableid = ifgrp[igrp][2*imem] ; 3304 vector<uInt>::iterator iter = find( freqid[tableid].begin(), freqid[tableid].end(), ifgrp[igrp][2*imem+1] ) ; 3305 if ( iter != freqid[tableid].end() ) { 3306 uInt rowid = distance( freqid[tableid].begin(), iter ) ; 3307 groups[tableid][rowid].push_back( igrp ) ; 3308 } 3309 } 3310 } 3242 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3243 for ( uInt ifreq = 0 ; ifreq < freqid[itable].size() ; ifreq++ ) { 3244 double minf = iffreq[itable][2*ifreq] ; 3245 uInt groupid ; 3246 for ( uInt igrp = 0 ; igrp < freqgrp.size() ; igrp++ ) { 3247 vector<uInt> memberlist = freqgrp[igrp] ; 3248 if ( (minf >= grprange[2*igrp]) && (minf <= grprange[2*igrp+1]) ) { 3249 groupid = igrp ; 3250 break ; 3251 } 3252 } 3253 groups[itable][ifreq] = groupid ; 3254 } 3255 } 3256 3311 3257 3312 3258 // print membership 3313 // oss.str("") ; 3314 // for ( uInt i = 0 ; i < insize ; i++ ) { 3315 // oss << "Table " << i << endl ; 3316 // for ( uInt j = 0 ; j < groups[i].size() ; j++ ) { 3317 // oss << " FREQ_ID " << setw( 2 ) << freqid[i][j] << ": " ; 3318 // for ( uInt k = 0 ; k < groups[i][j].size() ; k++ ) { 3319 // oss << setw( 2 ) << groups[i][j][k] << " " ; 3320 // } 3321 // oss << endl ; 3322 // } 3323 // } 3324 // os << oss.str() << LogIO::POST ; 3325 3326 // set back coordinfo 3327 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3328 vector<string> coordinfo = tmpin[itable]->getCoordInfo() ; 3329 coordinfo[0] = oldinfo[itable] ; 3330 tmpin[itable]->setCoordInfo( coordinfo ) ; 3331 } 3332 3333 // Create additional table if needed 3334 bool oldInsitu = insitu_ ; 3335 setInsitu( false ) ; 3336 vector< vector<uInt> > addrow( insize ) ; 3337 vector<uInt> addtable( insize, 0 ) ; 3338 vector<uInt> newtableids( insize ) ; 3339 vector<uInt> newifids( insize, 0 ) ; 3340 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3341 //os << "Table " << itable << ": " ; 3342 for ( uInt ifrow = 0 ; ifrow < groups[itable].size() ; ifrow++ ) { 3343 addrow[itable].push_back( groups[itable][ifrow].size()-1 ) ; 3344 //os << addrow[itable][ifrow] << " " ; 3345 } 3346 addtable[itable] = *max_element( addrow[itable].begin(), addrow[itable].end() ) ; 3347 //os << "(" << addtable[itable] << ")" << LogIO::POST ; 3348 } 3349 newin.resize( insize ) ; 3350 copy( tmpin.begin(), tmpin.end(), newin.begin() ) ; 3259 oss.str("") ; 3351 3260 for ( uInt i = 0 ; i < insize ; i++ ) { 3352 newtableids[i] = i ; 3353 } 3354 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3355 for ( uInt iadd = 0 ; iadd < addtable[itable] ; iadd++ ) { 3356 CountedPtr<Scantable> add = getScantable( newin[itable], false ) ; 3357 vector<int> freqidlist ; 3358 for ( uInt i = 0 ; i < groups[itable].size() ; i++ ) { 3359 if ( groups[itable][i].size() > iadd + 1 ) { 3360 freqidlist.push_back( freqid[itable][i] ) ; 3361 } 3362 } 3363 stringstream taqlstream ; 3364 taqlstream << "SELECT FROM $1 WHERE FREQ_ID IN [" ; 3365 for ( uInt i = 0 ; i < freqidlist.size() ; i++ ) { 3366 taqlstream << freqidlist[i] ; 3367 if ( i < freqidlist.size() - 1 ) 3368 taqlstream << "," ; 3369 else 3370 taqlstream << "]" ; 3371 } 3372 string taql = taqlstream.str() ; 3373 //os << "taql = " << taql << LogIO::POST ; 3374 STSelector selector = STSelector() ; 3375 selector.setTaQL( taql ) ; 3376 add->setSelection( selector ) ; 3377 newin.push_back( add ) ; 3378 newtableids.push_back( itable ) ; 3379 newifids.push_back( iadd + 1 ) ; 3380 } 3381 } 3382 3383 // udpate ifgrp 3384 uInt offset = insize ; 3385 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3386 for ( uInt iadd = 0 ; iadd < addtable[itable] ; iadd++ ) { 3387 for ( uInt ifrow = 0 ; ifrow < groups[itable].size() ; ifrow++ ) { 3388 if ( groups[itable][ifrow].size() > iadd + 1 ) { 3389 uInt igrp = groups[itable][ifrow][iadd+1] ; 3390 for ( uInt imem = 0 ; imem < ifgrp[igrp].size()/2 ; imem++ ) { 3391 if ( ifgrp[igrp][2*imem] == newtableids[offset+iadd] && ifgrp[igrp][2*imem+1] == freqid[newtableids[offset+iadd]][ifrow] ) { 3392 ifgrp[igrp][2*imem] = offset + iadd ; 3393 } 3394 } 3395 } 3396 } 3397 } 3398 offset += addtable[itable] ; 3399 } 3400 3401 // print IF groups again for debug 3402 // oss.str( "" ) ; 3403 // oss << "IF Group summary: " << endl ; 3404 // oss << " GROUP_ID [FREQ_MIN, FREQ_MAX]: (TABLE_ID, FREQ_ID)" << endl ; 3405 // for ( uInt i = 0 ; i < ifgrp.size() ; i++ ) { 3406 // oss << " GROUP " << setw( 2 ) << i << " [" << ifgfreq[2*i] << "," << ifgfreq[2*i+1] << "]: " ; 3407 // for ( uInt j = 0 ; j < ifgrp[i].size()/2 ; j++ ) { 3408 // oss << "(" << ifgrp[i][2*j] << "," << ifgrp[i][2*j+1] << ") " ; 3409 // } 3410 // oss << endl ; 3411 // } 3412 // oss << endl ; 3413 // os << oss.str() << LogIO::POST ; 3261 oss << "Table " << i << endl ; 3262 for ( uInt j = 0 ; j < groups[i].size() ; j++ ) { 3263 oss << " FREQ_ID " << setw( 2 ) << freqid[i][j] << ": " ; 3264 oss << setw( 2 ) << groups[i][j] ; 3265 oss << endl ; 3266 } 3267 } 3268 os << oss.str() << LogIO::POST ; 3414 3269 3415 3270 // reset SCANNO and IFNO/FREQ_ID: IF is reset by the result of sortation 3416 3271 //os << "All IF number is set to IF group index" << LogIO::POST ; 3417 insize = newin.size() ;3418 3272 // reset SCANNO only when avmode != "SCAN" 3419 3273 if ( avmode != "SCAN" ) { … … 3421 3275 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3422 3276 uInt nrow = newin[itable]->nrow() ; 3423 Table &tmpt = newin[itable]->table() ; 3424 scannoCol.attach( tmpt, "SCANNO" ) ; 3425 for ( uInt irow = 0 ; irow < nrow ; irow++ ) 3426 scannoCol.put( irow, 0 ) ; 3427 } 3428 } 3429 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3430 uInt rows = newin[itable]->nrow() ; 3431 Table &tmpt = newin[itable]->table() ; 3432 freqIDCol.attach( tmpt, "FREQ_ID" ) ; 3433 ifnoCol.attach( tmpt, "IFNO" ) ; 3434 for ( uInt irow=0 ; irow < rows ; irow++ ) { 3435 uInt freqID = freqIDCol( irow ) ; 3436 vector<uInt>::iterator iter = find( freqid[newtableids[itable]].begin(), freqid[newtableids[itable]].end(), freqID ) ; 3437 if ( iter != freqid[newtableids[itable]].end() ) { 3438 uInt index = distance( freqid[newtableids[itable]].begin(), iter ) ; 3439 ifnoCol.put( irow, groups[newtableids[itable]][index][newifids[itable]] ) ; 3440 } 3441 else { 3442 throw(AipsError("IF grouping was wrong in additional tables.")) ; 3443 } 3444 } 3445 } 3446 oldinfo.resize( insize ) ; 3447 setInsitu( oldInsitu ) ; 3448 3449 // temporarily set coordinfo 3450 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3451 vector<string> coordinfo = newin[itable]->getCoordInfo() ; 3452 oldinfo[itable] = coordinfo[0] ; 3453 coordinfo[0] = "Hz" ; 3454 newin[itable]->setCoordInfo( coordinfo ) ; 3455 } 3456 3457 // save column values in the vector 3458 vector< vector<uInt> > freqIdVec( insize ) ; 3459 vector< vector<uInt> > ifNoVec( insize ) ; 3460 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3461 ifnoCol.attach( newin[itable]->table(), "IFNO" ) ; 3462 freqIDCol.attach( newin[itable]->table(), "FREQ_ID" ) ; 3463 for ( uInt irow = 0 ; irow < newin[itable]->table().nrow() ; irow++ ) { 3464 freqIdVec[itable].push_back( freqIDCol( irow ) ) ; 3465 ifNoVec[itable].push_back( ifnoCol( irow ) ) ; 3466 } 3467 } 3468 3469 // reset spectra and flagtra: pick up common part of frequency coverage 3470 //os << "Pick common frequency range and align resolution" << LogIO::POST ; 3471 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3472 uInt rows = newin[itable]->nrow() ; 3473 int nminchan = -1 ; 3474 int nmaxchan = -1 ; 3475 vector<uInt> freqIdUpdate ; 3476 for ( uInt irow = 0 ; irow < rows ; irow++ ) { 3477 uInt ifno = ifNoVec[itable][irow] ; // IFNO is reset by group index (IF group index) 3478 double minfreq = ifgfreq[2*ifno] ; 3479 double maxfreq = ifgfreq[2*ifno+1] ; 3480 //os << "frequency range: [" << minfreq << "," << maxfreq << "]" << LogIO::POST ; 3481 vector<double> abcissa = newin[itable]->getAbcissa( irow ) ; 3482 int nchan = abcissa.size() ; 3483 double resol = abcissa[1] - abcissa[0] ; 3484 //os << "abcissa range : [" << abcissa[0] << "," << abcissa[nchan-1] << "]" << LogIO::POST ; 3485 uInt imin, imax; 3486 int sigres; 3487 if ( resol >= 0. ) { 3488 imin = 0; 3489 imax = nchan - 1 ; 3490 sigres = 1 ; 3491 } else { 3492 imin = nchan - 1 ; 3493 imax = 0 ; 3494 sigres = -1 ; 3495 resol = abs(resol) ; 3496 } 3497 if ( minfreq <= abcissa[imin] ) 3498 nminchan = imin ; 3499 else { 3500 //double cfreq = ( minfreq - abcissa[0] ) / resol ; 3501 double cfreq = ( minfreq - abcissa[imin] + 0.5 * resol ) / resol ; 3502 nminchan = imin + sigres * (int(cfreq) + ( ( cfreq - int(cfreq) <= 0.5 ) ? 0 : 1 )) ; 3503 } 3504 if ( maxfreq >= abcissa[imax] ) 3505 nmaxchan = imax; 3506 else { 3507 //double cfreq = ( abcissa[abcissa.size()-1] - maxfreq ) / resol ; 3508 double cfreq = ( abcissa[imax] - maxfreq + 0.5 * resol ) / resol ; 3509 nmaxchan = imax - sigres * (int(cfreq) +( ( cfreq - int(cfreq) >= 0.5 ) ? 1 : 0 )) ; 3510 } 3511 //os << "channel range (" << irow << "): [" << nminchan << "," << nmaxchan << "]" << LogIO::POST ; 3512 if ( nmaxchan < nminchan ) { 3513 int tmp = nmaxchan ; 3514 nmaxchan = nminchan ; 3515 nminchan = tmp ; 3516 } 3517 if ( nmaxchan > nminchan ) { 3518 newin[itable]->reshapeSpectrum( nminchan, nmaxchan, irow ) ; 3519 int newchan = nmaxchan - nminchan + 1 ; 3520 if ( count( freqIdUpdate.begin(), freqIdUpdate.end(), freqIdVec[itable][irow] ) == 0 && newchan < nchan ) { 3521 freqIdUpdate.push_back( freqIdVec[itable][irow] ) ; 3522 3523 // Update before nminchan is lost 3524 uInt freqId = freqIdVec[itable][irow] ; 3525 Double refpix ; 3526 Double refval ; 3527 Double increment ; 3528 newin[itable]->frequencies().getEntry( refpix, refval, increment, freqId ) ; 3529 //refval = refval - ( refpix - nminchan ) * increment ; 3530 refval = abcissa[nminchan] ; 3531 refpix = 0 ; 3532 newin[itable]->frequencies().setEntry( refpix, refval, increment, freqId ) ; 3533 } 3534 } 3535 else { 3536 throw(AipsError("Failed to pick up common part of frequency range.")) ; 3537 } 3538 } 3539 // for ( uInt i = 0 ; i < freqIdUpdate.size() ; i++ ) { 3540 // uInt freqId = freqIdUpdate[i] ; 3541 // Double refpix ; 3542 // Double refval ; 3543 // Double increment ; 3544 3545 // // update row 3546 // newin[itable]->frequencies().getEntry( refpix, refval, increment, freqId ) ; 3547 // refval = refval - ( refpix - nminchan ) * increment ; 3548 // refpix = 0 ; 3549 // newin[itable]->frequencies().setEntry( refpix, refval, increment, freqId ) ; 3550 // } 3551 } 3552 3553 3277 Vector<uInt> resetScan( nrow, 0 ) ; 3278 newin[itable]->scanCol_.putColumn( resetScan ) ; 3279 } 3280 } 3281 3554 3282 // reset spectra and flagtra: align spectral resolution 3555 3283 //os << "Align spectral resolution" << LogIO::POST ; 3556 3284 // gmaxdnu: the coarsest frequency resolution in the frequency group 3557 // gmemid: member index that have a resolution equal to gmaxdnu 3558 // gmaxdnu[numfreqgrp] 3559 // gmaxdnu: [dnu0, dnu1, ...] 3560 // gmemid[numfreqgrp] 3561 // gmemid: [id0, id1, ...] 3285 // gminfreq: lower frequency edge of the frequency group 3286 // gnchan: number of channels for the frequency group 3562 3287 vector<double> gmaxdnu( freqgrp.size(), 0.0 ) ; 3563 vector<uInt> gmemid( freqgrp.size(), 0 ) ; 3564 for ( uInt igrp = 0 ; igrp < ifgrp.size() ; igrp++ ) { 3565 double maxdnu = 0.0 ; // maximum (coarsest) frequency resolution 3566 int minchan = INT_MAX ; // minimum channel number 3567 Double refpixref = -1 ; // reference of 'reference pixel' 3568 Double refvalref = -1 ; // reference of 'reference frequency' 3569 Double refinc = -1 ; // reference frequency resolution 3570 uInt refreqid ; 3571 uInt reftable = INT_MAX; 3572 // process only if group member > 1 3573 if ( ifgrp[igrp].size() > 2 ) { 3574 // find minchan and maxdnu in each group 3575 for ( uInt imem = 0 ; imem < ifgrp[igrp].size()/2 ; imem++ ) { 3576 uInt tableid = ifgrp[igrp][2*imem] ; 3577 uInt rowid = ifgrp[igrp][2*imem+1] ; 3578 vector<uInt>::iterator iter = find( freqIdVec[tableid].begin(), freqIdVec[tableid].end(), rowid ) ; 3579 if ( iter != freqIdVec[tableid].end() ) { 3580 uInt index = distance( freqIdVec[tableid].begin(), iter ) ; 3581 vector<double> abcissa = newin[tableid]->getAbcissa( index ) ; 3582 int nchan = abcissa.size() ; 3583 double dnu = abcissa[1] - abcissa[0] ; 3584 //os << "GROUP " << igrp << " (" << tableid << "," << rowid << "): nchan = " << nchan << " (minchan = " << minchan << ")" << LogIO::POST ; 3585 if ( nchan < minchan ) { 3586 minchan = nchan ; 3587 maxdnu = abs(dnu) ; 3588 newin[tableid]->frequencies().getEntry( refpixref, refvalref, refinc, rowid ) ; 3589 refreqid = rowid ; 3590 reftable = tableid ; 3591 // Spectra are reversed when dnu < 0 3592 if (dnu < 0) 3593 refpixref = minchan - 1 -refpixref ; 3594 } 3595 } 3596 } 3597 // regrid spectra in each group 3598 os << "GROUP " << igrp << endl ; 3599 os << " Channel number is adjusted to " << minchan << endl ; 3600 os << " Corresponding frequency resolution is " << maxdnu << "Hz" << LogIO::POST ; 3601 for ( uInt imem = 0 ; imem < ifgrp[igrp].size()/2 ; imem++ ) { 3602 uInt tableid = ifgrp[igrp][2*imem] ; 3603 uInt rowid = ifgrp[igrp][2*imem+1] ; 3604 freqIDCol.attach( newin[tableid]->table(), "FREQ_ID" ) ; 3605 //os << "tableid = " << tableid << " rowid = " << rowid << ": " << LogIO::POST ; 3606 //os << " regridChannel applied to " ; 3607 //if ( tableid != reftable ) 3608 refreqid = newin[tableid]->frequencies().addEntry( refpixref, refvalref, maxdnu ) ; 3609 for ( uInt irow = 0 ; irow < newin[tableid]->table().nrow() ; irow++ ) { 3610 uInt tfreqid = freqIdVec[tableid][irow] ; 3611 if ( tfreqid == rowid ) { 3612 //os << irow << " " ; 3613 newin[tableid]->regridChannel( minchan, maxdnu, irow ) ; 3614 freqIDCol.put( irow, refreqid ) ; 3615 freqIdVec[tableid][irow] = refreqid ; 3616 } 3617 } 3618 //os << LogIO::POST ; 3619 } 3620 } 3621 else { 3622 uInt tableid = ifgrp[igrp][0] ; 3623 uInt rowid = ifgrp[igrp][1] ; 3624 vector<uInt>::iterator iter = find( freqIdVec[tableid].begin(), freqIdVec[tableid].end(), rowid ) ; 3625 if ( iter != freqIdVec[tableid].end() ) { 3626 uInt index = distance( freqIdVec[tableid].begin(), iter ) ; 3627 vector<double> abcissa = newin[tableid]->getAbcissa( index ) ; 3628 minchan = abcissa.size() ; 3629 maxdnu = abs( abcissa[1] - abcissa[0]) ; 3630 } 3631 } 3632 for ( uInt i = 0 ; i < freqgrp.size() ; i++ ) { 3633 if ( count( freqgrp[i].begin(), freqgrp[i].end(), igrp ) > 0 ) { 3634 if ( maxdnu > gmaxdnu[i] ) { 3635 gmaxdnu[i] = maxdnu ; 3636 gmemid[i] = igrp ; 3637 } 3638 break ; 3639 } 3288 vector<double> gminfreq( freqgrp.size() ) ; 3289 vector<double> gnchan( freqgrp.size() ) ; 3290 for ( uInt i = 0 ; i < insize ; i++ ) { 3291 vector<uInt> members = groups[i] ; 3292 for ( uInt j = 0 ; j < members.size() ; j++ ) { 3293 uInt groupid = members[j] ; 3294 Double rp,rv,ic ; 3295 newin[i]->frequencies().getEntry( rp, rv, ic, j ) ; 3296 if ( abs(ic) > abs(gmaxdnu[groupid]) ) 3297 gmaxdnu[groupid] = ic ; 3298 } 3299 } 3300 for ( uInt igrp = 0 ; igrp < freqgrp.size() ; igrp++ ) { 3301 gminfreq[igrp] = grprange[2*igrp] ; 3302 double maxfreq = grprange[2*igrp+1] ; 3303 gnchan[igrp] = (int)(abs((maxfreq-gminfreq[igrp])/gmaxdnu[igrp])+0.9) ; 3304 } 3305 3306 // regrid spectral data and update frequency info 3307 for ( uInt itable = 0 ; itable < insize ; itable++ ) { 3308 Vector<uInt> oldFreqId = newin[itable]->mfreqidCol_.getColumn() ; 3309 Vector<uInt> newFreqId( oldFreqId.nelements() ) ; 3310 3311 // update MAIN 3312 for ( uInt irow = 0 ; irow < newin[itable]->nrow() ; irow++ ) { 3313 uInt groupid = groups[itable][oldFreqId[irow]] ; 3314 newFreqId[irow] = groupid ; 3315 newin[itable]->regridChannel( gnchan[groupid], 3316 gmaxdnu[groupid], 3317 gminfreq[groupid], 3318 irow ) ; 3319 } 3320 newin[itable]->mfreqidCol_.putColumn( newFreqId ) ; 3321 newin[itable]->ifCol_.putColumn( newFreqId ) ; 3322 3323 // update FREQUENCIES 3324 Table tab = newin[itable]->frequencies().table() ; 3325 ScalarColumn<uInt> fIdCol( tab, "ID" ) ; 3326 ScalarColumn<Double> fRefPixCol( tab, "REFPIX" ) ; 3327 ScalarColumn<Double> fRefValCol( tab, "REFVAL" ) ; 3328 ScalarColumn<Double> fIncrCol( tab, "INCREMENT" ) ; 3329 if ( freqgrp.size() > tab.nrow() ) { 3330 tab.addRow( freqgrp.size()-tab.nrow() ) ; 3331 } 3332 for ( uInt irow = 0 ; irow < freqgrp.size() ; irow++ ) { 3333 Double refval = gminfreq[irow] + 0.5 * abs(gmaxdnu[irow]) ; 3334 Double refpix = (gmaxdnu[irow] > 0.0) ? 0 : gnchan[irow]-1 ; 3335 Double increment = gmaxdnu[irow] ; 3336 fIdCol.put( irow, irow ) ; 3337 fRefPixCol.put( irow, refpix ) ; 3338 fRefValCol.put( irow, refval ) ; 3339 fIncrCol.put( irow, increment ) ; 3640 3340 } 3641 3341 } … … 3646 3346 coordinfo[0] = oldinfo[itable] ; 3647 3347 newin[itable]->setCoordInfo( coordinfo ) ; 3648 } 3649 3650 // accumulate all rows into the first table 3651 // NOTE: assumed in.size() = 1 3652 vector< CountedPtr<Scantable> > tmp( 1 ) ; 3653 if ( newin.size() == 1 ) 3654 tmp[0] = newin[0] ; 3655 else 3656 tmp[0] = merge( newin ) ; 3657 3658 //return tmp[0] ; 3348 } 3659 3349 3660 3350 // average 3661 CountedPtr<Scantable> tmpout = average( tmp, mask, weight, avmode ) ; 3662 3663 //return tmpout ; 3664 3665 // combine frequency group 3666 os << "Combine spectra based on frequency grouping" << LogIO::POST ; 3667 os << "IFNO is renumbered as frequency group ID (see above)" << LogIO::POST ; 3668 vector<string> coordinfo = tmpout->getCoordInfo() ; 3669 oldinfo[0] = coordinfo[0] ; 3670 coordinfo[0] = "Hz" ; 3671 tmpout->setCoordInfo( coordinfo ) ; 3672 // create proformas of output table 3673 stringstream taqlstream ; 3674 taqlstream << "SELECT FROM $1 WHERE IFNO IN [" ; 3675 for ( uInt i = 0 ; i < gmemid.size() ; i++ ) { 3676 taqlstream << gmemid[i] ; 3677 if ( i < gmemid.size() - 1 ) 3678 taqlstream << "," ; 3679 else 3680 taqlstream << "]" ; 3681 } 3682 string taql = taqlstream.str() ; 3683 //os << "taql = " << taql << LogIO::POST ; 3684 STSelector selector = STSelector() ; 3685 selector.setTaQL( taql ) ; 3686 oldInsitu = insitu_ ; 3687 setInsitu( false ) ; 3688 out = getScantable( tmpout, false ) ; 3689 setInsitu( oldInsitu ) ; 3690 out->setSelection( selector ) ; 3691 // regrid rows 3692 ifnoCol.attach( tmpout->table(), "IFNO" ) ; 3693 for ( uInt irow = 0 ; irow < tmpout->table().nrow() ; irow++ ) { 3694 uInt ifno = ifnoCol( irow ) ; 3695 for ( uInt igrp = 0 ; igrp < freqgrp.size() ; igrp++ ) { 3696 if ( count( freqgrp[igrp].begin(), freqgrp[igrp].end(), ifno ) > 0 ) { 3697 vector<double> abcissa = tmpout->getAbcissa( irow ) ; 3698 double bw = ( abcissa[1] - abcissa[0] ) * abcissa.size() ; 3699 int nchan = (int) abs( bw / gmaxdnu[igrp] ) ; 3700 // All spectra will have positive frequency increments 3701 tmpout->regridChannel( nchan, gmaxdnu[igrp], irow ) ; 3702 break ; 3703 } 3704 } 3705 } 3706 // combine spectra 3707 ArrayColumn<Float> specColOut( out->table(), "SPECTRA" ) ; 3708 ArrayColumn<uChar> flagColOut( out->table(), "FLAGTRA" ) ; 3709 ArrayColumn<Float> tsysColOut( out->table(), "TSYS" ) ; 3710 ScalarColumn<uInt> ifnoColOut( out->table(), "IFNO" ) ; 3711 ScalarColumn<uInt> polnoColOut( out->table(), "POLNO" ) ; 3712 ScalarColumn<uInt> freqidColOut( out->table(), "FREQ_ID" ) ; 3713 // MDirection::ScalarColumn dirColOut ; 3714 // dirColOut.attach( out->table(), "DIRECTION" ) ; 3715 Table &tab = tmpout->table() ; 3716 // Block<String> cols(1); 3717 // cols[0] = String("POLNO") ; 3718 Block<String> cols(3); 3719 cols[0] = String("POLNO") ; 3720 cols[1] = String("SCANNO") ; 3721 cols[2] = String("BEAMNO") ; 3722 TableIterator iter( tab, cols ) ; 3723 vector< vector<uInt> > sizes( freqgrp.size() ) ; 3724 vector<uInt> totalsizes( freqgrp.size(), 0 ) ; 3725 ArrayColumn<Float> specCols ; 3726 ArrayColumn<uChar> flagCols ; 3727 ArrayColumn<Float> tsysCols ; 3728 ScalarColumn<uInt> polnos ; 3729 vector< Vector<Float> > specout( freqgrp.size() ) ; 3730 vector< Vector<uChar> > flagout( freqgrp.size() ) ; 3731 vector< Vector<Float> > tsysout( freqgrp.size() ) ; 3732 while( !iter.pastEnd() ) { 3733 specCols.attach( iter.table(), "SPECTRA" ) ; 3734 flagCols.attach( iter.table(), "FLAGTRA" ) ; 3735 tsysCols.attach( iter.table(), "TSYS" ) ; 3736 ifnoCol.attach( iter.table(), "IFNO" ) ; 3737 polnos.attach( iter.table(), "POLNO" ) ; 3738 // MDirection::ScalarColumn dircol ; 3739 // dircol.attach( iter.table(), "DIRECTION" ) ; 3740 uInt polno = polnos( 0 ) ; 3741 //os << "POLNO iteration: " << polno << LogIO::POST ; 3742 // for ( uInt igrp = 0 ; igrp < freqgrp.size() ; igrp++ ) { 3743 // sizes[igrp].resize( freqgrp[igrp].size() ) ; 3744 // for ( uInt imem = 0 ; imem < freqgrp[igrp].size() ; imem++ ) { 3745 // for ( uInt irow = 0 ; irow < iter.table().nrow() ; irow++ ) { 3746 // uInt ifno = ifnoCol( irow ) ; 3747 // if ( ifno == freqgrp[igrp][imem] ) { 3748 // Vector<Float> spec = specCols( irow ) ; 3749 // Vector<uChar> flag = flagCols( irow ) ; 3750 // vector<Float> svec ; 3751 // spec.tovector( svec ) ; 3752 // vector<uChar> fvec ; 3753 // flag.tovector( fvec ) ; 3754 // //os << "spec.size() = " << svec.size() << " fvec.size() = " << fvec.size() << LogIO::POST ; 3755 // specout[igrp].insert( specout[igrp].end(), svec.begin(), svec.end() ) ; 3756 // flagout[igrp].insert( flagout[igrp].end(), fvec.begin(), fvec.end() ) ; 3757 // //os << "specout[" << igrp << "].size() = " << specout[igrp].size() << LogIO::POST ; 3758 // sizes[igrp][imem] = spec.nelements() ; 3759 // } 3760 // } 3761 // } 3762 // for ( uInt irow = 0 ; irow < out->table().nrow() ; irow++ ) { 3763 // uInt ifout = ifnoColOut( irow ) ; 3764 // uInt polout = polnoColOut( irow ) ; 3765 // if ( ifout == gmemid[igrp] && polout == polno ) { 3766 // // set SPECTRA and FRAGTRA 3767 // Vector<Float> newspec( specout[igrp] ) ; 3768 // Vector<uChar> newflag( flagout[igrp] ) ; 3769 // specColOut.put( irow, newspec ) ; 3770 // flagColOut.put( irow, newflag ) ; 3771 // // IFNO renumbering 3772 // ifnoColOut.put( irow, igrp ) ; 3773 // } 3774 // } 3775 // } 3776 // get a list of number of channels for each frequency group member 3777 if ( totalsizes[0] == 0 ) { 3778 for ( uInt igrp = 0 ; igrp < freqgrp.size() ; igrp++ ) { 3779 sizes[igrp].resize( freqgrp[igrp].size() ) ; 3780 for ( uInt imem = 0 ; imem < freqgrp[igrp].size() ; imem++ ) { 3781 for ( uInt irow = 0 ; irow < iter.table().nrow() ; irow++ ) { 3782 uInt ifno = ifnoCol( irow ) ; 3783 if ( ifno == freqgrp[igrp][imem] ) { 3784 Vector<Float> spec = specCols( irow ) ; 3785 sizes[igrp][imem] = spec.nelements() ; 3786 totalsizes[igrp] += sizes[igrp][imem] ; 3787 break ; 3788 } 3789 } 3790 } 3791 specout[igrp].resize( totalsizes[igrp] ) ; 3792 flagout[igrp].resize( totalsizes[igrp] ) ; 3793 tsysout[igrp].resize( totalsizes[igrp] ) ; 3794 } 3795 } 3796 3797 // combine spectra 3798 for ( uInt irow = 0 ; irow < out->table().nrow() ; irow++ ) { 3799 uInt polout = polnoColOut( irow ) ; 3800 if ( polout == polno ) { 3801 uInt ifout = ifnoColOut( irow ) ; 3802 // Vector<Double> direction = dirColOut(irow).getAngle(Unit(String("rad"))).getValue() ; 3803 uInt igrp ; 3804 for ( uInt jgrp = 0 ; jgrp < freqgrp.size() ; jgrp++ ) { 3805 if ( ifout == gmemid[jgrp] ) { 3806 igrp = jgrp ; 3807 break ; 3808 } 3809 } 3810 IPosition startpos( 1, 0 ) ; 3811 IPosition endpos( 1, 0 ) ; 3812 for ( uInt imem = 0 ; imem < freqgrp[igrp].size() ; imem++ ) { 3813 for ( uInt jrow = 0 ; jrow < iter.table().nrow() ; jrow++ ) { 3814 uInt ifno = ifnoCol( jrow ) ; 3815 // 2012/02/17 TN 3816 // Since STGrid is implemented, average doesn't consider direction 3817 // when accumulating 3818 // Vector<Double> tdir = dircol(jrow).getAngle(Unit(String("rad"))).getValue() ; 3819 // //if ( ifno == freqgrp[igrp][imem] && allTrue( tdir == direction ) ) { 3820 // Double dx = tdir[0] - direction[0] ; 3821 // Double dy = tdir[1] - direction[1] ; 3822 // Double dd = sqrt( dx * dx + dy * dy ) ; 3823 //if ( ifno == freqgrp[igrp][imem] && allNearAbs( tdir, direction, tol ) ) { 3824 // if ( ifno == freqgrp[igrp][imem] && dd <= tol ) { 3825 if ( ifno == freqgrp[igrp][imem] ) { 3826 endpos[0] = startpos[0] + sizes[igrp][imem] - 1 ; 3827 Vector<Float> spec = specCols( jrow ) ; 3828 Vector<uChar> flag = flagCols( jrow ) ; 3829 Vector<Float> tsys = tsysCols( jrow ) ; 3830 //os << "spec.size() = " << svec.size() << " fvec.size() = " << fvec.size() << LogIO::POST ; 3831 specout[igrp]( startpos, endpos ) = spec ; 3832 flagout[igrp]( startpos, endpos ) = flag ; 3833 if ( spec.size() == tsys.size() ) { 3834 tsysout[igrp]( startpos, endpos ) = tsys ; 3835 } 3836 else { 3837 tsysout[igrp]( startpos, endpos ) = tsys[0] ; 3838 } 3839 //os << "specout[" << igrp << "].size() = " << specout[igrp].size() << LogIO::POST ; 3840 startpos[0] += sizes[igrp][imem] ; 3841 } 3842 } 3843 } 3844 // set SPECTRA and FRAGTRA 3845 specColOut.put( irow, specout[igrp] ) ; 3846 flagColOut.put( irow, flagout[igrp] ) ; 3847 tsysColOut.put( irow, tsysout[igrp] ) ; 3848 // IFNO renumbering (renumbered as frequency group ID) 3849 ifnoColOut.put( irow, igrp ) ; 3850 } 3851 } 3852 iter++ ; 3853 } 3854 // update FREQUENCIES subtable 3855 vector<bool> updated( freqgrp.size(), false ) ; 3856 for ( uInt igrp = 0 ; igrp < freqgrp.size() ; igrp++ ) { 3857 uInt index = 0 ; 3858 uInt pixShift = 0 ; 3859 3860 while ( freqgrp[igrp][index] != gmemid[igrp] ) { 3861 pixShift += sizes[igrp][index++] ; 3862 } 3863 for ( uInt irow = 0 ; irow < out->table().nrow() ; irow++ ) { 3864 //if ( ifnoColOut( irow ) == gmemid[igrp] && !updated[igrp] ) { 3865 if ( ifnoColOut( irow ) == igrp && !updated[igrp] ) { 3866 uInt freqidOut = freqidColOut( irow ) ; 3867 //os << "freqgrp " << igrp << " freqidOut = " << freqidOut << LogIO::POST ; 3868 double refpix ; 3869 double refval ; 3870 double increm ; 3871 out->frequencies().getEntry( refpix, refval, increm, freqidOut ) ; 3872 if (increm < 0) 3873 refpix = sizes[igrp][index] - 1 - refpix ; // reversed 3874 refpix += pixShift ; 3875 out->frequencies().setEntry( refpix, refval, gmaxdnu[igrp], freqidOut ) ; 3876 updated[igrp] = true ; 3877 } 3878 } 3879 } 3880 3881 //out = tmpout ; 3882 3883 coordinfo = tmpout->getCoordInfo() ; 3884 coordinfo[0] = oldinfo[0] ; 3885 tmpout->setCoordInfo( coordinfo ) ; 3351 out = average( newin, mask, weight, avmode ) ; 3886 3352 } 3887 3353 else { -
trunk/src/Scantable.cpp
r2591 r2595 2304 2304 } 2305 2305 2306 void Scantable::regridChannel( int nChan, double dnu, double fmin, int irow ) 2307 { 2308 Vector<Float> oldspec = specCol_( irow ) ; 2309 Vector<uChar> oldflag = flagsCol_( irow ) ; 2310 Vector<Float> oldtsys = tsysCol_( irow ) ; 2311 Vector<Float> newspec( nChan, 0 ) ; 2312 Vector<uChar> newflag( nChan, true ) ; 2313 Vector<Float> newtsys ; 2314 bool regridTsys = false ; 2315 if (oldtsys.size() == oldspec.size()) { 2316 regridTsys = true ; 2317 newtsys.resize(nChan,false) ; 2318 newtsys = 0 ; 2319 } 2320 2321 // regrid 2322 vector<double> abcissa = getAbcissa( irow ) ; 2323 int oldsize = abcissa.size() ; 2324 double olddnu = abcissa[1] - abcissa[0] ; 2325 //int ichan = 0 ; 2326 double wsum = 0.0 ; 2327 Vector<double> zi( nChan+1 ) ; 2328 Vector<double> yi( oldsize + 1 ) ; 2329 Block<uInt> count( nChan, 0 ) ; 2330 yi[0] = abcissa[0] - 0.5 * olddnu ; 2331 for ( int ii = 1 ; ii < oldsize ; ii++ ) 2332 yi[ii] = 0.5* (abcissa[ii-1] + abcissa[ii]) ; 2333 yi[oldsize] = abcissa[oldsize-1] \ 2334 + 0.5 * (abcissa[oldsize-1] - abcissa[oldsize-2]) ; 2335 // cout << "olddnu=" << olddnu << ", dnu=" << dnu << " (diff=" << olddnu-dnu << ")" << endl ; 2336 // cout << "yi[0]=" << yi[0] << ", fmin=" << fmin << " (diff=" << yi[0]-fmin << ")" << endl ; 2337 // cout << "oldsize=" << oldsize << ", nChan=" << nChan << endl ; 2338 2339 // do not regrid if input parameters are almost same as current 2340 // spectral setup 2341 double dnuDiff = abs( ( dnu - olddnu ) / olddnu ) ; 2342 double oldfmin = min( yi[0], yi[oldsize] ) ; 2343 double fminDiff = abs( ( fmin - oldfmin ) / oldfmin ) ; 2344 double nChanDiff = nChan - oldsize ; 2345 double eps = 1.0e-8 ; 2346 if ( nChanDiff == 0 && dnuDiff < eps && fminDiff < eps ) 2347 return ; 2348 2349 //zi[0] = abcissa[0] - 0.5 * olddnu ; 2350 //zi[0] = ((olddnu*dnu > 0) ? yi[0] : yi[oldsize]) ; 2351 if ( dnu > 0 ) 2352 zi[0] = fmin - 0.5 * dnu ; 2353 else 2354 zi[0] = fmin + nChan * abs(dnu) ; 2355 for ( int ii = 1 ; ii < nChan ; ii++ ) 2356 zi[ii] = zi[0] + dnu * ii ; 2357 zi[nChan] = zi[nChan-1] + dnu ; 2358 // Access zi and yi in ascending order 2359 int izs = ((dnu > 0) ? 0 : nChan ) ; 2360 int ize = ((dnu > 0) ? nChan : 0 ) ; 2361 int izincr = ((dnu > 0) ? 1 : -1 ) ; 2362 int ichan = ((olddnu > 0) ? 0 : oldsize ) ; 2363 int iye = ((olddnu > 0) ? oldsize : 0 ) ; 2364 int iyincr = ((olddnu > 0) ? 1 : -1 ) ; 2365 //for ( int ii = izs ; ii != ize ; ii+=izincr ){ 2366 int ii = izs ; 2367 while (ii != ize) { 2368 // always zl < zr 2369 double zl = zi[ii] ; 2370 double zr = zi[ii+izincr] ; 2371 // Need to access smaller index for the new spec, flag, and tsys. 2372 // Values between zi[k] and zi[k+1] should be stored in newspec[k], etc. 2373 int i = min(ii, ii+izincr) ; 2374 //for ( int jj = ichan ; jj != iye ; jj+=iyincr ) { 2375 int jj = ichan ; 2376 while (jj != iye) { 2377 // always yl < yr 2378 double yl = yi[jj] ; 2379 double yr = yi[jj+iyincr] ; 2380 // Need to access smaller index for the original spec, flag, and tsys. 2381 // Values between yi[k] and yi[k+1] are stored in oldspec[k], etc. 2382 int j = min(jj, jj+iyincr) ; 2383 if ( yr <= zl ) { 2384 jj += iyincr ; 2385 continue ; 2386 } 2387 else if ( yl <= zl ) { 2388 if ( yr < zr ) { 2389 if (!oldflag[j]) { 2390 newspec[i] += oldspec[j] * ( yr - zl ) ; 2391 if (regridTsys) newtsys[i] += oldtsys[j] * ( yr - zl ) ; 2392 wsum += ( yr - zl ) ; 2393 count[i]++ ; 2394 } 2395 newflag[i] = newflag[i] && oldflag[j] ; 2396 } 2397 else { 2398 if (!oldflag[j]) { 2399 newspec[i] += oldspec[j] * abs(dnu) ; 2400 if (regridTsys) newtsys[i] += oldtsys[j] * abs(dnu) ; 2401 wsum += abs(dnu) ; 2402 count[i]++ ; 2403 } 2404 newflag[i] = newflag[i] && oldflag[j] ; 2405 ichan = jj ; 2406 break ; 2407 } 2408 } 2409 else if ( yl < zr ) { 2410 if ( yr <= zr ) { 2411 if (!oldflag[j]) { 2412 newspec[i] += oldspec[j] * ( yr - yl ) ; 2413 if (regridTsys) newtsys[i] += oldtsys[j] * ( yr - yl ) ; 2414 wsum += ( yr - yl ) ; 2415 count[i]++ ; 2416 } 2417 newflag[i] = newflag[i] && oldflag[j] ; 2418 } 2419 else { 2420 if (!oldflag[j]) { 2421 newspec[i] += oldspec[j] * ( zr - yl ) ; 2422 if (regridTsys) newtsys[i] += oldtsys[j] * ( zr - yl ) ; 2423 wsum += ( zr - yl ) ; 2424 count[i]++ ; 2425 } 2426 newflag[i] = newflag[i] && oldflag[j] ; 2427 ichan = jj ; 2428 break ; 2429 } 2430 } 2431 else { 2432 //ichan = jj - iyincr ; 2433 break ; 2434 } 2435 jj += iyincr ; 2436 } 2437 if ( wsum != 0.0 ) { 2438 newspec[i] /= wsum ; 2439 if (regridTsys) newtsys[i] /= wsum ; 2440 } 2441 wsum = 0.0 ; 2442 ii += izincr ; 2443 } 2444 2445 // flag out channels without data 2446 // this is tentative since there is no specific definition 2447 // on bit flag... 2448 uChar noData = 1 << 7 ; 2449 for ( Int i = 0 ; i < nChan ; i++ ) { 2450 if ( count[i] == 0 ) 2451 newflag[i] = noData ; 2452 } 2453 2454 specCol_.put( irow, newspec ) ; 2455 flagsCol_.put( irow, newflag ) ; 2456 if (regridTsys) tsysCol_.put( irow, newtsys ); 2457 2458 return ; 2459 } 2460 2306 2461 std::vector<float> Scantable::getWeather(int whichrow) const 2307 2462 { -
trunk/src/Scantable.h
r2591 r2595 501 501 void regridChannel( int nchan, double dnu ) ; 502 502 void regridChannel( int nchan, double dnu, int irow ) ; 503 void regridChannel( int nchan, double dnu, double fmin, int irow ) ; 503 504 504 505 void regridSpecChannel( double dnu, int nchan=-1 ) ;
Note:
See TracChangeset
for help on using the changeset viewer.