@@ -299,6 +299,75 @@ peaks_df = spec.to_dataframe()
299299print (peaks_df.head())
300300```
301301
302+ ### Working with Chromatograms
303+
304+ Chromatograms (e.g., extracted ion chromatograms, total ion chromatograms) are now fully supported with a Pythonic interface similar to spectra.
305+
306+ ``` python
307+ from openms_python import Py_MSExperiment, Py_MSChromatogram
308+ import pandas as pd
309+
310+ # Load experiment with chromatograms
311+ exp = Py_MSExperiment.from_file(' data.mzML' )
312+
313+ # Check chromatogram count
314+ print (f " Chromatograms: { exp.chromatogram_count} " )
315+
316+ # Access individual chromatograms
317+ if exp.chromatogram_count > 0 :
318+ chrom = exp.get_chromatogram(0 )
319+ print (f " MZ: { chrom.mz:.4f } " )
320+ print (f " Name: { chrom.name} " )
321+ print (f " Data points: { len (chrom)} " )
322+ print (f " RT range: { chrom.rt_range} " )
323+ print (f " TIC: { chrom.total_ion_current:.2e } " )
324+
325+ # Iterate over all chromatograms
326+ for chrom in exp.chromatograms():
327+ print (f " Chromatogram: MZ= { chrom.mz:.4f } , Points= { len (chrom)} " )
328+
329+ # Create chromatogram from DataFrame
330+ df = pd.DataFrame({
331+ ' rt' : [10.0 , 20.0 , 30.0 , 40.0 ],
332+ ' intensity' : [1000.0 , 5000.0 , 3000.0 , 500.0 ]
333+ })
334+ chrom = Py_MSChromatogram.from_dataframe(
335+ df,
336+ mz = 445.12 ,
337+ name = " XIC m/z 445.12" ,
338+ native_id = " chromatogram=1"
339+ )
340+
341+ # Add to experiment
342+ exp.add_chromatogram(chrom)
343+
344+ # Chromatogram properties
345+ print (f " MZ: { chrom.mz:.4f } " )
346+ print (f " Max intensity: { chrom.max_intensity} " )
347+ print (f " RT at max: { chrom.rt[chrom.intensity.argmax()]:.2f } " )
348+
349+ # Get data as arrays
350+ rt, intensity = chrom.data
351+ # Or individually
352+ rt_values = chrom.rt
353+ intensity_values = chrom.intensity
354+
355+ # Convert to DataFrame
356+ chrom_df = chrom.to_dataframe()
357+
358+ # Filter chromatogram by RT
359+ filtered = chrom.filter_by_rt(min_rt = 15.0 , max_rt = 35.0 )
360+
361+ # Normalize intensities
362+ normalized = chrom.normalize_intensity(max_value = 100.0 )
363+ normalized_tic = chrom.normalize_to_tic()
364+
365+ # Metadata access
366+ chrom[" sample_id" ] = " Sample_A"
367+ chrom[" replicate" ] = 1
368+ print (chrom.get(" sample_id" ))
369+ ```
370+
302371## Workflow helpers
303372
304373` openms_python ` now exposes opinionated utilities that combine the primitive
@@ -665,6 +734,8 @@ plt.show()
665734
666735** Properties:**
667736- ` n_spectra ` : Number of spectra
737+ - ` nr_chromatograms ` : Number of chromatograms
738+ - ` chromatogram_count ` : Alias for nr_chromatograms
668739- ` rt_range ` : Tuple of (min_rt, max_rt)
669740- ` ms_levels ` : Set of MS levels present
670741
@@ -677,12 +748,42 @@ plt.show()
677748- ` ms2_spectra() ` : Iterator over MS2 spectra
678749- ` spectra_by_level(level) ` : Iterator over specific MS level
679750- ` spectra_in_rt_range(min_rt, max_rt) ` : Iterator over RT range
751+ - ` get_chromatogram(index) ` : Get chromatogram by index
752+ - ` chromatograms() ` : Iterator over all chromatograms
753+ - ` add_chromatogram(chromatogram) ` : Add a chromatogram to the experiment
680754- ` filter_by_ms_level(level) ` : Filter by MS level
681755- ` filter_by_rt(min_rt, max_rt) ` : Filter by RT range
682756- ` filter_top_n_peaks(n) ` : Keep top N peaks per spectrum
683757- ` summary() ` : Get summary statistics
684758- ` print_summary() ` : Print formatted summary
685759
760+ ### Py_MSChromatogram
761+
762+ ** Properties:**
763+ - ` mz ` : M/z value for the chromatogram
764+ - ` name ` : Chromatogram name
765+ - ` native_id ` : Native chromatogram ID
766+ - ` chromatogram_type ` : Type of chromatogram
767+ - ` rt_range ` : Tuple of (min_rt, max_rt)
768+ - ` min_rt ` : Minimum retention time
769+ - ` max_rt ` : Maximum retention time
770+ - ` min_intensity ` : Minimum intensity
771+ - ` max_intensity ` : Maximum intensity
772+ - ` total_ion_current ` : Sum of all intensities
773+ - ` data ` : Tuple of (rt_array, intensity_array)
774+ - ` rt ` : RT values as NumPy array
775+ - ` intensity ` : Intensity values as NumPy array
776+
777+ ** Methods:**
778+ - ` from_numpy(rt, intensity, **metadata) ` : Create from NumPy arrays (class method)
779+ - ` from_dataframe(df, **metadata) ` : Create from DataFrame (class method)
780+ - ` to_numpy() ` : Convert to NumPy arrays
781+ - ` to_dataframe() ` : Convert to DataFrame
782+ - ` filter_by_rt(min_rt, max_rt) ` : Filter data points by RT range
783+ - ` filter_by_intensity(min_intensity) ` : Filter by minimum intensity
784+ - ` normalize_intensity(max_value) ` : Normalize intensities to max value
785+ - ` normalize_to_tic() ` : Normalize so intensities sum to 1.0
786+
686787### Py_MSSpectrum
687788
688789** Properties:**
@@ -744,10 +845,13 @@ pip install -e ".[dev]"
744845| Feature | pyOpenMS | openms-python |
745846| ---------| ----------| ---------------|
746847| Get spectrum count | ` exp.getNrSpectra() ` | ` len(exp) ` |
848+ | Get chromatogram count | ` exp.getNrChromatograms() ` | ` exp.chromatogram_count ` |
747849| Get retention time | ` spec.getRT() ` | ` spec.retention_time ` |
850+ | Get chromatogram m/z | ` chrom.getMZ() ` | ` chrom.mz ` |
748851| Check MS1 | ` spec.getMSLevel() == 1 ` | ` spec.is_ms1 ` |
749852| Load file | ` MzMLFile().load(path, exp) ` | ` exp = MSExperiment.from_file(path) ` |
750853| Iterate MS1 | Manual loop + level check | ` for spec in exp.ms1_spectra(): ` |
854+ | Iterate chromatograms | Manual loop + range check | ` for chrom in exp.chromatograms(): ` |
751855| Peak data | ` peaks = spec.get_peaks(); mz = peaks[0] ` | ` mz, intensity = spec.peaks ` |
752856| DataFrame | Not available | ` df = exp.to_dataframe() ` |
753857
0 commit comments