Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Cluster Lenses (Demo n° 1)

This demo will demonstrate the basics of cluster lenses as of CosmoSim v3.1. We follow the pattern from CosmoSim Demo I and Datasets Generation, and we will not take up space to explain constructs known therefrom.

Preparation

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import json
from CosmoSim.datagen import SimImage
import CosmoSim.Image as csimg
import CosmoSim.dataset as csd
from CosmoSim import Parameters, __version__
print( "CosmoSim version", __version__ )
CosmoSim version 3.3.0

First test of Cluster Lenses

We choose the following parameters for the first simulation.

cfg = { "simulator" : { "model" : "Raytrace", "cropsize" : 256 }
      , 'lens': { "cluster" : "SIE/5/5/8/0.3/45;SIE/-5/-5/8/0.3/45" }
      , 'source': {
            'mode': 'Spherical',
            'sigma': 5,
            'theta': 45,
            'position': 'cartesian'}
      , 'position': { 'x': 11.01, 'y': 0.31 }
      }
param = Parameters( cfg )

The new element is the lens specification, which is not as user friendly as it was. The cluster attribute gives a list of lenses separated by semicolon. Each constituent lens consists of the lens model ("SIE") and a list of lens parameters separated by slash (/). For SIE, these parameters are xx/yy/θE\theta_E/ff/ϕL\phi_L, i.e. position (x,y)(x,y), Einstein radius, ellipticity, and orientation.

Given the parameters, the simulation is as before.

imsim = SimImage( param, verbose=0 )
im = imsim.getImage()
csimg.imshow( im, title="First example of a cluster lens" )
<Figure size 640x480 with 1 Axes>

Random dataset

We can also generate random datasets. The specification is given in the cluster.toml.

cfg = csd.readtoml( "cluster.toml" )
display( json.dumps( cfg ) )
'{"simulator": {"model": "Raytrace", "size": 15000, "nterms": 4, "imagesize": 512, "cropsize": 256, "centred": true}, "dataset": {"directory": "images"}, "lens": {"mode": "SIE", "einstein-min": 3, "einstein-max": 75, "orientation-min": 0, "orientation-max": 180, "ellipseratio-min": 0.1, "ellipseratio-max": 0.9}, "cluster": {"count": 2, "maxrelativelocation": 1.2}, "source": {"mode": "SersicSphere", "n_sersic-min": 1, "n_sersic-max": 5, "luminosity-min": 20, "luminosity-max": 80, "luminosity-lambda": 2.0, "sigma-min": 5, "sigma-max": 50, "position": "critical"}, "position": {"phi-min": 0, "phi-max": 360, "r-relativemax": 1.2}}'

Each constituent lens is placed in a random direction from the origin, at a random distance upper bounded as cθEc\theta_E where θE\theta_E is the Einstein radius and cc is the constant given as cluster.maxrelativelocation.

We can draw a random object as in Datasets Generation.

