from Wizardry.AIPSData import AIPSUVData from AIPS import AIPS import math, sys class snatch: def __init__(self, datasource, datatarget, inver, outver): self.debug = 1 self.datasource = datasource self.datatarget = datatarget self.inver = inver self.outver = outver def setDebug(self, val): self.debug = val def printMsg(self, msg): if self.debug > 0: print msg def getAmplitude(self, real, imag): return math.sqrt(math.pow(real, 2) + math.pow(imag, 2)) def getAmplitudeOut(self, freqid, real, imag, deltaband): ampouts = [] deltab = deltaband[freqid - 1] ndbf = len(deltab) for dbf in range(ndbf): ampouts.append(self.getAmplitude(real[deltab[dbf][1]], imag[deltab[dbf][1]])) return ampouts def getPhase(self, real, imag): return math.atan2(imag, real) def getPhaseIn(self, real, imag): inphases = [] nrs = len(real) if nrs == len(imag): for nr in range(nrs): inphases.append(self.getPhase(real[nr], imag[nr])) return inphases def getReal(self, amp, phase): return (amp * math.cos(phase)) def getImag(self, amp, phase): return (amp * math.sin(phase)) def getRefFreq(self, data): header = data.header return header['crval'][2] def getFreqOffset(self, data): freqoff = [] for row in data.table('FQ', 0): if type(row.if_freq) != list: freqoff.append([row.if_freq]) else: freqoff.append(row.if_freq) return freqoff def getFreqs(self, data): freqs = [] rf = self.getRefFreq(data) fo = self.getFreqOffset(data) nfreqsel = len(fo) niff = len(fo[0]) for freqsel in range(nfreqsel): freqs.append([]) for iff in range(niff): sum = fo[freqsel][iff] + rf freqs[freqsel].append(sum) return freqs def getDeltaBandWidth(self, datasource, datatarget): deltaBand = [] fssource = self.getFreqs(datasource) fstarget = self.getFreqs(datatarget) nfreqsel = len(fssource) if nfreqsel != len(fstarget): return 0 niffs = len(fssource[0]) nifft = len(fstarget[0]) for freqsel in range(nfreqsel): deltaBand.append([]) for ifft in range(nifft): for iffs in range(niffs): if fstarget[freqsel][ifft] < fssource[freqsel][iffs]: delta = fstarget[freqsel][ifft] - fssource[freqsel][iffs - 1] deltaBand[freqsel].append([delta, iffs - 1]) return deltaBand def getPhaseOut(self, freqid, phasein, mbdelay, deltaband): phaseouts = [] deltab = deltaband[freqid - 1] ndbf = len(deltab) for dbf in range(ndbf): phaseout = phasein[deltab[dbf][1]] + (2 * math.pi * mbdelay * deltab[dbf][0]) phaseouts.append(phaseout) return phaseouts def getRealOut(self, amp, phaseout): realouts = [] npo = len(phaseout) for po in range(npo): realouts.append(self.getReal(amp[po], phaseout[po])) if npo == 1: realouts = realouts[0] return realouts def getImagOut(self, amp, phaseout): imagouts = [] npo = len(phaseout) for po in range(npo): imagouts.append(self.getImag(amp[po], phaseout[po])) if npo == 1: imagouts = imagouts[0] return imagouts def getDataOut(self, freqid, data, deltaband): dataouts = [] deltab = deltaband[freqid - 1] ndbf = len(deltab) for dbf in range(ndbf): dataouts.append(data[deltab[dbf][1]]) if ndbf == 1: dataouts = dataouts[0] return dataouts def getNIF(self, data): return len(self.getFreqOffset(data)[0]) def existsSNTbl(self, data, ver): tables = data.tables tbln = len(tables) for tbl in range(tbln): if tables[tbl][0] == ver: if tables[tbl][1] == 'AIPS SN': return 1 return 0 def getSources(self, data): sources = [[],[]] for row in data.table('SU', 0): source_name = row.source.strip() id_no = row.id__no sources[0].append(source_name) sources[1].append(id_no) return sources def changeSourceID(self, su_id1, sources1, sources2): source1 = None n_su1 = len(sources1[0]) for su1 in range(n_su1): if sources1[1][su1] == su_id1: source1 = sources1[0][su1] break if source1 is not None: n_su2 = len(sources2[0]) for su2 in range(n_su2): if sources2[0][su2] == source1: return su2 + 1 return su_id1 def compute(self, datasource, datatarget, inver, outver): print "----SNATCH--- copies SN tables and extrapolates delay solutions" print datasource, inver print datatarget, outver print "-------------" deltaBand = self.getDeltaBandWidth(datasource, datatarget) ds_sources = self.getSources(datasource) dt_sources = self.getSources(datatarget) niftarget = self.getNIF(datatarget) datawsource = AIPSUVData(datasource.name, datasource.klass, datasource.disk, datasource.seq, AIPS.userno) datawtarget = AIPSUVData(datatarget.name, datatarget.klass, datatarget.disk, datatarget.seq, AIPS.userno) sourcetbl = datawsource.table('SN', inver) targettbl = datawtarget.attach_table('SN', outver) targettbl.keywords['NO_ANT'] = sourcetbl.keywords['NO_ANT'] no_pol = sourcetbl.keywords['NO_POL'] no_nodes = sourcetbl.keywords['NO_NODES'] targettbl.keywords['NO_POL'] = no_pol targettbl.keywords['NO_IF'] = niftarget targettbl.keywords['NO_NODES'] = no_nodes for i in xrange(1, no_nodes + 1): strraoff = "RA_OFF" + str(i) strdecoff = "DEC_OFF" + str (i) targettbl.keywords[strraoff] = sourcetbl.keywords[strraoff] targettbl.keywords[strraoff] = sourcetbl.keywords[strdecoff] for row in sourcetbl: source_id = row.source_id phasein1 = self.getPhaseIn(row.real1, row.imag1) phaseout1 = self.getPhaseOut(row.freq_id, phasein1, row.mbdelay1, deltaBand) amp1 = self.getAmplitudeOut(row.freq_id, row.real1, row.imag1, deltaBand) row.source_id = self.changeSourceID(source_id, ds_sources, dt_sources) row.real1 = self.getRealOut(amp1, phaseout1) row.imag1 = self.getImagOut(amp1, phaseout1) row.delay_1 = self.getDataOut(row.freq_id, row.delay_1, deltaBand) row.rate_1 = self.getDataOut(row.freq_id, row.rate_1, deltaBand) row.weight_1 = self.getDataOut(row.freq_id, row.weight_1, deltaBand) row.refant_1 = self.getDataOut(row.freq_id, row.refant_1, deltaBand) if no_pol == 2: phasein2 = self.getPhaseIn(row.real2, row.imag2) phaseout2 = self.getPhaseOut(row.freq_id, phasein2, row.mbdelay2, deltaBand) amp2 = self.getAmplitudeOut(row.freq_id, row.real2, row.imag2, deltaBand) row.real2 = self.getRealOut(amp2, phaseout2) row.imag2 = self.getImagOut(amp2, phaseout2) row.delay_2 = self.getDataOut(row.freq_id, row.delay_2, deltaBand) row.rate_2 = self.getDataOut(row.freq_id, row.rate_2, deltaBand) row.weight_2 = self.getDataOut(row.freq_id, row.weight_2, deltaBand) row.refant_2 = self.getDataOut(row.freq_id, row.refant_2, deltaBand) targettbl.append(row) continue sourcetbl.close() targettbl.close() def checkInput(self, datasource, datatarget, inver, outver): if datasource.exists(): if datatarget.exists(): if self.existsSNTbl(datasource, inver): if self.existsSNTbl(datatarget, outver): self.printMsg("\nTarget table SN number " + str(outver) + " already exists.\n") yn = raw_input("Do you want to overwrite it ? (Y/N) [N] : ") if yn.upper() != 'Y': return 0 return 1 else: self.printMsg("Source table SN number " + str(inver) + " does not exists.") else: self.printMsg("Data target does not exists.") else: self.printMsg("Data source does not exists.") return 0 def run(self): if self.checkInput(self.datasource, self.datatarget, self.inver, self.outver): self.compute(self.datasource, self.datatarget, self.inver, self.outver) self.printMsg("Done.") return 1 return 0