masster 0.3.10__py3-none-any.whl → 0.3.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of masster might be problematic. Click here for more details.

masster/study/study.py CHANGED
@@ -95,9 +95,10 @@ from masster.study.plot import plot_alignment
95
95
  from masster.study.plot import plot_alignment_bokeh
96
96
  from masster.study.plot import plot_chrom
97
97
  from masster.study.plot import plot_consensus_2d
98
+ from masster.study.plot import plot_consensus_stats
99
+ from masster.study.plot import plot_pca
98
100
  from masster.study.plot import plot_samples_2d
99
101
  from masster.study.processing import align
100
- from masster.study.processing import filter_consensus
101
102
  from masster.study.processing import merge
102
103
  from masster.study.processing import integrate
103
104
  from masster.study.processing import find_ms2
@@ -170,7 +171,7 @@ class Study:
170
171
  - `ddafile`: For individual sample processing before study-level analysis.
171
172
  - `StudyParameters`: For configuring study-specific parameters.
172
173
  """
173
-
174
+
174
175
  # Defaults class attributes
175
176
  study_defaults = study_defaults
176
177
  sample_defaults = sample_defaults
@@ -219,15 +220,15 @@ class Study:
219
220
  # Handle filename parameter for automatic loading
220
221
  auto_load_filename = None
221
222
  if filename is not None:
222
- if not filename.endswith('.study5'):
223
+ if not filename.endswith(".study5"):
223
224
  raise ValueError("filename must be a .study5 file")
224
225
  if not os.path.exists(filename):
225
226
  raise FileNotFoundError(f"Study file not found: {filename}")
226
-
227
+
227
228
  # Set folder to the directory containing the file if not already specified
228
- if 'folder' not in kwargs:
229
- kwargs['folder'] = os.path.dirname(os.path.abspath(filename))
230
-
229
+ if "folder" not in kwargs:
230
+ kwargs["folder"] = os.path.dirname(os.path.abspath(filename))
231
+
231
232
  auto_load_filename = filename
232
233
 
233
234
  # Check if a study_defaults instance was passed
@@ -257,7 +258,7 @@ class Study:
257
258
  self.log_level = params.log_level.upper() if params.log_level else "INFO"
258
259
  self.log_label = params.log_label + " | " if params.log_label else ""
259
260
  self.log_sink = params.log_sink
260
-
261
+
261
262
  if self.folder is not None and not os.path.exists(self.folder):
262
263
  # create the folder if it does not exist
263
264
  os.makedirs(self.folder)
@@ -308,42 +309,42 @@ class Study:
308
309
  if auto_load_filename is not None:
309
310
  self.load(filename=auto_load_filename)
310
311
 
311
-
312
-
313
- # Attach module functions as class methods
312
+ # Attach module functions as class methods
314
313
  load = load
315
- save = save
316
- save_consensus = save_consensus
317
- save_samples = save_samples
318
- align = align
319
- fill_single = fill_single
314
+ save = save
315
+ save_consensus = save_consensus
316
+ save_samples = save_samples
317
+ align = align
318
+ fill_single = fill_single
320
319
  fill_chrom_single = fill_single # Backward compatibility alias
321
- merge = merge
320
+ merge = merge
322
321
  find_consensus = merge # Backward compatibility alias
323
- find_ms2 = find_ms2
322
+ find_ms2 = find_ms2
324
323
  integrate = integrate
325
324
  integrate_chrom = integrate # Backward compatibility alias
326
- store_history = store_history
327
- get_parameters = get_parameters
328
- update_parameters = update_parameters
329
- get_parameters_property = get_parameters_property
330
- set_parameters_property = set_parameters_property
331
- plot_alignment = plot_alignment
332
- plot_alignment_bokeh = plot_alignment_bokeh
333
- plot_chrom = plot_chrom
334
- plot_consensus_2d = plot_consensus_2d
335
- plot_samples_2d = plot_samples_2d
336
- get_consensus = get_consensus
337
- get_chrom = get_chrom
338
- get_consensus_matches = get_consensus_matches
339
- compress = compress
325
+ store_history = store_history
326
+ get_parameters = get_parameters
327
+ update_parameters = update_parameters
328
+ get_parameters_property = get_parameters_property
329
+ set_parameters_property = set_parameters_property
330
+ plot_alignment = plot_alignment
331
+ plot_alignment_bokeh = plot_alignment_bokeh
332
+ plot_chrom = plot_chrom
333
+ plot_consensus_2d = plot_consensus_2d
334
+ plot_consensus_stats = plot_consensus_stats
335
+ plot_pca = plot_pca
336
+ plot_samples_2d = plot_samples_2d
337
+ get_consensus = get_consensus
338
+ get_chrom = get_chrom
339
+ get_consensus_matches = get_consensus_matches
340
+ compress = compress
340
341
  compress_features = compress_features
341
342
  compress_ms2 = compress_ms2
342
343
  compress_chrom = compress_chrom
343
- restore_features = restore_features
344
+ restore_features = restore_features
344
345
  restore_chrom = restore_chrom
345
- fill_reset = fill_reset
346
- align_reset = align_reset
346
+ fill_reset = fill_reset
347
+ align_reset = align_reset
347
348
  set_source = set_source
348
349
  features_select = features_select
349
350
  features_filter = features_filter
@@ -351,37 +352,37 @@ class Study:
351
352
  consensus_select = consensus_select
352
353
  consensus_filter = consensus_filter
353
354
  consensus_delete = consensus_delete
354
- filter_consensus = consensus_filter
355
+ filter_consensus = consensus_filter
355
356
  select_consensus = consensus_select
356
357
  filter_features = features_filter
357
358
  select_features = features_select
358
359
  consensus_find = merge
359
- filter_features = features_filter
360
+ filter_features = features_filter
360
361
 
361
362
  # Additional method assignments for all imported functions
362
- add_folder = add # backward compatibility alias
363
- add = add
363
+ add_folder = add # backward compatibility alias
364
+ add = add
364
365
  add_sample = add_sample
365
- _load_study5 = _load_study5
366
- _save_study5 = _save_study5
367
- _save_study5_compressed = _save_study5_compressed
368
- _get_consensus_uids = _get_consensus_uids
369
- _get_feature_uids = _get_feature_uids
370
- _get_sample_uids = _get_sample_uids
371
- get_consensus_matrix = get_consensus_matrix
372
- get_gaps_matrix = get_gaps_matrix
373
- get_gaps_stats = get_gaps_stats
366
+ _load_study5 = _load_study5
367
+ _save_study5 = _save_study5
368
+ _save_study5_compressed = _save_study5_compressed
369
+ _get_consensus_uids = _get_consensus_uids
370
+ _get_feature_uids = _get_feature_uids
371
+ _get_sample_uids = _get_sample_uids
372
+ get_consensus_matrix = get_consensus_matrix
373
+ get_gaps_matrix = get_gaps_matrix
374
+ get_gaps_stats = get_gaps_stats
374
375
  get_orphans = get_orphans
375
- set_folder = set_folder
376
- fill = fill
376
+ set_folder = set_folder
377
+ fill = fill
377
378
  fill_chrom = fill # Backward compatibility alias
378
- _process_sample_for_parallel_fill = _process_sample_for_parallel_fill
379
- _get_missing_consensus_sample_combinations = _get_missing_consensus_sample_combinations
380
- _load_consensusXML = _load_consensusXML
381
- load_features = load_features
382
- sanitize = sanitize
383
- _save_consensusXML = _save_consensusXML
384
- export_mgf = export_mgf
379
+ _process_sample_for_parallel_fill = _process_sample_for_parallel_fill
380
+ _get_missing_consensus_sample_combinations = _get_missing_consensus_sample_combinations
381
+ _load_consensusXML = _load_consensusXML
382
+ load_features = load_features
383
+ sanitize = sanitize
384
+ _save_consensusXML = _save_consensusXML
385
+ export_mgf = export_mgf
385
386
  export_mztab = export_mztab
386
387
  _get_mgf_df = _get_mgf_df # New function for MGF data extraction
387
388
 
@@ -404,13 +405,13 @@ class Study:
404
405
  This ensures that the instance uses the latest implementation without restarting the interpreter.
405
406
  """
