Seminar 6 — Scattering & Photothermal Experiments

Introduction

This seminar covers light-matter interactions in the context of scattering and photothermal spectroscopy. We explore Rayleigh scattering from nanoparticles, dynamic light scattering (DLS), and photothermal experiments with lock-in detection.


Problem 1: Rayleigh Scattering Cross-Section

Problem Statement:

The scattering cross-section for a small sphere (radius \(a \ll \lambda\)) in the Rayleigh regime is:

\[\sigma_{\text{sca}} = \frac{2\pi}{\lambda^4} \left(\frac{2a}{1}\right)^6 \frac{|\varepsilon - 1|^2}{|\varepsilon + 2|^2}\]

where \(\varepsilon\) is the complex relative permittivity.

a) Calculate the scattering cross-section of a 20 nm gold nanoparticle at λ = 532 nm (green laser).

Use the following optical constants for gold at 532 nm: \[\varepsilon_{\text{gold}} = -4.6 + 2.4i\]

b) Compare the scattering cross-section with the geometric cross-section \(\sigma_{\text{geom}} = \pi a^2\). What is the scattering efficiency \(Q_{\text{sca}} = \sigma_{\text{sca}} / \sigma_{\text{geom}}\)?

c) Discuss: does a 20 nm gold particle scatter or absorb more at 532 nm? (Hint: check if the imaginary part of ε dominates.)

Code
# Rayleigh scattering calculation
wavelength = 532  # nm
a = 20  # nm, radius
eps_gold = -4.6 + 2.4j  # complex permittivity

# Calculate scattering cross-section
numerator = np.abs(eps_gold - 1)**2
denominator = np.abs(eps_gold + 2)**2

print("Rayleigh Scattering of 20 nm Gold Nanoparticle")
print("=" * 50)
print(f"Wavelength: {wavelength} nm")
print(f"Particle radius: {a} nm")
print(f"Permittivity: ε = {eps_gold}")
print(f"|ε - 1|² = {numerator:.3f}")
print(f"|ε + 2|² = {denominator:.3f}")

# Calculate sigma_sca
sigma_sca = (2 * np.pi / wavelength**4) * (2*a)**6 * (numerator / denominator)

print(f"\nScattering cross-section:")
print(f"  σ_sca = {sigma_sca:.3e} nm² = {sigma_sca*1e-3:.3f} nm³")
print(f"  σ_sca = {sigma_sca*1e-6:.6f} nm² = {sigma_sca*1e-6 / (wavelength**2):.3e} λ²")

# Geometric cross-section
sigma_geom = np.pi * a**2
print(f"\nGeometric cross-section:")
print(f"  σ_geom = πa² = {sigma_geom:.1f} nm²")

# Scattering efficiency
Q_sca = sigma_sca / sigma_geom
print(f"\nScattering efficiency:")
print(f"  Q_sca = σ_sca / σ_geom = {Q_sca:.3f}")

# Absorption (rough estimate): absorption cross-section is proportional to Im(ε)
# σ_abs ~ Im(ε) for Rayleigh particles
print(f"\nAbsorption:")
print(f"  Im(ε) = {eps_gold.imag} (significant)")
print(f"  Conclusion: 20 nm Au absorbs MORE than it scatters at 532 nm")
print(f"  (This is why gold nanoparticles are used in photothermal applications)")
Rayleigh Scattering of 20 nm Gold Nanoparticle
==================================================
Wavelength: 532 nm
Particle radius: 20 nm
Permittivity: ε = (-4.6+2.4j)
|ε - 1|² = 37.120
|ε + 2|² = 12.520

Scattering cross-section:
  σ_sca = 9.526e-01 nm² = 0.001 nm³
  σ_sca = 0.000001 nm² = 3.366e-12 λ²

Geometric cross-section:
  σ_geom = πa² = 1256.6 nm²

Scattering efficiency:
  Q_sca = σ_sca / σ_geom = 0.001

Absorption:
  Im(ε) = 2.4 (significant)
  Conclusion: 20 nm Au absorbs MORE than it scatters at 532 nm
  (This is why gold nanoparticles are used in photothermal applications)

Problem 2: Dynamic Light Scattering (DLS)

Problem Statement:

A 100 nm diameter polystyrene sphere undergoes Brownian motion in water at T = 25°C.

The diffusion coefficient is given by the Stokes-Einstein equation:

\[D = \frac{k_B T}{6 \pi \eta a}\]

