<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Universe OpenAstronomy (Posts by Om S Habib)</title><link>http://openastronomy.org/Universe_OA/</link><description></description><atom:link href="http://openastronomy.org/Universe_OA/authors/om-s-habib.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Mon, 22 Jun 2026 05:23:36 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title> Lift off: Weeks 1 &amp; 2The firs...</title><link>http://openastronomy.org/Universe_OA/posts/2026/06/20260616_0827_omiii-215/</link><dc:creator>Om S Habib</dc:creator><description>&lt;p&gt; &lt;/p&gt;
&lt;span id="docs-internal-guid-c79a753d-7fff-eef0-db84-593d0b6d8ea0"&gt;&lt;span style="font-family: georgia;"&gt;&lt;h3 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"&gt;&lt;span style="font-size: 16pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Lift off: Weeks 1 &amp;amp; 2&lt;/span&gt;&lt;/h3&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;The first month of Google Summer of Code has been nothing short of a whirlwind. Here's a quick breakdown of how the first two weeks went down:&lt;/span&gt;&lt;/p&gt;
&lt;ul style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Navigating the Codebase: If you've ever stared at a massive codebase and wondered where to begin, you know how my first few days felt. Getting my hands dirty made things click into place rapidly.&lt;/span&gt;&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;/li&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Finishing Power Colors: My immediate target was getting the Power Colors implementation over the finish line. Classifying spectral states based on power spectral shapes is a huge deal in X-ray binaries.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Porting from Python to Julia: Bringing this capability from the established Python ecosystem to our native Julia environment felt like unlocking a new superpower.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Rigorous Testing: It required strict testing against established scientific benchmarks, but finally seeing those PR checks turn green was an absolute thrill.
&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: 14.6667px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;span id="docs-internal-guid-6f068243-7fff-ce7c-015b-630f72a80949"&gt;&lt;h3 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-size: 16pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Leveling Up: Core Spectral Types: Weeks 3 &amp;amp; 4&lt;/span&gt;&lt;/h3&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;With the confidence boost from the Power Colors merge, Weeks 3 and 4 were all about the heavy lifting: the Core Spectral Types.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;If you've used Stingray.jl before, you might remember that functions like avg_cs_from_events would just spit out a raw DataFrame. Sure, it got the job done, but it wasn't exactly user-friendly for building a high-level scientific pipeline. Our mission? Build rock-solid, type-safe Julia structs that not only map beautifully to the Python Stingray API but also squeeze out every ounce of Julia's performance through multiple dispatch.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;I am super pumped to announce that the Core Spectral Types are officially baked in! We rolled out the AbstractCrossspectrum hierarchy, featuring the brand-new Crossspectrum{T} and Powerspectrum{T} types.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Here is a quick look at how slick the reverberation lag measurement looks now:&lt;/span&gt;&lt;/p&gt;
&lt;br&gt;&lt;div&gt;&lt;span&gt;&lt;a name="more"&gt;&lt;/a&gt;&lt;/span&gt;# Reverberation lag measurement using our new Core Spectral Types&lt;/div&gt;&lt;div&gt;ev = readevents("observation.fits")&lt;/div&gt;&lt;div&gt;soft_ev = filter_energy(e -&amp;gt; 0.3 &amp;lt;= e &amp;lt;= 1.0, ev)  # soft band (thermal disk)&lt;/div&gt;&lt;div&gt;hard_ev = filter_energy(e -&amp;gt; 2.0 &amp;lt;= e &amp;lt;= 10.0, ev)  # hard band (Comptonized corona)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;# Meet the new Crossspectrum type!&lt;/div&gt;&lt;div&gt;cs = Crossspectrum(soft_ev, hard_ev, segment_size=64.0, dt=1/256)&lt;/div&gt;&lt;div&gt;lags = time_lag(cs)  # Grab those frequency-dependent time lags&lt;/div&gt;&lt;div&gt;coh = coherence(cs)  # Intrinsic coherence, calculated seamlessly&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;# Visualizing the data is literally a one-liner now&lt;/div&gt;&lt;div&gt;plot(cs, :lag_frequency)  # lag-frequency plot&lt;br&gt;&lt;/div&gt;&lt;span&gt;&lt;!--more--&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIX9x-1QfIcBhJZeSaCNPGQ9VtPXmpXFfqc0HbSiGuWyyLU8DjI1vmFrAXUDnpY2NSCeHk2svS_rfeFI96EBvnLsUriSH7kC7upCJE874HQrKTguhNEdO9EcVQ7b5jnhFOXNOPTiGk7ALJB9HuJyMWAN2djeyvXe0RTRXiG-1v5KUWSIJelIdVE1S0z5wz/s1024/Lag%20Frequency%20Plot.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="453" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIX9x-1QfIcBhJZeSaCNPGQ9VtPXmpXFfqc0HbSiGuWyyLU8DjI1vmFrAXUDnpY2NSCeHk2svS_rfeFI96EBvnLsUriSH7kC7upCJE874HQrKTguhNEdO9EcVQ7b5jnhFOXNOPTiGk7ALJB9HuJyMWAN2djeyvXe0RTRXiG-1v5KUWSIJelIdVE1S0z5wz/w453-h453/Lag%20Frequency%20Plot.png" width="453"&gt;&lt;/a&gt;&lt;br&gt;&lt;span id="docs-internal-guid-de35dd1a-7fff-4f5d-36ea-fdd30969164b"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;i&gt;Observed X-ray Lag-Frequency Spectrum showing reverberation dip&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/div&gt;&lt;span id="docs-internal-guid-e30d73c9-7fff-120b-65fa-6bffbc159cd6"&gt;&lt;h4 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 16pt; text-align: justify;"&gt;&lt;span style="color: #434343; font-size: 14pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Under the Hood: Supercharging Stingray.jl&lt;/span&gt;&lt;/h4&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;The real magic happens beneath the surface. By designing Crossspectrum parametrically (Crossspectrum{T&amp;lt;:Real}), we guaranteed type stability. This means Julia's Just-In-Time (JIT) compiler can optimize the math down to the bare metal.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Check out a snippet of the foundation we laid in crossspectrum.jl:&lt;/span&gt;&lt;/p&gt;
&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;/div&gt;&lt;span&gt;&lt;!--more--&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;div&gt;struct Crossspectrum{T&amp;lt;:Real} &amp;lt;: AbstractCrossspectrum&lt;/div&gt;&lt;div&gt;    freq::Vector{T}&lt;/div&gt;&lt;div&gt;    power::Vector{Complex{T}}&lt;/div&gt;&lt;div&gt;    power_err::Vector{Complex{T}}&lt;/div&gt;&lt;div&gt;    unnorm_power::Vector{Complex{T}}&lt;/div&gt;&lt;div&gt;    unnorm_power_err::Vector{Complex{T}}&lt;/div&gt;&lt;div&gt;    pds1::Union{Nothing, Vector{T}}&lt;/div&gt;&lt;div&gt;    pds2::Union{Nothing, Vector{T}}&lt;/div&gt;&lt;div&gt;    df::T&lt;/div&gt;&lt;div&gt;    dt::T&lt;/div&gt;&lt;div&gt;    n::Int&lt;/div&gt;&lt;div&gt;    m::Int&lt;/div&gt;&lt;div&gt;    # ... tracking all the crucial metadata internally!&lt;/div&gt;&lt;div&gt;end&lt;/div&gt;&lt;span&gt;&lt;!--more--&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;span id="docs-internal-guid-2d803f6f-7fff-b1d1-03fa-5cdf7d489f35"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;By ditching the raw DataFrame returns in favor of these robust structs, the developer ergonomics have improved tenfold:&lt;/span&gt;&lt;/p&gt;
&lt;ul style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Strong Typing: No more hunting for array columns, everything you need is strongly typed.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Ready for Analysis: The data is immediately ready for complex downstream computations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Smart Constructors: We wired up convenient constructors that ingest EventList or LightCurve objects directly.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Automated GTIs: These constructors take care of Good Time Intervals (GTIs) automatically under the hood.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 16pt; white-space: pre-wrap;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: 16pt; white-space: pre-wrap;"&gt;&lt;b&gt;What’s Next on the Radar?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: 16pt; white-space: pre-wrap;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-748a0857-7fff-451d-c416-02cdba175c0c"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;We've covered a lot of ground, but we are far from done. Here is the roadmap for the upcoming weeks:&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Frequency Rebinning: This is the very next hurdle. We are actively working on logarithmic (geometric) and linear frequency rebinning for the Powerspectrum and Crossspectrum objects. Getting the logarithmic rebinning dialed in is non-negotiable for high-quality broadband noise studies, as it drastically improves the signal-to-noise ratio at high frequencies.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNjEEkwVQKDS-06pwfNAxTyj9UDXnKg2UDy3_yd60JRzIMng-SMF6YLG1iv1s-4snp-BmfiWYXoPLGZqCGv3fCfNhYEbjkS1s6qGstEf4iaJP3M_yCEVlhOXFi0HQVwdtm1PT7mQkr2vyOi6xpdIrgERJMdysy-_dNW6L8bDAWJ_ekPcef_2-Xn2F3MsU0/s1024/power%20spectrum%20qpo.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNjEEkwVQKDS-06pwfNAxTyj9UDXnKg2UDy3_yd60JRzIMng-SMF6YLG1iv1s-4snp-BmfiWYXoPLGZqCGv3fCfNhYEbjkS1s6qGstEf4iaJP3M_yCEVlhOXFi0HQVwdtm1PT7mQkr2vyOi6xpdIrgERJMdysy-_dNW6L8bDAWJ_ekPcef_2-Xn2F3MsU0/w441-h441/power%20spectrum%20qpo.png" width="441"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span id="docs-internal-guid-2a972987-7fff-bd2e-54be-0971e61f5010"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;i&gt;X-ray Power Density Spectrum with a QPO peak at 5 Hz&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;span&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-1a770530-7fff-52a4-e5dc-deecf44616a6"&gt;&lt;ol start="2" style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Covariance Spectra and the Lag-Energy Framework: With rebinning out of the way, we will pivot to the variability-vs-energy framework the holy grail for mapping X-ray reverberations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li dir="ltr" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Lomb-Scargle Periodograms: Bringing Lomb-Scargle into our shiny new type system to handle unevenly sampled datasets like a champ.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: 14.6667px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;This GSoC journey has been an absolute blast so far. Marrying the expressive flexibility of Python with the raw speed of Julia isn't without its brain-bending moments, but seeing those beautiful lag-frequency plots render from our native Julia types makes every hour of debugging worth it.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"&gt;&lt;span style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Catch you in the next update as we dive deep into frequency rebinning!&lt;/span&gt;&lt;/p&gt;
&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;</description><category>stingray</category><guid>http://openastronomy.org/Universe_OA/posts/2026/06/20260616_0827_omiii-215/</guid><pubDate>Tue, 16 Jun 2026 07:27:18 GMT</pubDate></item></channel></rss>