Beispiel #1
0
    def get_result(self, request):
        global _albus_time
        global _albus_rm

        # get time and frequency for the tile
        cells = request.cells
        cells_shape = meq.shape(cells)
        time = cells.grid.time
        freq = cells.grid.freq

        # use scipy to interpolate and get rm for MS times
        f = interp1d(_albus_time, _albus_rm)
        rotation_measure = f(time)

        factor = LIGHT_SPEED / freq
        out_array = meq.vells(cells_shape)

        metre_sq = factor * factor
        for j in range(cells_shape[0]):
            angle = rotation_measure[j] * metre_sq
            out_array[j, :] = angle

        vellsets = []
        vellsets.append(meq.vellset(out_array))
        res = meq.result(cells=request.cells)
        res.vellsets = vellsets
        return res
Beispiel #2
0
  def get_result (self,request):
    global _albus_time
    global _albus_rm

    # get time and frequency for the tile
    cells = request.cells
    cells_shape = meq.shape(cells);
    time = cells.grid.time
    freq = cells.grid.freq

    # use scipy to interpolate and get rm for MS times
    f = interp1d(_albus_time, _albus_rm)
    rotation_measure = f(time) 

    factor = LIGHT_SPEED / freq
    out_array = meq.vells(cells_shape)

    metre_sq = factor * factor
    for j in range(cells_shape[0]):
      angle =  rotation_measure[j] * metre_sq
      out_array[j,:] = angle

    vellsets = [];
    vellsets.append(meq.vellset(out_array))
    res = meq.result(cells = request.cells)
    res.vellsets = vellsets
    return res
Beispiel #3
0
 def get_result (self,request,*children):
   if len(children):
     raise TypeError("this is a leaf node, no children expected!");
   # make value of same shape as cells
   cells = request.cells;
   shape = meq.shape(cells);
   print("cells shape is",shape);
   value = meq.vells(shape);
   # fill in random numbers with the given distribution
   flat = value.ravel();   # 'flat' reference to array data
   for i in range(flat.size):
     flat[i] = self._generator(*self.distribution_args);
   return meq.result(meq.vellset(value),cells);
 def get_result (self,request,*children):
   if len(children):
     raise TypeError,"this is a leaf node, no children expected!";
   # make value of same shape as cells
   cells = request.cells;
   shape = meq.shape(cells);
   print "cells shape is",shape;
   value = meq.vells(shape);
   # fill in random numbers with the given distribution
   flat = value.ravel();   # 'flat' reference to array data
   for i in range(flat.size):
     flat[i] = self._generator(*self.distribution_args);
   return meq.result(meq.vellset(value),cells);
    def get_result(self, request, *children):
        if len(children) < 1:
            raise TypeError(
                "this is NOT a leaf node, At least 1  child with piercepoints expected!"
            )
        res1 = children[0]
        vs1 = res1.vellsets
        # pierce_points, vector of length 2 or 3 (x,y(,z))
        vector_size = len(vs1)
        # for now use fist two:
        if vector_size < 2:
            raise TypeError(
                "vector size of child 1 too small, at leat x/y expected")
        xv = vs1[0].value[0]
        yv = vs1[1].value[0]

        if vs1[0].has_field('shape'):
            shapex = vs1[0].shape
        else:
            shapex = (1, )
        if vs1[1].has_field('shape'):
            shapey = vs1[1].shape
        else:
            shapey = (1, )

        cells = request.cells
        seg = cells.segments.time
        #        print '************************************************************'
        #        print cells
        #        print '------------------------------------------------------------'
        #        print seg
        #        print '************************************************************'
        # the startt and endt are the timeslots when tiling is set > 1
        if type(seg.start_index) == type(1):
            startt = seg.start_index
            endt = seg.end_index
        else:
            startt = seg.start_index[0]
            endt = seg.end_index[-1]
#        print '************************************************************'
#        print startt, endt
#        print '************************************************************'

# make time a lot smaller to prevent precision errors for int
# the actual value of the constant
        time = cells.grid.time - self.starttime

        if startt >= endt:
            time = [
                time,
            ]
        val = []
        for it in range(startt, endt + 1):
            if shapex[0] > 1:
                xv = vs1[0].value[it]
            if shapey[0] > 1:
                yv = vs1[1].value[it]

            xshift = (time[it]) * self.speedx
            yshift = (time[it]) * self.speedy
            xn = (xv + xshift) / self.scale
            yn = (yv + yshift) / self.scale
            xn = int(xn) % (
                self.grid_size
            )  # zorg dat xn een integer tussen 0 en grid_size is
            yn = int(yn) % (
                self.grid_size
            )  # zorg dat xn een integer tussen 0 en grid_size is

            val.append(PhaseScreen.phasescreen[xn][yn] * self.amp_scale +
                       self.tec0)
        # fill result
        res = meq.result(None, cells)
        # print startt,endt,seg,val;
        val2 = meq.vells(shape=meq.shape(endt + 1, ))
        val2[:] = val
        vs = meq.vellset(val2)
        res.vellsets = [
            vs,
        ]
        return res