where \(k_B = 1.38 \times 10^{-23}\) J/K is Boltzmann’s constant, \(\eta\) is the dynamic viscosity of water (~0.89 mPa·s at 25°C), and \(a\) is the particle radius.

In DLS, we measure intensity autocorrelation \(g_2(\tau) = \langle I(t) I(t+\tau) \rangle\) which decays exponentially:

\[g_2(\tau) = 1 + \beta e^{-2\Gamma \tau}\]

where \(\beta\) is a contrast factor and \(\Gamma = Dq^2\) is the decay rate, with scattering wavevector:

\[q = \frac{4\pi n}{\lambda} \sin(\theta/2)\]

a) Calculate the diffusion coefficient \(D\) for a 100 nm polystyrene sphere in water at 25°C.

b) For backscattering detection (θ = 173°) with λ = 632 nm (He-Ne laser) and water refractive index \(n = 1.33\), calculate the scattering wavevector \(q\) and decay rate \(\Gamma\).

c) Calculate the characteristic decay time \(\tau_c = 1/\Gamma\) (autocorrelation lifetime).

d) Plot the expected autocorrelation function \(g_2(\tau)\) with \(\beta = 0.05\).

Code
# Physical constants
k_B = 1.38e-23  # J/K, Boltzmann constant
T = 25 + 273.15  # K, temperature
eta = 0.89e-3  # Pa·s, viscosity of water at 25°C
a = 100 / 2  # nm → radius = 50 nm
a_m = a * 1e-9  # m

print("Dynamic Light Scattering (DLS) Calculation")
print("=" * 50)
print(f"Temperature: {T:.1f} K ({T - 273.15:.0f}°C)")
print(f"Particle diameter: 100 nm (radius a = {a} nm)")
print(f"Viscosity of water: {eta*1e3:.2f} mPa·s")

# Part a): Diffusion coefficient
D = k_B * T / (6 * np.pi * eta * a_m)
print(f"\nPart a) Diffusion coefficient:")
print(f"  D = {D:.3e} m²/s = {D*1e12:.2f} nm²/s")

# Part b): Scattering wavevector
wavelength = 632  # nm
n_water = 1.33
theta = 173  # degrees, backscattering
theta_rad = np.radians(theta)

q = (4 * np.pi * n_water / wavelength) * np.sin(theta_rad / 2)
q_nm = q * 1e-9  # convert to nm⁻¹

print(f"\nPart b) Scattering wavevector (backscattering):")
print(f"  λ = {wavelength} nm, θ = {theta}°")
print(f"  q = {q:.3e} m⁻¹ = {q_nm:.4f} nm⁻¹")

# Decay rate
Gamma = D * q**2
tau_c = 1 / Gamma

print(f"\nPart c) Decay rate and lifetime:")
print(f"  Γ = D·q² = {Gamma:.3e} s⁻¹")
print(f"  τ_c = 1/Γ = {tau_c:.3e} s = {tau_c*1e6:.2f} µs")
Dynamic Light Scattering (DLS) Calculation
==================================================
Temperature: 298.1 K (25°C)
Particle diameter: 100 nm (radius a = 50.0 nm)
Viscosity of water: 0.89 mPa·s

Part a) Diffusion coefficient:
  D = 4.905e-12 m²/s = 4.91 nm²/s

Part b) Scattering wavevector (backscattering):
  λ = 632 nm, θ = 173°
  q = 2.640e-02 m⁻¹ = 0.0000 nm⁻¹

Part c) Decay rate and lifetime:
  Γ = D·q² = 3.418e-15 s⁻¹
  τ_c = 1/Γ = 2.926e+14 s = 292603816782511800320.00 µs

Now plot the autocorrelation function:

Code
# Plot g2(tau)
beta = 0.05  # contrast factor
tau = np.logspace(-7, -3, 1000)  # 100 ns to 1 µs

g2 = 1 + beta * np.exp(-2 * Gamma * tau)

fig, ax = plt.subplots(figsize=get_size(12, 8))
ax.semilogx(tau * 1e6, g2, 'b-', linewidth=2)
ax.axvline(x=tau_c*1e6, color='r', linestyle='--', alpha=0.7, label=f'τ_c = {tau_c*1e6:.2f} µs')
ax.set_xlabel(r'Delay time $\tau$ (µs)')
ax.set_ylabel(r'Autocorrelation $g_2(\tau)$')
ax.set_ylim([0.995, 1.06])
ax.grid(True, alpha=0.3)
ax.legend(fontsize=8)

