diff --git a/pabeam/beamformer.py b/pabeam/beamformer.py index 0bb1b5d4c9dee2d3d75e5b996044c153dd6c4bda..82004a29494791ba2cf5664a9e5683ba5fe034d5 100644 --- a/pabeam/beamformer.py +++ b/pabeam/beamformer.py @@ -671,4 +671,13 @@ class DualDipoleBeam(GriddedBeam): e = self.gain_errors w = w*e self.Hbeam = np.sum((AF.T*w.conj()).T,axis=0)#/np.sqrt(w.shape[0]) - return self.Hbeam \ No newline at end of file + return self.Hbeam + + def getGGrid(self,freq, pol = 'rcp', transmit_pol = 'rcp'): + AF = self.getG(*(self.spherical_grid), freq, pol = pol, + transmit_pol = transmit_pol) + w = self.weights + e = self.gain_errors + w = w*e + self.beam = np.sum((AF.T*w.conj()).T,axis=0)#/np.sqrt(w.shape[0]) + return self.beam \ No newline at end of file diff --git a/pabeam/fitbeam.py b/pabeam/fitbeam.py index aa0f60a0ea40f844fdf408ecbc0fe071708dc48c..aa30b38f804aafe48900d3da378ef8cfb3192a4b 100755 --- a/pabeam/fitbeam.py +++ b/pabeam/fitbeam.py @@ -306,5 +306,26 @@ def FitWeights(beam, source_dir, constraints, freq, print("underdetermined") return np.dot(np.linalg.pinv(Aht),constraints).squeeze() #complex weights +def projectionG(beam, rfi_dir, freq, + receiver_pol = 'ele', transmit_pol = 'rcp'): + W = beam.getG(rfi_dir[0], rfi_dir[1], freq, + pol = receiver_pol, transmit_pol = transmit_pol) #Nant x N_rfi + Nant = W.shape[0] + Nrfi = W.shape[1] + P = np.eye(Nant) + R = np.dot(W,W.conj().T) + l,V = np.linalg.eig(R) + V_sel = V[:,np.abs(l)>1e-7] + #print(V,V_sel.shape,V_sel,l) + P = P - np.dot(V_sel,V_sel.conj().T) + # for i in range(Nrfi): + # #wtemp = np.dot(W[:,i],P) + # #p = np.eye(beam.Nant) - \ + # # np.outer(wtemp,wtemp.conj())/np.dot(wtemp,wtemp.conj()) + # #P = p + # p = np.eye(beam.Nant) - \ + # np.outer(W[:,i],W[:,i].conj())/np.dot(W[:,i],W[:,i].conj()) + # P = np.dot(p,P) + return P