Beispiel #6
0
    def get_result(self, request, *children):
        if len(children) < 2:
            raise TypeError, "this is NOT a leaf node, At least 2  children expected!"
        cells = request.cells
        res = meq.result(None, cells)

        Xp_table = [0, 0, 0]
        # if necessary loop over time and other axis
        # First get PiercePoints
        res1 = children[1]
        vs1 = res1.vellsets
        # num_pierce_points each containing vector of length 2 or 3 (x,y(,z))
        dims = res1.dims
        vector_size = dims[1]
        num_pp = dims[0]
        x = []
        for j in range(num_pp):
            x.append([])
            for i in range(vector_size):
                x[j].append(0)

        # x=[[0,]*vector_size,]*num_pp;
        Xp_table = [
            0,
        ] * num_pp
        for i in range(num_pp):
            for j in range(vector_size):
                x[i][j] = vs1[i * vector_size + j].value
        shape = meq.shape(x[0][0])
        grid_size = len(x[0][0])
        # print "grid_size",grid_size;

        # Then the parameters
        res0 = children[0]
        vs0 = res0.vellsets
        # should be one per parameter
        num_parms = len(vs0)
        val0 = [
            0,
        ] * num_parms
        par = [
            0,
        ] * num_parms
        solvable = False
        parmidx = range(num_parms)

        # initialize  result vector 1 field per pp;
        #      ph=[[0,]*grid_size,]*num_parms;
        ph = []
        for j in range(num_pp):
            ph.append([])
            for i in range(grid_size):
                ph[j].append(0)

        # if solvable they should have perturbed_values;
        if vs0[0].has_key('perturbed_value'):
            solvable = True
            pert = [0] * num_parms
            pt = []
            perturbations = ()
            spid_index = ()
            # get spidindex
            for i in range(num_parms):
                spid_index += vs0[i].spid_index

            # sort on spidindex
            for i in range(num_parms):
                for j in range(i):
                    if spid_index[i] < spid_index[parmidx[j]]:
                        newidx = i
                        for k in range(j, i + 1):
                            old = parmidx[k]
                            parmidx[k] = newidx
                            newidx = old
                        break
            spid_index = ()
            # 1 perturbed value per pp per paramter
            # or the other way around???
            for i in range(num_parms):
                pt.append([])

                for i2 in range(num_pp):
                    pt[i].append([])
                    for g in range(grid_size):
                        pt[i][i2].append(0)
        # fill values sorted
        for pn in range(num_parms):
            pnidx = parmidx[pn]
            val0[pn] = vs0[pnidx].value
            par[pn] = val0[pn][0]
            # use first value (in case of constant parms)

            # assume single perturbation parms for the moment
            if solvable:
                pert[pn] = vs0[pnidx].perturbed_value[0]
                spid_index += vs0[pnidx].spid_index
                perturbations += vs0[pnidx].perturbations

        # get U matrix
        # Only if domain changed!!
        for i in range(grid_size):
            for j in range(vector_size):
                for k in range(num_pp):
                    Xp_table[k] = x[k][j][i]
            U, S, Ut, B = get_U(Xp_table, order=num_parms)

            for pn in range(num_parms):
                if len(val0[pn]) > i:
                    # incorrect check for freq/time dependendies
                    par[pn] = (val0[pn][i])

            value = dot(U, par)
            for v in range(num_pp):
                ph[v][i] = value[v]
            for v in range(num_parms):
                if solvable:
                    old = par[v]
                    if len(pert[v]) > i:
                        par[v] = pert[v][i]
                    else:
                        par[v] = pert[v][0]
                    pval = dot(U, par)
                    par[v] = old
                    for v2 in range(num_pp):
                        pt[v][v2][i] = pval[v2]

        vellsets = []
        for v in range(num_pp):
            value = meq.vells(shape)
            ph[v] = array(ph[v])
            ph[v].shape = shape
            value[:] = ph[v]

            vellsets.append(meq.vellset(value))
            if solvable:
                vellsets[v].perturbed_value = ()
                for v2 in range(num_parms):
                    value = meq.vells(shape)
                    pt[v2][v] = array(pt[v2][v])
                    pt[v2][v].shape = shape
                    value[:] = pt[v2][v]
                    vellsets[v].perturbed_value += (value, )
                    vellsets[v].spid_index = spid_index
                    vellsets[v].perturbations = perturbations
        res.vellsets = vellsets
        # res.dims = [3,1];
        #    return meq.result(meq.vellset(value),cells);

        # print "result",res
        return res
    def get_result (self,request,*children):
        if len(children)<1:
            raise TypeError,"this is NOT a leaf node, At least 1  child with piercepoints expected!";
        res1=children[0];
        vs1=res1.vellsets; #pierce_points, vector of length 2 or 3 (x,y(,z))
        vector_size=len(vs1);
        #for now use fist two:
        if vector_size<2:
            raise TypeError,"vector size of child 1 too small, at leat x/y expected";
        xv=vs1[0].value[0];
        yv=vs1[1].value[0];

        if vs1[0].has_field('shape'):
            shapex=vs1[0].shape;
        else:
            shapex=(1,);
        if vs1[1].has_field('shape'):
            shapey=vs1[1].shape;
        else:
            shapey=(1,);
        
        cells=request.cells;
        seg=cells.segments.time;