plt.savefig('img/dls_autocorrelation.png', dpi=150, bbox_inches='tight')
plt.close()
print("Figure saved to img/dls_autocorrelation.png")
Figure saved to img/dls_autocorrelation.png

Problem 3: Photothermal Temperature Rise

Problem Statement:

When a nanoparticle absorbs laser light, its temperature rises. For a small spherical particle surrounded by a medium (e.g., water), the steady-state temperature increase is:

\[\Delta T = \frac{P_{\text{abs}}}{4 \pi \kappa r}\]

where \(P_{\text{abs}}\) is the absorbed power, \(\kappa\) is the thermal conductivity of the surrounding medium, and \(r\) is the distance from the particle.

a) A 40 nm gold nanoparticle absorbs \(P_{\text{abs}} = 0.5\) µW of laser power in water. Calculate the temperature rise at the particle surface (\(r = 20\) nm).

Use \(\kappa_{\text{water}} = 0.6\) W/(m·K).

b) The refractive index of water changes with temperature: \(\partial n / \partial T = -1.0 \times 10^{-4}\) K⁻¹. Calculate the refractive index change at the particle surface.

c) This refractive index perturbation can be detected via a photothermal lens effect. Why would a photothermal microscope measure a phase shift (or absorption change) when scanning over a nanoparticle?

Code
# Photothermal temperature rise
P_abs = 0.5e-6  # W, absorbed power
kappa_water = 0.6  # W/(m·K)
r = 20e-9  # m, distance (particle surface)

print("Photothermal Temperature Rise")
print("=" * 50)
print(f"Absorbed power: P_abs = {P_abs*1e6:.1f} µW")
print(f"Particle radius: 20 nm")
print(f"Thermal conductivity of water: κ = {kappa_water} W/(m·K)")

# Part a): temperature rise
Delta_T = P_abs / (4 * np.pi * kappa_water * r)
print(f"\nPart a) Temperature rise at particle surface:")
print(f"  ΔT = {Delta_T:.1f} K = {Delta_T:.1f} °C")

# Part b): refractive index change
dn_dT = -1.0e-4  # K⁻¹
Delta_n = dn_dT * Delta_T

print(f"\nPart b) Refractive index change:")
print(f"  ∂n/∂T = {dn_dT:.2e} K⁻¹")
print(f"  Δn = (∂n/∂T) · ΔT = {Delta_n:.3e}")

# Estimated refractive index perturbation size
print(f"\nPart c) Photothermal detection:")
print(f"  The temperature gradient ∇T creates a radial refractive index")
print(f"  gradient around the particle, acting as a weak lens.")
print(f"  This lens deflects the probe beam, creating a phase shift")
print(f"  proportional to Δn. Detection methods:")
print(f"    - Thermal lens microscopy: detect deflection")
print(f"    - Photothermal heterodyne imaging: detect phase shift")
print(f"    - Absorption contrast: detect out-of-phase modulation")
Photothermal Temperature Rise
==================================================
Absorbed power: P_abs = 0.5 µW
Particle radius: 20 nm
Thermal conductivity of water: κ = 0.6 W/(m·K)

Part a) Temperature rise at particle surface:
  ΔT = 3.3 K = 3.3 °C

Part b) Refractive index change:
  ∂n/∂T = -1.00e-04 K⁻¹
  Δn = (∂n/∂T) · ΔT = -3.316e-04

Part c) Photothermal detection:
  The temperature gradient ∇T creates a radial refractive index
  gradient around the particle, acting as a weak lens.
  This lens deflects the probe beam, creating a phase shift
  proportional to Δn. Detection methods:
    - Thermal lens microscopy: detect deflection
    - Photothermal heterodyne imaging: detect phase shift
    - Absorption contrast: detect out-of-phase modulation

Problem 4: DLS Simulation (Autocorrelation from Brownian Motion)

Problem Statement:

Simulate a simplified DLS experiment:

  1. Generate scattered light intensity from multiple scattering centers (particles) at random positions
  2. Model Brownian motion: particles walk randomly at each time step
  3. Compute the intensity autocorrelation function \(g_2(\tau)\) from the scattered intensity
  4. Fit an exponential decay to extract the diffusion coefficient
Code
# DLS simulation parameters
n_particles = 100
n_timesteps = 1000
timestep = 1e-7  # s, 100 ns per step
diffusion_coeff = D  # from Problem 2 (nm²/s)

