Base API
Index
ComradeBase.AbstractModelComradeBase.AbstractPolarizedModelComradeBase.DensityAnalyticComradeBase.IntensityMapComradeBase.IntensityMapComradeBase.IsAnalyticComradeBase.MinimalHeaderComradeBase.NoHeaderComradeBase.NotAnalyticComradeBase.RectiGridComradeBase.SerialComradeBase.ThreadsExComradeBase.UnstructuredDomainComradeBase.UnstructuredMapComradeBase._visibilitymapComradeBase._visibilitymap!ComradeBase.allocate_imgmapComradeBase.allocate_vismapComradeBase.amplitudeComradeBase.amplitudemapComradeBase.axisdimsComradeBase.baseimageComradeBase.bispectrumComradeBase.bispectrummapComradeBase.centroidComradeBase.closure_phaseComradeBase.closure_phasemapComradeBase.create_imgmapComradeBase.create_mapComradeBase.create_vismapComradeBase.domainpointsComradeBase.executorComradeBase.fieldofviewComradeBase.fluxComradeBase.headerComradeBase.imagepixelsComradeBase.imanalyticComradeBase.intensity_pointComradeBase.intensitymapComradeBase.intensitymap!ComradeBase.intensitymap_analyticComradeBase.intensitymap_analytic!ComradeBase.intensitymap_numericComradeBase.intensitymap_numeric!ComradeBase.ispolarizedComradeBase.logclosure_amplitudeComradeBase.logclosure_amplitudemapComradeBase.named_dimsComradeBase.phasecenterComradeBase.pixelsizesComradeBase.radialextentComradeBase.second_momentComradeBase.stokesComradeBase.visanalyticComradeBase.visibilityComradeBase.visibility_pointComradeBase.visibilitymapComradeBase.visibilitymap!ComradeBase.visibilitymap_analyticComradeBase.visibilitymap_analytic!ComradeBase.visibilitymap_numericComradeBase.visibilitymap_numeric!DimensionalData.Dimensions.dims
Model API
ComradeBase.visibility Function
visibility(mimg, p)Computes the complex visibility of model m at coordinates p. p corresponds to the coordinates of the model. These need to have the properties U, V and sometimes Ti for time and Fr for frequency.
Notes
If you want to compute the visibilities at a large number of positions consider using the visibilitymap.
Warn
This is only defined for analytic models. If you want to compute the visibility for a single point for a non-analytic model, please use the visibilitymap function and create an UnstructuredDomain with a single point.
ComradeBase.visibilitymap Function
visibilitymap(model::AbstractModel, p)Computes the complex visibilities at the locations p.
ComradeBase.visibilitymap! Function
visibilitymap!(vis::AbstractArray, model::AbstractModel, p)Computes the complex visibilities vis in place at the locations p
ComradeBase.intensitymap Function
intensitymap(model::AbstractModel, p::AbstractSingleDomain)Computes the intensity map of model. For the inplace version see intensitymap!
ComradeBase.intensitymap! Function
intensitymap!(buffer::AbstractDimArray, model::AbstractModel)Computes the intensity map of model by modifying the buffer
ComradeBase.allocate_vismap Function
allocate_vismap(m::AbstractModel, g::AbstractSingleDomain)Allocate the default map specialized by the grid g
ComradeBase.allocate_imgmap Function
allocate_imgmap(m::AbstractModel, g::AbstractSingleDomain)Allocate the default map specialized by the grid g
ComradeBase.create_imgmap Function
create_imgmap(array, g::AbstractSingleDomain)Create a map of values specialized by the grid g in the image domain. The default is to call create_map with the same arguments.
ComradeBase.create_vismap Function
create_vismap(array, g::AbstractSingleDomain)Create a map of values specialized by the grid g in the visibility domain. The default is to call create_map with the same arguments.
ComradeBase.amplitude Method
amplitude(model, p)Computes the visibility amplitude of model m at the coordinate p. The coordinate p is expected to have the properties U, V, and sometimes Ti and Fr.
If you want to compute the amplitudemap at a large number of positions consider using the amplitudemap function.
ComradeBase.amplitudemap Function
amplitudemap(m::AbstractModel, p)Computes the visibility amplitudemap of the model m at the coordinates p. The coordinates p are expected to have the properties U, V, and sometimes Ti and Fr.
ComradeBase.bispectrum Function
bispectrum(model, p1, p2, p3)Computes the complex bispectrum of model m at the uv-triangle p1 -> p2 -> p3
If you want to compute the bispectrum over a number of triangles consider using the bispectrummap function.
ComradeBase.bispectrummap Function
bispectrummap(m, p1, p2, p3)Computes the closure phases of the model m at the triangles p1, p2, p3, where pi are coordinates.
ComradeBase.closure_phase Function
closure_phase(model, p1, p2, p3, p4)Computes the closure phase of model m at the uv-triangle u1,v1 -> u2,v2 -> u3,v3
If you want to compute closure phases over a number of triangles consider using the closure_phasemap function.
ComradeBase.closure_phasemap Function
closure_phasemap(m,
p1::AbstractArray
p2::AbstractArray
p3::AbstractArray
)Computes the closure phases of the model m at the triangles p1, p2, p3, where pi are coordinates.
ComradeBase.logclosure_amplitude Function
logclosure_amplitude(model, p1, p2, p3, p4)Computes the log-closure amplitude of model m at the uv-quadrangle u1,v1 -> u2,v2 -> u3,v3 -> u4,v4 using the formula
If you want to compute log closure amplitudemap over a number of triangles consider using the logclosure_amplitudemap function.
ComradeBase.logclosure_amplitudemap Function
logclosure_amplitudemap(m::AbstractModel,
p1,
p2,
p3,
p4
)Computes the log closure amplitudemap of the model m at the quadrangles p1, p2, p3, p4.
Model Interface
ComradeBase.AbstractModel Type
AbstractModelThe Comrade abstract model type. To instantiate your own model type you should subtybe from this model. Additionally you need to implement the following methods to satify the interface:
Mandatory Methods
visanalytic: defines whether the model visibilities can be computed analytically. If yes then this should returnIsAnalytic()and the user must to definevisibility_point. If not analytic thenvisanalyticshould returnNotAnalytic().imanalytic: defines whether the model intensities can be computed pointwise. If yes then this should returnIsAnalytic()and the user must to defineintensity_point. If not analytic thenimanalyticshould returnNotAnalytic().radialextent: Provides a estimate of the radial extent of the model in the image domain. This is used for estimating the size of the image, and for plotting.flux: Returns the total flux of the model.intensity_point: Defines how to compute model intensities pointwise. Note this is must be defined ifimanalytic(::Type{YourModel})==IsAnalytic().visibility_point: Defines how to compute model visibilties pointwise. Note this is must be defined ifvisanalytic(::Type{YourModel})==IsAnalytic().
Optional Methods:
ispolarized: Specified whether a model is intrinsically polarized (returnsIsPolarized()) or is not (returnsNotPolarized()), by default a model isNotPolarized()visibilitymap_analytic: Vectorized version ofvisibility_pointfor models wherevisanalyticreturnsIsAnalytic()visibilitymap_numeric: Vectorized version ofvisibility_pointfor models wherevisanalyticreturnsNotAnalytic()typically these are numerical FT'sintensitymap_analytic: Computes the entire image for models whereimanalyticreturnsIsAnalytic()intensitymap_numeric: Computes the entire image for models whereimanalyticreturnsNotAnalytic()intensitymap_analytic!: Inplace version ofintensitymapintensitymap_numeric!: Inplace version ofintensitymap
ComradeBase.AbstractPolarizedModel Type
abstract type AbstractPolarizedModel <: ComradeBase.AbstractModelA generic polarized model. To implement the use needs to follow the AbstractModel implementation instructions. In addtion there is an optional method stokes(model, p::Symbol) which extracts the specific stokes parameter of the model. The default that the different stokes parameters are stored as fields of the model. To overwrite this behavior overload the function.
ComradeBase.visanalytic Function
visanalytic(::Type{<:AbstractModel})Determines whether the model is pointwise analytic in Fourier domain, i.e. we can evaluate its fourier transform at an arbritrary point.
If IsAnalytic() then it will try to call visibility_point to calculate the complex visibilities. Otherwise it fallback to using the FFT that works for all models that can compute an image.
ComradeBase.imanalytic Function
imanalytic(::Type{<:AbstractModel})Determines whether the model is pointwise analytic in the image domain, i.e. we can evaluate its intensity at an arbritrary point.
If IsAnalytic() then it will try to call intensity_point to calculate the intensity.
ComradeBase.ispolarized Function
ispolarized(::Type)Trait function that defines whether a model is polarized or not.
ComradeBase.radialextent Function
radialextent(model::AbstractModel)Provides an estimate of the radial size/extent of the model. This is used internally to estimate image size when plotting and using modelimage
ComradeBase.DensityAnalytic Type
DensityAnalyticInternal type for specifying the nature of the model functions. Whether they can be easily evaluated pointwise analytic. This is an internal type that may change.
ComradeBase.IsAnalytic Type
struct IsAnalytic <: ComradeBase.DensityAnalyticDefines a trait that a states that a model is analytic. This is usually used with an abstract model where we use it to specify whether a model has a analytic fourier transform and/or image.
ComradeBase.NotAnalytic Type
struct NotAnalytic <: ComradeBase.DensityAnalyticDefines a trait that a states that a model is analytic. This is usually used with an abstract model where we use it to specify whether a model has does not have a easy analytic fourier transform and/or intensity function.
ComradeBase.visibility_point Function
visibility_point(model::AbstractModel, p)Function that computes the pointwise visibility. This must be implemented in the model interface if visanalytic(::Type{MyModel}) == IsAnalytic()
ComradeBase.visibilitymap_analytic Function
visibilties_analytic(model, p)Computes the visibilties of a model using using the analytic visibility expression given by visibility_point.
ComradeBase.visibilitymap_analytic! Function
visibilties_analytic!(vis, model)Computes the visibilties of a model in-place, using using the analytic visibility expression given by visibility_point.
ComradeBase.visibilitymap_numeric Function
visibilties_numeric(model, p)Computes the visibilties of a model using a numerical fourier transform. Note that none of these are implemented in ComradeBase. For implementations please see Comrade.
ComradeBase.visibilitymap_numeric! Function
visibilties_numeric!(vis, model)Computes the visibilties of a model in-place using a numerical fourier transform. Note that none of these are implemented in ComradeBase. For implementations please see Comrade.
ComradeBase.intensity_point Function
intensity_point(model::AbstractModel, p)Function that computes the pointwise intensity if the model has the trait in the image domain IsAnalytic(). Otherwise it will use construct the image in visibility space and invert it.
ComradeBase.intensitymap_analytic Function
intensitymap_analytic(m::AbstractModel, p::AbstractSingleDomain)Computes the IntensityMap of a model m using the image dimensions p by broadcasting over the analytic intensity_point method.
ComradeBase.intensitymap_analytic! Function
intensitymap_analytic!(img::IntensityMap, m::AbstractModel)Updates the img using the model m by broadcasting over the analytic intensity_point method.
ComradeBase.intensitymap_numeric Function
intensitymap_numeric(m::AbstractModel, p::AbstractSingleDomain)Computes the IntensityMap of a model m at the image positions p using a numerical method. This has to be specified uniquely for every model m if imanalytic(typeof(m)) === NotAnalytic(). See Comrade.jl for example implementations.
ComradeBase.intensitymap_numeric! Function
intensitymap_numeric!(img::IntensityMap, m::AbstractModel)Updates the img using the model m using a numerical method. This has to be specified uniquely for every model m if imanalytic(typeof(m)) === NotAnalytic(). See Comrade.jl for example implementations.
Image Domain
ComradeBase.imagepixels Function
imagepixels(fovx, fovy, nx, ny; x0=0, y0=0, executor=Serial(), header=NoHeader())Construct a grid of pixels with a field of view fovx and fovy and nx and ny pixels. This points are the pixel centers and the field of view goes from the edge of the first pixel to the edge of the last pixel. The x0, y0 offsets shift the image origin over by (x0, y0) in the image plane.
Arguments:
fovx::Real: The field of view in the x-directionfovy::Real: The field of view in the y-directionnx::Integer: The number of pixels in the x-directionny::Integer: The number of pixels in the y-direction
Keyword Arguments:
x0::Real=0: The x-offset of the imagey0::Real=0: The y-offset of the imageexecutor=Serial(): The executor to use for the grid, default is serial executionheader=NoHeader(): The header to use for the grid
ComradeBase.RectiGrid Type
RectiGrid(dims::NamedTuple{Na}; executor=Serial(), header=ComradeBase.NoHeader())
RectiGrid(dims::NTuple{N, <:DimensionalData.Dimension}; executor=Serial(), header=ComradeBase.NoHeader())Creates a rectilinear grid of pixels with the dimensions dims. The dims can either be a named tuple of dimensions or a tuple of dimensions. The dimensions can be in any order however the standard orders are:
(:X, :Y, :Ti, :Fr)
(:X, :Y, :Fr, :Ti)
(:X, :Y) # spatial only
where X,Y are the RA and DEC spatial dimensions respectively, Ti is the time dimension and Fr is the frequency dimension.
Note that the majority of the time users should just call imagepixels to create a spatial grid.
Optional Arguments
executor: specifies how different models are executed. The default isSerialwhich mean serial CPU computations. For threaded computations useThreadsEx()or loadOhMyThreads.jlto uses their schedulers.header: specified underlying header information for the grid. This is used to store information about the image such as the source, RA and DEC, MJD.
Examples
dims = RectiGrid((X(-5.0:0.1:5.0), Y(-4.0:0.1:4.0), Ti([1.0, 1.5, 1.75]), Fr([230, 345])); executor=ThreadsEx())
dims = RectiGrid((X = -5.0:0.1:5.0, Y = -4.0:0.1:4.0, Ti = [1.0, 1.5, 1.75], Fr = [230, 345]); executor=ThreadsEx()))ComradeBase.UnstructuredDomain Type
UnstructuredDomain(dims::NamedTuple; executor=Serial(), header=ComradeBase.NoHeader)Builds an unstructured grid (really a vector of points) from the dimensions dims. The executor is used controls how the grid is computed when calling visibilitymap or intensitymap. The default is Serial which mean regular CPU computations. For threaded execution use ThreadsEx() or load OhMyThreads.jl to uses their schedulers.
Note that unlike RectiGrid which assigns dimensions to the grid points, UnstructuredDomain does not. This is becuase the grid is unstructured the points are a cloud in a space
DimensionalData.Dimensions.dims Function
dims(g::AbstractSingleDomain)Returns a tuple containing the dimensions of g. For a named version see ComradeBase.named_dims
ComradeBase.named_dims Function
named_dims(g::AbstractSingleDomain)Returns a named tuple containing the dimensions of g. For a unnamed version see dims
ComradeBase.axisdims Function
axisdims(img::IntensityMap)
axisdims(img::IntensityMap, p::Symbol)Returns the keys of the IntensityMap as the actual internal AbstractRectiGrid object. Optionall the user can ask for a specific dimension with p
ComradeBase.domainpoints Function
domainpoints(g::AbstractSingleDomain)Create a grid iterator that can be used to iterate through different points. All grid methods must implement this method.
ComradeBase.fieldofview Function
fieldofview(img::IntensityMap)
fieldofview(img::IntensityMap)Returns a named tuple with the field of view of the image.
ComradeBase.pixelsizes Function
pixelsizes(img::IntensityMap)
pixelsizes(img::AbstractRectiGrid)Returns a named tuple with the spatial pixel sizes of the image.
ComradeBase.phasecenter Function
phasecenter(img::IntensityMap)Computes the phase center of an intensity map. Note this is the pixels that is in the middle of the image.
ComradeBase.executor Function
executor(g::AbstractSingleDomain)Returns the executor used to compute the intensitymap or visibilitymap
ComradeBase.Serial Type
Serial()Uses serial execution when computing the intensitymap or visibilitymap
ComradeBase.ThreadsEx Type
ThreadsEx(;scheduler::Symbol = :dynamic)Uses Julia's Threads @threads macro when computing the intensitymap or visibilitymap. You can choose from Julia's various schedulers by passing the scheduler as a parameter. The default is :dynamic, but it isn't considered part of the stable API and may change at any moment.
ComradeBase.header Function
header(g::AbstractSingleDomain)Returns the headerinformation of the dimensions g
header(img::IntensityMap)Retrieves the header of an IntensityMap
ComradeBase.MinimalHeader Type
MinimalHeader{T}A minimal header type for ancillary image information.
Fields
source: Common source namera: Right ascension of the image in degrees (J2000)dec: Declination of the image in degrees (J2000)mjd: Modified Julian Date in daysfrequency: Frequency of the image in Hz
Image Types
ComradeBase.IntensityMap Type
struct IntensityMap{T, N, D, G<:(ComradeBase.AbstractRectiGrid{D}), A<:AbstractArray{T, N}, R<:Tuple, Na} <: AbstractDimArray{T, N, D, A<:AbstractArray{T, N}}This type is the basic array type for all images and models that obey the ComradeBase interface. The type is a subtype of DimensionalData.AbstractDimArray however, we make a few changes to support the Comrade API.
The dimensions should be specified by an
AbstractRectiGridinterface. Usually users just need theRectiGridgrid, for rectilinear grids.There are two ways to access the dimensions of the array.
dims(img)will return the usualDimArraydimensions, i.e. aTuple{DimensionalData.Dim, ...}. The other way to access the array dimensions is using thegetproperty, e.g.,img.Xwill return the RA/X grid locations but stripped of the usualDimensionalData.Dimensionmaterial. Thisgetpropertybehavior is NOT CONSIDERED* part of the stable API and may be changed in the future.Metadata is stored in the
AbstractRectiGridtype through theheaderproperty and can be accessed throughmetadataorheader
The most common way to create a IntensityMap is to use the function definitions
julia> g = imagepixels(10.0, 10.0, 128, 128; header=NoHeader())
julia> X = g.X; Y = g.Y
julia> data = rand(128, 128)
julia> img1 = IntensityMap(data, g)
julia> img2 = IntensityMap(data, (;X, Y); header=header(g))
julia> img1 == img2
true
julia> img3 = IntensityMap(data, 10.0, 10.0; header=NoHeader())Broadcasting, map, and reductions should all just obey the DimensionalData interface.
ComradeBase.IntensityMap Method
IntensityMap(data::AbstractArray, g::AbstractRectiGrid; refdims=(), name=Symbol(""))Creates a IntensityMap with the pixel fluxes data on the grid g. Optionally, you can specify a set of reference dimensions refdims as a tuple and a name for array name.
ComradeBase.UnstructuredMap Type
UnstructuredMap(data::AbstractVector, dims::UnstructuredDomain)A map that is defined on an unstructured domain. This is typically just a vector of values. The vector of locations of the visibilities are stored in dims. Otherwise this behaves very similarly to IntensityMap, except that is isn't a grid.
For instance the locations of the visibilities can be accessed with axisdims, as well as the usual getproperty and propertynames functions. Like with IntensityMap during execution the executor is used to determine the execution context.
ComradeBase.centroid Function
centroid(im::AbstractIntensityMap)Computes the image centroid aka the center of light of the image.
For polarized maps we return the centroid for Stokes I only.
ComradeBase.second_moment Function
second_moment(im::AbstractIntensityMap; center=true)Computes the image second moment tensor of the image. By default we really return the second cumulant or centered second moment, which is specified by the center argument.
For polarized maps we return the second moment for Stokes I only.
second_moment(im::IntensityMap; center=true)Computes the image second moment tensor of the image. By default we really return the second cumulant or centered second moment, which is specified by the center argument.
ComradeBase.stokes Function
stokes(m::AbstractPolarizedModel, p::Symbol)Extract the specific stokes component p from the polarized model m
stokes(m::AbstractArray{<:StokesParams}, p::Symbol)Extract the specific stokes component p from the polarized image m.
Internal Methods not part of public API
ComradeBase._visibilitymap Function
_visibilitymap(model::AbstractModel, p)Internal method used for trait dispatch and unpacking of args arguments in visibilities
Warn
Not part of the public API so it may change at any moment.
ComradeBase._visibilitymap! Function
_visibilitymap!(model::AbstractModel, p)Internal method used for trait dispatch and unpacking of args arguments in visibilities!
Warn
Not part of the public API so it may change at any moment.
ComradeBase.create_map Function
create_map(array, g::AbstractSingleDomain)Create a map of values specialized by the grid g.