#        print '************************************************************'
#        print cells
#        print '------------------------------------------------------------'
#        print seg
#        print '************************************************************'
        # the startt and endt are the timeslots when tiling is set > 1
        if type(seg.start_index) == type(1):
          startt  = seg.start_index;
          endt    = seg.end_index;
        else:
          startt  = seg.start_index[0];
          endt    = seg.end_index[-1];
#        print '************************************************************'
#        print startt, endt
#        print '************************************************************'

        # make time a lot smaller to prevent precision errors for int
        # the actual value of the constant
        time=cells.grid.time - self.starttime;

        if startt>=endt:
            time=[time,];
        val=[];
        for it in range(startt,endt+1):
            if shapex[0]>1:   
                xv=vs1[0].value[it];
            if shapey[0]>1:   
                yv=vs1[1].value[it];

            xshift=(time[it])*self.speedx;
            yshift=(time[it])*self.speedy;
            xn=(xv+xshift)/self.scale;
            yn=(yv+yshift)/self.scale;
            xn=int(xn)%(self.grid_size)  # zorg dat xn een integer tussen 0 en grid_size is
            yn=int(yn)%(self.grid_size)  # zorg dat xn een integer tussen 0 en grid_size is

            val.append(PhaseScreen.phasescreen[xn][yn]*self.amp_scale + self.tec0);
        #fill result
        res = meq.result(0,cells);
        # print startt,endt,seg,val;
        val2=meq.vells(shape=meq.shape(endt+1,));
        val2[:]=val;
        vs=meq.vellset(val2);
        res.vellsets=[vs,]
        return res;
