Commits

Ville Suoranta authored 2267d148f27 Merge
Merge pull request #118 in CASA/casa from bugfix/CAS-10280 to master

* commit '80489706b417542a1533129516e13408111575da': Sped up the define image by passing the channel info to SynthesisUtilsMethod changed the code for some frequency range calculation not to use the iterator but use MSUtil functionalities
No tags

code/msvis/MSVis/MSUtil.cc

Modified
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

Everything looks good. We'll let you know here if there's anything you should know about.

Add shortcut