ob = csd.getline( cfg, fn="test.png" )
display( ob )
[getline] idx=0
[CosmoSim/py] setCluster(SIE/28.525721303278928/-21.51253534843954/34.74769147761908/0.6814707237089468/60.70818500775398;SIE/-22.51572278974841/-77.14263409572997/71.88984375313561/0.49174146049603895/100.04545267249645)
index 0 filename test.png model Raytrace cluster SIE/28.525721303278928/-21.51253534843954/34.7... source SersicSphere R 7.737658 phi 153.986923 sigma 47.280356 sigma2 4.593093 theta 48.354968 n_sersic 1.638791 luminosity 69.809831 x -6.953786 y 3.393553 dtype: object
param = Parameters( )
param.setRow( ob )
imsim = SimImage( param, verbose=2 )
im = imsim.getImage()
csimg.imshow( im )
[GenericSim] init (verbose=2) ...
[SimImage] init (verbose=2) ...
[getSource] src=SersicSphere, ltprf0=None, verbose=2
[getSource] Lightprofile: SersicSphere LightProfileSpec.Sersic
[SphericalSource] constructor done
getSource() returns
[CosmoSim/py] setCluster(SIE/28.525721303278928/-21.51253534843954/34.74769147761908/0.6814707237089468/60.70818500775398;SIE/-22.51572278974841/-77.14263409572997/71.88984375313561/0.49174146049603895/100.04545267249645)
SIE : [28.525721303278928, -21.51253534843954, 34.74769147761908, 0.6814707237089468, 60.70818500775398]
[Source] Constructor Source (Superclass)
[ClusterLens] addLens (28.525721303278928, -21.51253534843954) <CosmoSim.CosmoSimPy.SIE object at 0x7fd11e769070>
SIE : [-22.51572278974841, -77.14263409572997, 71.88984375313561, 0.49174146049603895, 100.04545267249645]
[ClusterLens] addLens (-22.51572278974841, -77.14263409572997) <CosmoSim.CosmoSimPy.SIE object at 0x7fd11e769330>
[initSim] XY -6.95378615456579 3.393553017076015
[SphericalSource] SERSIC
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (28.5257, -21.5125)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-22.5157, -77.1426)
[SimulatorModel] instantiating
[SimulatorModel::setLens] ClusterLens
[SimulatorModel::setSource] setting source
[SimulatorModel::setNterms] 10 -> 5
[SimulatorModel::update] Lens: ClusterLens
[Lens] Fix pt it'n 0; xi0=[-6.95379, 3.39355]; Delta eta = -20.6302, 95.324
[Lens] Fix pt it'n 1; xi0=[-27.584, 98.7176]; Delta eta = -16.5484, 109.347
[Lens] Fix pt it'n 2; xi0=[-23.5022, 112.741]; Delta eta = -13.1798, 110.293
[Lens] Fix pt it'n 3; xi0=[-20.1336, 113.686]; Delta eta = -11.4924, 110.583
[Lens] Fix pt it'n 4; xi0=[-18.4462, 113.976]; Delta eta = -10.6613, 110.71
[Lens] Fix pt it'n 5; xi0=[-17.6151, 114.103]; Delta eta = -10.253, 110.769
[Lens] Fix pt it'n 6; xi0=[-17.2068, 114.162]; Delta eta = -10.0525, 110.797
[Lens] Fix pt it'n 7; xi0=[-17.0063, 114.19]; Delta eta = -9.95409, 110.81
[Lens] Fix pt it'n 8; xi0=[-16.9079, 114.204]; Delta eta = -9.90581, 110.817
[Lens] Fix pt it'n 9; xi0=[-16.8596, 114.211]; Delta eta = -9.88212, 110.82
[Lens] Fix pt it'n 10; xi0=[-16.8359, 114.214]; Delta eta = -9.8705, 110.822
[Lens] Good approximation: xi0=[-16.8359, 114.214]; xi1=[-16.8243, 114.215]
[Lens::getXi] [-6.95379, 3.39355] -> [-16.8243, 114.215]
[setNu] etaOffset set to zero.
[SimulatorModel::update] Done updateApparentAbs()
[SimulatorModel::update] thread section
[Source::getImage()]
[SimulatorModel::updateInner()] eta=[-6.95379, 3.39355]
[SimulatorModel::updateInner()] xi=[-16.8243, 114.215]; eta=[-6.95379, 3.39355]; etaOffset=[0, 0]
[SimulatorModel::updateInner()] nu=[-16.8243, 114.215]
[calculateAlphaBeta] [[-16.8243, 114.215]] ... 
[ClusterLens->calculateAlphaBeta()] 5; [-16.8243, 114.215]
[PsiFunctionLens.calculateAlphaBeta()] 5; 34.7477 - [-16.8243, 114.215]
[PsiFunctionLens.calculateAlphaBeta()] done
[PsiFunctionLens.calculateAlphaBeta()] 5; 71.8898 - [-16.8243, 114.215]
[PsiFunctionLens.calculateAlphaBeta()] done
[calculateAlphaBeta] done
[RaytraceModel::parallelDistort] ClusterLens (Spherical Source)
Time to update(): 75 milliseconds
[Simulator] Centre Point (-8.27,14.08) (Centre of Luminence in Planar Co-ordinates)
[getImage] centring from parameters: None
[SimulatorModel::getDistorted()]
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SimulatorModel] destructing
[Source] Destructor Source (Superclass)
<Figure size 640x480 with 1 Axes>

A sample

def mkimg(ob):
      p0 = Parameters( )
      p0.setRow( ob )
      sim = SimImage( p0, verbose=0 )
      return sim.getImage()