Beispiel #8
0
    def get_result(self, request, *children):
        if len(children) < 2:
            raise TypeError, "this is NOT a leaf node, At least 2  children expected!"
        cells = request.cells
        res = meq.result(None, cells)

        Xp_table = [0, 0, 0]
        # if necessary loop over time and other axis
        # First get PiercePoints
        res1 = children[1]
        vs1 = res1.vellsets
        # num_pierce_points each containing vector of length 2 or 3 (x,y(,z))
        dims = res1.dims
        vector_size = dims[1]
        num_pp = dims[0]
        x = []
        for j in range(num_pp):
            x.append([])
            for i in range(vector_size):
                x[j].append(0)

        # x=[[0,]*vector_size,]*num_pp;
        Xp_table = [0, ] * num_pp
        for i in range(num_pp):
            for j in range(vector_size):
                x[i][j] = vs1[i * vector_size + j].value
        shape = meq.shape(x[0][0])
        grid_size = len(x[0][0])
        # print "grid_size",grid_size;

        # Then the parameters
        res0 = children[0]
        vs0 = res0.vellsets
        # should be one per parameter
        num_parms = len(vs0)
        val0 = [0, ] * num_parms
        par = [0, ] * num_parms
        solvable = False
        parmidx = range(num_parms)

        # initialize  result vector 1 field per pp;
        #      ph=[[0,]*grid_size,]*num_parms;
        ph = []
        for j in range(num_pp):
            ph.append([])
            for i in range(grid_size):
                ph[j].append(0)

        # if solvable they should have perturbed_values;
        if vs0[0].has_key('perturbed_value'):
            solvable = True
            pert = [0] * num_parms
            pt = []
            perturbations = ()
            spid_index = ()
            # get spidindex
            for i in range(num_parms):
                spid_index += vs0[i].spid_index

            # sort on spidindex
            for i in range(num_parms):
                for j in range(i):
                    if spid_index[i] < spid_index[parmidx[j]]:
                        newidx = i
                        for k in range(j, i + 1):
                            old = parmidx[k]
                            parmidx[k] = newidx
                            newidx = old
                        break
            spid_index = ()
            # 1 perturbed value per pp per paramter
            # or the other way around???
            for i in range(num_parms):
                pt.append([])

                for i2 in range(num_pp):
                    pt[i].append([])
                    for g in range(grid_size):
                        pt[i][i2].append(0)
        # fill values sorted
        for pn in range(num_parms):
            pnidx = parmidx[pn]
            val0[pn] = vs0[pnidx].value
            par[pn] = val0[pn][0]
            # use first value (in case of constant parms)

            # assume single perturbation parms for the moment
            if solvable:
                pert[pn] = vs0[pnidx].perturbed_value[0]
                spid_index += vs0[pnidx].spid_index
                perturbations += vs0[pnidx].perturbations

        # get U matrix
        # Only if domain changed!!
        for i in range(grid_size):
            for j in range(vector_size):
                for k in range(num_pp):
                    Xp_table[k] = x[k][j][i]
            U, S, Ut, B = get_U(Xp_table, order=num_parms)

            for pn in range(num_parms):
                if len(val0[pn]) > i:
                    # incorrect check for freq/time dependendies
                    par[pn] = (val0[pn][i])

            value = dot(U, par)
            for v in range(num_pp):
                ph[v][i] = value[v]
            for v in range(num_parms):
                if solvable:
                    old = par[v]
                    if len(pert[v]) > i:
                        par[v] = pert[v][i]
                    else:
                        par[v] = pert[v][0]
                    pval = dot(U, par)
                    par[v] = old
                    for v2 in range(num_pp):
                        pt[v][v2][i] = pval[v2]

        vellsets = []
        for v in range(num_pp):
            value = meq.vells(shape)
            ph[v] = array(ph[v])
            ph[v].shape = shape
            value[:] = ph[v]

            vellsets.append(meq.vellset(value))
            if solvable:
                vellsets[v].perturbed_value = ()
                for v2 in range(num_parms):
                    value = meq.vells(shape)
                    pt[v2][v] = array(pt[v2][v])
                    pt[v2][v].shape = shape
                    value[:] = pt[v2][v]
                    vellsets[v].perturbed_value += (value,)
                    vellsets[v].spid_index = spid_index
                    vellsets[v].perturbations = perturbations
        res.vellsets = vellsets
        # res.dims = [3,1];
        #    return meq.result(meq.vellset(value),cells);

        # print "result",res
        return res
 def get_result (self,request,*children):
   try:
     if len(children) < 1:
       raise TypeError,"at least one child is expected";
     # now, figure out the lms 
     # lm may be a 2/3-vector or an Nx2/3 tensor
     lm = children[0];
     dims = getattr(lm,'dims',[len(lm.vellsets)]);
     if len(dims) == 2 and dims[1] in (2,3):
       nsrc,nlm = dims;
       tensor = True;
     elif len(dims) == 1 and dims[0] in (2,3):
       nsrc,nlm = 1,dims[0];
       tensor = False;
     else:
       raise TypeError,"expecting a 2/3-vector or an Nx2/3 matrix for child 0 (lm)";
     # pointing offsets (child 1) are optional
     if len(children) > 1:
       dlm = children[1];
       if len(dlm.vellsets) != 2:
         raise TypeError,"expecting a 2-vector for child 1 (dlm)";
       dl,dm = dlm.vellsets[0].value,dlm.vellsets[1].value;
     else:
       dl = dm = None;
     # turn freq into an array of the proper shape
     freq = request.cells.grid.freq;
     freqshape = [1]*(self._freqaxis+1);
     freqshape[self._freqaxis] = len(freq);
     freq = freq.reshape(freqshape);
     # now compute the beam per source
     vellsets = [];
     for isrc in range(nsrc):
       # get l/m for this sources
       l,m = lm.vellsets[isrc*nlm].value,lm.vellsets[isrc*nlm+1].value;
       # apply pointing offset, if given
       if dl is not None:
         dl,l,dm,m = unite_multiple_shapes(dl,l,dm,m);
         l = l - dl
         m = m - dm
       l,m,fq = unite_multiple_shapes(l,m,freq);
       # compute distance (scaled by frequency)
       dist = fq*self.scale*numpy.sqrt(l*l+m*m);
       # compute sinc function
       E = meq.vells(dist.shape);
       E[...] = numpy.sin(dist)/dist;
       E[dist==0] = 1;
       E[(l<0)|(m<0)] = 0;
       vellsets.append(meq.vellset(E));
     # form up result and return
     result = meq.result(vellsets[0],cells=request.cells);
     result.vellsets[1:] = vellsets[1:];
     # result.dims = (nsrc,) if tensor else (1.);
     return result;
     #res0 = children[0];
     #res1 = children[1];
     #cells = res0.cells
     #l = res0.vellsets[0].value;
     #m = res1.vellsets[0].value;
     #shape = l.shape
     #for i in range(shape[0]):
       #if l[i,0] < 0.0 or m[i,0] < 0.0:
         #l[i,0] = 0.0
       #else:
         #dist = 265.667 * math.sqrt(l[i,0]*l[i,0] + m[i,0]*m[i,0])
         ##  265.667 is scaling factor to get 0.707 voltage response at 18 arcmin from pointing position (nominal FWHM=36arcmin at 1.4 GHz)
         #l[i,0] = math.sin(dist) / dist
       
     #vellsets = [];
     #vellsets.append(meq.vellset(l))
     #res = meq.result(cells=cells)
     #res.vellsets = vellsets
     #return res
   except:
     traceback.print_exc();
     raise;
    def get_result(self, request, *children):
        try:
            if len(children) < 1:
                raise TypeError, "at least one child is expected"
            # now, figure out the lms
            # lm may be a 2/3-vector or an Nx2/3 tensor
            lm = children[0]
            dims = getattr(lm, 'dims', [len(lm.vellsets)])
            if len(dims) == 2 and dims[1] in (2, 3):
                nsrc, nlm = dims
                tensor = True
            elif len(dims) == 1 and dims[0] in (2, 3):
                nsrc, nlm = 1, dims[0]
                tensor = False
            else:
                raise TypeError, "expecting a 2/3-vector or an Nx2/3 matrix for child 0 (lm)"
            # pointing offsets (child 1) are optional
            if len(children) > 1:
                dlm = children[1]
                if len(dlm.vellsets) != 2:
                    raise TypeError, "expecting a 2-vector for child 1 (dlm)"
                dl, dm = dlm.vellsets[0].value, dlm.vellsets[1].value
            else:
                dl = dm = None
            # turn freq into an array of the proper shape
            freq = request.cells.grid.freq
            freqshape = [1] * (self._freqaxis + 1)
            freqshape[self._freqaxis] = len(freq)
            freq = freq.reshape(freqshape)
            # now compute the beam per source
            vellsets = []
            for isrc in range(nsrc):
                # get l/m for this sources
                l, m = lm.vellsets[isrc * nlm].value, lm.vellsets[isrc * nlm +
                                                                  1].value
                # apply pointing offset, if given
                if dl is not None:
                    dl, l, dm, m = unite_multiple_shapes(dl, l, dm, m)
                    l = l - dl
                    m = m - dm
                l, m, fq = unite_multiple_shapes(l, m, freq)
                # compute distance (scaled by frequency)
                dist = fq * self.scale * numpy.sqrt(l * l + m * m)
                # compute sinc function
                E = meq.vells(dist.shape)
                E[...] = numpy.sin(dist) / dist
                E[dist == 0] = 1
                E[(l < 0) | (m < 0)] = 0
                vellsets.append(meq.vellset(E))
            # form up result and return
            result = meq.result(vellsets[0], cells=request.cells)
            result.vellsets[1:] = vellsets[1:]
            # result.dims = (nsrc,) if tensor else (1.);
            return result
            #res0 = children[0];
            #res1 = children[1];
            #cells = res0.cells
            #l = res0.vellsets[0].value;
            #m = res1.vellsets[0].value;
            #shape = l.shape
            #for i in range(shape[0]):
            #if l[i,0] < 0.0 or m[i,0] < 0.0:
            #l[i,0] = 0.0
            #else:
            #dist = 265.667 * math.sqrt(l[i,0]*l[i,0] + m[i,0]*m[i,0])
            ##  265.667 is scaling factor to get 0.707 voltage response at 18 arcmin from pointing position (nominal FWHM=36arcmin at 1.4 GHz)
            #l[i,0] = math.sin(dist) / dist

            #vellsets = [];
            #vellsets.append(meq.vellset(l))
            #res = meq.result(cells=cells)
            #res.vellsets = vellsets
            #return res
        except:
            traceback.print_exc()
            raise