Scanning strategy

To define the scanning strategy for a satellite, set the ScanningStrategy structure.

mutable struct ScanningStrategy{T<:AbstractFloat, I<:Int, AA<:AbstractArray{T}, AS<:AbstractString}
    nside::I
    duration::I
    sampling_rate::I
    alpha::T
    beta::T
    prec_rpm::T
    spin_rpm::T
    hwp_rpm::T
    FP_theta::AA
    FP_phi::AA
    start_point::AS
end

You can generate ScanningStrategy structure using gen_ScanningStrategy() function.

This initial value of component of ScanningStrategy can be changed by specifying the gen_ScanningStrategy() argument when declaring ss like below.

ss = gen_ScanningStrategy(alpha=60, prec_rpm=0.001, sampling_rate=5)

In addition, you can directly access ss and interactively change its value.

ss.nside = 256 #You can change a value
ss.spin_rpm = 0.04

Generate pointing TOD

The information about the orientation of a satellite at a certain time is called pointing. The pointing is defined by $(\theta, \phi, \psi)$, where $\theta$ and $\phi$ are parameters of the 3D polar coordinates and $\psi$ is the angle between the scan direction and the meridian of the sky.

Once the scanning strategy is determined, computing the pointing is straightforward.

pointings = get_pointings(ss::ScanningStrategy, start::Int, stop::Int)
pix_tod, psi_tod, time_array = get_pointing_pixels(ss::ScanningStrategy, start::Int, stop::Int)

Enter an integer value for the time to be calculated in the start and stop fields. The get_pointings() returns $(\theta, \phi, \psi)$ that indicate their pointing in chronological order. These are stored as an array of dictionary type, and can be accessed as follows.

In[]: pointings["theta"]
Out[]: 14400×1 Matrix{Float64}:
 1.1344640137963142
 1.134461356131033
 1.1344533831585348
 1.1344400949488544
...

The pointings["psi"] contains the scanning angle according to the COSMO(HEALPix) definition. And pointings["time"] contains the time used in the calculation.

The get_pointing_pixels() does not allocate $\theta$ and $\phi$ arrays internally, but only allocates the minimum number of arrays needed to allocate the pixel TOD. Therefore, it runs faster than get_pointings(). In fact, get_pointing_pixels() is executed inside ScanningStrategy2map().

Now, the pointing TOD is calculated every month and stored in the map each time.

ss.FP_theta = [0.0, 10.0]
ss.FP_phi = [0.0, 90.0]

In this operation, the first component of the array represents the center of the focal plane, i.e. the boresight. On the other hand, the second component represents the detector that observes a point in the sky 10 degrees in theta direction and 90 degrees in phi direction away from the boresight.

If you want to build a focal plane, just substitute its configuration into these arrays and you will be able to compute multi-channel pointings.