{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# SSP interpolation\n", "## Load SSP Grid" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-11-10 17:13:20,829 - rubix - INFO - \n", " ___ __ _____ _____ __\n", " / _ \\/ / / / _ )/ _/ |/_/\n", " / , _/ /_/ / _ |/ /_> <\n", "/_/|_|\\____/____/___/_/|_|\n", "\n", "\n", "2025-11-10 17:13:20,831 - rubix - INFO - Rubix version: 0.0.post626+g42b4b7505.d20251110\n", "2025-11-10 17:13:20,831 - rubix - INFO - JAX version: 0.7.2\n", "2025-11-10 17:13:20,909 - rubix - INFO - Running on [CpuDevice(id=0)] devices\n", "2025-11-10 17:13:20,911 - rubix - WARNING - python-fsps is not installed. Please install it to use this function. Install using pip install fsps and check the installation page: https://dfm.io/python-fsps/current/installation/ for more details. Especially, make sure to set all necessary environment variables.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "HDF5SSPGrid(age=Array([ 0. , 5.100002 , 5.1500006, 5.1999993, 5.25 ,\n", " 5.3000016, 5.350002 , 5.4000006, 5.4500012, 5.500002 ,\n", " 5.550002 , 5.600002 , 5.6500025, 5.700002 , 5.750002 ,\n", " 5.8000026, 5.850003 , 5.900003 , 5.950003 , 6. ,\n", " 6.0200005, 6.040001 , 6.0599985, 6.0799985, 6.100002 ,\n", " 6.120001 , 6.1399984, 6.16 , 6.18 , 6.1999993,\n", " 6.2200007, 6.24 , 6.2599998, 6.2799997, 6.2999997,\n", " 6.3199987, 6.3399997, 6.3600006, 6.3799996, 6.3999987,\n", " 6.4200006, 6.44 , 6.4599996, 6.4799995, 6.499999 ,\n", " 6.52 , 6.539999 , 6.56 , 6.5799994, 6.6 ,\n", " 6.6199994, 6.6399994, 6.66 , 6.679999 , 6.699999 ,\n", " 6.72 , 6.7399993, 6.7599993, 6.7799997, 6.799999 ,\n", " 6.819999 , 6.839999 , 6.8599997, 6.879999 , 6.899999 ,\n", " 6.919999 , 6.939999 , 6.959999 , 6.9799986, 6.999999 ,\n", " 7.0200005, 7.040001 , 7.0599985, 7.0799985, 7.099998 ,\n", " 7.119998 , 7.1399984, 7.16 , 7.18 , 7.1999993,\n", " 7.2199984, 7.24 , 7.2599998, 7.2799997, 7.2999997,\n", " 7.3199987, 7.3399997, 7.3599987, 7.3799996, 7.3999987,\n", " 7.4199986, 7.4399986, 7.462398 , 7.4771214, 7.4913616,\n", " 7.50515 , 7.518514 , 7.531479 , 7.544068 , 7.5563025,\n", " 7.5682015, 7.5797834, 7.5910645, 7.60206 , 7.628389 ,\n", " 7.6532125, 7.6766934, 7.69897 , 7.7201595, 7.7403626,\n", " 7.7565446, 7.806545 , 7.8565454, 7.906545 , 7.9565454,\n", " 8.006543 , 8.056546 , 8.1065445, 8.156547 , 8.206545 ,\n", " 8.256547 , 8.306547 , 8.356546 , 8.406547 , 8.456547 ,\n", " 8.506547 , 8.556547 , 8.606546 , 8.656548 , 8.706548 ,\n", " 8.756548 , 8.806548 , 8.856548 , 8.9065485, 8.956549 ,\n", " 9.006547 , 9.05655 , 9.106548 , 9.156549 , 9.206551 ,\n", " 9.225309 , 9.230449 , 9.255273 , 9.278753 , 9.30103 ,\n", " 9.322219 , 9.3424225, 9.361728 , 9.380211 , 9.39794 ,\n", " 9.414973 , 9.439333 , 9.477121 , 9.511884 , 9.544068 ,\n", " 9.574031 , 9.60206 , 9.628389 , 9.653213 , 9.676694 ,\n", " 9.69897 , 9.72016 , 9.740363 , 9.759667 , 9.7781515,\n", " 9.79588 , 9.812913 , 9.829304 , 9.8450985, 9.860338 ,\n", " 9.875061 , 9.889301 , 9.90309 , 9.916454 , 9.929419 ,\n", " 9.942008 , 9.954243 , 9.966142 , 9.977724 , 9.989004 ,\n", " 10. , 10.010724 , 10.02119 , 10.031408 , 10.041392 ,\n", " 10.051152 , 10.060698 , 10.070038 , 10.079182 , 10.088136 ,\n", " 10.09691 , 10.10551 , 10.113943 , 10.122216 , 10.130334 ,\n", " 10.138303 , 10.146128 , 10.153815 , 10.161368 , 10.168792 ,\n", " 10.176091 , 10.1832695, 10.190331 , 10.197281 , 10.20412 ,\n", " 10.210854 , 10.2174835, 10.224015 , 10.230449 , 10.236789 ,\n", " 10.243038 , 10.249198 , 10.255273 , 10.261263 , 10.267172 ,\n", " 10.273002 , 10.278753 , 10.2844305, 10.290034 , 10.2955675,\n", " 10.30103 ], dtype=float32), metallicity=Array([0.0001, 0.0004, 0.004 , 0.008 , 0.02 , 0.05 ], dtype=float32), wavelength=Array([ 91., 94., 96., 98., 100., 102., 104., 106.,\n", " 108., 110., 114., 118., 121., 125., 127., 128.,\n", " 131., 132., 134., 137., 140., 143., 147., 151.,\n", " 155., 159., 162., 166., 170., 173., 177., 180.,\n", " 182., 186., 191., 194., 198., 202., 205., 210.,\n", " 216., 220., 223., 227., 230., 234., 240., 246.,\n", " 252., 257., 260., 264., 269., 274., 279., 284.,\n", " 290., 296., 301., 308., 318., 328., 338., 348.,\n", " 357., 366., 375., 385., 395., 405., 414., 422.,\n", " 430., 441., 451., 460., 470., 480., 490., 500.,\n", " 506., 512., 520., 530., 540., 550., 560., 570.,\n", " 580., 590., 600., 610., 620., 630., 640., 650.,\n", " 658., 665., 675., 685., 695., 705., 716., 726.,\n", " 735., 745., 755., 765., 775., 785., 795., 805.,\n", " 815., 825., 835., 845., 855., 865., 875., 885.,\n", " 895., 905., 915., 925., 935., 945., 955., 965.,\n", " 975., 985., 995., 1005., 1015., 1025., 1035., 1045.,\n", " 1055., 1065., 1075., 1085., 1095., 1105., 1115., 1125.,\n", " 1135., 1145., 1155., 1165., 1175., 1185., 1195., 1205.,\n", " 1215., 1225., 1235., 1245., 1255., 1265., 1275., 1285.,\n", " 1295., 1305., 1315., 1325., 1335., 1345., 1355., 1365.,\n", " 1375., 1385., 1395., 1405., 1415., 1425., 1435., 1442.,\n", " 1447., 1455., 1465., 1475., 1485., 1495., 1505., 1512.,\n", " 1517., 1525., 1535., 1545., 1555., 1565., 1575., 1585.,\n", " 1595., 1605., 1615., 1625., 1635., 1645., 1655., 1665.,\n", " 1672., 1677., 1685., 1695., 1705., 1715., 1725., 1735.,\n", " 1745., 1755., 1765., 1775., 1785., 1795., 1805., 1815.,\n", " 1825., 1835., 1845., 1855., 1865., 1875., 1885., 1895.,\n", " 1905., 1915., 1925., 1935., 1945., 1955., 1967., 1976.,\n", " 1984., 1995., 2005., 2015., 2025., 2035., 2045., 2055.,\n", " 2065., 2074., 2078., 2085., 2095., 2105., 2115., 2125.,\n", " 2135., 2145., 2155., 2165., 2175., 2185., 2195., 2205.,\n", " 2215., 2225., 2235., 2245., 2255., 2265., 2275., 2285.,\n", " 2295., 2305., 2315., 2325., 2335., 2345., 2355., 2365.,\n", " 2375., 2385., 2395., 2405., 2415., 2425., 2435., 2445.,\n", " 2455., 2465., 2475., 2485., 2495., 2505., 2513., 2518.,\n", " 2525., 2535., 2545., 2555., 2565., 2575., 2585., 2595.,\n", " 2605., 2615., 2625., 2635., 2645., 2655., 2665., 2675.,\n", " 2685., 2695., 2705., 2715., 2725., 2735., 2745., 2755.,\n", " 2765., 2775., 2785., 2795., 2805., 2815., 2825., 2835.,\n", " 2845., 2855., 2865., 2875., 2885., 2895., 2910., 2930.,\n", " 2950., 2970., 2990., 3010., 3030., 3050., 3070., 3090.,\n", " 3110., 3130., 3150., 3170., 3190., 3210., 3230., 3250.,\n", " 3270., 3290., 3310., 3330., 3350., 3370., 3390., 3410.,\n", " 3430., 3450., 3470., 3490., 3510., 3530., 3550., 3570.,\n", " 3590., 3610., 3630., 3640., 3650., 3670., 3690., 3710.,\n", " 3730., 3750., 3770., 3790., 3810., 3830., 3850., 3870.,\n", " 3890., 3910., 3930., 3950., 3970., 3990., 4010., 4030.,\n", " 4050., 4070., 4090., 4110., 4130., 4150., 4170., 4190.,\n", " 4210., 4230., 4250., 4270., 4290., 4310., 4330., 4350.,\n", " 4370., 4390., 4410., 4430., 4450., 4470., 4490., 4510.,\n", " 4530., 4550., 4570., 4590., 4610., 4630., 4650., 4670.,\n", " 4690., 4710., 4730., 4750., 4770., 4790., 4810., 4830.,\n", " 4850., 4870., 4890., 4910., 4930., 4950., 4970., 4990.,\n", " 5010., 5030., 5050., 5070., 5090., 5110., 5130., 5150.,\n", " 5170., 5190., 5210., 5230., 5250., 5270., 5290., 5310.,\n", " 5330., 5350., 5370., 5390., 5410., 5430., 5450., 5470.,\n", " 5490., 5510., 5530., 5550., 5570., 5590., 5610., 5630.,\n", " 5650., 5670., 5690., 5710., 5730., 5750., 5770., 5790.,\n", " 5810., 5830., 5850., 5870., 5890., 5910., 5930., 5950.,\n", " 5970., 5990., 6010., 6030., 6050., 6070., 6090., 6110.,\n", " 6130., 6150., 6170., 6190., 6210., 6230., 6250., 6270.,\n", " 6290., 6310., 6330., 6350., 6370., 6390., 6410., 6430.,\n", " 6450., 6470., 6490., 6510., 6530., 6550., 6570., 6590.,\n", " 6610., 6630., 6650., 6670., 6690., 6710., 6730., 6750.,\n", " 6770., 6790., 6810., 6830., 6850., 6870., 6890., 6910.,\n", " 6930., 6950., 6970., 6990., 7010., 7030., 7050., 7070.,\n", " 7090., 7110., 7130., 7150., 7170., 7190., 7210., 7230.,\n", " 7250., 7270., 7290., 7310., 7330., 7350., 7370., 7390.,\n", " 7410., 7430., 7450., 7470., 7490., 7510., 7530., 7550.,\n", " 7570., 7590., 7610., 7630., 7650., 7670., 7690., 7710.,\n", " 7730., 7750., 7770., 7790., 7810., 7830., 7850., 7870.,\n", " 7890., 7910., 7930., 7950., 7970., 7990., 8010., 8030.,\n", " 8050., 8070., 8090., 8110., 8130., 8150., 8170., 8190.,\n", " 8210., 8230., 8250., 8270., 8290., 8310., 8330., 8350.,\n", " 8370., 8390., 8410., 8430., 8450., 8470., 8490., 8510.,\n", " 8530., 8550., 8570., 8590., 8610., 8630., 8650., 8670.,\n", " 8690., 8710., 8730., 8750., 8770., 8790., 8810., 8830.,\n", " 8850., 8870., 8890., 8910., 8930., 8950., 8970., 8990.,\n", " 9010., 9030., 9050., 9070., 9090., 9110., 9130., 9150.,\n", " 9170., 9190., 9210., 9230., 9250., 9270., 9290., 9310.,\n", " 9330., 9350., 9370., 9390., 9410., 9430., 9450., 9470.,\n", " 9490., 9510., 9530., 9550., 9570., 9590., 9610., 9630.,\n", " 9650., 9670., 9690., 9710., 9730., 9750., 9770., 9790.,\n", " 9810., 9830., 9850., 9870., 9890., 9910., 9930., 9950.,\n", " 9970., 9990., 10025., 10075., 10125., 10175., 10225., 10275.,\n", " 10325., 10375., 10425., 10475., 10525., 10575., 10625., 10675.,\n", " 10725., 10775., 10825., 10875., 10925., 10975., 11025., 11075.,\n", " 11125., 11175., 11225., 11275., 11325., 11375., 11425., 11475.,\n", " 11525., 11575., 11625., 11675., 11725., 11775., 11825., 11875.,\n", " 11925., 11975., 12025., 12075., 12125., 12175., 12225., 12275.,\n", " 12325., 12375., 12425., 12475., 12525., 12575., 12625., 12675.,\n", " 12725., 12775., 12825., 12875., 12925., 12975., 13025., 13075.,\n", " 13125., 13175., 13225., 13275., 13325., 13375., 13425., 13475.,\n", " 13525., 13575., 13625., 13675., 13725., 13775., 13825., 13875.,\n", " 13925., 13975., 14025., 14075., 14125., 14175., 14225., 14275.,\n", " 14325., 14375., 14425., 14475., 14525., 14570., 14620., 14675.,\n", " 14725., 14775., 14825., 14875., 14925., 14975., 15025., 15075.,\n", " 15125., 15175., 15225., 15275., 15325., 15375., 15425., 15475.,\n", " 15525., 15575., 15625., 15675., 15725., 15775., 15825., 15875.,\n", " 15925., 15975., 16050., 16150., 16250., 16350., 16450., 16550.,\n", " 16650., 16750., 16850., 16950., 17050., 17150., 17250., 17350.,\n", " 17450., 17550., 17650., 17750., 17850., 17950., 18050., 18150.,\n", " 18250., 18350., 18450., 18550., 18650., 18750., 18850., 18950.,\n", " 19050., 19150., 19250., 19350., 19450., 19550., 19650., 19750.,\n", " 19850., 19950.], dtype=float32), flux=Array([[[9.08833684e-08, 1.93420703e-07, 3.10973348e-07, ...,\n", " 1.92249590e-05, 1.88633931e-05, 1.85086974e-05],\n", " [9.08833684e-08, 1.93420703e-07, 3.10973348e-07, ...,\n", " 1.92249590e-05, 1.88633931e-05, 1.85086974e-05],\n", " [9.08833684e-08, 1.93420703e-07, 3.10973348e-07, ...,\n", " 1.92249590e-05, 1.88633931e-05, 1.85086974e-05],\n", " ...,\n", " [5.92562333e-10, 8.93100538e-10, 1.15493171e-09, ...,\n", " 2.39835890e-06, 2.35784546e-06, 2.32140042e-06],\n", " [5.92806859e-10, 8.92882435e-10, 1.15413190e-09, ...,\n", " 2.37455151e-06, 2.33498645e-06, 2.29807620e-06],\n", " [5.95643035e-10, 8.97048713e-10, 1.15942633e-09, ...,\n", " 2.35168159e-06, 2.31248464e-06, 2.27596547e-06]],\n", "\n", " [[2.11160405e-08, 4.68378190e-08, 7.72740307e-08, ...,\n", " 2.08794318e-05, 2.04886637e-05, 2.01090988e-05],\n", " [2.11160405e-08, 4.68378190e-08, 7.72740307e-08, ...,\n", " 2.08794318e-05, 2.04886637e-05, 2.01090988e-05],\n", " [2.11160405e-08, 4.68378190e-08, 7.72740307e-08, ...,\n", " 2.08794318e-05, 2.04886637e-05, 2.01090988e-05],\n", " ...,\n", " [5.63963209e-10, 8.50090109e-10, 1.09938125e-09, ...,\n", " 2.57541342e-06, 2.53532630e-06, 2.49656500e-06],\n", " [5.59437219e-10, 8.43146331e-10, 1.09030318e-09, ...,\n", " 2.55510099e-06, 2.51477172e-06, 2.47722096e-06],\n", " [5.78517234e-10, 8.71934414e-10, 1.12751075e-09, ...,\n", " 2.53303801e-06, 2.49305162e-06, 2.45587876e-06]],\n", "\n", " [[1.11427291e-10, 2.75856810e-10, 4.93186603e-10, ...,\n", " 3.00550819e-05, 2.95078007e-05, 2.89541367e-05],\n", " [1.11427291e-10, 2.75856810e-10, 4.93186603e-10, ...,\n", " 3.00550819e-05, 2.95078007e-05, 2.89541367e-05],\n", " [1.11427291e-10, 2.75856810e-10, 4.93186603e-10, ...,\n", " 3.00550819e-05, 2.95078007e-05, 2.89541367e-05],\n", " ...,\n", " [1.51815840e-08, 1.92815222e-08, 2.29955877e-08, ...,\n", " 3.14909880e-06, 3.10474729e-06, 3.06152378e-06],\n", " [1.55623212e-08, 1.97692778e-08, 2.35827819e-08, ...,\n", " 3.12075917e-06, 3.07683240e-06, 3.03407387e-06],\n", " [1.56620601e-08, 1.98958627e-08, 2.37337012e-08, ...,\n", " 3.10205382e-06, 3.05840922e-06, 3.01598016e-06]],\n", "\n", " [[6.33916183e-11, 1.56637481e-10, 2.80225038e-10, ...,\n", " 3.40314473e-05, 3.34144715e-05, 3.28001406e-05],\n", " [6.33916183e-11, 1.56637481e-10, 2.80225038e-10, ...,\n", " 3.40314473e-05, 3.34144715e-05, 3.28001406e-05],\n", " [6.33916183e-11, 1.56637481e-10, 2.80225038e-10, ...,\n", " 3.40314473e-05, 3.34144715e-05, 3.28001406e-05],\n", " ...,\n", " [1.13446195e-08, 1.44345762e-08, 1.72374950e-08, ...,\n", " 3.58108127e-06, 3.53232667e-06, 3.49160928e-06],\n", " [1.14191590e-08, 1.45293875e-08, 1.73506933e-08, ...,\n", " 3.54622898e-06, 3.49792595e-06, 3.45767330e-06],\n", " [1.14927898e-08, 1.46229295e-08, 1.74622912e-08, ...,\n", " 3.51071185e-06, 3.46286311e-06, 3.42306453e-06]],\n", "\n", " [[1.03717389e-14, 2.60376945e-14, 6.23507932e-14, ...,\n", " 4.28130661e-05, 4.20417018e-05, 4.12843074e-05],\n", " [1.03717389e-14, 2.60376945e-14, 6.23507932e-14, ...,\n", " 4.28130661e-05, 4.20417018e-05, 4.12843074e-05],\n", " [1.03717389e-14, 2.60376945e-14, 6.23507932e-14, ...,\n", " 4.28130661e-05, 4.20417018e-05, 4.12843074e-05],\n", " ...,\n", " [2.74051143e-10, 4.33427960e-10, 5.86995785e-10, ...,\n", " 3.62579908e-06, 3.56578244e-06, 3.53157429e-06],\n", " [2.80006740e-10, 4.42861414e-10, 5.99826022e-10, ...,\n", " 3.59876890e-06, 3.53911469e-06, 3.50530217e-06],\n", " [2.81731083e-10, 4.45578630e-10, 6.03499362e-10, ...,\n", " 3.57047224e-06, 3.51121457e-06, 3.47779246e-06]],\n", "\n", " [[2.64753693e-18, 8.02830980e-18, 2.30857457e-17, ...,\n", " 5.49388205e-05, 5.39541179e-05, 5.29583958e-05],\n", " [2.64753693e-18, 8.02830980e-18, 2.30857457e-17, ...,\n", " 5.49388205e-05, 5.39541179e-05, 5.29583958e-05],\n", " [2.69226858e-18, 8.17344360e-18, 2.35313512e-17, ...,\n", " 5.90876080e-05, 5.80271771e-05, 5.69552649e-05],\n", " ...,\n", " [2.86055124e-10, 4.52389348e-10, 6.12669249e-10, ...,\n", " 3.57395697e-06, 3.51914946e-06, 3.49452603e-06],\n", " [2.92348756e-10, 4.62365729e-10, 6.26242114e-10, ...,\n", " 3.54419944e-06, 3.48981166e-06, 3.46525371e-06],\n", " [2.94150426e-10, 4.65220779e-10, 6.30102970e-10, ...,\n", " 3.51500717e-06, 3.46103275e-06, 3.43656484e-06]]], dtype=float32))\n" ] } ], "source": [ "# NBVAL_SKIP\n", "from rubix.spectra.ssp.templates import BruzualCharlot2003\n", "\n", "print(BruzualCharlot2003)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SSP lookup" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.550001\n" ] }, { "data": { "image/png": "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ya233krnzp2JiIjg29/+NgUFBQ3eoy1fH0C3bt0aXaNlWdx6661A+/sO582bx2WXXUZKSgqWZTFr1qwG+40xPPjggyQnJxMaGkpWVhYbNmxocMy+ffu45ppriIqKIiYmhhtvvJGysrIGx6xYsYKzzjqLkJAQ0tLSePLJJxuV5c0336Rfv36EhIQwePBg3nnnnRa/xpqaGu69914GDx5MeHg4KSkpXHvttezatavBezT1vT/xxBPt4hoBrrvuukblv+iiixoc056/R6DJf5eWZTFlypTAMW35ezyROqI1f4c2u241ctJef/114/F4zEsvvWS++uorM3HiRBMTE2MKCgqcLlojY8eONS+//LJZtWqVyc3NNRdffLFJT083ZWVlgWPOOeccM3HiRLN79+7Ao7i4OLC/trbWDBo0yGRlZZnly5ebd955x8TFxZlJkyYFjtm8ebMJCwsz2dnZZvXq1ea5554zbrfbvPfeey1+jQ899JAZOHBgg/IXFRUF9t98880mLS3N5OTkmCVLlpjTTz/dfOtb32o312eMMYWFhQ2u78MPPzSA+fjjj40x7e87fOedd8wvf/lL8+9//9sA5q233mqw/4knnjDR0dFm1qxZ5ssvvzTjx4833bt3NwcPHgwcc9FFF5mhQ4eazz//3Hz66aemV69e5gc/+EFgf3FxsUlMTDTXXHONWbVqlfnHP/5hQkNDzR//+MfAMfPnzzdut9s8+eSTZvXq1eZXv/qVCQ4ONitXrmzRazxw4IDJysoyM2fONGvXrjULFy40o0aNMsOHD2/wHl27djWPPvpog+/1yH+7bfkajTFmwoQJ5qKLLmpQ/n379jU4pj1/j8aYBte2e/du89JLLxnLssymTZsCx7Tl7/FE6ojW+h1qR92qUPMNjBo1ytx6662B53V1dSYlJcVMnjzZwVKdmMLCQgOYTz75JLDtnHPOMXfcccdRX/POO+8Yl8tl8vPzA9teeOEFExUVZaqqqowxxtxzzz1m4MCBDV539dVXm7Fjx9p7AU146KGHzNChQ5vcd+DAARMcHGzefPPNwLY1a9YYwCxcuNAY0/avryl33HGH6dmzp/H5fMaY9v0dfr2i8Pl8JikpyUyZMiWw7cCBA8br9Zp//OMfxhhjVq9ebQDzxRdfBI559913jWVZZufOncYYY/7whz+YTp06Ba7PGGPuvfde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Ro0aZT7//HOni9QkoMnHyy+/bIwxZtu2bebss882sbGxxuv1ml69eplf/OIXDdY4McaYLVu2mHHjxpnQ0FATFxdn7rrrLlNTU9PgmI8//thkZGQYj8djevToEThHS7v66qtNcnKy8Xg8JjU11Vx99dVm48aNgf0HDx40//d//2c6depkwsLCzJVXXml2797d4D3a8vXVe//99w1g1q1b12B7e/wOP/744yb/Xk6YMMEY45/W/cADD5jExETj9XrN+eef3+i69+7da37wgx+YiIgIExUVZa6//npTWlra4Jgvv/zSnHnmmcbr9ZrU1FTzxBNPNCrLG2+8Yfr06WM8Ho8ZOHCgmT17dotfY15e3lH/bdavPbR06VKTmZlpoqOjTUhIiOnfv795/PHHGwSCtnyNFRUV5sILLzTx8fEmODjYdO3a1UycOLFRBdWev8d6f/zjH01oaKg5cOBAo9e39e/xeHWEMa37O7S5dat16KJERERE2jWNqREREZEOQaFGREREOgSFGhEREekQFGpERESkQ1CoERERkQ5BoUZEREQ6BIUaERER6RAUakRERKRDUKgRERGRDkGhRkRERDoEhRoRERHpEBRqREREpEP4f+LGfvAdkWw1AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# NBVAL_SKIP\n", "import matplotlib.pyplot as plt\n", "from rubix.spectra.ssp.templates import BruzualCharlot2003\n", "from jax import jit\n", "\n", "ssp = BruzualCharlot2003\n", "wave = ssp.wavelength\n", "\n", "\n", "age_index = 0\n", "met_index = 3\n", "\n", "target_age = ssp.age[age_index] + 0.5*(ssp.age[age_index+1] - ssp.age[age_index])\n", "print(target_age)\n", "target_met = ssp.metallicity[met_index] + 0.5*(ssp.metallicity[met_index+1] - ssp.metallicity[met_index])\n", "\n", "lookup = ssp.get_lookup_interpolation()\n", "\n", "spec_calc = lookup(target_met, target_age)\n", "\n", "spec_true = ssp.flux[met_index, age_index, :]\n", "\n", "plt.plot(wave, spec_calc, label='calc')\n", "plt.plot(wave, spec_true, label='true')\n", "\n", "plt.legend()\n", "plt.yscale('log')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# NBVAL_SKIP\n", "# Check if it works with jit\n", "\n", "spec_calc = jit(lookup)(target_met, target_age)\n", "\n", "plt.plot(wave, spec_calc, label='calc jit')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# NBVAL_SKIP\n", "from rubix.utils import load_galaxy_data\n", "\n", "data, units = load_galaxy_data(\"output/rubix_galaxy.h5\")\n", "mass = data[\"particle_data\"][\"stars\"][\"mass\"]\n", "metallicity = data[\"particle_data\"][\"stars\"][\"metallicity\"]\n", "age = data[\"particle_data\"][\"stars\"][\"age\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## VMAP\n", "\n", "Vmap the lookup over the stellar particles" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1000, 842)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_SKIP\n", "# Calculate spectra with vmap\n", "from jax import vmap\n", "\n", "lookup = ssp.get_lookup_interpolation()\n", "\n", "subset = 1000\n", "\n", "# Use only subset because it is too big to fit into gpu memory\n", "met_subset = metallicity[:subset]\n", "age_subset = age[:subset]\n", "\n", "\n", "# Clip the metallicity and age values to the range of the SSP\n", "\n", "met_subset = met_subset.clip(min(ssp.metallicity), max(ssp.metallicity))\n", "age_subset = age_subset.clip(min(ssp.age), max(ssp.age))\n", "\n", "\n", "spec_calc = vmap(lookup)(met_subset, age_subset)\n", "\n", "\n", "spec_calc.shape\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Array(False, dtype=bool)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_SKIP\n", "# check if it contains nan values\n", "import jax.numpy as jnp\n", "jnp.isnan(spec_calc).any()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Use configuration to load lookup function" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "#NBVAL_SKIP\n", "config ={ \"ssp\": {\n", " \"template\": {\n", " \"name\": \"BruzualCharlot2003\"\n", " },\n", " \"method\": \"cubic\"\n", " }\n", "}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-11-10 17:13:25,095 - rubix - DEBUG - Using method defined in config: cubic\n" ] } ], "source": [ "# NBVAL_SKIP\n", "from rubix.core.ssp import get_lookup_interpolation\n", "\n", "lookup = get_lookup_interpolation(config)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Array(695, dtype=int32), Array(35669, dtype=int32))" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_SKIP\n", "# Check how many particles are outside the range of the SSP\n", "import numpy as np\n", "np.sum(metallicity < ssp.metallicity[0]), np.sum(metallicity > ssp.metallicity[-1])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Array(0, dtype=int32), Array(45331, dtype=int32))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_SKIP\n", "np.sum(age < ssp.age[0]), np.sum(age > ssp.age[-1])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "643940" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_SKIP\n", "len(metallicity)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Array([[ 0.0000000e+00, 2.7755576e-17, 5.5511151e-17, ...,\n", " 4.5619352e-05, 4.4804754e-05, 4.3980177e-05],\n", " [ 0.0000000e+00, 2.7755576e-17, 5.5511151e-17, ...,\n", " 4.5822202e-05, 4.5003901e-05, 4.4175598e-05],\n", " [ 0.0000000e+00, 2.7755576e-17, 5.5511151e-17, ...,\n", " 4.8169481e-05, 4.7308338e-05, 4.6436926e-05],\n", " ...,\n", " [ 0.0000000e+00, 2.7755576e-17, 5.5511151e-17, ...,\n", " 4.6039131e-05, 4.5216868e-05, 4.4384582e-05],\n", " [-5.2917185e-12, -1.3075374e-11, -2.3385127e-11, ...,\n", " 4.5421279e-05, 4.4608027e-05, 4.3794011e-05],\n", " [ 0.0000000e+00, 2.7755576e-17, 5.5511151e-17, ...,\n", " 4.4646134e-05, 4.3849301e-05, 4.3042593e-05]], dtype=float32)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_SKIP\n", "# clip the metallicity and age values to the range of the SSP\n", "met_subset = met_subset.clip(min(ssp.metallicity), max(ssp.metallicity))\n", "age_subset = age_subset.clip(min(ssp.age), max(ssp.age))\n", "lookup(met_subset, age_subset)" ] } ], "metadata": { "kernelspec": { "display_name": "rubix", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.0" } }, "nbformat": 4, "nbformat_minor": 2 }