# A) Peak-based integration (DSC, force curves, etc.)
peak_idx = np.argmax(y_data) # or np.argmin() for valleys
window = 20 # adjust based on peak width
start_idx = peak_idx - window
end_idx = peak_idx + window
# B) Range-based integration (find indices for specific x-values)
start_idx = np.argmin(np.abs(x_data - start_value)) # closest to start_value
end_idx = np.argmin(np.abs(x_data - end_value)) # closest to end_value
# Extract region of interest
x_region = x_data[start_idx:end_idx]
y_region = y_data[start_idx:end_idx]
# Create baseline (linear between endpoints)
baseline = np.linspace(y_region[0], y_region[-1], len(y_region))
# Alternative: baseline = np.full(len(y_region), min(y_region)) # horizontal
# Baseline-corrected data
corrected_y = y_region - baseline
# Numerical integration
area = np.trapz(corrected_y, x_region) # trapezoidal rule
# Visualize integration area
ax.fill_between(x_region, y_region, baseline,
color='lightblue', alpha=0.5, label='Integration area')
print(f"Integrated area: {area:.2f}")