# Convert diffusion to per-step displacement
# Mean squared displacement in dt: <Δr²> = 4D·dt (2D)
# Standard deviation per step: σ = sqrt(2D·dt) in each dimension
dt_s = timestep
dt_nm = dt_s * 1e9
sigma_step = np.sqrt(2 * diffusion_coeff * dt_nm)  # nm per step

print("DLS Simulation (Brownian Motion)")
print("=" * 50)
print(f"Number of particles: {n_particles}")
print(f"Simulation steps: {n_timesteps}")
print(f"Time step: {timestep*1e6:.1f} µs")
print(f"Total time: {n_timesteps * timestep*1e6:.1f} µs")
print(f"Step displacement σ = {sigma_step:.3f} nm")

# Initialize particle positions (2D)
positions = np.random.uniform(0, 500, (n_particles, 2, n_timesteps))

# Brownian motion: random walk
for t in range(1, n_timesteps):
    displacement = np.random.normal(0, sigma_step, (n_particles, 2))
    positions[:, :, t] = positions[:, :, t-1] + displacement

# Simulate scattered intensity at each time step
# Assume simple model: intensity is proportional to sum of waves from all particles
# For simplicity, use uniform scattering from each particle

scattered_intensity = np.zeros(n_timesteps)

for t in range(n_timesteps):
    # Phase from particle position: φ ~ q·r
    # For backscattering, q is large
    phases = q * (positions[:, 0, t] * 1e-9)  # convert nm to m
    # Scattered field: E ~ sum(exp(i·φ))
    E = np.sum(np.exp(1j * phases))
    # Intensity: I = |E|²
    scattered_intensity[t] = np.abs(E)**2

# Compute autocorrelation g2(tau)
max_lag = 200
g2_sim = np.zeros(max_lag)

for lag in range(max_lag):
    I1 = scattered_intensity[:-lag] if lag > 0 else scattered_intensity
    I2 = scattered_intensity[lag:]
    mean_I = np.mean(scattered_intensity)
    g2_sim[lag] = np.mean(I1 * I2) / (mean_I**2)

tau_lags = np.arange(max_lag) * timestep

print(f"\nAutocorrelation computed for {max_lag} lags")
DLS Simulation (Brownian Motion)
==================================================
Number of particles: 100
Simulation steps: 1000
Time step: 0.1 µs
Total time: 100.0 µs
Step displacement σ = 0.000 nm

Autocorrelation computed for 200 lags

Now plot and fit:

Code
# Fit exponential decay: g2 = 1 + β·exp(-2·Γ·τ)
from scipy.optimize import curve_fit

def g2_model(tau, Gamma, beta):
    return 1 + beta * np.exp(-2 * Gamma * tau)

# Fit to simulated data (use last 50 points for better fit)
popt, _ = curve_fit(g2_model, tau_lags[1:100], g2_sim[1:100],
                     p0=[Gamma, 0.1], maxfev=5000)
Gamma_fit, beta_fit = popt

print("Fit results:")
print(f"  Γ_true = {Gamma:.3e} s⁻¹")
print(f"  Γ_fit  = {Gamma_fit:.3e} s⁻¹")
print(f"  β_fit  = {beta_fit:.4f}")

# Plot comparison
fig, ax = plt.subplots(figsize=get_size(12, 8))
ax.semilogy(tau_lags[:150]*1e6, g2_sim[:150] - 1, 'bo', markersize=4, label='Simulated data')

tau_smooth = np.linspace(0, tau_lags[149], 500)
g2_fit = g2_model(tau_smooth, Gamma_fit, beta_fit) - 1
ax.semilogy(tau_smooth*1e6, g2_fit, 'r-', linewidth=2, label='Fit')

ax.set_xlabel(r'Delay time $\tau$ (µs)')
ax.set_ylabel(r'$g_2(\tau) - 1$ (log scale)')
ax.grid(True, which='both', alpha=0.3)
ax.legend(fontsize=8)

plt.savefig('img/dls_simulation.png', dpi=150, bbox_inches='tight')
plt.close()
print("\nFigure saved to img/dls_simulation.png")
Fit results:
  Γ_true = 3.418e-15 s⁻¹
  Γ_fit  = 3.418e-15 s⁻¹
  β_fit  = -0.0000
/var/folders/t4/_9qps8wj56jc60nwkr3nrcr00000gn/T/ipykernel_10136/1644749267.py:8: OptimizeWarning:

Covariance of the parameters could not be estimated