obs = [ csd.getline( cfg ) for _ in range(8) ]
ims = [ mkimg(ob) for ob in obs ]
ts = [ f"Image {i}" for i in range(8) ]
csimg.showImages( ims, size=(2,4), titles=ts )
[getline] idx=0
[CosmoSim/py] setCluster(SIE/-0.42776548837347694/6.322682301274619/16.36814389154821/0.8793068820321219/114.25684909996363;SIE/-6.9473328360160735/-4.217295865467228/23.691924637440728/0.8684397024178189/161.30935498479158)
[getline] idx=0
[CosmoSim/py] setCluster(SIE/57.597300743074115/3.895601040737669/65.59111544104658/0.4899263683376619/34.04208194223369;SIE/-1.1296509481913874/-1.5753539274668744/62.53756651441387/0.845331232630817/126.0643925907931)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-0.427765, 6.32268)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-6.94733, -4.2173)
[Lens::criticalXi] Fix pt it'n 0; r0=10
[Lens::criticalXi] [Lens] Good approximation: r0=10; r1=37.5625
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[getline] idx=0
[CosmoSim/py] setCluster(SIE/9.180395664474661/-0.3177404059551845/13.37913730715085/0.866186314223999/135.15453063606023;SIE/-25.583770125035834/26.98302609989887/57.29529125991381/0.7902908066327535/106.42428796766494)
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (57.5973, 3.8956)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-1.12965, -1.57535)
[Lens::criticalXi] Fix pt it'n 0; r0=10
[Lens::criticalXi] [Lens] Good approximation: r0=10; r1=129.303
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[getline] idx=0
[CosmoSim/py] setCluster(SIE/-68.93753185019241/-26.85898579452453/72.42589316017038/0.5667503126406255/112.0796139876083;SIE/0.5347578853700248/11.836083493753662/16.969762632265134/0.7713716864502272/41.260550869535166)
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (9.1804, -0.31774)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-25.5838, 26.983)
[Lens::criticalXi] Fix pt it'n 0; r0=10
[Lens::criticalXi] [Lens] Good approximation: r0=10; r1=68.3241
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[getline] idx=0
[CosmoSim/py] setCluster(SIE/-0.6787425565030863/-4.086529584536785/66.46084280524144/0.18133047330478416/167.48712380400744;SIE/4.698068151699642/14.993288558498671/50.98709308384034/0.1399616272233633/23.39654181766391)
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-68.9375, -26.859)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (0.534758, 11.8361)
[Lens::criticalXi] Fix pt it'n 0; r0=10
[Lens::criticalXi] [Lens] Good approximation: r0=10; r1=46.8758
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[getline] idx=0
[CosmoSim/py] setCluster(SIE/-0.9967475411367606/-2.774921805613699/11.387893220782129/0.6023223877555404/104.71684436007395;SIE/2.2657562272179175/-12.322920820919354/10.710323577934533/0.5206917479267353/68.91505392982161)
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-0.678743, -4.08653)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (4.69807, 14.9933)
[Lens::criticalXi] Fix pt it'n 0; r0=10
[Lens::criticalXi] [Lens] Good approximation: r0=10; r1=99.7922
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[getline] idx=0
[CosmoSim/py] setCluster(SIE/-3.493931342586436/-3.253362165900714/10.932751645136825/0.26799372950963174/49.523853614894584;SIE/3.933568362455166/-18.170538116001413/30.013278105382582/0.12784960239814078/3.2568484957719113)
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-0.996748, -2.77492)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (2.26576, -12.3229)
[Lens::criticalXi] Fix pt it'n 0; r0=10
[Lens::criticalXi] [Lens] Good approximation: r0=10; r1=12.8072
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[getline] idx=0
[CosmoSim/py] setCluster(SIE/-6.649981640845245/4.786439947142811/12.046071368888844/0.4257677572295745/175.8203030931556;SIE/5.714629744856633/4.417045109977495/12.75567354420906/0.35441542731794495/124.11515643400081)
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-3.49393, -3.25336)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (3.93357, -18.1705)
[Lens::criticalXi] Fix pt it'n 0; r0=10
[Lens::criticalXi] [Lens] Good approximation: r0=10; r1=11.3426
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[ClusterLens] init ClusterLens
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (-6.64998, 4.78644)
[Lens] init Lens (Superclass)
[PsiFunctionLens] init PsiFunctionLens
[SIE] init SIE
[ClusterLens::addLens] (5.71463, 4.41705)
[Lens::criticalXi] Fix pt it'n 0; r0=10
[Lens::criticalXi] [Lens] Good approximation: r0=10; r1=21.1262
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[SIE] destructing SIE
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[ClusterLens] destructing ClusterLens
[PsiFunctionLens] destructing PsiFunctionLens
[Lens] destructing Lens (Superclass)
[setDebug] 0
<Figure size 2000x1000 with 8 Axes>

If we take a particular interest in one particular image, say no 1, we can easily inspect its parameters.

print( obs[1] )
index                                                         0
filename                                       image-000000.png
model                                                  Raytrace
cluster       SIE/57.597300743074115/3.895601040737669/65.59...
source                                             SersicSphere
R                                                     71.750598
phi                                                   28.825162
sigma                                                 42.667665
sigma2                                                28.668436
theta                                                 70.258959
n_sersic                                               4.626395
luminosity                                            71.028642
x                                                     62.860342
y                                                     34.593723
dtype: object

The cluser specification does not show in the row view, but we can single that one out to see properly.

print( obs[1]["cluster"] )
SIE/57.597300743074115/3.895601040737669/65.59111544104658/0.4899263683376619/34.04208194223369;SIE/-1.1296509481913874/-1.5753539274668744/62.53756651441387/0.845331232630817/126.0643925907931

Closure

Parameter design for random sets of cluster lenses is still a concern for further research.