diff --git a/.gitignore b/.gitignore index e5feaf7..ef80bb4 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,5 @@ z_toDo.txt +pykneer/.ipynb_checkpoints/* +.ipynb_checkpoints/README-checkpoint.md diff --git a/README.md b/README.md index 0757c83..14a4e90 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,7 @@ - Documentation at [sbonaretti.github.io/pykneer/](https://sbonaretti.github.io/pyKNEEr/) - Paper: *S. Bonaretti ,G.E. Gold, G.S. Beaupre [pyKNEEr: An image analysis workflow for open and reproducible research on femoral knee cartilage](https://journals.plos.org/plosone/article/metrics?id=10.1371/journal.pone.0226501) Plos one 15.1 (2020): e0226501.* -- Release on Zenodo (with DOI for citation): [![DOI](https://zenodo.org/badge/155445441.svg)](https://zenodo.org/badge/latestdoi/155445441) - +- Release on Zenodo (with DOI for citation): [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3607322.svg)](https://doi.org/10.5281/zenodo.3607322) --- ### Contributors @@ -26,18 +25,24 @@ Project and new code: - [Serena Bonaretti](https://sbonaretti.github.io/) Open source code included in pyKNEEr: -- [intensity preprocessing](https://bitbucket.org/marcniethammer/ksrt/src) by Liang Shan and [Marc Niethammer](http://wwwx.cs.unc.edu/~mn/?q=content/overview) +- [Intensity preprocessing](https://bitbucket.org/marcniethammer/ksrt/src) by Liang Shan and [Marc Niethammer](http://wwwx.cs.unc.edu/~mn/?q=content/overview) - [Elastix](https://github.com/SuperElastix/elastix) for registration in atlas-based segmentation by [Stefan Klein](http://bigr.nl/people/StefanKlein/) - Cylinder fitting for cartilage flattening by https://github.com/xingjiepan/cylinder_fitting User feedbacks and suggestions for improvements: - Tijmen Van Zadelhoff - Piyush Kumar Prajapati - +- Tadiwa Waungana + --- ### Changelog +*v 0.0.6.3*: +(Complicated version number due to issues while uploading to Pypi) +- Substituted the filter `sitk.BinaryDilate()` with the filter `sitk.BinaryDilateImageFilter()` in the function `dilate_mask()` of the module `sitk_functions` (-> Closure of issues 13 and 15) +- Added `raise FileNotFoundError` in the `elastix_transformix` module to provide feedback during the registration process + *v 0.0.5*: - Solved ITK bug about the Orient function in preprocessing - different way to set direction in ITK4.13 - Added option to show images with slider in notebooks diff --git a/pykneer/pykneer/elastix_transformix.py b/pykneer/pykneer/elastix_transformix.py index f4a5f02..7800f98 100644 --- a/pykneer/pykneer/elastix_transformix.py +++ b/pykneer/pykneer/elastix_transformix.py @@ -123,16 +123,16 @@ def modify_transformation(self, image_data, transformation): input_file_name = image_data["i_registered_sub_folder"] + image_data[anatomy + "i_spline_transf_name"] output_file_name = image_data["i_registered_sub_folder"] + image_data[anatomy + "m_spline_transf_name"] else: - print("----------------------------------------------------------------------------------------") - print("ERROR: This transformation is not supported. Use 'rigid', 'similarity', or 'spline'") - print("----------------------------------------------------------------------------------------") + print("----------------------------------------------------------------------------------------", flush = True) # flush = True needed to print in multiprocessing.Pool() + print("ERROR: This transformation is not supported. Use 'rigid', 'similarity', or 'spline'", flush = True) + print("----------------------------------------------------------------------------------------", flush = True) return # check if transformation file exists if not os.path.exists(input_file_name): - print("----------------------------------------------------------------------------------------") - print("ERROR: The file %s does not exist" % (input_file_name) ) - print("----------------------------------------------------------------------------------------") + print("----------------------------------------------------------------------------------------", flush = True) + print("ERROR: The file %s does not exist" % (input_file_name), flush = True ) + print("----------------------------------------------------------------------------------------", flush = True) return # read the file and modify the needed lines @@ -159,7 +159,7 @@ def modify_transformation(self, image_data, transformation): # --------------------------------------------------------------------------------------------------------------------------- -# BONE INSTANCE ------------------------------------------------------------------------------------------------------------- +# BONE ---------------------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------------------------- class bone (registration): @@ -182,7 +182,7 @@ def rigid(self, image_data): complete_elastix_path = image_data["complete_elastix_path"] # execute registration - # print (" Rigid registration") + # print (" Rigid registration", flush = True) # os.path.abspath because working directory is where elastix is in pykneer, so images need whole path, not only relative cmd = [complete_elastix_path, "-f", os.path.abspath(complete_reference_name), "-fMask", os.path.abspath(complete_reference_mask_dil_name), @@ -195,35 +195,33 @@ def rigid(self, image_data): # check if the registration worked # if the registration did not work if not os.path.exists(image_data["registered_sub_folder"] + "result.0.mha"): - print("-------------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.rigid()") - print("-------------------------------------------------------------------------------------------") - + # print out possible errors # elastix not in system output = test_elastix() if output == 0: - print ("-> elastix correctly installed") - print ("complete_elastix_path : " + complete_elastix_path) - print ("complete_reference_name : " + complete_reference_name) - print ("complete_reference_mask_dil_name: " + complete_reference_mask_dil_name) - print ("complete_moving_name : " + complete_moving_name) - print ("params : " + params) - print ("output_folder : " + output_folder) + print ("-> elastix correctly installed", flush = True) + print ("complete_elastix_path : " + complete_elastix_path, flush = True) + print ("complete_reference_name : " + complete_reference_name, flush = True) + print ("complete_reference_mask_dil_name: " + complete_reference_mask_dil_name, flush = True) + print ("complete_moving_name : " + complete_moving_name, flush = True) + print ("params : " + params, flush = True) + print ("output_folder : " + output_folder, flush = True) else: - print ("-> elastix not installed. Error message is: " + output) - print (" You might need to set Elastix environmental variables separately. To do so, go to pyKNEEr documentation here: https://sbonaretti.github.io/pyKNEEr/faq.html#elastix") - - - + print ("-> elastix not installed. Error message is: " + output, flush = True) + print (" You might need to set Elastix environmental variables separately. To do so, go to pyKNEEr documentation here: https://sbonaretti.github.io/pyKNEEr/faq.html#elastix", flush = True) - return + raise FileNotFoundError ("No output created in bone.rigid()") + # change output names else: os.rename(image_data["registered_sub_folder"] + "result.0.mha", image_data["registered_sub_folder"] + image_data[anatomy + "rigid_name"]) os.rename(image_data["registered_sub_folder"] + "TransformParameters.0.txt", image_data["registered_sub_folder"] + image_data[anatomy + "rigid_transf_name"]) + # make sure the image was written + if not os.path.exists(image_data["registered_sub_folder"] + image_data[anatomy + "rigid_name"]): + raise FileNotFoundError (image_data["registered_sub_folder"] + image_data[anatomy + "rigid_name"] + " not written in bone.rigid()") def similarity(self, image_data): @@ -243,7 +241,7 @@ def similarity(self, image_data): complete_elastix_path = image_data["complete_elastix_path"] # execute registration - #print (" Similarity registration") + #print (" Similarity registration", flush = True) cmd = [complete_elastix_path, "-f", os.path.abspath(complete_reference_name), "-fMask", os.path.abspath(complete_reference_mask_dil_name), "-m", os.path.abspath(complete_moving_name), @@ -253,15 +251,16 @@ def similarity(self, image_data): # change output names if not os.path.exists(image_data["registered_sub_folder"] + "result.0.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.similarity()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.similarity()") else: os.rename(image_data["registered_sub_folder"] + "result.0.mha", image_data["registered_sub_folder"] + image_data[anatomy + "similarity_name"]) os.rename(image_data["registered_sub_folder"] + "TransformParameters.0.txt", image_data["registered_sub_folder"] + image_data[anatomy + "similarity_transf_name"]) + # make sure the image was written + if not os.path.exists(image_data["registered_sub_folder"] + image_data[anatomy + "similarity_name"]): + raise FileNotFoundError (image_data["registered_sub_folder"] + image_data[anatomy + "similarity_name"] + " not written in bone.similarity()") + def spline(self, image_data): @@ -294,15 +293,15 @@ def spline(self, image_data): # change output names if not os.path.exists(image_data["registered_sub_folder"] + "result.0.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.spline()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.spline()") else: os.rename(image_data["registered_sub_folder"] + "result.0.mha", image_data["registered_sub_folder"] + image_data[anatomy + "spline_name"]) os.rename(image_data["registered_sub_folder"] + "TransformParameters.0.txt", image_data["registered_sub_folder"] + image_data[anatomy + "spline_transf_name"]) + # make sure the image was written + if not os.path.exists(image_data["registered_sub_folder"] + image_data[anatomy + "spline_name"]): + raise FileNotFoundError (image_data["registered_sub_folder"] + image_data[anatomy + "spline_name"] + " not written in bone.spline()") def i_rigid(self, image_data): @@ -323,7 +322,7 @@ def i_rigid(self, image_data): complete_elastix_path = image_data["complete_elastix_path"] # execute registration - #print (" Inverting rigid transformation") + #print (" Inverting rigid transformation", flush = True) cmd = [complete_elastix_path, "-f", os.path.abspath(complete_reference_name), "-fMask", os.path.abspath(complete_reference_mask_dil_name), "-m", os.path.abspath(complete_reference_name), @@ -334,13 +333,11 @@ def i_rigid(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "TransformParameters.0.txt"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.i_rigid()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.i_rigid()") else: os.rename(image_data["i_registered_sub_folder"] + "TransformParameters.0.txt", image_data["i_registered_sub_folder"] + image_data[anatomy + "i_rigid_transf_name"]) + def i_similarity(self, image_data): @@ -361,7 +358,7 @@ def i_similarity(self, image_data): complete_elastix_path = image_data["complete_elastix_path"] # execute registration - #print (" Inverting similarity transformation") + #print (" Inverting similarity transformation", flush = True) cmd = [complete_elastix_path, "-f", os.path.abspath(complete_reference_name), "-fMask", os.path.abspath(complete_reference_mask_dil_name), "-m", os.path.abspath(complete_reference_name), @@ -372,10 +369,7 @@ def i_similarity(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "TransformParameters.0.txt"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.i_similarity()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.i_similarity()") else: os.rename(image_data["i_registered_sub_folder"] + "TransformParameters.0.txt", image_data["i_registered_sub_folder"] + image_data[anatomy + "i_similarity_transf_name"]) @@ -399,7 +393,7 @@ def i_spline(self, image_data): complete_elastix_path = image_data["complete_elastix_path"] # execute registration - #print (" Inverting spline transformation") + #print (" Inverting spline transformation", flush = True) cmd = [complete_elastix_path, "-f", os.path.abspath(complete_reference_name), "-fMask", os.path.abspath(complete_reference_mask_dil_name), "-m", os.path.abspath(complete_reference_name), @@ -410,10 +404,7 @@ def i_spline(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "TransformParameters.0.txt"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.i_spline()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.i_spline()") else: os.rename(image_data["i_registered_sub_folder"] + "TransformParameters.0.txt", image_data["i_registered_sub_folder"] + image_data[anatomy + "i_spline_transf_name"]) @@ -439,7 +430,7 @@ def t_rigid(self, image_data): complete_transformix_path = image_data["complete_transformix_path"] # execute transformation - #print (" Rigid warping") + #print (" Rigid warping", flush = True) cmd = [complete_transformix_path, "-in", os.path.abspath(mask_to_warp), "-tp", os.path.abspath(transformation), "-out", os.path.abspath(output_folder)] @@ -448,13 +439,13 @@ def t_rigid(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "result.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.t_rigid()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.t_rigid()") else: os.rename(image_data["i_registered_sub_folder"] + "result.mha", image_data["i_registered_sub_folder"] + image_data[anatomy + "m_rigid_name"]) + # make sure the image was written + if not os.path.exists(image_data["i_registered_sub_folder"] + image_data[anatomy + "m_rigid_name"]): + raise FileNotFoundError (image_data["i_registered_sub_folder"] + image_data[anatomy + "m_rigid_name"] + " not written in bone.t_rigid()") def t_similarity(self, image_data): @@ -480,13 +471,13 @@ def t_similarity(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "result.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.t_similarity()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.t_similarity()") else: os.rename(image_data["i_registered_sub_folder"] + "result.mha", image_data["i_registered_sub_folder"] + image_data[anatomy+"m_similarity_name"]) + # make sure the image was written + if not os.path.exists(image_data["i_registered_sub_folder"] + image_data[anatomy + "m_similarity_name"]): + raise FileNotFoundError (image_data["i_registered_sub_folder"] + image_data[anatomy + "m_similarity_name"] + " not written in bone.t_similarity()") def t_spline(self, image_data): @@ -504,7 +495,7 @@ def t_spline(self, image_data): complete_transformix_path = image_data["complete_transformix_path"] # execute transformation - #print (" Spline warping") + #print (" Spline warping", flush = True) cmd = [complete_transformix_path, "-in", os.path.abspath(mask_to_warp), "-tp", os.path.abspath(transformation), "-out", os.path.abspath(output_folder)] @@ -512,13 +503,14 @@ def t_spline(self, image_data): # change output name if not os.path.exists(image_data["i_registered_sub_folder"] + "result.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.t_spline()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.t_spline()") else: os.rename(image_data["i_registered_sub_folder"] + "result.mha", image_data["i_registered_sub_folder"] + image_data[anatomy+"m_spline_name"]) + # make sure the image was written + if not os.path.exists(image_data["i_registered_sub_folder"] + image_data[anatomy + "m_spline_name"]): + raise FileNotFoundError (image_data["i_registered_sub_folder"] + image_data[anatomy + "m_spline_name"] + " not written in bone.t_spline()") + def vf_spline(self, image_data): @@ -541,10 +533,7 @@ def vf_spline(self, image_data): # change output name if not os.path.exists(image_data["registered_sub_folder"] + "deformationField.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in bone.vf_spline()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.vf_spline()") else: os.rename(image_data["registered_sub_folder"] + "deformationField.mha", image_data["registered_folder"] + image_data["vector_field_name"]) @@ -553,7 +542,7 @@ def vf_spline(self, image_data): # --------------------------------------------------------------------------------------------------------------------------- -# CARTILAGE INSTANCE -------------------------------------------------------------------------------------------------------- +# CARTILAGE ----------------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------------------------- class cartilage (registration): @@ -585,7 +574,7 @@ def spline(self, image_data): complete_elastix_path = image_data["complete_elastix_path"] # execute registration - #print (" Spline registration") + #print (" Spline registration", flush = True) cmd = [complete_elastix_path, "-f", os.path.abspath(complete_reference_name), "-fMask", os.path.abspath(complete_reference_mask_dil_name), "-m", os.path.abspath(complete_moving_name), @@ -595,17 +584,17 @@ def spline(self, image_data): # change output names if not os.path.exists(image_data["registered_sub_folder"] + "result.0.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in cartilage.spline()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.spline()") else: os.rename(image_data["registered_sub_folder"] + "result.0.mha", image_data["registered_sub_folder"] + image_data[anatomy + "spline_name"]) os.rename(image_data["registered_sub_folder"] + "TransformParameters.0.txt", image_data["registered_sub_folder"] + image_data[anatomy + "spline_transf_name"]) - - + # make sure the image was written + print (image_data["registered_sub_folder"] + image_data[anatomy + "spline_name"]) + if not os.path.exists(image_data["registered_sub_folder"] + image_data[anatomy + "spline_name"]): + raise FileNotFoundError (image_data["registered_sub_folder"] + image_data[anatomy + "spline_name"] + " not written in cartilage.spline()") + def i_rigid(self, image_data): pass @@ -630,7 +619,7 @@ def i_spline(self, image_data): complete_elastix_path = image_data["complete_elastix_path"] # execute registration - #print (" Inverting spline transformation") + #print (" Inverting spline transformation", flush = True) cmd = [complete_elastix_path, "-f", os.path.abspath(complete_reference_name), "-fMask", os.path.abspath(complete_reference_mask_dil_name), "-m", os.path.abspath(complete_reference_name), @@ -641,10 +630,7 @@ def i_spline(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "TransformParameters.0.txt"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in cartilage.i_spline()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.i_spline()") else: os.rename(image_data["i_registered_sub_folder"] + "TransformParameters.0.txt", image_data["i_registered_sub_folder"] + image_data[anatomy + "i_spline_transf_name"]) @@ -679,13 +665,15 @@ def t_rigid(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "result.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in cartilage.t_rigid()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.t_rigid()") else: os.rename(image_data["i_registered_sub_folder"] + "result.mha", image_data["i_registered_sub_folder"] + image_data[anatomy + "m_rigid_name"]) + # make sure the image was written + print ("in cartilage.t_rigid", flush = True) + if not os.path.exists(image_data["i_registered_sub_folder"] + image_data[anatomy + "m_rigid_name"]): + raise FileNotFoundError (image_data["i_registered_sub_folder"] + image_data[anatomy + "m_rigid_name"] + " not written in cartilage.t_rigid()") + def t_similarity(self, image_data): @@ -704,7 +692,7 @@ def t_similarity(self, image_data): complete_transformix_path = image_data["complete_transformix_path"] # execute transformation - #print (" Similarity warping") + #print (" Similarity warping", flush = True) cmd = [complete_transformix_path, "-in", os.path.abspath(mask_to_warp), "-tp", os.path.abspath(transformation), "-out", os.path.abspath(output_folder)] @@ -712,14 +700,15 @@ def t_similarity(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "result.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in cartilage.t_similarity()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.t_similarity()") else: os.rename(image_data["i_registered_sub_folder"] + "result.mha", image_data["i_registered_sub_folder"] + image_data[anatomy+"m_similarity_name"]) - + # make sure the image was written + print ("in cartilage.t_similarity", flush = True) + if not os.path.exists(image_data["i_registered_sub_folder"] + image_data[anatomy + "m_similarity_name"]): + raise FileNotFoundError (image_data["i_registered_sub_folder"] + image_data[anatomy + "m_similarity_name"] + " not written in cartilage.t_similarity()") + def t_spline(self, image_data): @@ -736,7 +725,7 @@ def t_spline(self, image_data): complete_transformix_path = image_data["complete_transformix_path"] # execute transformation - #print (" Spline warping") + #print (" Spline warping", flush = True) cmd = [complete_transformix_path, "-in", os.path.abspath(mask_to_warp), "-tp", os.path.abspath(transformation), "-out", os.path.abspath(output_folder)] @@ -744,13 +733,14 @@ def t_spline(self, image_data): # change output names if not os.path.exists(image_data["i_registered_sub_folder"] + "result.mha"): - print("----------------------------------------------------------------------------------------") - print("ERROR: No output created in cartilage.t_spline()") - print("----------------------------------------------------------------------------------------") - return + raise FileNotFoundError ("No output created in bone.t_spline()") else: os.rename(image_data["i_registered_sub_folder"] + "result.mha", image_data["i_registered_sub_folder"] + image_data[anatomy+"m_spline_name"]) + # make sure the image was written + print ("------------------------------>in cartilage.t_spline", flush = True) + if not os.path.exists(image_data["i_registered_sub_folder"] + image_data[anatomy + "m_spline_name"]): + raise FileNotFoundError (image_data["i_registered_sub_folder"] + image_data[anatomy + "m_spline_name"] + " not written in cartilage.t_spline()") def vf_spline(self): diff --git a/pykneer/pykneer/sitk_functions.py b/pykneer/pykneer/sitk_functions.py index b361f9e..d66d3ec 100644 --- a/pykneer/pykneer/sitk_functions.py +++ b/pykneer/pykneer/sitk_functions.py @@ -351,8 +351,13 @@ def edge_preserving_smoothing(img): def dilate_mask(mask, radius): # dilate reference binary mask - mask = sitk.Cast(mask,sitk.sitkInt16) # make sure that input of BinaryDilate is int - mask_dil = sitk.BinaryDilate(mask,radius) + mask = sitk.Cast(mask,sitk.sitkUInt16) # make sure that input of BinaryDilate is int + print (mask.GetPixelIDTypeAsString()) + # mask_dil = sitk.BinaryDilate(mask,radius) # this does not work anymore, not sure why - changed to BinaryDilateImageFilter in version 0.6 + # mask_dil = sitk.BinaryDilate(mask,3) + dilate_filter = sitk.BinaryDilateImageFilter() + dilate_filter.SetKernelRadius(radius) + mask_dil = dilate_filter.Execute(mask) return mask_dil diff --git a/pykneer/requirements.txt b/pykneer/requirements.txt index d40f03a..482d0ab 100644 --- a/pykneer/requirements.txt +++ b/pykneer/requirements.txt @@ -1,9 +1,9 @@ -numpy>=1.15.1 -pandas>=0.23.4 -SimpleITK>=1.1.0 -matplotlib>=2.2.3 -scipy>=1.1.0 -scikit-image>=0.14.0 -watermark>=1.7.0 -itkwidgets==0.15.2 -itk>=5.0.1 \ No newline at end of file +numpy>=1.15 +pandas>=0.23 +SimpleITK>=1.1 +matplotlib>=2.2 +scipy>=1.1 +scikit-image>=0.14 +watermark>=1.7 +itkwidgets>=0.15 +itk>=5.0 \ No newline at end of file diff --git a/pykneer/setup.py b/pykneer/setup.py index 40aa351..c73a2fc 100644 --- a/pykneer/setup.py +++ b/pykneer/setup.py @@ -7,7 +7,7 @@ setuptools.setup( # package info name="pykneer", - version="0.0.5", + version="0.0.6.3", author="Serena Bonaretti", author_email="serena.bonaretti.research@gmail.edu", description="pyKNEEr: An image analysis workflow for open and reproducible research on femoral knee cartilage",