/var/folders/t4/_9qps8wj56jc60nwkr3nrcr00000gn/T/ipykernel_10136/1644749267.py:30: UserWarning:

Data has no positive values, and therefore cannot be log-scaled.

Figure saved to img/dls_simulation.png

Problem 5: Lock-in Detection

Problem Statement:

A lock-in amplifier detects signals at a specific modulation frequency by multiplying the input signal by a reference oscillator at that frequency and low-pass filtering the result.

Mathematically, for a signal \(s(t) = A \sin(\omega_0 t + \phi_s)\) and reference \(r(t) = \cos(\omega_0 t)\):

\[\text{out}(t) = \text{LPF}[s(t) \cdot r(t)] = \frac{A}{2} \cos(\phi_s)\]

where LPF denotes low-pass filtering.

a) Derive why multiplying by the reference and low-pass filtering extracts the signal amplitude and phase.

b) Consider a photothermal signal with amplitude \(A_{\text{signal}} = 10\) mV at modulation frequency \(f_0 = 1\) kHz, plus white noise with amplitude \(\sigma_{\text{noise}} = 100\) mV.

Without lock-in (direct measurement): signal-to-noise ratio \(\text{SNR}_{\text{direct}} = A / \sigma\).

With lock-in detection and bandwidth \(B_{\text{LPF}} = 1\) Hz (from the low-pass filter), the noise is reduced by a factor \(\sqrt{f_0 / (2 B_{\text{LPF}})}\) (Wiener-Khinchin theorem).

Calculate the SNR improvement factor.

c) Why does lock-in detection not help if the noise is at the same frequency as the signal (e.g., 50 Hz power line noise modulating the signal)?

Code
# Lock-in detection analysis
A_signal = 10  # mV
f_0 = 1000  # Hz, modulation frequency
sigma_noise = 100  # mV, noise amplitude
B_lpf = 1  # Hz, low-pass filter bandwidth

print("Lock-in Detection Analysis")
print("=" * 50)
print(f"Signal amplitude: A = {A_signal} mV")
print(f"Modulation frequency: f_0 = {f_0} Hz")
print(f"Noise amplitude: σ = {sigma_noise} mV")
print(f"LPF bandwidth: B = {B_lpf} Hz")

# Part b): SNR improvement
SNR_direct = A_signal / sigma_noise
print(f"\nPart b) SNR without lock-in:")
print(f"  SNR_direct = A / σ = {SNR_direct:.4f} ({10*np.log10(SNR_direct):.1f} dB)")

# With lock-in: noise reduced by sqrt(f_0 / (2*B))
noise_reduction_factor = np.sqrt(f_0 / (2 * B_lpf))
SNR_lockin = SNR_direct * noise_reduction_factor

print(f"\nWith lock-in (B = {B_lpf} Hz):")
print(f"  Noise reduction factor = √(f_0 / (2B)) = {noise_reduction_factor:.1f}")
print(f"  SNR_lock-in = {SNR_lockin:.2f} ({10*np.log10(SNR_lockin):.1f} dB)")
print(f"  Improvement = {noise_reduction_factor:.1f}×")

# Part c): explanation
print(f"\nPart c) Noise at signal frequency:")
print(f"  If noise is at the SAME frequency as the signal (e.g., both at 1 kHz),")
print(f"  then lock-in cannot distinguish them. Both will pass through the")
print(f"  multiplication and low-pass filtering step together.")
print(f"  Lock-in ONLY rejects noise at OTHER frequencies (off-resonance noise).")
print(f"  This is why modulation frequency should be chosen away from")
print(f"  common noise sources (50/60 Hz, harmonics, thermal noise, 1/f noise).")
Lock-in Detection Analysis
==================================================
Signal amplitude: A = 10 mV
Modulation frequency: f_0 = 1000 Hz
Noise amplitude: σ = 100 mV
LPF bandwidth: B = 1 Hz

Part b) SNR without lock-in:
  SNR_direct = A / σ = 0.1000 (-10.0 dB)

With lock-in (B = 1 Hz):
  Noise reduction factor = √(f_0 / (2B)) = 22.4
  SNR_lock-in = 2.24 (3.5 dB)
  Improvement = 22.4×

Part c) Noise at signal frequency:
  If noise is at the SAME frequency as the signal (e.g., both at 1 kHz),
  then lock-in cannot distinguish them. Both will pass through the
  multiplication and low-pass filtering step together.
  Lock-in ONLY rejects noise at OTHER frequencies (off-resonance noise).
  This is why modulation frequency should be chosen away from
  common noise sources (50/60 Hz, harmonics, thermal noise, 1/f noise).

