Commits
Ville Suoranta authored 2267d148f27 Merge
172 172 | outnchan[nout]=locnchan[j]; |
173 173 | |
174 174 | |
175 175 | |
176 176 | } |
177 177 | } |
178 178 | |
179 179 | } |
180 180 | |
181 181 | |
182 + | } |
183 + | void MSUtil::getChannelRangeFromFreqRange(Int& start, |
184 + | Int& nchan, |
185 + | const MeasurementSet& ms, |
186 + | const Int spw, |
187 + | const Double freqStart, |
188 + | const Double freqEnd, |
189 + | const Double freqStep, |
190 + | const MFrequency::Types freqframe) |
191 + | { |
192 + | start=-1; |
193 + | nchan=-1; |
194 + | ROMSFieldColumns fieldCol(ms.field()); |
195 + | ROMSDataDescColumns ddCol(ms.dataDescription()); |
196 + | Vector<Int> dataDescSel=MSDataDescIndex(ms.dataDescription()).matchSpwId(spw); |
197 + | //cerr << "dataDescSel " << dataDescSel << endl; |
198 + | if(dataDescSel.nelements()==0) |
199 + | return; |
200 + | Vector<Double> t; |
201 + | ROScalarColumn<Double> (ms,MS::columnName(MS::TIME)).getColumn(t); |
202 + | Vector<Int> ddId; |
203 + | ROScalarColumn<Int> (ms,MS::columnName(MS::DATA_DESC_ID)).getColumn(ddId); |
204 + | ROMSSpWindowColumns spwCol(ms.spectralWindow()); |
205 + | Vector<Double> ddIdD(ddId.shape()); |
206 + | convertArray(ddIdD, ddId); |
207 + | ddIdD+= 1.0; //no zero id |
208 + | //we have to do this as one can have multiple dd for the same time. |
209 + | t*=ddIdD; |
210 + | //t(fldId != fieldId)=-1.0; |
211 + | Vector<Double> elt; |
212 + | Vector<Int> elindx; |
213 + | //rejecting the large blocks of same time for all baselines |
214 + | //this speeds up by a lot GenSort::sort |
215 + | rejectConsecutive(t, elt, elindx); |
216 + | |
217 + | ROScalarMeasColumn<MEpoch> timeCol(ms, MS::columnName(MS::TIME)); |
218 + | Vector<uInt> uniqIndx; |
219 + | uInt nTimes=GenSortIndirect<Double>::sort (uniqIndx, elt, Sort::Ascending, Sort::QuickSort|Sort::NoDuplicates); |
220 + | |
221 + | t.resize(0); |
222 + | |
223 + | //ROScalarColumn<Int> ddId(ms,MS::columnName(MS::DATA_DESC_ID)); |
224 + | ROScalarColumn<Int> fldId(ms,MS::columnName(MS::FIELD_ID)); |
225 + | //now need to do the conversion to data frame from requested frame |
226 + | //Get the epoch mesasures of the first row |
227 + | MEpoch ep; |
228 + | timeCol.get(0, ep); |
229 + | String observatory; |
230 + | MPosition obsPos; |
231 + | /////observatory position |
232 + | ROMSColumns msc(ms); |
233 + | if (ms.observation().nrow() > 0) { |
234 + | observatory = msc.observation().telescopeName()(msc.observationId()(0)); |
235 + | } |
236 + | if (observatory.length() == 0 || |
237 + | !MeasTable::Observatory(obsPos,observatory)) { |
238 + | // unknown observatory, use first antenna |
239 + | obsPos=msc.antenna().positionMeas()(0); |
240 + | } |
241 + | ////// |
242 + | Int oldDD=dataDescSel(0); |
243 + | Int newDD=oldDD; |
244 + | //For now we will assume that the field is not moving very far from polynome 0 |
245 + | MDirection dir =fieldCol.phaseDirMeas(0); |
246 + | MFrequency::Types obsMFreqType= (MFrequency::Types) (spwCol.measFreqRef()(ddCol.spectralWindowId()(dataDescSel(0)))); |
247 + | MeasFrame frame(ep, obsPos, dir); |
248 + | MFrequency::Convert toObs(freqframe, |
249 + | MFrequency::Ref(obsMFreqType, frame)); |
250 + | Double freqEndMax=freqEnd+0.5*fabs(freqStep); |
251 + | Double freqStartMin=freqStart-0.5*fabs(freqStep); |
252 + | if(freqframe != obsMFreqType){ |
253 + | freqEndMax=0.0; |
254 + | freqStartMin=C::dbl_max; |
255 + | } |
256 + | for (uInt j=0; j< nTimes; ++j) { |
257 + | if(anyEQ(dataDescSel, ddId(elindx[uniqIndx[j]]))){ |
258 + | timeCol.get(elindx[uniqIndx[j]], ep); |
259 + | newDD=ddId(elindx[uniqIndx[j]]); |
260 + | if(oldDD != newDD) { |
261 + | |
262 + | oldDD=newDD; |
263 + | if(spwCol.measFreqRef()(ddCol.spectralWindowId()(newDD)) != obsMFreqType) { |
264 + | obsMFreqType= (MFrequency::Types) (spwCol.measFreqRef()(ddCol.spectralWindowId()(newDD))); |
265 + | toObs.setOut(MFrequency::Ref(obsMFreqType, frame)); |
266 + | } |
267 + | } |
268 + | if(obsMFreqType != freqframe) { |
269 + | dir=fieldCol.phaseDirMeas(fldId(elindx[uniqIndx[j]])); |
270 + | frame.resetEpoch(ep); |
271 + | frame.resetDirection(dir); |
272 + | Double freqTmp=toObs(Quantity(freqStart, "Hz")).get("Hz").getValue(); |
273 + | freqStartMin=(freqStartMin > freqTmp) ? freqTmp : freqStartMin; |
274 + | freqTmp=toObs(Quantity(freqEnd, "Hz")).get("Hz").getValue(); |
275 + | freqEndMax=(freqEndMax < freqTmp) ? freqTmp : freqEndMax; |
276 + | } |
277 + | } |
278 + | } |
279 + | |
280 + | |
281 + | MSSpwIndex spwIn(ms.spectralWindow()); |
282 + | Vector<Int> spws; |
283 + | Vector<Int> starts; |
284 + | Vector<Int> nchans; |
285 + | if(!spwIn.matchFrequencyRange(freqStartMin-0.5*freqStep, freqEndMax+0.5*freqStep, spws, starts, nchans)){ |
286 + | return; |
287 + | } |
288 + | for (uInt k=0; k < spws.nelements(); ++k){ |
289 + | if(spws[k]==spw){ |
290 + | start=starts[k]; |
291 + | nchan=nchans[k]; |
292 + | } |
293 + | |
294 + | } |
182 295 | } |
183 296 | void MSUtil::getFreqRangeInSpw( Double& freqStart, |
184 297 | Double& freqEnd, const Vector<Int>& spw, const Vector<Int>& start, |
185 298 | const Vector<Int>& nchan, |
186 299 | const MeasurementSet& ms, |
187 300 | const MFrequency::Types freqframe, |
188 - | const Int fieldId){ |
301 + | const Int fieldId, const Bool fromEdge){ |
189 302 | |
190 303 | |
191 304 | freqStart=C::dbl_max; |
192 305 | freqEnd=0.0; |
193 306 | Vector<Double> t; |
194 307 | ROScalarColumn<Double> (ms,MS::columnName(MS::TIME)).getColumn(t); |
195 308 | Vector<Int> ddId; |
196 309 | Vector<Int> fldId; |
197 310 | ROScalarColumn<Int> (ms,MS::columnName(MS::DATA_DESC_ID)).getColumn(ddId); |
198 311 | ROScalarColumn<Int> (ms,MS::columnName(MS::FIELD_ID)).getColumn(fldId); |
229 342 | if (observatory.length() == 0 || |
230 343 | !MeasTable::Observatory(obsPos,observatory)) { |
231 344 | // unknown observatory, use first antenna |
232 345 | obsPos=msc.antenna().positionMeas()(0); |
233 346 | } |
234 347 | ////// |
235 348 | MeasFrame frame(ep, obsPos, dir); |
236 349 | |
237 350 | |
238 351 | for (uInt ispw =0 ; ispw < spw.nelements() ; ++ispw){ |
352 + | if(nchan[ispw]>0 && start[ispw] >-1){ |
239 353 | Double freqStartObs=C::dbl_max; |
240 354 | Double freqEndObs=0.0; |
241 355 | Vector<Double> chanfreq=spwCol.chanFreq()(spw[ispw]); |
242 356 | Vector<Double> chanwid=spwCol.chanWidth()(spw[ispw]); |
243 357 | Vector<Int> ddOfSpw=mddin.matchSpwId(spw[ispw]); |
244 358 | for (Int ichan=start[ispw]; ichan<start[ispw]+nchan[ispw]; ++ichan){ |
245 - | if(freqStartObs > (chanfreq[ichan]-fabs(chanwid[ichan])/2.0)) freqStartObs=chanfreq[ichan]-fabs(chanwid[ichan])/2.0; |
246 - | if(freqEndObs < (chanfreq[ichan]+fabs(chanwid[ichan])/2.0)) freqEndObs=chanfreq[ichan]+fabs(chanwid[ichan])/2.0; |
359 + | if(fromEdge){ |
360 + | if(freqStartObs > (chanfreq[ichan]-fabs(chanwid[ichan])/2.0)) freqStartObs=chanfreq[ichan]-fabs(chanwid[ichan])/2.0; |
361 + | if(freqEndObs < (chanfreq[ichan]+fabs(chanwid[ichan])/2.0)) freqEndObs=chanfreq[ichan]+fabs(chanwid[ichan])/2.0; |
362 + | } |
363 + | else{ |
364 + | if(freqStartObs > (chanfreq[ichan])) freqStartObs=chanfreq[ichan]; |
365 + | if(freqEndObs < (chanfreq[ichan])) freqEndObs=chanfreq[ichan]; |
366 + | } |
247 367 | } |
248 368 | obsMFreqType= (MFrequency::Types) (spwCol.measFreqRef()(spw[ispw])); |
249 369 | if((obsMFreqType==MFrequency::REST) || (obsMFreqType==freqframe && obsMFreqType != MFrequency::TOPO)){ |
250 370 | if(freqStart > freqStartObs) freqStart=freqStartObs; |
251 371 | if(freqEnd < freqStartObs) freqEnd=freqStartObs; |
252 372 | if(freqStart > freqEndObs) freqStart=freqEndObs; |
253 373 | if(freqEnd < freqEndObs) freqEnd=freqEndObs; |
254 374 | } |
255 375 | else{ |
256 376 | MFrequency::Convert toframe(obsMFreqType, |
262 382 | Double freqTmp=toframe(Quantity(freqStartObs, "Hz")).get("Hz").getValue(); |
263 383 | if(freqStart > freqTmp) freqStart=freqTmp; |
264 384 | if(freqEnd < freqTmp) freqEnd=freqTmp; |
265 385 | freqTmp=toframe(Quantity(freqEndObs, "Hz")).get("Hz").getValue(); |
266 386 | if(freqStart > freqTmp) freqStart=freqTmp; |
267 387 | if(freqEnd < freqTmp) freqEnd=freqTmp; |
268 388 | } |
269 389 | } |
270 390 | } |
271 391 | } |
392 + | } |
272 393 | } |
273 394 | void MSUtil::rejectConsecutive(const Vector<Double>& t, Vector<Double>& retval, Vector<Int>& indx){ |
274 395 | uInt n=t.nelements(); |
275 396 | if(n >0){ |
276 397 | retval.resize(n); |
277 398 | indx.resize(n); |
278 399 | retval[0]=t[0]; |
279 400 | indx[0]=0; |
280 401 | } |
281 402 | else |