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
////, i.e. position , 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" )
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 where is
the Einstein radius and 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: objectparam = 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)

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

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.