2323from scipy import sparse as sp
2424from scipy .sparse import csgraph as cs
2525
26- from tmd .io .conversion import convert_morphio_soma
27- from tmd .io .conversion import convert_morphio_trees
26+ from tmd .io .conversion import convert_morphio_neuron
2827from tmd .io .h5 import read_h5
2928from tmd .io .swc import SWC_DCT
3029from tmd .io .swc import read_swc
@@ -75,7 +74,7 @@ def redefine_types(user_types=None):
7574 return final_tree_types
7675
7776
78- def load_neuron (
77+ def _load_neuron_internal (
7978 input_file , line_delimiter = "\n " , soma_type = None , user_tree_types = None , remove_duplicates = True
8079):
8180 """I/O method to load an swc or h5 file into a Neuron object."""
@@ -140,7 +139,7 @@ def load_neuron(
140139 return neuron
141140
142141
143- def load_neuron_from_morphio (path_or_obj , user_tree_types = None ):
142+ def _load_neuron_morphio (path_or_obj , user_tree_types = None ):
144143 """Create Neuron object from morphio object or from path loaded via morphio.
145144
146145 Supported file formats: h5, swc, asc.
@@ -164,20 +163,58 @@ def load_neuron_from_morphio(path_or_obj, user_tree_types=None):
164163 # MorphIO does not support naming of objects yet.
165164 filename = ""
166165
167- neuron = Neuron .Neuron ()
168- neuron .name = filename
169- neuron .set_soma (convert_morphio_soma (obj .soma ))
170- for tree in convert_morphio_trees (obj ):
171- neuron .append_tree (tree , tree_types )
166+ return convert_morphio_neuron (obj , tree_types , filename )
172167
173- return neuron
174168
169+ def load_neuron (
170+ input_file , user_tree_types = None , * , line_delimiter = "\n " , soma_type = None , remove_duplicates = True
171+ ):
172+ """I/O method to load an 'asc', 'h5' or 'swc' file into a Neuron object.
175173
176- def load_population (neurons , user_tree_types = None , name = None , use_morphio = False ):
174+ Args:
175+ input_file (Union[str, morphio.Morphology]):
176+ Filepath or morphio object
177+
178+ Returns:
179+ neuron (Neuron): tmd Neuron object
180+
181+ """
182+ ext = os .path .splitext (input_file )[- 1 ][1 :]
183+ if ext not in ("h5" , "swc" , "asc" ):
184+ raise ValueError ("The file extension must be in ['asc', 'h5', 'swc']" )
185+
186+ try :
187+ return _load_neuron_morphio (input_file , user_tree_types = user_tree_types )
188+ except Exception as morphio_exc :
189+ try :
190+ if ext not in ("h5" , "swc" ):
191+ raise ValueError ("The internal loader can only read '*.h5' and '*.swc' files." )
192+ neuron = _load_neuron_internal (
193+ input_file ,
194+ line_delimiter = line_delimiter ,
195+ soma_type = soma_type ,
196+ user_tree_types = user_tree_types ,
197+ remove_duplicates = remove_duplicates ,
198+ )
199+ warnings .warn (
200+ f"The file { input_file } was loaded using the internal loader because of a MorphIO "
201+ "failure."
202+ )
203+ return neuron
204+ except Exception as exc :
205+ raise exc from morphio_exc
206+
207+
208+ def load_population (neurons , user_tree_types = None , name = None , use_morphio = None ):
177209 """Load all data of recognised format (swc, h5) into a Population object.
178210
179211 Takes as input a directory or a list of files to load.
180212 """
213+ if use_morphio is not None :
214+ warnings .warn (
215+ "The 'use_morphio' parameter is deprecated as the internal loader is not only used "
216+ "when MorphIO fails."
217+ )
181218 if isinstance (neurons , (list , tuple )):
182219 files = neurons
183220 name = name if name is not None else "Population"
@@ -198,16 +235,7 @@ def load_population(neurons, user_tree_types=None, name=None, use_morphio=False)
198235
199236 for filename in files :
200237 try :
201- ext = os .path .splitext (filename )[- 1 ][1 :]
202- if not use_morphio :
203- assert ext in ("h5" , "swc" )
204- pop .append_neuron (load_neuron (filename , user_tree_types = user_tree_types ))
205- else :
206- assert ext in ("h5" , "swc" , "asc" )
207- pop .append_neuron (
208- load_neuron_from_morphio (filename , user_tree_types = user_tree_types )
209- )
210-
238+ pop .append_neuron (load_neuron (filename , user_tree_types = user_tree_types ))
211239 except AssertionError as exc :
212240 error_msg = "{} is not a valid h5, swc or asc file. If asc set use_morphio to True."
213241 raise Warning (error_msg .format (filename )) from exc
0 commit comments