406
407
  # Reset logger configuration flags to allow proper reconfiguration after reload
407
- ''' try:
408
+ """ try:
408
409
  import masster.sample.logger as logger_module
409
410
 
410
411
  if hasattr(logger_module, "_STUDY_LOGGER_CONFIGURED"):
411
412
  logger_module._STUDY_LOGGER_CONFIGURED = False
412
413
  except Exception:
413
- pass'''
414
+ pass"""
414
415
 
415
416
  # Get the base module name (masster)
416
417
  base_modname = self.__class__.__module__.split(".")[0]
@@ -508,7 +509,7 @@ class Study:
508
509
  # Cache DataFrame lengths and existence checks
509
510
  consensus_df_len = len(self.consensus_df) if not self.consensus_df.is_empty() else 0
510
511
  samples_df_len = len(self.samples_df) if not self.samples_df.is_empty() else 0
511
-
512
+
512
513
  # Calculate consensus statistics only if consensus_df exists and has data
513
514
  if consensus_df_len > 0:
514
515
  # Execute the aggregation once
@@ -525,40 +526,44 @@ class Study:
525
526
  min_samples = 0
526
527
  mean_samples = 0
527
528
  max_samples = 0
528
-
529
+
529
530
  # Count only features where 'filled' == False
530
- if not self.features_df.is_empty() and 'filled' in self.features_df.columns:
531
- unfilled_features_count = self.features_df.filter(~self.features_df['filled']).height
531
+ if not self.features_df.is_empty() and "filled" in self.features_df.columns:
532
+ unfilled_features_count = self.features_df.filter(~self.features_df["filled"]).height
532
533
  else:
533
534
  unfilled_features_count = 0
534
535
 
535
536
  # Calculate features in consensus vs not in consensus (only for unfilled features)
536
537
  if not self.features_df.is_empty() and not self.consensus_mapping_df.is_empty():
537
538
  # Get unfilled features only
538
- unfilled_features = self.features_df.filter(~self.features_df['filled']) if 'filled' in self.features_df.columns else self.features_df
539
-
539
+ unfilled_features = (
540
+ self.features_df.filter(~self.features_df["filled"])
541
+ if "filled" in self.features_df.columns
542
+ else self.features_df
543
+ )
544
+
540
545
  # Ensure the column and list have matching data types
541
- consensus_feature_uids = self.consensus_mapping_df['feature_uid'].to_list()
542
-
546
+ consensus_feature_uids = self.consensus_mapping_df["feature_uid"].to_list()
547
+
543
548
  # Check if we need to cast either side to match types
544
- unfilled_dtype = unfilled_features['feature_uid'].dtype
545
- consensus_dtype = self.consensus_mapping_df['feature_uid'].dtype
546
-
549
+ unfilled_dtype = unfilled_features["feature_uid"].dtype
550
+ consensus_dtype = self.consensus_mapping_df["feature_uid"].dtype
551
+
547
552
  if unfilled_dtype != consensus_dtype:
548
553
  # Cast both to Int64 if possible, otherwise keep as string
549
554
  try:
550
- unfilled_features = unfilled_features.with_columns(pl.col('feature_uid').cast(pl.Int64))
555
+ unfilled_features = unfilled_features.with_columns(pl.col("feature_uid").cast(pl.Int64))
551
556
  consensus_feature_uids = [int(uid) for uid in consensus_feature_uids]
552
557
  except Exception:
553
558
  # If casting fails, ensure both are strings
554
- unfilled_features = unfilled_features.with_columns(pl.col('feature_uid').cast(pl.Utf8))
559
+ unfilled_features = unfilled_features.with_columns(pl.col("feature_uid").cast(pl.Utf8))
555
560
  consensus_feature_uids = [str(uid) for uid in consensus_feature_uids]
556
561
 
557
562
  # Count unfilled features that are in consensus
558
563
  in_consensus_count = unfilled_features.filter(
559
- pl.col('feature_uid').is_in(consensus_feature_uids)
564
+ pl.col("feature_uid").is_in(consensus_feature_uids),
560
565
  ).height
561
-
566
+
562
567
  # Calculate ratios that sum to 100%
563
568
  total_unfilled = unfilled_features.height
564
569
  ratio_in_consensus_to_total = (in_consensus_count / total_unfilled * 100) if total_unfilled > 0 else 0
@@ -572,16 +577,20 @@ class Study:
572
577
  # Ensure matching data types for join keys
573
578
  features_dtype = self.features_df["feature_uid"].dtype
574
579
  consensus_dtype = self.consensus_mapping_df["feature_uid"].dtype
575
-
580
+
576
581
  if features_dtype != consensus_dtype:
577
582
  # Try to cast both to Int64, fallback to string if needed
578
583
  try:
579
584
  self.features_df = self.features_df.with_columns(pl.col("feature_uid").cast(pl.Int64))
580
- self.consensus_mapping_df = self.consensus_mapping_df.with_columns(pl.col("feature_uid").cast(pl.Int64))
585
+ self.consensus_mapping_df = self.consensus_mapping_df.with_columns(
586
+ pl.col("feature_uid").cast(pl.Int64)
587
+ )
581
588
  except Exception:
582
589
  # If casting to Int64 fails, cast both to string
583
590
  self.features_df = self.features_df.with_columns(pl.col("feature_uid").cast(pl.Utf8))
584
- self.consensus_mapping_df = self.consensus_mapping_df.with_columns(pl.col("feature_uid").cast(pl.Utf8))
591
+ self.consensus_mapping_df = self.consensus_mapping_df.with_columns(
592
+ pl.col("feature_uid").cast(pl.Utf8)
593
+ )
585
594
 
586
595
  # Use more efficient counting - count non-null chroms only for features in consensus mapping
587
596
  if not self.consensus_mapping_df.is_empty():
@@ -599,21 +608,21 @@ class Study:
599
608
  else:
600
609
  non_null_chroms = 0
601
610
  total_possible = samples_df_len * consensus_df_len
602
- chrom_completeness = (
603
- non_null_chroms / total_possible if total_possible > 0 else 0
604
- )
611
+ chrom_completeness = non_null_chroms / total_possible if total_possible > 0 else 0
605
612
  else:
606
613
  chrom_completeness = 0
607
-
614
+
608
615
  # Calculate consensus features with MS2 (count unique consensus_uids with MS2)
609
616
  if not self.consensus_ms2.is_empty():
610
617
  consensus_with_ms2_count = self.consensus_ms2["consensus_uid"].n_unique()
611
618
  else:
612
619
  consensus_with_ms2_count = 0
613
-
620
+
614
621
  # Calculate percentage of consensus features with MS2
615
- consensus_with_ms2_percentage = (consensus_with_ms2_count / consensus_df_len * 100) if consensus_df_len > 0 else 0
616
-
622
+ consensus_with_ms2_percentage = (
623
+ (consensus_with_ms2_count / consensus_df_len * 100) if consensus_df_len > 0 else 0
624
+ )
625
+
617
626
  # Total MS2 spectra count
618
627
  total_ms2_count = len(self.consensus_ms2) if not self.consensus_ms2.is_empty() else 0
619
628
 
@@ -632,15 +641,15 @@ class Study:
632
641
  f"Samples: {samples_df_len}\n"
633
642
  f"Features: {unfilled_features_count}\n"
634
643
  f"- in consensus: {ratio_in_consensus_to_total:.0f}%\n"
635
- f"- not in consensus: {ratio_not_in_consensus_to_total:.0f}%\n"
644
+ f"- not in consensus: {ratio_not_in_consensus_to_total:.0f}%\n"
636
645
  f"Consensus: {consensus_df_len}\n"
637
646
  f"- Min samples count: {min_samples:.0f}\n"
638
647
  f"- Mean samples count: {mean_samples:.0f}\n"
639
- f"- Max samples count: {max_samples:.0f}\n"
648
+ f"- Max samples count: {max_samples:.0f}\n"
640
649
  f"- with MS2: {consensus_with_ms2_percentage:.0f}%\n"
641
650
  f"- total MS2: {total_ms2_count}\n"
642
- f"Chrom completeness: {chrom_completeness*100:.0f}%\n"
643
- f"Memory usage: {memory_usage / (1024 ** 2):.2f} MB\n"
651
+ f"Chrom completeness: {chrom_completeness * 100:.0f}%\n"
652
+ f"Memory usage: {memory_usage / (1024**2):.2f} MB\n"
644
653
  )
645
654
 
646
655
  print(summary)
@@ -1,43 +1,43 @@
1
1
  {
2
2
  "consensus_df": {
3
3
  "columns": {
4
- "consensus_uid": {
5
- "dtype": "pl.Int64"
6
- },
7
- "consensus_id": {
8
- "dtype": "pl.Utf8"
4
+ "adducts": {
5
+ "dtype": "pl.Object"
9
6
  },
10
- "quality": {
7
+ "bl": {
11
8
  "dtype": "pl.Float64"
12
9
  },
13
- "number_samples": {
14
- "dtype": "pl.Int64"
15
- },
16
- "rt": {
10
+ "charge_mean": {
17
11
  "dtype": "pl.Float64"
18
12
  },
19
- "mz": {
13
+ "chrom_coherence_mean": {
20
14
  "dtype": "pl.Float64"
21
15
  },
22
- "rt_min": {
16
+ "chrom_height_scaled_mean": {
23
17
  "dtype": "pl.Float64"
24
18
  },
25
- "rt_max": {
19
+ "chrom_prominence_mean": {
26
20
  "dtype": "pl.Float64"
27
21
  },
28
- "rt_mean": {
22
+ "chrom_prominence_scaled_mean": {
29
23
  "dtype": "pl.Float64"
30
24
  },
31
- "rt_start_mean": {
25
+ "consensus_id": {
26
+ "dtype": "pl.Utf8"
27
+ },
28
+ "consensus_uid": {
29
+ "dtype": "pl.Int64"
30
+ },
31
+ "inty_mean": {
32
32
  "dtype": "pl.Float64"
33
33
  },
34
- "rt_end_mean": {
34
+ "iso_mean": {
35
35
  "dtype": "pl.Float64"
36
36
  },
37
- "rt_delta_mean": {
37
+ "mz": {
38
38
  "dtype": "pl.Float64"
39
39
  },
40
- "mz_min": {
40
+ "mz_end_mean": {
41
41
  "dtype": "pl.Float64"
42
42
  },
43
43
  "mz_max": {
@@ -46,41 +46,41 @@
46
46
  "mz_mean": {
47
47
  "dtype": "pl.Float64"
48
48
  },
49
- "mz_start_mean": {
49
+ "mz_min": {
50
50
  "dtype": "pl.Float64"
51
51
  },
52
- "mz_end_mean": {
52
+ "mz_start_mean": {
53
53
  "dtype": "pl.Float64"
54
54
  },
55
- "inty_mean": {
56
- "dtype": "pl.Float64"
55
+ "number_ms2": {
56
+ "dtype": "pl.Int64"
57
57
  },
58
- "bl": {
59
- "dtype": "pl.Float64"
58
+ "number_samples": {
59
+ "dtype": "pl.Int64"
60
60
  },
61
- "chrom_coherence_mean": {
61
+ "quality": {
62
62
  "dtype": "pl.Float64"
63
63
  },
64
- "chrom_prominence_mean": {
64
+ "rt": {
65
65
  "dtype": "pl.Float64"
66
66
  },
67
- "chrom_prominence_scaled_mean": {
67
+ "rt_delta_mean": {
68
68
  "dtype": "pl.Float64"
69
69
  },
70
- "chrom_height_scaled_mean": {
70
+ "rt_end_mean": {
71
71
  "dtype": "pl.Float64"
72
72
  },
73
- "iso_mean": {
73
+ "rt_max": {
74
74
  "dtype": "pl.Float64"
75
75
  },
76
- "charge_mean": {
76
+ "rt_mean": {
77
77
  "dtype": "pl.Float64"
78
78
  },
79
- "number_ms2": {
80
- "dtype": "pl.Int64"
79
+ "rt_min": {
80
+ "dtype": "pl.Float64"
81
81
  },
82
- "adducts": {
83
- "dtype": "pl.Object"
82
+ "rt_start_mean": {
83
+ "dtype": "pl.Float64"
84
84
  }
85
85
  }
86
86
  },
@@ -133,106 +133,112 @@
133
133
  },
134
134
  "features_df": {
135
135
  "columns": {
136
- "feature_uid": {
136
+ "adduct": {
137
+ "dtype": "pl.Utf8"
138
+ },
139
+ "adduct_group": {
137
140
  "dtype": "pl.Int64"
138
141
  },
139
- "sample_uid": {
142
+ "adduct_mass": {
143
+ "dtype": "pl.Float64"
144
+ },
145
+ "charge": {
140
146
  "dtype": "pl.Int32"
141
147
  },
142
- "feature_id": {
143
- "dtype": "pl.Utf8"
148
+ "chrom": {
149
+ "dtype": "pl.Object"
144
150
  },
145
- "mz": {
151
+ "chrom_area": {
146
152
  "dtype": "pl.Float64"
147
153
  },
148
- "rt": {
154
+ "chrom_coherence": {
149
155
  "dtype": "pl.Float64"
150
156
  },
151
- "rt_original": {
157
+ "chrom_height_scaled": {
152
158
  "dtype": "pl.Float64"
153
159
  },
154
- "rt_start": {
160
+ "chrom_prominence": {
155
161
  "dtype": "pl.Float64"
156
162
  },
157
- "rt_end": {
163
+ "chrom_prominence_scaled": {
158
164
  "dtype": "pl.Float64"
159
165
  },
160
- "rt_delta": {
161
- "dtype": "pl.Float64"
166
+ "feature_id": {
167
+ "dtype": "pl.Utf8"
162
168
  },
163
- "mz_start": {
164
- "dtype": "pl.Float64"
169
+ "feature_uid": {
170
+ "dtype": "pl.Int64"
165
171
  },
166
- "mz_end": {
167
- "dtype": "pl.Float64"
172
+ "filled": {
173
+ "dtype": "pl.Boolean"
168
174
  },
169
175
  "inty": {
170
176
  "dtype": "pl.Float64"
171
177
  },
172
- "quality": {
173
- "dtype": "pl.Float64"
174
- },
175
- "charge": {
176
- "dtype": "pl.Int32"
177
- },
178
178
  "iso": {
179
179
  "dtype": "pl.Int64"
180
180
  },
181
181
  "iso_of": {
182
182
  "dtype": "pl.Int64"
183
183
  },
184
- "adduct_group": {
185
- "dtype": "pl.Int64"
184
+ "ms2_scans": {
185
+ "dtype": "pl.Object"
186
186
  },
187
- "adduct": {
188
- "dtype": "pl.Utf8"
187
+ "ms2_specs": {
188
+ "dtype": "pl.Object"
189
189
  },
190
- "adduct_mass": {
190
+ "mz": {
191
191
  "dtype": "pl.Float64"
192
192
  },
193
- "filled": {
194
- "dtype": "pl.Boolean"
193
+ "mz_end": {
194
+ "dtype": "pl.Float64"
195
195
  },
196
- "chrom_area": {
196
+ "mz_start": {
197
197
  "dtype": "pl.Float64"
198
198
  },
199
- "chrom": {
200
- "dtype": "pl.Object"
199
+ "quality": {
200
+ "dtype": "pl.Float64"
201
201
  },
202
- "chrom_coherence": {
202
+ "rt": {
203
203
  "dtype": "pl.Float64"
204
204
  },
205
- "chrom_prominence": {
205
+ "rt_delta": {
206
206
  "dtype": "pl.Float64"
207
207
  },
208
- "chrom_prominence_scaled": {
208
+ "rt_end": {
209
209
  "dtype": "pl.Float64"
210
210
  },
211
- "chrom_height_scaled": {
211
+ "rt_original": {
212
212
  "dtype": "pl.Float64"
213
213
  },
214
- "ms2_scans": {
215
- "dtype": "pl.Object"
214
+ "rt_start": {
215
+ "dtype": "pl.Float64"
216
216
  },
217
- "ms2_specs": {
218
- "dtype": "pl.Object"
217
+ "sample_uid": {
218
+ "dtype": "pl.Int32"
219
219
  }
220
220
  }
221
221
  },
222
222
  "samples_df": {
223
223
  "columns": {
224
+ "file_source": {
225
+ "dtype": "pl.Utf8"
226
+ },
224
227
  "map_id": {
225
228
  "dtype": "pl.Utf8"
226
229
  },
230
+ "ms1": {
231
+ "dtype": "pl.Int64"
232
+ },
233
+ "ms2": {
234
+ "dtype": "pl.Int64"
235
+ },
227
236
  "sample_name": {
228
237
  "dtype": "pl.Utf8"
229
238
  },
230
239
  "sample_path": {
231
240
  "dtype": "pl.Utf8"
232
241
  },
233
- "file_source": {
234
- "dtype": "pl.Utf8"
235
- },
236
242
  "sample_type": {
237
243
  "dtype": "pl.Utf8"
238
244
  },
@@ -241,12 +247,6 @@
241
247
  },
242
248
  "size": {
243
249
  "dtype": "pl.Int64"
244
- },
245
- "ms1": {
246
- "dtype": "pl.Int64"
247
- },
248
- "ms2": {
249
- "dtype": "pl.Int64"
250
250
  }
251
251
  }
252
252
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: masster
3
- Version: 0.3.10
3
+ Version: 0.3.11
4
4
  Summary: Mass spectrometry data analysis package
5
5
  Project-URL: homepage, https://github.com/zamboni-lab/masster
6
6
  Project-URL: repository, https://github.com/zamboni-lab/masster