Problem 6: Acousto-Optic Modulators (AOM)

Problem Statement:

An acousto-optic modulator (AOM) works by Bragg diffraction from a sound wave traveling through a crystal (typically TeO₂).

a) Briefly explain the AOM principle: how does a traveling acoustic wave create a diffraction grating for light?

b) In an AOM, the Bragg condition is:

\[2 d \sin(\theta_B) = m \lambda\]

where \(d\) is the acoustic wavelength, \(\theta_B\) is the Bragg angle, \(m\) is the diffraction order, and \(\lambda\) is the optical wavelength.

The acoustic wavelength is related to the sound frequency \(f\) and speed \(v_s\): \(d = v_s / f\).

For a typical setup: \(v_s = 600\) m/s (in TeO₂), \(f = 80\) MHz, optical wavelength \(\lambda = 532\) nm (green), first order \(m = 1\).

Calculate the Bragg angle \(\theta_B\).

c) Why are AOMs used to modulate the pump beam in photothermal microscopy? What is the advantage?

Solution:

(a) The acoustic wave creates a time-varying strain in the crystal, which modulates the refractive index periodically. This acts as a traveling diffracting grating. Light satisfying the Bragg condition is diffracted into a first-order beam.

(b) Calculation:

Code
# AOM Bragg angle calculation
v_s = 600  # m/s, sound speed in TeO2
f_acoustic = 80e6  # Hz, acoustic frequency
wavelength_opt = 532e-9  # m, optical wavelength
m = 1  # first order

print("Acousto-Optic Modulator (AOM)")
print("=" * 50)
print(f"Sound speed (TeO₂): v_s = {v_s} m/s")
print(f"Acoustic frequency: f = {f_acoustic/1e6:.0f} MHz")
print(f"Optical wavelength: λ = {wavelength_opt*1e9:.0f} nm")
print(f"Diffraction order: m = {m}")

# Acoustic wavelength
d = v_s / f_acoustic
print(f"\nAcoustic wavelength:")
print(f"  Λ = v_s / f = {d*1e6:.3f} µm = {d*1e9:.1f} nm")

# Bragg angle from 2·Λ·sin(θ_B) = m·λ
sin_theta_B = (m * wavelength_opt) / (2 * d)
theta_B = np.degrees(np.arcsin(sin_theta_B))

print(f"\nBragg angle:")
print(f"  2·Λ·sin(θ_B) = m·λ")
print(f"  sin(θ_B) = m·λ / (2·Λ) = {sin_theta_B:.4f}")
print(f"  θ_B = {theta_B:.2f}°")

print(f"\nPart c) AOM in photothermal microscopy:")
print(f"  - AOMs allow rapid ON/OFF switching (MHz speeds)")
print(f"  - Can modulate pump power without mechanical shutters")
print(f"  - Enable lock-in detection at the modulation frequency")
print(f"  - Reduce phototoxicity (pulsed excitation)")
print(f"  - Improve signal-to-noise via frequency-selective detection")
Acousto-Optic Modulator (AOM)
==================================================
Sound speed (TeO₂): v_s = 600 m/s
Acoustic frequency: f = 80 MHz
Optical wavelength: λ = 532 nm
Diffraction order: m = 1

Acoustic wavelength:
  Λ = v_s / f = 7.500 µm = 7500.0 nm

Bragg angle:
  2·Λ·sin(θ_B) = m·λ
  sin(θ_B) = m·λ / (2·Λ) = 0.0355
  θ_B = 2.03°

Part c) AOM in photothermal microscopy:
  - AOMs allow rapid ON/OFF switching (MHz speeds)
  - Can modulate pump power without mechanical shutters
  - Enable lock-in detection at the modulation frequency
  - Reduce phototoxicity (pulsed excitation)
  - Improve signal-to-noise via frequency-selective detection

Summary

This seminar covered: - Rayleigh scattering: small nanoparticles scatter weakly at visible wavelengths; absorption dominates in plasmonic particles - DLS: Brownian motion causes intensity fluctuations; autocorrelation decay reveals diffusion and particle size - Photothermal effects: absorbed light generates local heat; refractive index changes can be detected - Lock-in detection: frequency-selective measurement dramatically improves SNR by rejecting broadband noise - AOMs: enable rapid, frequency-modulated excitation for synchronous detection

These techniques are foundational for modern nano-optical experiments and bioimaging applications.