99import itertools
1010import json
1111import logging
12- import os
1312import re
1413import uuid
1514from abc import ABC
2019from numbers import Number
2120
2221import networkx as nx
23- import yaml
2422
2523from isatools .create import errors
2624from isatools .create .constants import (
5755 WASHOUT ,
5856 ZFILL_WIDTH ,
5957 assays_opts ,
58+ get_study_creator_config ,
6059)
6160from isatools .model import (
6261 AcquisitionParameterDataFile ,
9897
9998__author__ = "massi"
10099
100+ _ALLOWED_DATA_FILE_CLASSES = {
101+ RawDataFile ,
102+ RawSpectralDataFile ,
103+ ArrayDataFile ,
104+ FreeInductionDecayDataFile ,
105+ DerivedDataFile ,
106+ DerivedSpectralDataFile ,
107+ DerivedArrayDataFile ,
108+ ProteinAssignmentFile ,
109+ PeptideAssignmentFile ,
110+ DerivedArrayDataMatrixFile ,
111+ PostTranslationalModificationAssignmentFile ,
112+ AcquisitionParameterDataFile ,
113+ }
114+
115+ _DATA_FILE_CLASS_BY_NAME = {cls .__name__ : cls for cls in _ALLOWED_DATA_FILE_CLASSES }
116+
101117
102118def intersperse (lst , item ):
103119 """
@@ -215,8 +231,9 @@ def duration(self):
215231 def update_duration (self , duration_value , duration_unit = None ):
216232 if not isinstance (duration_value , Number ):
217233 raise ValueError ("duration_value must be a Number. Value provided is {0}" .format (duration_value ))
218- self .__duration .value = duration_value
219- self .__duration .unit = duration_unit
234+ duration_factor_value = self .duration
235+ duration_factor_value .value = duration_value
236+ duration_factor_value .unit = duration_unit
220237
221238
222239class Treatment (Element ):
@@ -298,8 +315,9 @@ def duration(self):
298315 def update_duration (self , duration_value , duration_unit = None ):
299316 if not isinstance (duration_value , Number ):
300317 raise ValueError ("duration_value must be a Number. Value provided is {0}" .format (duration_value ))
301- self .__duration .value = duration_value
302- self .__duration .unit = duration_unit
318+ duration_factor_value = self .duration
319+ duration_factor_value .value = duration_value
320+ duration_factor_value .unit = duration_unit
303321
304322
305323class StudyCell (object ):
@@ -2509,8 +2527,14 @@ def _generate_isa_elements_from_node(
25092527 for process in processes [::- 1 ]
25102528 if process .executes_protocol == previous_protocol_node
25112529 )
2512- assert isinstance (previous_process , Process )
2513- assert isinstance (item , Process )
2530+ if not isinstance (previous_process , Process ):
2531+ raise TypeError (
2532+ "Expected Process instance for previous_process, got {}" .format (
2533+ type (previous_process ).__name__
2534+ )
2535+ )
2536+ if not isinstance (item , Process ):
2537+ raise TypeError ("Expected Process instance for item, got {}" .format (type (item ).__name__ ))
25142538 log .debug ("linking process {0} to process {1}" .format (previous_process .name , item .name ))
25152539 plink (previous_process , item ) # TODO check if this generates any issue
25162540
@@ -2530,8 +2554,14 @@ def _generate_isa_elements_from_node(
25302554 for process in processes [::- 1 ]
25312555 if process .executes_protocol == previous_protocol_node
25322556 )
2533- assert isinstance (previous_process , Process )
2534- assert isinstance (item , Process )
2557+ if not isinstance (previous_process , Process ):
2558+ raise TypeError (
2559+ "Expected Process instance for previous_process, got {}" .format (
2560+ type (previous_process ).__name__
2561+ )
2562+ )
2563+ if not isinstance (item , Process ):
2564+ raise TypeError ("Expected Process instance for item, got {}" .format (type (item ).__name__ ))
25352565 log .debug ("linking process {0} to process {1}" .format (previous_process .name , item .name ))
25362566 plink (previous_process , item ) # TODO check if this generates any issue
25372567 return processes , other_materials , characteristic_categories , data_files , item , counter
@@ -2675,22 +2705,8 @@ def _isa_objects_factory(
26752705 log .debug (
26762706 "Assay conf. found: {}; {}; {};" .format (measurement_type , technology_type , curr_assay_opt )
26772707 )
2678- isa_class = globals ()[curr_assay_opt ["raw data file" ].replace (" " , "" )]
2679- assert isa_class in {
2680- # expand this set if needed
2681- RawDataFile ,
2682- RawSpectralDataFile ,
2683- ArrayDataFile ,
2684- FreeInductionDecayDataFile ,
2685- DerivedDataFile ,
2686- DerivedSpectralDataFile ,
2687- DerivedArrayDataFile ,
2688- ProteinAssignmentFile ,
2689- PeptideAssignmentFile ,
2690- DerivedArrayDataMatrixFile ,
2691- PostTranslationalModificationAssignmentFile ,
2692- AcquisitionParameterDataFile ,
2693- }
2708+ raw_data_file_name = curr_assay_opt ["raw data file" ].replace (" " , "" )
2709+ isa_class = _DATA_FILE_CLASS_BY_NAME .get (raw_data_file_name , RawDataFile )
26942710 file_extension = ".{}" .format (node .extension ) if node .extension else ""
26952711 return isa_class (
26962712 filename = "{}_S{}_DAE_R{}_{}{}" .format (
@@ -2710,12 +2726,7 @@ def generate_isa_study(self, identifier=None):
27102726 this is the core method to return the fully populated ISA Study object from the StudyDesign
27112727 :return: isatools.model.Study
27122728 """
2713- with open (
2714- os .path .join (os .path .dirname (__file__ ), ".." , "resources" , "config" , "yaml" , "study-creator-config.yml" )
2715- ) as yaml_file :
2716- config = yaml .load (yaml_file , Loader = yaml .FullLoader )
2717-
2718- study_config = config ["study" ]
2729+ study_config = get_study_creator_config ()["study" ]
27192730 study = Study (
27202731 identifier = self .identifier or identifier or DEFAULT_STUDY_IDENTIFIER ,
27212732 title = self .name ,
@@ -2808,7 +2819,8 @@ def augment_study(cls, study, study_design, in_place=False):
28082819 :param in_place: boolean
28092820 :return:
28102821 """
2811- assert isinstance (in_place , bool )
2822+ if not isinstance (in_place , bool ):
2823+ raise TypeError ("in_place must be a boolean" )
28122824 if not isinstance (study , Study ):
28132825 raise TypeError ("study must be a valid Study object" )
28142826 if not isinstance (study_design , StudyDesign ):
@@ -2818,7 +2830,8 @@ def augment_study(cls, study, study_design, in_place=False):
28182830 for cell , study_assay_plan in arm .arm_map .items ():
28192831 if study_assay_plan :
28202832 for assay_graph in study_assay_plan .assay_plan :
2821- assert isinstance (assay_graph , AssayGraph )
2833+ if not isinstance (assay_graph , AssayGraph ):
2834+ raise TypeError ("assay_graph must be a valid AssayGraph object" )
28222835 if assay_graph .quality_control :
28232836 # CHECK the assumption here is that an assay file can unequivocally be identified
28242837 # by StudyCell name, corresponding AssayGraph id and measurement type
@@ -2929,7 +2942,8 @@ def _generate_quality_control_samples(
29292942 if not isinstance (quality_control , QualityControl ):
29302943 raise TypeError ()
29312944 qc_pre = quality_control .pre_run_sample_type
2932- assert isinstance (qc_pre , ProductNode )
2945+ if not isinstance (qc_pre , ProductNode ):
2946+ raise TypeError ("quality_control.pre_run_sample_type must be a ProductNode" )
29332947 cell_name = study_cell .name
29342948 for i in range (qc_pre .size ):
29352949 dummy_source = QualityControlSource (
@@ -2976,7 +2990,8 @@ def _generate_quality_control_samples(
29762990 qc_samples_interspersed [(sample_node , interspersing_interval )].append (sample )
29772991 log .debug ("Completed interspersed samples" )
29782992 qc_post = quality_control .post_run_sample_type
2979- assert isinstance (qc_post , ProductNode )
2993+ if not isinstance (qc_post , ProductNode ):
2994+ raise TypeError ("quality_control.post_run_sample_type must be a ProductNode" )
29802995 for i in range (qc_post .size ):
29812996 dummy_source = QualityControlSource (
29822997 name = "SRC-QC-POST_{}_{}_{}" .format (cell_name , SOURCE_QC_SOURCE_NAME , str (i ).zfill (4 ))
@@ -2986,7 +3001,7 @@ def _generate_quality_control_samples(
29863001 name = "SMP-QC-POST-{}_{}_{}" .format (cell_name , QC_SAMPLE_NAME , str (i ).zfill (4 )),
29873002 factor_values = [],
29883003 characteristics = [
2989- qc_post .characteristics if i < len (qc_post .characteristics ) else qc_post .characteristics [- 1 ]
3004+ qc_post .characteristics [ i ] if i < len (qc_post .characteristics ) else qc_post .characteristics [- 1 ]
29903005 ],
29913006 derives_from = [dummy_source ],
29923007 )
0 commit comments