From 8651ff66fa88f296d999029a856f3de38eb1bb24 Mon Sep 17 00:00:00 2001 From: neelspatel999 Date: Sat, 2 Oct 2021 23:16:57 -0400 Subject: [PATCH 01/14] Updates to add clustering files --- README_perform_clustering.md | 75 ++++++++++ scripts/perform_clustering.py | 252 ++++++++++++++++++++++++++++++++ tutorial_perform_clustering.pdf | Bin 0 -> 213336 bytes 3 files changed, 327 insertions(+) create mode 100644 README_perform_clustering.md create mode 100644 scripts/perform_clustering.py create mode 100644 tutorial_perform_clustering.pdf diff --git a/README_perform_clustering.md b/README_perform_clustering.md new file mode 100644 index 0000000..316839a --- /dev/null +++ b/README_perform_clustering.md @@ -0,0 +1,75 @@ +# Perform_Clustering + +Performs clustering on an ExpressionData file with various cluster and visualization options. + +## Usage + +## Perform DBSCAN and create a DBSCAN_ClusterIDs.csv file + +python perform_clustering.py -f path/to/ExpressionData.csv -d + +## Perform k-means and creates an elbow_visualization.png file for clusters 2 to 5 + +python perform_clustering.py -f path/to/ExpressionData.csv -e + +## Perform k-means silhouette and create a silhouette_visualization.png file for clusters 2 to 5 +(Note: The default, without -u (upper bound) specified, is clusters 2 to 11) + +python perform_clustering.py -f path/to/ExpressionData.csv -s -u 5 + +Note: any combination of -s, -e, and -d can be specified, for example: + +python perform_clustering.py -f path/to/ExpressionData.csv -d -e -s + + +# INPUTS + +-f: The ExpressionData file path +Required +The ExpressionData file is expected to be the same format as generated by BoolODE + +-d: DBSCAN clustering is requested +Not required + +-e: k-means elbow is requested +Not required + +-s: k-means silhouette is requested +Not required + +-u: upper bound for silhouette plots, which must be greater than 2 +Not required + + +# OUTPUTS + +-d: DBSCAN clustering is requested +The DBSCAN clustering outputs a DBSCAN_ClusterIDs.csv file, where each cell has its own cluster assigned by DBSCAN. Note: noise found by DBSCAN are put in a cluster for visualization purposes. + +-e: k-means elbow is requested +The k-means elbow generates an elbow_visualization.png file with the elbow identified. + +-s: k-means silhouette is requested +The k-means silhouette generates a silhouette_visualization.png file where the number of clusters is 2 until the number specified by -u. If no upper bound is specified by -u, the default upper bound is 11. + +Note: All outputs are generated in the same directory as the provided ExpressionData.csv + + +# OUTPUT NOTES + +## DBSCAN + +There is more work that needs to be done with DBSCAN, such as testing with lower simulation times and differing cell numbers. Additionally, DBSCAN is not suitable for datasets with varying density, and that is an analysis metric we want to include in the future (analyzing the density of the dataset and determining when DBSCAN is successful and what density works with particular models). + +## ELBOW + +The elbow method has one additional metric that can be implemented if the line defining the model type is changed from metric='calinski_harabasz' to metric='distortion’ in k_means_elbow(). We have set it to calinski_harabasz because that has yielded closer results to the expected value on average for the particular models that we tested. + +## SILHOUETTE + +The silhouette_visualization.png file needs to be visually analyzed to determine the appropriate number of clusters. The correct estimated cluster number, according to Silhouette, corresponds to the plot where there that has the least number of negative coefficient values and has the most uniformity in the thickness of the clusters. + + +# OVERVIEW + +The perform_clustering script is designed to analyze ExpressionData files generated by BoolODE to statistically analyze the data to try and cluster it and predict the number of steady states that exist in the boolean model. It currently supports k-means elbow, k-means silhouette, and DBSCAN. diff --git a/scripts/perform_clustering.py b/scripts/perform_clustering.py new file mode 100644 index 0000000..6d4381d --- /dev/null +++ b/scripts/perform_clustering.py @@ -0,0 +1,252 @@ +""" + This script performs k-means and DBSCAN clustering + algorithms on a provided ExpressionData.CSV file to estimate + the number of steady states for a particular boolean model. + + @Author: Neel Patel (neelspatel999@vt.edu) + @Author: Madeline Shaklee (mshaklee@umassd.edu) + @Author: Amelia Whitehead (ameliafw@vt.edu) +""" +import numpy as np +import argparse +import pandas + +parser = argparse.ArgumentParser(description='Takes the ExpressionData.csv filepath ' + 'and various options to cluster and visualize the data.') + +parser.add_argument('-f', '--ExpressionDataFilePath', required=True, type=str, + help='Specify the path of the ExpressionData file.') +parser.add_argument('-e', '--Elbow', action='store_true', + help='Input -e if you want to perform a k-means elbow visualization.') +parser.add_argument('-s', '--Silhouette', action='store_true', + help='Input -s if you want to perform a k-means silhouette visualization.') +parser.add_argument('-d', '--DBSCAN', action='store_true', + help='Input -d if you want to perform DBSCAN clustering to obtain a DBSCAN_ClusterIDs.csv file.') +parser.add_argument('-u', '--SilhouetteUpperBound', type=int, + help='Input -u if you want to specify the upper bound (inclusive) for the number of clusters to consider ' + 'in silhouette plots. The default is 11. You must use this option along with -s, ' + 'and you must provide a number greater than 2. NOTE: We suggest starting' + ' with low numbers (less than 12) because the image ' + 'will increase in size as you increase the number of silhouettes to generate') + + +elbow_value = parser.parse_args().Elbow +silhouette_value = parser.parse_args().Silhouette +dbscan_value = parser.parse_args().DBSCAN +silhouette_upperbound = parser.parse_args().SilhouetteUpperBound +expression_data_location = parser.parse_args().ExpressionDataFilePath + +# Defining the output path to be the same path as +# ExpressionData for any output file generated +output_file_path = expression_data_location[0:expression_data_location.rindex('/') + 1] + +"""" + Iteratively performs k-means clustering, testing k values 2 ≤ k ≤ upper_bound, + and generates a silhouette plot of each. + + @Param: upper_bound is the number of maximum number of clusters to + include in the silhouette visualization. This can be specified + by the user by -u or --SilhouetteUpperBound. The default + is 11. upper_bound must be k ≥ 3 + + @Precondition: The number of cells in the ExpressionData file + must be greater than upper_bound + + @Note: The package only allows for k ≥ 2 analyses + + @Citation: https://www.scikit-yb.org/en/latest/api/cluster/silhouette.html +""" +def k_means_silhouette(upper_bound): + from sklearn.cluster import KMeans + from yellowbrick.cluster import SilhouetteVisualizer + import matplotlib.pyplot as plt + + # ExpressionData is a matrix, where rows are genes and columns are cells + expression_df = pandas.read_csv(expression_data_location, sep=',', index_col=0) + + # Performs transpose for later clustering on the samples. + # Later, we cluster the cell columns of ExpressionData + expression_data_transpose = np.array(expression_df.T.to_numpy().tolist()) + + fig, axs = plt.subplots(upper_bound - 1, figsize=(15, upper_bound*5)) + plot_count = 0 + for cluster_number in range(2, upper_bound + 1): + k_means = KMeans(n_clusters=cluster_number) + + visualizer = SilhouetteVisualizer(k_means, axs[plot_count]) + visualizer.fit(expression_data_transpose) + axs[plot_count].set_title("Silhouette of " + str(cluster_number) + " Clusters") + axs[plot_count].set_xlabel('silhouette coefficient values') + axs[plot_count].set_ylabel('cluster label') + plot_count = plot_count + 1 + + visualizer.show(outpath=output_file_path + "silhouette_visualization.png") + print("Silhouette analyses generated a silhouette_visualization.png file.") + +"""" + Iteratively performs k-means clustering, testing k values 2 ≤ k ≤ 11, + and generates an elbow plot. + + @Precondition: Number of cells in the ExpressionData file + must be greater than 11 + + @Note: The package only allows for k ≥ 2 analyses + + @Citation: https://www.scikit-yb.org/en/latest/api/cluster/elbow.html +""" +def k_means_elbow(): + from sklearn.cluster import KMeans + from yellowbrick.cluster import KElbowVisualizer + + # ExpressionData is a matrix, where rows are genes and columns are cells + expression_df = pandas.read_csv(expression_data_location, sep=',', index_col=0) + + # Performs transpose for later clustering on the samples. + # We cluster the cell columns of ExpressionData + expression_data_transpose = np.array(expression_df.T.to_numpy().tolist()) + + model = KMeans() + + # KElbowVisualizer has 3 different metrics + # (distortion, silhouette, and calinski_harabasz) + # The calinski_harabasz score computes the ratio of + # dispersion between and within clusters. Distortion could also + # be used for this method. + visualizer = KElbowVisualizer(model, k=(2, 12), metric='calinski_harabasz', timings=False) + + visualizer.fit(expression_data_transpose) + visualizer.show(outpath=output_file_path + "elbow_visualization.png") + print("Elbow analysis generated an elbow_visualization.png file.") + +""" + Performs DBSCAN on the ExpressionData file and generates a DBSCAN_ClusterIDs.csv file, which specifies + which cell belongs to what cluster, according to DBSCAN. All noise points are grouped together into + a separate cluster for visualization purposes. + + @Precondition: The number of samples (cells) needs to be greater than two + times the number of genes + + @Note: DBSCAN does not work well with datasets of varying density + + @Citations: https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#sphx-glr-auto-examples-cluster-plot-dbscan-py + https://medium.com/@tarammullin/dbscan-parameter-estimation-ff8330e3a3bd +""" +def dbscan_clustering(): + from sklearn.cluster import DBSCAN + from sklearn.neighbors import NearestNeighbors + from kneed import KneeLocator + + # ExpressionData is a matrix, where rows are genes and columns are cells + expression_df = pandas.read_csv(expression_data_location, sep=',', index_col=0) + + # Performs transpose for later clustering on the samples. + # We cluster the cell columns of ExpressionData + expression_data_transpose = np.array(expression_df.T.to_numpy().tolist()) + + + # DBSCAN takes two parameters, MinSamples and Epsilon + # MinSamples is described now, and Epsilon will be described later + + # The MinSamples parameter is the fewest number of samples (cells) + # DBSCAN will put in a cluster. We assign MinSamples + # to two times the number of genes in ExpressionData + min_samples_num = len(expression_df.index)*2 + + + ############# Below is from Medium.com reference ############# + + # Compute nearest neighbors and distances + neighbors = NearestNeighbors(n_neighbors=min_samples_num) + + neighbors_fit = neighbors.fit(expression_data_transpose) + distances, indices = neighbors_fit.kneighbors(expression_data_transpose) + + # Sort distances in ascending order + distances = np.sort(distances, axis=0) + + ############# End of Medium.com reference ############# + + + # Find the average k-distances then plot to find the knee, + # which is the point of maximum curvature + y_values = compute_average_distances(distances) + x_values = list(range(1,len(y_values) + 1)) + knee_locator = KneeLocator(x_values, y_values, S=1.0, curve='convex', direction='increasing') + maximum_curvature_position = round(knee_locator.knee, 20) + + # The Epsilon parameter of DBSCAN represents the upper bound (exclusive) + # distance between two points to be clustered together. + epsilon = y_values[maximum_curvature_position - 1] + + + ############# Below is from the scikit-learn reference ############# + + # Performs DBSCAN with the calculated parameters + db = DBSCAN(eps=epsilon, min_samples=min_samples_num).fit(expression_data_transpose) + + clusters_identifiers = db.fit_predict(expression_data_transpose) + core_samples_mask = np.zeros_like(db.labels_, dtype=bool) + core_samples_mask[db.core_sample_indices_] = True + labels = db.labels_ + + # Number of clusters in labels, ignoring noise if present. + n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) + n_noise_ = list(labels).count(-1) + + print("DBSCAN result:") + print('Estimated number of clusters: %d' % n_clusters_) + print('Estimated number of noise points: %d \n' % n_noise_) + + ############# End of scikit-learn reference ############# + + # Adding the cluster labels to the dataframe + expression_df.loc['cluster_labels', :] = clusters_identifiers + + # Write a new ClusterID file according to DBSCAN's clustering + cluster_values = expression_df.loc['cluster_labels'].tolist() + cluster_values = [int(number) for number in cluster_values] + cell_names = expression_df.columns.tolist() + dictionary = {'':cell_names, 'cl':cluster_values} + cluster_df = pandas.DataFrame(dictionary) + cluster_df.to_csv(output_file_path + 'DBSCAN_ClusterIDs.csv', index=False) + + print("DBSCAN analysis generated a DBSCAN_ClusterIDs.csv file.") + +""" + Takes a list of distance lists computed via k-nearest neighbors, and + outputs a list where each element is the average distance of the distance + list occupied in the respective ordinal location of the input list + + @Param: A list of lists, where each element contains a + list of distances computed via k-nearest neighbor. + + @Precondition: The distance_array has length greater than 0 + + @Returns: A list of distances, where each element is the + average distance of the distance list occupied + in the respective ordinal location of the input list +""" +def compute_average_distances(distance_array): + denominator_of_average = len(distance_array[0]) + # Will be of length number of samples (cells) in the + # ExpressionData, once full + average_distances = [] + for distances in distance_array: + distance_sum = 0 + for distance_value in distances: + distance_sum = distance_sum + distance_value + average_distance = distance_sum / denominator_of_average + average_distances.append(average_distance) + return average_distances + +if __name__ == '__main__': + if elbow_value: + k_means_elbow() + if silhouette_value: + if silhouette_upperbound: + k_means_silhouette(silhouette_upperbound) + else: + # The default value is 11 + k_means_silhouette(11) + if dbscan_value: + dbscan_clustering() diff --git a/tutorial_perform_clustering.pdf b/tutorial_perform_clustering.pdf new file mode 100644 index 0000000000000000000000000000000000000000..abd5d5a6b48303faa1a67190c08a91297fdf2e1e GIT binary patch literal 213336 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°*7XDhO2a;|y1u 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%0A4mVeNxP_aLB6a8b=77F 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 z

QAR(&y*chui^6|2Ll_G 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 literal 0 HcmV?d00001 From ad401006392be574fbf0ac7a9f78224403ddf147 Mon Sep 17 00:00:00 2001 From: neelspatel999 Date: Sun, 10 Oct 2021 23:40:48 -0400 Subject: [PATCH 02/14] Updates to README.md, requirements.txt, tutorial_perform_clustering.pdf --- README.md | 87 ++++++++++++++++++++++++++++++++ README_perform_clustering.md | 75 --------------------------- requirements.txt | 2 + tutorial_perform_clustering.pdf | Bin 213336 -> 214262 bytes 4 files changed, 89 insertions(+), 75 deletions(-) delete mode 100644 README_perform_clustering.md diff --git a/README.md b/README.md index b7b200d..3f2128d 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ Find the documentation for BoolODE at [https://murali-group.github.io/Beeline/Bo ## Usage `python boolode.py --config path/to/config.yaml` +## Getting Started +Install the required packages with the following command: +`pip install -r requirements.txt` + ## Configuration BoolODE reads user defined configurations from a YAML file. A sample config file is provided in (config-files/example-config.yaml)[github.com//Murali-group/BoolODE/blob/master/config-files/example-config.yaml]. @@ -85,3 +89,86 @@ More more details, please see the supplementary material and Online Methods of t If you use BoolODE in your research, please cite: Aditya Pratapa, Amogh Jalihal, Jeffrey Law, Aditya Bharadwaj, and T M Murali. Benchmarking algorithms for gene regulatory network inference from single-cell transcriptomic data, Nature Methods, (2020). https://doi.org/10.1038/s41592-019-0690-6 + +## Optional clustering techniques + +# Perform_Clustering + +Performs clustering on an ExpressionData file with various cluster and visualization options. +Clustering is used to predict the number of steady states in the Boolean Model expressed in the ExpressionData file. A brief explanation of the DBSCAN clustering technique is provided in the Overview section + +## Usage + +## Perform DBSCAN and create a DBSCAN_ClusterIDs.csv file + +`python perform_clustering.py -f path/to/ExpressionData.csv -d` + +## Perform k-means and creates an elbow_visualization.png file for clusters 2 to 11 + +`python perform_clustering.py -f path/to/ExpressionData.csv -e` + +## Perform k-means silhouette and create a silhouette_visualization.png file for clusters 2 to 5 +(Note: The default, without -u (upper bound) specified, is clusters 2 to 11) + +`python perform_clustering.py -f path/to/ExpressionData.csv -s -u 5` + +Note: any combination of -s, -e, and -d can be specified, for example: + +`python perform_clustering.py -f path/to/ExpressionData.csv -d -e -s` + + +# INPUTS + +-f: The ExpressionData file path +Required +The ExpressionData file is expected to be the same format as generated by BoolODE + +-d: DBSCAN clustering is requested +Not required + +-e: k-means elbow is requested +Not required + +-s: k-means silhouette is requested +Not required + +-u: upper bound for silhouette plots, which must be greater than 2 +Not required + + +# OUTPUTS + +-d: DBSCAN clustering is requested +The DBSCAN clustering outputs a DBSCAN_ClusterIDs.csv file, where each cell has its own cluster assigned by DBSCAN. Note: noise found by DBSCAN are put in a cluster for visualization purposes. + +-e: k-means elbow is requested +The k-means elbow generates an elbow_visualization.png file with the elbow identified. + +-s: k-means silhouette is requested +The k-means silhouette generates a silhouette_visualization.png file where the number of clusters is 2 until the number specified by -u. If no upper bound is specified by -u, the default upper bound is 11. + +Note: All outputs are generated in the same directory as the provided ExpressionData.csv + + +# OUTPUT NOTES + +## DBSCAN + +There is more work that needs to be done with DBSCAN, such as testing with lower simulation times and differing cell numbers. Additionally, DBSCAN is not suitable for datasets with varying density, and that is an analysis metric we want to include in the future (analyzing the density of the dataset and determining when DBSCAN is successful and what density works with particular models). + +## ELBOW + +The elbow method has one additional metric that can be implemented if the line defining the model type is changed from metric='calinski_harabasz' to metric='distortion’ in k_means_elbow(). We have set it to calinski_harabasz because that has yielded closer results to the expected value on average for the particular models that we tested. + +## SILHOUETTE + +The silhouette_visualization.png file needs to be visually analyzed to determine the appropriate number of clusters. The correct estimated cluster number, according to Silhouette, corresponds to the plot where there that has the least number of negative coefficient values and has the most uniformity in the thickness of the clusters. + + +# OVERVIEW + +The perform_clustering script is designed to analyze ExpressionData files generated by BoolODE to statistically analyze the data to try and cluster it and predict the number of steady states that exist in the boolean model. It currently supports k-means elbow, k-means silhouette, and DBSCAN. + +## DBSCAN Description + +DBSCAN stands for Density-Based Spatial Clustering of Applications with Noise. It is useful for handling the data in ExpressionData files because of how it handles noise. DBSCAN works by looking at a point and a specified number of its neighbors at a certain distance to determine if they are similar enough to be grouped together in a cluster. In the end, DBSCAN outputs the estimated number of clusters that it found from the data. DBSCAN is used to estimate the number of steady states from simulated gene expression data from an ExpressionData file. \ No newline at end of file diff --git a/README_perform_clustering.md b/README_perform_clustering.md deleted file mode 100644 index 316839a..0000000 --- a/README_perform_clustering.md +++ /dev/null @@ -1,75 +0,0 @@ -# Perform_Clustering - -Performs clustering on an ExpressionData file with various cluster and visualization options. - -## Usage - -## Perform DBSCAN and create a DBSCAN_ClusterIDs.csv file - -python perform_clustering.py -f path/to/ExpressionData.csv -d - -## Perform k-means and creates an elbow_visualization.png file for clusters 2 to 5 - -python perform_clustering.py -f path/to/ExpressionData.csv -e - -## Perform k-means silhouette and create a silhouette_visualization.png file for clusters 2 to 5 -(Note: The default, without -u (upper bound) specified, is clusters 2 to 11) - -python perform_clustering.py -f path/to/ExpressionData.csv -s -u 5 - -Note: any combination of -s, -e, and -d can be specified, for example: - -python perform_clustering.py -f path/to/ExpressionData.csv -d -e -s - - -# INPUTS - --f: The ExpressionData file path -Required -The ExpressionData file is expected to be the same format as generated by BoolODE - --d: DBSCAN clustering is requested -Not required - --e: k-means elbow is requested -Not required - --s: k-means silhouette is requested -Not required - --u: upper bound for silhouette plots, which must be greater than 2 -Not required - - -# OUTPUTS - --d: DBSCAN clustering is requested -The DBSCAN clustering outputs a DBSCAN_ClusterIDs.csv file, where each cell has its own cluster assigned by DBSCAN. Note: noise found by DBSCAN are put in a cluster for visualization purposes. - --e: k-means elbow is requested -The k-means elbow generates an elbow_visualization.png file with the elbow identified. - --s: k-means silhouette is requested -The k-means silhouette generates a silhouette_visualization.png file where the number of clusters is 2 until the number specified by -u. If no upper bound is specified by -u, the default upper bound is 11. - -Note: All outputs are generated in the same directory as the provided ExpressionData.csv - - -# OUTPUT NOTES - -## DBSCAN - -There is more work that needs to be done with DBSCAN, such as testing with lower simulation times and differing cell numbers. Additionally, DBSCAN is not suitable for datasets with varying density, and that is an analysis metric we want to include in the future (analyzing the density of the dataset and determining when DBSCAN is successful and what density works with particular models). - -## ELBOW - -The elbow method has one additional metric that can be implemented if the line defining the model type is changed from metric='calinski_harabasz' to metric='distortion’ in k_means_elbow(). We have set it to calinski_harabasz because that has yielded closer results to the expected value on average for the particular models that we tested. - -## SILHOUETTE - -The silhouette_visualization.png file needs to be visually analyzed to determine the appropriate number of clusters. The correct estimated cluster number, according to Silhouette, corresponds to the plot where there that has the least number of negative coefficient values and has the most uniformity in the thickness of the clusters. - - -# OVERVIEW - -The perform_clustering script is designed to analyze ExpressionData files generated by BoolODE to statistically analyze the data to try and cluster it and predict the number of steady states that exist in the boolean model. It currently supports k-means elbow, k-means silhouette, and DBSCAN. diff --git a/requirements.txt b/requirements.txt index 8c10eb6..241b14a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,5 @@ tqdm==4.31.1 seaborn==0.9.0 pandas==0.24.2 scikit-learn==0.21.3 +yellowbrick==1.3.post1 +kneed==0.7.0 diff --git a/tutorial_perform_clustering.pdf b/tutorial_perform_clustering.pdf index abd5d5a6b48303faa1a67190c08a91297fdf2e1e..df6b16ad5d79595ec9f816a5af98ee2453130b1f 100644 GIT binary patch delta 47262 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 V$&A7fgaB4H4mJQexwxXl{{t+lV&DJ( delta 46608 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≈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 Date: Mon, 15 Nov 2021 00:36:15 -0500 Subject: [PATCH 03/14] Integrated PyboolNet and updated DBSCAN for cluster comparison --- .DS_Store | Bin 0 -> 10244 bytes .idea/.gitignore | 3 + .idea/BoolODE.iml | 10 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + BoolODE/.DS_Store | Bin 0 -> 6148 bytes BoolODE/__init__.py | 38 +++- BoolODE/dbscan_evaluation.py | 199 ++++++++++++++++++ BoolODE/post_processing.py | 198 ++++++++--------- README.md | 29 ++- Synthetic-H/.DS_Store | Bin 0 -> 6148 bytes Synthetic-H/dyn-LI-1/parameters.txt | 66 ++++++ Synthetic-H/dyn-LL-1/parameters.txt | 165 +++++++++++++++ boolode.py | 1 - config-files/config.yaml | 51 ++--- config-files/example-config.yaml | 11 + requirements.txt | 2 +- scripts/.DS_Store | Bin 0 -> 6148 bytes scripts/perform_clustering.py | 4 +- 21 files changed, 666 insertions(+), 135 deletions(-) create mode 100644 .DS_Store create mode 100644 .idea/.gitignore create mode 100644 .idea/BoolODE.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 BoolODE/.DS_Store create mode 100644 BoolODE/dbscan_evaluation.py create mode 100644 Synthetic-H/.DS_Store create mode 100644 Synthetic-H/dyn-LI-1/parameters.txt create mode 100644 Synthetic-H/dyn-LL-1/parameters.txt create mode 100644 scripts/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b2088cc5c7d1895a374238f833ed84fb5c75dbcb GIT binary patch literal 10244 zcmeHM&u<$=6n>K$vUXCkX_NjEh!s&KMAOJ=6HpFST_+K>pd^i>kdPL4*SmIBUGJFP zby6n;`Ob+WNE|sJA#vk^#2NkqPN;tZTq_RYo7uJN9|TnhM2cosGwZ54>q=<1*2g*>=a}JULPqacyv|R9b+42UgRfl3gF`yVw3@8Q^ z11Et2e6vN-Mq;U2#eiZ!G04FShqZB{gYMq+%U>!e`Z6cQZKwXtZ5l7b2@Xs zxWo5~kr_3@ycukZyHzvVu@ZfqbFZVD)`sismGp^4?nkEUJAnkdwgZ!U@4LRu_wu~q z+o7DN7!PP#T1%Jo3kL_+=jNx4YYPj9)5gKVwd}Mp|JIv_hiUEn<=GpB2esz@!N-T6 zd@f&vSdvRl7F6n12v;43ci1o9`Js#w}hO=D_T)S8| z%dTJDjGRYN(cO1S`k6k{HOKz&Y1ewQ4x5Rm9df$21IO{@d@Geo=tP@c`c_FF3(Eob zyj32$k<0z9dm$pB5IMDiU*UM-E>`|ZT?~aAP7p#4U^chRATa%^lW*SlOv~|B{5+2$ zUK5sLwleou14qoX=|UIpGIjGetQ3@~+&gXM^;pqqDptfGk5x@)>pu6Lbb2bcnv806 z1$p2OZO}v7r_bn1`kKC{AL$qRm7cI+c9FftuCO_FgWY7e*3~ch4aTdkTX;xyEj~hMCf)S zbP5oBA5jD0D6|@?k1z{?j_46Zy?B`izv;dr0YX z=_JT?@tN5{9&CW_2$zH0=A(Mll%sS|Zm*q)M)pRRYhbF1 zVn8vV7*Gr-1{4F&z`&{4#t`TK%g6u!{|qxJ6UBgH;CW?$rIw0IdHnkJHogBv#96z6 z`T$iFVb_YKgrJef@sRR39yj7RULG=_FAH53=sBT4wqgkl + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..437958e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a19acc7 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BoolODE/.DS_Store b/BoolODE/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..eeb14995af0810c8942a0bfc4476c7f45f8f4335 GIT binary patch literal 6148 zcmeH~O-|!L5QVEDi)cXNN3)m>l23rd4Ge+>YYqT}L=efbBa$Gp^PY>a0C7H6@KtpW zauNf((afkSs(yC6UUk5h-`~U7gy~3plLCEuD)VxsYiLiatviE=X~~M zyb|plu7E4>w<)0S?uNayLn)>C{?1Q}>Z(^%JtA~@IK=ng%((i^8p~X+}vb58F_ik5nt>|NLumFT)SCQC(41MVkO zQ8J^J8H9(W8SKED5v@AhlSL~SGPYJTZO!nylws4x8s`fS2zd8FZ4Ar}U-!fDC zO*Fq<=x+av0{W(5-HnLex&p3%EAXL!t`8Zmm?x|w+R{N|M*y%xw;9*^XF)kx!aQLe zktbM)R4`IQI%0%Kr$0+^dBQqkq)SMLkB~+V>4Xw&bn<5wE+LQTtt;RPEGn=bZ?|>- zKl%Lpzew^sSHKncuM`NK None: self.dropout_jobs = dropout_jobs self.dimred_jobs = dimred_jobs self.slingshot_jobs = slingshot_jobs self.gensample_jobs = gensample_jobs + self.dbscan_jobs = dbscan_jobs self.geneexpression_jobs = geneexpression_jobs class BoolODE(object): @@ -147,6 +149,7 @@ def do_post_processing(self): if self.post_settings.dropout_jobs\ or self.post_settings.dimred_jobs\ or self.post_settings.geneexpression_jobs\ + or self.post_settings.dbscan_jobs\ or self.post_settings.slingshot_jobs: doOtherAnalysis = True generatedPaths = {} @@ -203,7 +206,37 @@ def do_post_processing(self): po.genDropouts(settings) if num_invalid == len(alljobs): break - + # DBSCAN Jobs + if self.post_settings.dbscan_jobs is not None: + print("Starting DBSCAN...") + for dbscan_job in self.post_settings.dbscan_jobs: + for jobid in alljobs: + for gsampPath in generatedPaths[jobid]: + # outputPath = self.jobs[jobid]['outputPath'] + settings = {} + settings['outputPath'] = dbscan_job.get('outputPath') + settings['perform_PyBoolNet'] = dbscan_job.get('perform_PyBoolNet', False) + # To use genSamples generated ExpressionData for + # this specific post-processing test as ExpressionData + # settings['expressionDataFileLocation'] = Path(gsampPath,\ + # 'ExpressionData.csv') + + # Use BoolODE output (the one the user sees) as ExpressionData + settings['expressionDataFileLocation'] = str( + self.jobs[jobid]['outprefix']) + "/ExpressionData.csv" + + data_file_name = "" + for jobid2, joby in enumerate(self.job_settings.jobs): + data_file_name = str(Path(self.global_settings.model_dir, joby.get('model_definition', ''))) + parent_directory_path = Path(self.global_settings.model_dir) + parent_directory_path = parent_directory_path.parent.absolute() + + # DBSCAN will need to know what model is being analyzed if + # it is running PyBoolNet + settings['modelPath'] = str(parent_directory_path) + "/" + data_file_name + + po.dbscan_run(settings) + if self.post_settings.dimred_jobs is not None: print("Starting dimesionality reduction using tSNE") for dimred_jobs in self.post_settings.dimred_jobs: @@ -342,7 +375,8 @@ def __parse_postproc_settings(input_settings_map) -> GlobalSettings: slingshot_jobs = input_settings_map.get('Slingshot', None) dimred_jobs = input_settings_map.get('DimRed', None) gensample_jobs = input_settings_map.get('GenSamples', None) + dbscan_jobs = input_settings_map.get('DBSCAN', None) geneexpression_jobs = input_settings_map.get('GeneExpression', None) return PostProcSettings(dropout_jobs, dimred_jobs, slingshot_jobs, gensample_jobs, - geneexpression_jobs) + dbscan_jobs, geneexpression_jobs) diff --git a/BoolODE/dbscan_evaluation.py b/BoolODE/dbscan_evaluation.py new file mode 100644 index 0000000..32bd33c --- /dev/null +++ b/BoolODE/dbscan_evaluation.py @@ -0,0 +1,199 @@ +""" + This script DBSCAN clustering + on a provided ExpressionData.CSV file to estimate + the number of steady states for a particular boolean model. + + @Author: Neel Patel (neelspatel999@vt.edu) + @Author: Madeline Shaklee (mshaklee@umassd.edu) + @Author: Amelia Whitehead (ameliafw@vt.edu) +""" + +""" + Performs DBSCAN on the ExpressionData file and generates a DBSCAN_ClusterIDs.csv file, which specifies + which cell belongs to what cluster, according to DBSCAN. All noise points are grouped together into + a separate cluster for visualization purposes. + + @Precondition: The number of samples (cells) needs to be greater than two + times the number of genes + + @Note: DBSCAN does not work well with datasets of varying density + + @Params: expression_data_location: the full file path of ExpressionData + output_file_path: the file path where output files should go + compare_with_pyboolnet: 1 if compare output with PyBoolNet, 0 otherwise + model_path: States the path of the model. Needed for PyBoolNet to analyze steady states + + @Citations: https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#sphx-glr-auto-examples-cluster-plot-dbscan-py + https://medium.com/@tarammullin/dbscan-parameter-estimation-ff8330e3a3bd +""" + + +def dbscan_clustering(expression_data_location, output_file_path, compare_with_pyboolnet, model_path): + from sklearn.cluster import DBSCAN + from sklearn.neighbors import NearestNeighbors + from kneed import KneeLocator + import numpy as np + import pandas + + # ExpressionData is a matrix, where rows are genes and columns are cells + expression_df = pandas.read_csv(expression_data_location, sep=',', index_col=0) + + # Performs transpose for later clustering on the samples. + # We cluster the cell columns of ExpressionData + expression_data_transpose = np.array(expression_df.T.to_numpy().tolist()) + # ExpressionData is a matrix, where rows are genes and columns are cells + # expression_df = pandas.read_csv(expression_data_location, sep=',', index_col=0) + + # Performs transpose for later clustering on the samples. + # We cluster the cell columns of ExpressionData + # expression_data_transpose = np.array(data_frame.tolist()) + + # DBSCAN takes two parameters, MinSamples and Epsilon + # MinSamples is described now, and Epsilon will be described later + + # The MinSamples parameter is the fewest number of samples (cells) + # DBSCAN will put in a cluster. We assign MinSamples + # to two times the number of genes in ExpressionData + min_samples_num = len(expression_df.index) * 2 + + ############# Below is from Medium.com reference ############# + + # Compute nearest neighbors and distances + neighbors = NearestNeighbors(n_neighbors=min_samples_num) + + neighbors_fit = neighbors.fit(expression_data_transpose) + distances, indices = neighbors_fit.kneighbors(expression_data_transpose) + + # Sort distances in ascending order + distances = np.sort(distances, axis=0) + + ############# End of Medium.com reference ############# + + # Find the average k-distances then plot to find the knee, + # which is the point of maximum curvature + # y_values = compute_average_distances(distances) + ############################################################# + denominator_of_average = len(distances[0]) + # Will be of length number of samples (cells) in the + # ExpressionData, once full + + average_distances = [] + for distances_element in distances: + distance_sum = 0 + for distance_value in distances_element: + distance_sum = distance_sum + distance_value + average_distance = distance_sum / denominator_of_average + average_distances.append(average_distance) + y_values = average_distances + ############################################ + x_values = list(range(1, len(y_values) + 1)) + knee_locator = KneeLocator(x_values, y_values, S=1.0, curve='convex', direction='increasing') + maximum_curvature_position = round(knee_locator.knee, 20) + + # The Epsilon parameter of DBSCAN represents the upper bound (exclusive) + # distance between two points to be clustered together. + epsilon = y_values[maximum_curvature_position - 1] + + ############# Below is from the scikit-learn reference ############# + + # Performs DBSCAN with the calculated parameters + db = DBSCAN(eps=epsilon, min_samples=min_samples_num).fit(expression_data_transpose) + + clusters_identifiers = db.fit_predict(expression_data_transpose) + core_samples_mask = np.zeros_like(db.labels_, dtype=bool) + core_samples_mask[db.core_sample_indices_] = True + labels = db.labels_ + + # Number of clusters in labels, ignoring noise if present. + n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) + n_noise_ = list(labels).count(-1) + + print("DBSCAN result:") + print('Estimated number of clusters: %d' % n_clusters_) + print('Estimated number of noise points: %d \n' % n_noise_) + + ############# End of scikit-learn reference ############# + + # Adding the cluster labels to the dataframe + expression_df.loc['cluster_labels', :] = clusters_identifiers + + # Write a new ClusterID file according to DBSCAN's clustering + cluster_values = expression_df.loc['cluster_labels'].tolist() + cluster_values = [int(number) for number in cluster_values] + cell_names = expression_df.columns.tolist() + dictionary = {'': cell_names, 'cl': cluster_values} + cluster_df = pandas.DataFrame(dictionary) + cluster_df.to_csv(output_file_path + 'DBSCAN_ClusterIDs.csv', index=False) + + print("DBSCAN analysis generated a DBSCAN_ClusterIDs.csv file.") + pyboolnet_result = -1 + if compare_with_pyboolnet: + # Note: not the correct way to express the file path. + pyboolnet_result = pyBoolNet_comparison(0, False, model_path) + + # Only do these print statements if PyBoolNet was ran. + if pyboolnet_result != -1: + if n_clusters_ == pyboolnet_result: + print("\nDBSCAN and PyBoolNet results match and found " + str(n_clusters_) + "steady states\n") + else: + print("\nDBSCAN and PyBoolNet outputs did not match. \nDBSCAN: " + str(n_clusters_) + ", PyBoolNet: " + str( + pyboolnet_result) + "\n") + + +# Runs PyBoolNet +def pyBoolNet_comparison(bnet_file, ics_present, model_path): + #### Still has initial conditions section to be added + print("Starting PyBoolNet...") + + import PyBoolNet + import pandas as pd + import os + + input_file = open(model_path, "r") + temp_bnet_file = open(model_path + "_temporary_bnet.txt", "x") + for line in input_file: + # If it is not the first line + if "".join(line.split()).lower() != "generule": + # Convert the format and remove tabs. + py_formatted_line = line.replace('\t', ',', 1) + py_formatted_line = py_formatted_line.replace("and", "&") + py_formatted_line = py_formatted_line.replace("or", "|") + py_formatted_line = py_formatted_line.replace("not", "!") + py_formatted_line = py_formatted_line.replace('\t', ' ') + temp_bnet_file.write(py_formatted_line) + temp_bnet_file.write('\n') + + input_file.close() + temp_bnet_file.close() + + primes = PyBoolNet.FileExchange.bnet2primes(model_path + "_temporary_bnet.txt") + steady_states = PyBoolNet.AspSolver.steady_states(primes) + df = pd.DataFrame(steady_states) + + print("PyBoolNet found " + str(len(df)) + " steady state/s total") + + # Delete the temporary file. + os.remove(model_path + "_temporary_bnet.txt") + + # Initial conditions and reachability from a given initial condition is TBD + # We currently always set this to always false. Still need to work on this section + unreachable_steady_states = 0 + if ics_present: + current_goal_state = "" + ic = "1--00" + list_of_steady_states = df.values.tolist() + # Find the number of unreachable_steady_states + for steady_state in list_of_steady_states: + current_goal_state = ','.join(str(v) for v in steady_state) + current_goal_state = current_goal_state.replace(',', '') + current_goal_state = current_goal_state.strip() + path = PyBoolNet.StateTransitionGraphs.best_first_reachability(primes, InitialSpace=ic, + GoalSpace=current_goal_state) + if path: + # for x in path: + # print(x) + print("A path was found for steady state: " + current_goal_state) + else: + print("No path was found for steady state: " + current_goal_state) + + return len(df) - unreachable_steady_states diff --git a/BoolODE/post_processing.py b/BoolODE/post_processing.py index 7f61bb8..658606c 100644 --- a/BoolODE/post_processing.py +++ b/BoolODE/post_processing.py @@ -6,6 +6,8 @@ from sklearn.cluster import KMeans from sklearn.manifold import TSNE import matplotlib.pyplot as plt +from BoolODE import dbscan_evaluation + def genSamples(opts): """ @@ -14,7 +16,7 @@ def genSamples(opts): """ numclusters = opts['nClusters'] num_simulations = opts['num_cells'] - + if numclusters > 1: clusterdf = pd.read_csv(opts['outPrefix'] + '/ClusterIds.csv', index_col=0) @@ -22,8 +24,8 @@ def genSamples(opts): if opts['sample_size'] > num_simulations: print('sample_size should be less than num of experiments') sample_size = num_simulations - - df = pd.read_csv(opts['outPrefix'] + '/simulations/E0.csv',index_col=0) + + df = pd.read_csv(opts['outPrefix'] + '/simulations/E0.csv', index_col=0) maxtime = len(df.columns) generatedPaths = [] @@ -32,43 +34,43 @@ def genSamples(opts): # Beeline/inputs/DYN-LI-500-1/... outfpath = opts['outPrefix'] + '/' + opts['name'] + '-' + str(sample_size) + '-' + str(did) generatedPaths.append(outfpath) - + if not os.path.exists(outfpath): print(outfpath, "does not exist, creating it...") os.makedirs(outfpath) # Create cell ids simids = np.random.choice(range(num_simulations), size=sample_size, replace=False) - fids = ['E'+ str(sid) + '.csv' for sid in simids] - timepoints = np.random.choice(range(1,maxtime), size=sample_size) + fids = ['E' + str(sid) + '.csv' for sid in simids] + timepoints = np.random.choice(range(1, maxtime), size=sample_size) min_t = min(timepoints) max_t = max(timepoints) - pts = [(t - min_t)/(max_t - min_t) for t in timepoints] - cellids = ['E' + str(sid) + '_' + str(t) for sid, t in zip(simids, timepoints)] + pts = [(t - min_t) / (max_t - min_t) for t in timepoints] + cellids = ['E' + str(sid) + '_' + str(t) for sid, t in zip(simids, timepoints)] # Read simulations from input dataset #psetid # to build a sample sample = [] for fid, cid in tqdm(zip(fids, cellids)): - df = pd.read_csv( opts['outPrefix'] + '/simulations/' + fid, index_col=0) + df = pd.read_csv(opts['outPrefix'] + '/simulations/' + fid, index_col=0) df.sort_index(inplace=True) sample.append(df[cid].to_frame()) - sampledf = pd.concat(sample,axis=1) + sampledf = pd.concat(sample, axis=1) sampledf.to_csv(outfpath + '/ExpressionData.csv') ## Read refNetwork.csv refdf = pd.read_csv(opts['outPrefix'] + '/refNetwork.csv') - refdf.to_csv(outfpath + '/refNetwork.csv',index=False) + refdf.to_csv(outfpath + '/refNetwork.csv', index=False) if numclusters == 1: ptdf = pd.DataFrame(np.array(pts), - index=pd.Index(cellids),columns = ['PseudoTime']) + index=pd.Index(cellids), columns=['PseudoTime']) else: subsetcluster = clusterdf.loc[[cid.split('_')[0] for cid in cellids]] ptdf = pd.DataFrame(index=pd.Index(cellids), - columns = ['PseudoTime' + str(1+i) for i in range(numclusters)]) + columns=['PseudoTime' + str(1 + i) for i in range(numclusters)]) for (cid, row), pt in zip(ptdf.iterrows(), pts): - ptdf.loc[cid]['PseudoTime' +\ - str(int(subsetcluster.loc[cid.split('_')[0]]['cl']) + 1)] = round(pt,5) - ptdf.to_csv(outfpath + '/PseudoTime.csv',na_rep='NA') + ptdf.loc[cid]['PseudoTime' + \ + str(int(subsetcluster.loc[cid.split('_')[0]]['cl']) + 1)] = round(pt, 5) + ptdf.to_csv(outfpath + '/PseudoTime.csv', na_rep='NA') return generatedPaths - + def genDropouts(opts): """Induce drop out in the simulated scRNAseq datasets. @@ -86,30 +88,30 @@ def genDropouts(opts): refDF = pd.read_csv(opts['refNet'], index_col=0) ## Generate output path for the dropout datasets - path = opts['outPrefix'] #+str(ncells) - path += '-' + str(int(100*dropoutCutoffs))+ '-' + str(opts['drop_prob']) + path = opts['outPrefix'] # +str(ncells) + path += '-' + str(int(100 * dropoutCutoffs)) + '-' + str(opts['drop_prob']) if not os.path.exists(path): os.makedirs(path) - + # Sample cells DropOutDF = expDF.copy() - #DropOutDF = DropOutDF.sample(n=ncells, axis='columns') - #cellIDs = DropOutDF.columns - + # DropOutDF = DropOutDF.sample(n=ncells, axis='columns') + # cellIDs = DropOutDF.columns + # copy over PT and refNetwork files refDF.to_csv(path + '/refNetwork.csv') - PTDF.to_csv(path+'/PseudoTime.csv') - + PTDF.to_csv(path + '/PseudoTime.csv') + # Drop-out genes if they are less than the # percentile value @ "dc" with 50% chance if dropoutCutoffs != 0: - quantileExp = expDF.quantile(q = dropoutCutoffs, axis = 'columns') + quantileExp = expDF.quantile(q=dropoutCutoffs, axis='columns') for idx, row in tqdm(expDF.iterrows()): for col in expDF.columns: if row[col] < quantileExp.loc[idx]: cointoss = np.random.random() if cointoss < opts['drop_prob']: - DropOutDF.loc[idx,col] = 0.0 + DropOutDF.loc[idx, col] = 0.0 DropOutDF.to_csv(path + '/ExpressionData.csv') @@ -118,22 +120,23 @@ def doDimRed(opts): """ Carry out dimensionality reduction """ - ExpDF = pd.read_csv(opts['expr'],index_col=0, header = 0) - ptDF = pd.read_csv(opts['pseudo'],index_col=0, header = 0) + ExpDF = pd.read_csv(opts['expr'], index_col=0, header=0) + ptDF = pd.read_csv(opts['pseudo'], index_col=0, header=0) perplexity = opts['perplexity'] print(perplexity) print("Computing TSNE...") - DimRedRes = TSNE(n_components = 2, perplexity = perplexity).fit_transform(ExpDF.T) - - DimRedDF = pd.DataFrame(DimRedRes,columns=['dim1','dim2'], + DimRedRes = TSNE(n_components=2, perplexity=perplexity).fit_transform(ExpDF.T) + + DimRedDF = pd.DataFrame(DimRedRes, columns=['dim1', 'dim2'], index=pd.Index(list(ExpDF.columns))) - DimRedDF.loc[:,'pt'] = ptDF.min(axis='columns') - DimRedDF.to_csv(str(opts['expr'].parent) + '/tsne' + str(perplexity)+'.tsv', sep='\t') + DimRedDF.loc[:, 'pt'] = ptDF.min(axis='columns') + DimRedDF.to_csv(str(opts['expr'].parent) + '/tsne' + str(perplexity) + '.tsv', sep='\t') plt.figure() plt.scatter(DimRedDF.dim1, DimRedDF.dim2, c=DimRedDF.pt) - plt.savefig(str(opts['expr'].parent)+'/tsne' + str(perplexity) + '.png') + plt.savefig(str(opts['expr'].parent) + '/tsne' + str(perplexity) + '.png') plt.close() - + + def computeSSPT(opts): ''' *Author: Aditya Pratapa* @@ -146,20 +149,20 @@ def computeSSPT(opts): E.g., Bifurcating: k=3 (1 initial and 2 terminal) E.g., Trifurcating: k=4 (1 initial and 3 terminal) ''' - ExpDF = pd.read_csv(opts['expr'],index_col=0, header = 0) - ptDF = pd.read_csv(opts['pseudo'],index_col=0, header = 0) + ExpDF = pd.read_csv(opts['expr'], index_col=0, header=0) + ptDF = pd.read_csv(opts['pseudo'], index_col=0, header=0) nClust = opts['nClusters'] outPath = opts['outPrefix'] perplexity = opts['perplexity'] noEnd = opts['noEnd'] - + if nClust == 1: # Return simulation time as PseduoTime - ptDF.loc[ExpDF.columns].to_csv(outPath+"/PseudoTime.csv", columns =['Time']) - + ptDF.loc[ExpDF.columns].to_csv(outPath + "/PseudoTime.csv", columns=['Time']) + else: ### Compute PseudoTime ordering using slingshot - + # Step-1: Compute dimensionality reduction. This is done in doDimRed(). # Currently only does TSNE # TODO: Add PCA @@ -168,13 +171,12 @@ def computeSSPT(opts): if not Path(settings['expr'].parent / 'tsne.tsv').is_file(): # First compute tSNE if this hasn't been done doDimRed(opts) - DimRedDF = pd.read_csv(settings['expr'].parent / 'tsne.tsv',sep='\t') - + DimRedDF = pd.read_csv(settings['expr'].parent / 'tsne.tsv', sep='\t') + # Step-3: Compute kMeans clustering - DimRedDF.loc[:,'cl'] = KMeans(n_clusters = nClust).fit(ExpDF.T).labels_ + DimRedDF.loc[:, 'cl'] = KMeans(n_clusters=nClust).fit(ExpDF.T).labels_ # Identify starting cluster - # Step-4: Identify cells corresponding to initial and final states # Cells in initial states are identified from cluster with smallest # mean experimental time @@ -182,35 +184,35 @@ def computeSSPT(opts): startClust = DimRedDF.groupby('cl').mean()['pt'].idxmin() endClust = ','.join([str(ix) for ix in DimRedDF.groupby('cl').mean()['pt'].index if ix != startClust]) startClust = str(startClust) - + # Step-5: Create a temporary directory and write files necessary to run slingshot - os.makedirs(outPath, exist_ok = True) + os.makedirs(outPath, exist_ok=True) - DimRedDF.to_csv(outPath + '/rd.tsv', columns = ['dim1','dim2'],sep='\t') - DimRedDF.to_csv(outPath + '/cl.tsv', columns = ['cl'],sep='\t') + DimRedDF.to_csv(outPath + '/rd.tsv', columns=['dim1', 'dim2'], sep='\t') + DimRedDF.to_csv(outPath + '/cl.tsv', columns=['cl'], sep='\t') if noEnd: - cmdToRun= " ".join(["docker run --rm -v", str(Path.cwd()) + "/" +outPath +"/:/data/temp", - "slingshot:base /bin/sh -c \"Rscript data/run_slingshot.R", - "--input=/data/temp/rd.tsv --input-type=matrix", - "--cluster-labels=/data/temp/cl.tsv", - "--start-clus="+startClust+'\"']) + cmdToRun = " ".join(["docker run --rm -v", str(Path.cwd()) + "/" + outPath + "/:/data/temp", + "slingshot:base /bin/sh -c \"Rscript data/run_slingshot.R", + "--input=/data/temp/rd.tsv --input-type=matrix", + "--cluster-labels=/data/temp/cl.tsv", + "--start-clus=" + startClust + '\"']) else: - cmdToRun= " ".join(["docker run --rm -v", str(Path.cwd())+ "/" +outPath +"/:/data/temp", - "slingshot:base /bin/sh -c \"Rscript data/run_slingshot.R", - "--input=/data/temp/rd.tsv --input-type=matrix", - "--cluster-labels=/data/temp/cl.tsv", - "--start-clus="+startClust, "--end-clus="+endClust+'\"']) + cmdToRun = " ".join(["docker run --rm -v", str(Path.cwd()) + "/" + outPath + "/:/data/temp", + "slingshot:base /bin/sh -c \"Rscript data/run_slingshot.R", + "--input=/data/temp/rd.tsv --input-type=matrix", + "--cluster-labels=/data/temp/cl.tsv", + "--start-clus=" + startClust, "--end-clus=" + endClust + '\"']) print(cmdToRun) os.system(cmdToRun) # Do this only for the first file - tn = pd.read_csv(outPath+"/rd.tsv", - header = 0, index_col =None, sep='\t') + tn = pd.read_csv(outPath + "/rd.tsv", + header=0, index_col=None, sep='\t') - cl = pd.read_csv(outPath+"/cl.tsv", - header = 0, index_col =0, sep='\t') + cl = pd.read_csv(outPath + "/cl.tsv", + header=0, index_col=0, sep='\t') - curveFile = open(outPath+"/curves.csv","r") + curveFile = open(outPath + "/curves.csv", "r") curveLst = [] lneCnt = 0 for line in curveFile: @@ -218,60 +220,59 @@ def computeSSPT(opts): lneCnt += 1 tn['cl'] = cl.values - tn.columns = ['CellID','dim1','dim2','kMeans'] + tn.columns = ['CellID', 'dim1', 'dim2', 'kMeans'] tn.index = tn.CellID f, axes = plt.subplots(2, 2, figsize=(7.5, 7.5)) # Plot slingshot pseudotime # and original clusters - detPT = pd.read_csv(outPath+"/SlingshotPT.csv", - header = 0, index_col = 0) + detPT = pd.read_csv(outPath + "/SlingshotPT.csv", + header=0, index_col=0) print() colNames = detPT.columns for colName in colNames: # Select cells belonging to each pseudotime trajectory index = detPT[colName].index[detPT[colName].notnull()] - tn.loc[index,colName] = detPT.loc[index,colName] - + tn.loc[index, colName] = detPT.loc[index, colName] - sns.scatterplot(x='dim1',y='dim2', - data = tn.loc[index], hue = colName, - palette = "viridis", - ax = axes[1][0]) + sns.scatterplot(x='dim1', y='dim2', + data=tn.loc[index], hue=colName, + palette="viridis", + ax=axes[1][0]) plt.legend([]) for line in range(0, lneCnt, 2): - sns.lineplot(x= curveLst[line+1],y=curveLst[line], - color = "k", ax = axes[1][0]) + sns.lineplot(x=curveLst[line + 1], y=curveLst[line], + color="k", ax=axes[1][0]) - sns.scatterplot(x='dim1',y='dim2', - data = tn, hue = 'kMeans', - palette = "Set1", - ax = axes[1][1]) + sns.scatterplot(x='dim1', y='dim2', + data=tn, hue='kMeans', + palette="Set1", + ax=axes[1][1]) # Plot deterministic pseduotime # and original clusters - detPT = pd.read_csv(outPath+"/PseudoTime.csv", - header = 0, index_col = 0) + detPT = pd.read_csv(outPath + "/PseudoTime.csv", + header=0, index_col=0) colNames = detPT.columns for idx in range(len(colNames)): # Select cells belonging to each pseudotime trajectory colName = colNames[idx] index = detPT[colName].index[detPT[colName].notnull()] - tn.loc[index,'Original'] = int(idx) + tn.loc[index, 'Original'] = int(idx) tn['ExpTime'] = detPT.min(axis='columns') - sns.scatterplot(x='dim1',y='dim2', - data = tn, hue = 'ExpTime', - palette = "viridis", - ax = axes[0][0]) + sns.scatterplot(x='dim1', y='dim2', + data=tn, hue='ExpTime', + palette="viridis", + ax=axes[0][0]) - sns.scatterplot(x='dim1',y='dim2', - data = tn, hue = 'Original', - palette = "Set1", - ax = axes[0][1]) + sns.scatterplot(x='dim1', y='dim2', + data=tn, hue='Original', + palette="Set1", + ax=axes[0][1]) axes[0][0].get_legend().remove() axes[0][0].title.set_text('Experiment Time') @@ -286,8 +287,15 @@ def computeSSPT(opts): f.tight_layout() - tn.to_csv(outPath+"/Updated_rd.tsv", + tn.to_csv(outPath + "/Updated_rd.tsv", sep='\t') - plt.savefig(outPath+"/SlingshotOutput.png") - os.system("rm -rf temp/") - + plt.savefig(outPath + "/SlingshotOutput.png") + os.system("rm -rf temp/") + + +def dbscan_run(opts): + expressionDataFileLocation = opts['expressionDataFileLocation'] + outputPath = opts['outputPath'] + perform_pyboolnet = opts['perform_PyBoolNet'] + modelPath = opts['modelPath'] + dbscan_evaluation.dbscan_clustering(expressionDataFileLocation, outputPath, perform_pyboolnet, modelPath) diff --git a/README.md b/README.md index 3f2128d..bd3c708 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,22 @@ Git Repo for converting Boolean models to ODE models and performing stochastic s Find the documentation for BoolODE at [https://murali-group.github.io/Beeline/BoolODE.html](https://murali-group.github.io/Beeline/BoolODE.html). -## Usage -`python boolode.py --config path/to/config.yaml` +## Installation + +1) Clone the repository to get a copy of all BoolODE files on your personal machine. +In the directory where you want the BoolODE files, use the following command: +`git clone https://github.com/Murali-group/BoolODE.git` -## Getting Started -Install the required packages with the following command: +2) Install the required software packages with the following command: `pip install -r requirements.txt` +3) If you want to perform the optional post_processing of comparing DBSCAN with PyBoolNet (compare_pyboolnet:True), follow +the instructions to install the requirements for PyBoolNet here: +`https://pyboolnet.readthedocs.io/en/latest/index.html#` + +## Usage +`python boolode.py --config path/to/config.yaml` + ## Configuration BoolODE reads user defined configurations from a YAML file. A sample config file is provided in (config-files/example-config.yaml)[github.com//Murali-group/BoolODE/blob/master/config-files/example-config.yaml]. @@ -90,9 +99,9 @@ If you use BoolODE in your research, please cite: Aditya Pratapa, Amogh Jalihal, Jeffrey Law, Aditya Bharadwaj, and T M Murali. Benchmarking algorithms for gene regulatory network inference from single-cell transcriptomic data, Nature Methods, (2020). https://doi.org/10.1038/s41592-019-0690-6 -## Optional clustering techniques +# Optional clustering techniques -# Perform_Clustering +## Perform_Clustering Performs clustering on an ExpressionData file with various cluster and visualization options. Clustering is used to predict the number of steady states in the Boolean Model expressed in the ExpressionData file. A brief explanation of the DBSCAN clustering technique is provided in the Overview section @@ -117,7 +126,7 @@ Note: any combination of -s, -e, and -d can be specified, for example: `python perform_clustering.py -f path/to/ExpressionData.csv -d -e -s` -# INPUTS +## Inputs -f: The ExpressionData file path Required @@ -136,7 +145,7 @@ Not required Not required -# OUTPUTS +## Outputs -d: DBSCAN clustering is requested The DBSCAN clustering outputs a DBSCAN_ClusterIDs.csv file, where each cell has its own cluster assigned by DBSCAN. Note: noise found by DBSCAN are put in a cluster for visualization purposes. @@ -150,7 +159,7 @@ The k-means silhouette generates a silhouette_visualization.png file where the n Note: All outputs are generated in the same directory as the provided ExpressionData.csv -# OUTPUT NOTES +## OUTPUT NOTES ## DBSCAN @@ -165,7 +174,7 @@ The elbow method has one additional metric that can be implemented if the line d The silhouette_visualization.png file needs to be visually analyzed to determine the appropriate number of clusters. The correct estimated cluster number, according to Silhouette, corresponds to the plot where there that has the least number of negative coefficient values and has the most uniformity in the thickness of the clusters. -# OVERVIEW +## Overview The perform_clustering script is designed to analyze ExpressionData files generated by BoolODE to statistically analyze the data to try and cluster it and predict the number of steady states that exist in the boolean model. It currently supports k-means elbow, k-means silhouette, and DBSCAN. diff --git a/Synthetic-H/.DS_Store b/Synthetic-H/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..902b50c5c01d831dde405851cbaf280fa0a774cf GIT binary patch literal 6148 zcmeHK&2Abo5FP_f3{_PQmBP`N-e?7B(}+W)4Iu|44v{u$4{ZgzU6ib}T}QAKC4^{S zBYBBDN1mXM)6UpV1cF{8RLw}^Z|s@zu0LD;0RYjSL`{Gy07z8ALK%xSLVnT}DY%vr zqA-2*pbPJy*-iA1m1u6*LuUG43E zn$OE}=WX+#JNS8dHM^eQ+?t_)z=dn%wZliaLt}-QU;Zdfbb5w9%3JjJ9vA)sarYRr zNE}vKm;q*h8Q25{+}0;wZo<#-KQIH#z(z4Z`-4Iy^c?0E&DMd1c>*BPHPQ&$bY-L* z<4v0hq*;;LE(#lp@9o#;8_{?3v0S*E&u=k literal 0 HcmV?d00001 diff --git a/Synthetic-H/dyn-LI-1/parameters.txt b/Synthetic-H/dyn-LI-1/parameters.txt new file mode 100644 index 0000000..ce0027c --- /dev/null +++ b/Synthetic-H/dyn-LI-1/parameters.txt @@ -0,0 +1,66 @@ +# Automatically generated by BoolODE +n_g1 10.0 +n_g2 10.0 +n_g3 10.0 +n_g4 10.0 +n_g5 10.0 +n_g6 10.0 +n_g7 10.0 +k_g1 10.0 +k_g2 10.0 +k_g3 10.0 +k_g4 10.0 +k_g5 10.0 +k_g6 10.0 +k_g7 10.0 +sigmaH_g1 10.0 +sigmaH_g2 10.0 +sigmaH_g3 10.0 +sigmaH_g4 10.0 +sigmaH_g5 10.0 +sigmaH_g6 10.0 +sigmaH_g7 10.0 +m_g1 20.0 +m_g2 20.0 +m_g3 20.0 +m_g4 20.0 +m_g5 20.0 +m_g6 20.0 +m_g7 20.0 +l_x_g1 10.0 +l_x_g2 10.0 +l_x_g3 10.0 +l_x_g4 10.0 +l_x_g5 10.0 +l_x_g6 10.0 +l_x_g7 10.0 +r_g1 10.0 +r_g2 10.0 +r_g3 10.0 +r_g4 10.0 +r_g5 10.0 +r_g6 10.0 +r_g7 10.0 +l_p_g1 1.0 +l_p_g2 1.0 +l_p_g3 1.0 +l_p_g4 1.0 +l_p_g5 1.0 +l_p_g6 1.0 +l_p_g7 1.0 +alpha_g1 1 +alpha_g2 0 +alpha_g3 0 +alpha_g4 0 +alpha_g5 0 +alpha_g6 0 +alpha_g7 0 +a_g1_g7 0 +a_g2_g1 1 +a_g3_g2 1 +a_g4_g3 1 +a_g5_g4 1 +a_g6_g5 1 +a_g7_g6 1 +a_g7_g7 1 +a_g7_g6_g7 1 diff --git a/Synthetic-H/dyn-LL-1/parameters.txt b/Synthetic-H/dyn-LL-1/parameters.txt new file mode 100644 index 0000000..656bd42 --- /dev/null +++ b/Synthetic-H/dyn-LL-1/parameters.txt @@ -0,0 +1,165 @@ +# Automatically generated by BoolODE +n_g1 10.0 +n_g2 10.0 +n_g3 10.0 +n_g4 10.0 +n_g5 10.0 +n_g6 10.0 +n_g7 10.0 +n_g8 10.0 +n_g9 10.0 +n_g10 10.0 +n_g11 10.0 +n_g12 10.0 +n_g13 10.0 +n_g14 10.0 +n_g15 10.0 +n_g16 10.0 +n_g17 10.0 +n_g18 10.0 +k_g1 10.0 +k_g2 10.0 +k_g3 10.0 +k_g4 10.0 +k_g5 10.0 +k_g6 10.0 +k_g7 10.0 +k_g8 10.0 +k_g9 10.0 +k_g10 10.0 +k_g11 10.0 +k_g12 10.0 +k_g13 10.0 +k_g14 10.0 +k_g15 10.0 +k_g16 10.0 +k_g17 10.0 +k_g18 10.0 +sigmaH_g1 10.0 +sigmaH_g2 10.0 +sigmaH_g3 10.0 +sigmaH_g4 10.0 +sigmaH_g5 10.0 +sigmaH_g6 10.0 +sigmaH_g7 10.0 +sigmaH_g8 10.0 +sigmaH_g9 10.0 +sigmaH_g10 10.0 +sigmaH_g11 10.0 +sigmaH_g12 10.0 +sigmaH_g13 10.0 +sigmaH_g14 10.0 +sigmaH_g15 10.0 +sigmaH_g16 10.0 +sigmaH_g17 10.0 +sigmaH_g18 10.0 +m_g1 20.0 +m_g2 20.0 +m_g3 20.0 +m_g4 20.0 +m_g5 20.0 +m_g6 20.0 +m_g7 20.0 +m_g8 20.0 +m_g9 20.0 +m_g10 20.0 +m_g11 20.0 +m_g12 20.0 +m_g13 20.0 +m_g14 20.0 +m_g15 20.0 +m_g16 20.0 +m_g17 20.0 +m_g18 20.0 +l_x_g1 10.0 +l_x_g2 10.0 +l_x_g3 10.0 +l_x_g4 10.0 +l_x_g5 10.0 +l_x_g6 10.0 +l_x_g7 10.0 +l_x_g8 10.0 +l_x_g9 10.0 +l_x_g10 10.0 +l_x_g11 10.0 +l_x_g12 10.0 +l_x_g13 10.0 +l_x_g14 10.0 +l_x_g15 10.0 +l_x_g16 10.0 +l_x_g17 10.0 +l_x_g18 10.0 +r_g1 10.0 +r_g2 10.0 +r_g3 10.0 +r_g4 10.0 +r_g5 10.0 +r_g6 10.0 +r_g7 10.0 +r_g8 10.0 +r_g9 10.0 +r_g10 10.0 +r_g11 10.0 +r_g12 10.0 +r_g13 10.0 +r_g14 10.0 +r_g15 10.0 +r_g16 10.0 +r_g17 10.0 +r_g18 10.0 +l_p_g1 1.0 +l_p_g2 1.0 +l_p_g3 1.0 +l_p_g4 1.0 +l_p_g5 1.0 +l_p_g6 1.0 +l_p_g7 1.0 +l_p_g8 1.0 +l_p_g9 1.0 +l_p_g10 1.0 +l_p_g11 1.0 +l_p_g12 1.0 +l_p_g13 1.0 +l_p_g14 1.0 +l_p_g15 1.0 +l_p_g16 1.0 +l_p_g17 1.0 +l_p_g18 1.0 +omega_g1 1 +omega_g2 -1 +omega_g3 -1 +omega_g4 -1 +omega_g5 -1 +omega_g6 -1 +omega_g7 -1 +omega_g8 -1 +omega_g9 -1 +omega_g10 -1 +omega_g11 -1 +omega_g12 -1 +omega_g13 -1 +omega_g14 -1 +omega_g15 -1 +omega_g16 -1 +omega_g17 -1 +omega_g18 -1 +w_g1_g18 -0.1 +w_g2_g1 0.1 +w_g3_g2 0.1 +w_g4_g3 0.1 +w_g5_g4 0.1 +w_g6_g5 0.1 +w_g7_g6 0.1 +w_g8_g7 0.1 +w_g9_g8 0.1 +w_g10_g9 0.1 +w_g11_g10 0.1 +w_g12_g11 0.1 +w_g13_g12 0.1 +w_g14_g13 0.1 +w_g15_g14 0.1 +w_g16_g15 0.1 +w_g17_g16 0.1 +w_g18_g18 0.1 +w_g18_g17 0.1 +w_g18_g18_g17 0.1 diff --git a/boolode.py b/boolode.py index 7e41cd4..bb305d5 100644 --- a/boolode.py +++ b/boolode.py @@ -1,4 +1,3 @@ -import yaml import argparse import BoolODE as bo diff --git a/config-files/config.yaml b/config-files/config.yaml index ad85686..c04c2ef 100644 --- a/config-files/config.yaml +++ b/config-files/config.yaml @@ -2,32 +2,33 @@ global_settings: model_dir: "data" output_dir: "Synthetic-H" do_simulations: True - do_post_processing: False - modeltype: 'heaviside' -# modeltype: 'hill' + do_post_processing: True + modeltype: 'hill' +# modeltype: 'heaviside' jobs: - - name: "dyn-LL-1" - model_definition: "dyn-linear-long.txt" - model_initial_conditions: "dyn-linear-long_ics.txt" - simulation_time: 9 - num_cells: 300 - do_parallel: True - sample_cells: False - # - name: "dyn-LI-1" - # model_definition: "dyn-linear.txt" - # model_initial_conditions: "dyn-linear_ics.txt" - # simulation_time: 7 - # num_cells: 200 - # do_parallel: True - # sample_cells: False +# - name: "dyn-LL-1" +# model_definition: "dyn-linear-long.txt" +# model_initial_conditions: "dyn-linear-long_ics.txt" +# simulation_time: 9 +# num_cells: 300 +# do_parallel: False +# sample_cells: False + + - name: "dyn-LI-1" + model_definition: "dyn-linear.txt" + model_initial_conditions: "dyn-linear_ics.txt" + simulation_time: 7 + num_cells: 200 + do_parallel: False + sample_cells: False # - name: "dyn-BF-1" # model_definition: "dyn-bifurcating.txt" # model_initial_conditions: "dyn-bifurcating_ics.txt" # simulation_time: 5 # num_cells: 500 - # do_parallel: True + # do_parallel: False # sample_cells: False # nClusters: 2 @@ -36,7 +37,7 @@ jobs: # model_initial_conditions: "dyn-trifurcating_ics.txt" # simulation_time: 8 # num_cells: 500 - # do_parallel: True + # do_parallel: False # sample_cells: False # nClusters: 3 @@ -45,15 +46,17 @@ jobs: # model_initial_conditions: "dyn-cycle_ics.txt" # simulation_time: 8 # num_cells: 500 - # do_parallel: True + # do_parallel: False # sample_cells: False # nClusters: 1 post_processing: - Dropouts: - - dropout: False - nCells: 1000 - +# Dropouts: +# - dropout: False +# nCells: 1000 + DBSCAN: + - outputPath: /Users/neelpatel/Desktop/BoolODE/data/ + perform_PyBoolNet: True # - dropout: False # nCells: 100 # drop_cutoff: 0.5 diff --git a/config-files/example-config.yaml b/config-files/example-config.yaml index 5fc7da7..fe79d80 100644 --- a/config-files/example-config.yaml +++ b/config-files/example-config.yaml @@ -170,3 +170,14 @@ post_processing: ## docker on your machine. # Slingshot: # - perplexity: 200 + + +# Run DBSCAN on BoolODE ExpressionData output +# outputPath is where the user would like output files will generate +# For steady state calculation from PyBoolNet, set perform_PyBoolNet to True, +# the default is false. +# Note: If you set perform_PyBoolNet to true, you need to follow the +# PyBoolNet installation guide provided in README.MD +# DBSCAN: +# - outputPath: /Users/userName/Desktop/BoolODE/data/dbscanOutputFolder +# perform_PyBoolNet: True diff --git a/requirements.txt b/requirements.txt index 241b14a..2d7dcb9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,4 @@ seaborn==0.9.0 pandas==0.24.2 scikit-learn==0.21.3 yellowbrick==1.3.post1 -kneed==0.7.0 +kneed==0.7.0 \ No newline at end of file diff --git a/scripts/.DS_Store b/scripts/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7351eaee63ce4d14e724373246b9bf8db950c478 GIT binary patch literal 6148 zcmeHKO-sW-5PegNw20b^;6=$FXu*FFOFeilc-4Mc3)N_w9=zr5kMZ|;(lw& z-4Ujk;0Zl!uHOBkp0PCzb$){|pEky!H(>UJ5mkkwZ0ji>rP{o7a|K)hSK!AL;GV74 zI570q6>tSyfwcnqeMsnvX~e=Xd^*^KBLK0^a4`1uH&HoB#57`I$U8JKD$%GCj~HTf z#*>(rMl1}C4vB{ki6cuqp-32=^^=eeNe#Vq1zdq`1@`Q+rThQY_vim@l3%$3uE4)i zK0X=A@91ipR~W7-?1ZhDxw;jf(t|OcXor|aEDRZ;`Hw)5!5dfL HR~7gI2xD=E literal 0 HcmV?d00001 diff --git a/scripts/perform_clustering.py b/scripts/perform_clustering.py index 6d4381d..cfbd024 100644 --- a/scripts/perform_clustering.py +++ b/scripts/perform_clustering.py @@ -169,7 +169,7 @@ def dbscan_clustering(): # Find the average k-distances then plot to find the knee, # which is the point of maximum curvature - y_values = compute_average_distances(distances) + y_values = _compute_average_distances(distances) x_values = list(range(1,len(y_values) + 1)) knee_locator = KneeLocator(x_values, y_values, S=1.0, curve='convex', direction='increasing') maximum_curvature_position = round(knee_locator.knee, 20) @@ -226,7 +226,7 @@ def dbscan_clustering(): average distance of the distance list occupied in the respective ordinal location of the input list """ -def compute_average_distances(distance_array): +def _compute_average_distances(distance_array): denominator_of_average = len(distance_array[0]) # Will be of length number of samples (cells) in the # ExpressionData, once full From c5b52a43a9df27ec2d5ed3b0711f5ff158f40816 Mon Sep 17 00:00:00 2001 From: Neel Patel <67388292+neelspatel999@users.noreply.github.com> Date: Mon, 15 Nov 2021 00:38:44 -0500 Subject: [PATCH 04/14] Delete .DS_Store --- .DS_Store | Bin 10244 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index b2088cc5c7d1895a374238f833ed84fb5c75dbcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHM&u<$=6n>K$vUXCkX_NjEh!s&KMAOJ=6HpFST_+K>pd^i>kdPL4*SmIBUGJFP zby6n;`Ob+WNE|sJA#vk^#2NkqPN;tZTq_RYo7uJN9|TnhM2cosGwZ54>q=<1*2g*>=a}JULPqacyv|R9b+42UgRfl3gF`yVw3@8Q^ z11Et2e6vN-Mq;U2#eiZ!G04FShqZB{gYMq+%U>!e`Z6cQZKwXtZ5l7b2@Xs zxWo5~kr_3@ycukZyHzvVu@ZfqbFZVD)`sismGp^4?nkEUJAnkdwgZ!U@4LRu_wu~q z+o7DN7!PP#T1%Jo3kL_+=jNx4YYPj9)5gKVwd}Mp|JIv_hiUEn<=GpB2esz@!N-T6 zd@f&vSdvRl7F6n12v;43ci1o9`Js#w}hO=D_T)S8| z%dTJDjGRYN(cO1S`k6k{HOKz&Y1ewQ4x5Rm9df$21IO{@d@Geo=tP@c`c_FF3(Eob zyj32$k<0z9dm$pB5IMDiU*UM-E>`|ZT?~aAP7p#4U^chRATa%^lW*SlOv~|B{5+2$ zUK5sLwleou14qoX=|UIpGIjGetQ3@~+&gXM^;pqqDptfGk5x@)>pu6Lbb2bcnv806 z1$p2OZO}v7r_bn1`kKC{AL$qRm7cI+c9FftuCO_FgWY7e*3~ch4aTdkTX;xyEj~hMCf)S zbP5oBA5jD0D6|@?k1z{?j_46Zy?B`izv;dr0YX z=_JT?@tN5{9&CW_2$zH0=A(Mll%sS|Zm*q)M)pRRYhbF1 zVn8vV7*Gr-1{4F&z`&{4#t`TK%g6u!{|qxJ6UBgH;CW?$rIw0IdHnkJHogBv#96z6 z`T$iFVb_YKgrJef@sRR39yj7RULG=_FAH53=sBT4wqgkl Date: Mon, 15 Nov 2021 00:40:13 -0500 Subject: [PATCH 05/14] Delete .DS_Store --- Synthetic-H/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Synthetic-H/.DS_Store diff --git a/Synthetic-H/.DS_Store b/Synthetic-H/.DS_Store deleted file mode 100644 index 902b50c5c01d831dde405851cbaf280fa0a774cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&2Abo5FP_f3{_PQmBP`N-e?7B(}+W)4Iu|44v{u$4{ZgzU6ib}T}QAKC4^{S zBYBBDN1mXM)6UpV1cF{8RLw}^Z|s@zu0LD;0RYjSL`{Gy07z8ALK%xSLVnT}DY%vr zqA-2*pbPJy*-iA1m1u6*LuUG43E zn$OE}=WX+#JNS8dHM^eQ+?t_)z=dn%wZliaLt}-QU;Zdfbb5w9%3JjJ9vA)sarYRr zNE}vKm;q*h8Q25{+}0;wZo<#-KQIH#z(z4Z`-4Iy^c?0E&DMd1c>*BPHPQ&$bY-L* z<4v0hq*;;LE(#lp@9o#;8_{?3v0S*E&u=k From 17a091291e3ca4bbad73fd12ed58e8e79bf4492f Mon Sep 17 00:00:00 2001 From: Neel Patel <67388292+neelspatel999@users.noreply.github.com> Date: Mon, 15 Nov 2021 00:41:41 -0500 Subject: [PATCH 06/14] Delete vcs.xml --- .idea/vcs.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .idea/vcs.xml diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 5df25c33d61a6493f72f3ef76f12e94361165c49 Mon Sep 17 00:00:00 2001 From: Neel Patel <67388292+neelspatel999@users.noreply.github.com> Date: Mon, 15 Nov 2021 00:43:05 -0500 Subject: [PATCH 07/14] Delete .idea directory --- .idea/.gitignore | 3 --- .idea/BoolODE.iml | 10 ---------- .idea/inspectionProfiles/profiles_settings.xml | 6 ------ .idea/misc.xml | 4 ---- .idea/modules.xml | 8 -------- 5 files changed, 31 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/BoolODE.iml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/BoolODE.iml b/.idea/BoolODE.iml deleted file mode 100644 index 74d515a..0000000 --- a/.idea/BoolODE.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 437958e..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a19acc7..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 9437cea439bf97472b9fd3593cbfaa602f5e1d7a Mon Sep 17 00:00:00 2001 From: Neel Patel <67388292+neelspatel999@users.noreply.github.com> Date: Mon, 15 Nov 2021 00:50:23 -0500 Subject: [PATCH 08/14] Delete Synthetic-H directory --- Synthetic-H/dyn-LI-1/parameters.txt | 66 ----------- Synthetic-H/dyn-LL-1/parameters.txt | 165 ---------------------------- 2 files changed, 231 deletions(-) delete mode 100644 Synthetic-H/dyn-LI-1/parameters.txt delete mode 100644 Synthetic-H/dyn-LL-1/parameters.txt diff --git a/Synthetic-H/dyn-LI-1/parameters.txt b/Synthetic-H/dyn-LI-1/parameters.txt deleted file mode 100644 index ce0027c..0000000 --- a/Synthetic-H/dyn-LI-1/parameters.txt +++ /dev/null @@ -1,66 +0,0 @@ -# Automatically generated by BoolODE -n_g1 10.0 -n_g2 10.0 -n_g3 10.0 -n_g4 10.0 -n_g5 10.0 -n_g6 10.0 -n_g7 10.0 -k_g1 10.0 -k_g2 10.0 -k_g3 10.0 -k_g4 10.0 -k_g5 10.0 -k_g6 10.0 -k_g7 10.0 -sigmaH_g1 10.0 -sigmaH_g2 10.0 -sigmaH_g3 10.0 -sigmaH_g4 10.0 -sigmaH_g5 10.0 -sigmaH_g6 10.0 -sigmaH_g7 10.0 -m_g1 20.0 -m_g2 20.0 -m_g3 20.0 -m_g4 20.0 -m_g5 20.0 -m_g6 20.0 -m_g7 20.0 -l_x_g1 10.0 -l_x_g2 10.0 -l_x_g3 10.0 -l_x_g4 10.0 -l_x_g5 10.0 -l_x_g6 10.0 -l_x_g7 10.0 -r_g1 10.0 -r_g2 10.0 -r_g3 10.0 -r_g4 10.0 -r_g5 10.0 -r_g6 10.0 -r_g7 10.0 -l_p_g1 1.0 -l_p_g2 1.0 -l_p_g3 1.0 -l_p_g4 1.0 -l_p_g5 1.0 -l_p_g6 1.0 -l_p_g7 1.0 -alpha_g1 1 -alpha_g2 0 -alpha_g3 0 -alpha_g4 0 -alpha_g5 0 -alpha_g6 0 -alpha_g7 0 -a_g1_g7 0 -a_g2_g1 1 -a_g3_g2 1 -a_g4_g3 1 -a_g5_g4 1 -a_g6_g5 1 -a_g7_g6 1 -a_g7_g7 1 -a_g7_g6_g7 1 diff --git a/Synthetic-H/dyn-LL-1/parameters.txt b/Synthetic-H/dyn-LL-1/parameters.txt deleted file mode 100644 index 656bd42..0000000 --- a/Synthetic-H/dyn-LL-1/parameters.txt +++ /dev/null @@ -1,165 +0,0 @@ -# Automatically generated by BoolODE -n_g1 10.0 -n_g2 10.0 -n_g3 10.0 -n_g4 10.0 -n_g5 10.0 -n_g6 10.0 -n_g7 10.0 -n_g8 10.0 -n_g9 10.0 -n_g10 10.0 -n_g11 10.0 -n_g12 10.0 -n_g13 10.0 -n_g14 10.0 -n_g15 10.0 -n_g16 10.0 -n_g17 10.0 -n_g18 10.0 -k_g1 10.0 -k_g2 10.0 -k_g3 10.0 -k_g4 10.0 -k_g5 10.0 -k_g6 10.0 -k_g7 10.0 -k_g8 10.0 -k_g9 10.0 -k_g10 10.0 -k_g11 10.0 -k_g12 10.0 -k_g13 10.0 -k_g14 10.0 -k_g15 10.0 -k_g16 10.0 -k_g17 10.0 -k_g18 10.0 -sigmaH_g1 10.0 -sigmaH_g2 10.0 -sigmaH_g3 10.0 -sigmaH_g4 10.0 -sigmaH_g5 10.0 -sigmaH_g6 10.0 -sigmaH_g7 10.0 -sigmaH_g8 10.0 -sigmaH_g9 10.0 -sigmaH_g10 10.0 -sigmaH_g11 10.0 -sigmaH_g12 10.0 -sigmaH_g13 10.0 -sigmaH_g14 10.0 -sigmaH_g15 10.0 -sigmaH_g16 10.0 -sigmaH_g17 10.0 -sigmaH_g18 10.0 -m_g1 20.0 -m_g2 20.0 -m_g3 20.0 -m_g4 20.0 -m_g5 20.0 -m_g6 20.0 -m_g7 20.0 -m_g8 20.0 -m_g9 20.0 -m_g10 20.0 -m_g11 20.0 -m_g12 20.0 -m_g13 20.0 -m_g14 20.0 -m_g15 20.0 -m_g16 20.0 -m_g17 20.0 -m_g18 20.0 -l_x_g1 10.0 -l_x_g2 10.0 -l_x_g3 10.0 -l_x_g4 10.0 -l_x_g5 10.0 -l_x_g6 10.0 -l_x_g7 10.0 -l_x_g8 10.0 -l_x_g9 10.0 -l_x_g10 10.0 -l_x_g11 10.0 -l_x_g12 10.0 -l_x_g13 10.0 -l_x_g14 10.0 -l_x_g15 10.0 -l_x_g16 10.0 -l_x_g17 10.0 -l_x_g18 10.0 -r_g1 10.0 -r_g2 10.0 -r_g3 10.0 -r_g4 10.0 -r_g5 10.0 -r_g6 10.0 -r_g7 10.0 -r_g8 10.0 -r_g9 10.0 -r_g10 10.0 -r_g11 10.0 -r_g12 10.0 -r_g13 10.0 -r_g14 10.0 -r_g15 10.0 -r_g16 10.0 -r_g17 10.0 -r_g18 10.0 -l_p_g1 1.0 -l_p_g2 1.0 -l_p_g3 1.0 -l_p_g4 1.0 -l_p_g5 1.0 -l_p_g6 1.0 -l_p_g7 1.0 -l_p_g8 1.0 -l_p_g9 1.0 -l_p_g10 1.0 -l_p_g11 1.0 -l_p_g12 1.0 -l_p_g13 1.0 -l_p_g14 1.0 -l_p_g15 1.0 -l_p_g16 1.0 -l_p_g17 1.0 -l_p_g18 1.0 -omega_g1 1 -omega_g2 -1 -omega_g3 -1 -omega_g4 -1 -omega_g5 -1 -omega_g6 -1 -omega_g7 -1 -omega_g8 -1 -omega_g9 -1 -omega_g10 -1 -omega_g11 -1 -omega_g12 -1 -omega_g13 -1 -omega_g14 -1 -omega_g15 -1 -omega_g16 -1 -omega_g17 -1 -omega_g18 -1 -w_g1_g18 -0.1 -w_g2_g1 0.1 -w_g3_g2 0.1 -w_g4_g3 0.1 -w_g5_g4 0.1 -w_g6_g5 0.1 -w_g7_g6 0.1 -w_g8_g7 0.1 -w_g9_g8 0.1 -w_g10_g9 0.1 -w_g11_g10 0.1 -w_g12_g11 0.1 -w_g13_g12 0.1 -w_g14_g13 0.1 -w_g15_g14 0.1 -w_g16_g15 0.1 -w_g17_g16 0.1 -w_g18_g18 0.1 -w_g18_g17 0.1 -w_g18_g18_g17 0.1 From 8ac7cde611c608dcb83d1bc02bd983a3e1d139a1 Mon Sep 17 00:00:00 2001 From: Neel Patel <67388292+neelspatel999@users.noreply.github.com> Date: Sun, 5 Dec 2021 22:01:26 -0500 Subject: [PATCH 09/14] Corrected the pyboolnet link address --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bd3c708..4c05446 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ In the directory where you want the BoolODE files, use the following command: 3) If you want to perform the optional post_processing of comparing DBSCAN with PyBoolNet (compare_pyboolnet:True), follow the instructions to install the requirements for PyBoolNet here: -`https://pyboolnet.readthedocs.io/en/latest/index.html#` +`https://pyboolnet.readthedocs.io/` ## Usage `python boolode.py --config path/to/config.yaml` @@ -180,4 +180,4 @@ The perform_clustering script is designed to analyze ExpressionData files genera ## DBSCAN Description -DBSCAN stands for Density-Based Spatial Clustering of Applications with Noise. It is useful for handling the data in ExpressionData files because of how it handles noise. DBSCAN works by looking at a point and a specified number of its neighbors at a certain distance to determine if they are similar enough to be grouped together in a cluster. In the end, DBSCAN outputs the estimated number of clusters that it found from the data. DBSCAN is used to estimate the number of steady states from simulated gene expression data from an ExpressionData file. \ No newline at end of file +DBSCAN stands for Density-Based Spatial Clustering of Applications with Noise. It is useful for handling the data in ExpressionData files because of how it handles noise. DBSCAN works by looking at a point and a specified number of its neighbors at a certain distance to determine if they are similar enough to be grouped together in a cluster. In the end, DBSCAN outputs the estimated number of clusters that it found from the data. DBSCAN is used to estimate the number of steady states from simulated gene expression data from an ExpressionData file. From 0ec7d18e76a26a4d45822f42dc90261b4b6d301b Mon Sep 17 00:00:00 2001 From: neelspatel999 Date: Sun, 5 Dec 2021 23:35:46 -0500 Subject: [PATCH 10/14] Added config generation scripts and refactored post-processing --- .DS_Store | Bin 0 -> 6148 bytes .idea/.gitignore | 3 + .idea/BoolODE.iml | 10 ++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + BoolODE/__init__.py | 28 ++-- ...evaluation.py => compare_steady_states.py} | 108 ++++++++---- BoolODE/post_processing.py | 13 +- config-files/config.yaml | 90 +++++----- config-files/example-config.yaml | 18 +- config-files/example_gen_config_input.txt | 8 + config-files/generate_config_files.py | 158 ++++++++++++++++++ find_and_run_configs.py | 49 ++++++ 15 files changed, 406 insertions(+), 103 deletions(-) create mode 100644 .DS_Store create mode 100644 .idea/.gitignore create mode 100644 .idea/BoolODE.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml rename BoolODE/{dbscan_evaluation.py => compare_steady_states.py} (65%) create mode 100644 config-files/example_gen_config_input.txt create mode 100644 config-files/generate_config_files.py create mode 100644 find_and_run_configs.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c7f0070eea755cc54d2fd5bc217a74ff8b887982 GIT binary patch literal 6148 zcmeHKyGjH>5Ukb<4lcRSaDKqRKNyY^F5e#zR8)`^Lo z^mNU#6>M(F(RFJ+~XE6c)&HzXVu3O&Rt=^J4Q0U z^LKB<^Z58Q-sSDb>B>q0DIf);fE17dzf{0`FKxL>RFnczKni>*;NOQvckG2zVthIn zVgw*Am=5DQW(i{R1hE%RiOkR}sl=pOjTn}6=3CYE!YMK7uo^zBo@_OtSUjEgwvna~C=4+n!!YMK6%m + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1d3e338 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a19acc7 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BoolODE/__init__.py b/BoolODE/__init__.py index aa12561..a2bc9fc 100644 --- a/BoolODE/__init__.py +++ b/BoolODE/__init__.py @@ -36,14 +36,14 @@ def __init__(self, dimred_jobs, slingshot_jobs, gensample_jobs, - dbscan_jobs, + compare_ss_jobs, geneexpression_jobs) -> None: self.dropout_jobs = dropout_jobs self.dimred_jobs = dimred_jobs self.slingshot_jobs = slingshot_jobs self.gensample_jobs = gensample_jobs - self.dbscan_jobs = dbscan_jobs + self.compare_ss_jobs = compare_ss_jobs self.geneexpression_jobs = geneexpression_jobs class BoolODE(object): @@ -149,7 +149,7 @@ def do_post_processing(self): if self.post_settings.dropout_jobs\ or self.post_settings.dimred_jobs\ or self.post_settings.geneexpression_jobs\ - or self.post_settings.dbscan_jobs\ + or self.post_settings.compare_ss_jobs\ or self.post_settings.slingshot_jobs: doOtherAnalysis = True generatedPaths = {} @@ -206,16 +206,16 @@ def do_post_processing(self): po.genDropouts(settings) if num_invalid == len(alljobs): break - # DBSCAN Jobs - if self.post_settings.dbscan_jobs is not None: - print("Starting DBSCAN...") - for dbscan_job in self.post_settings.dbscan_jobs: + # compare_ss_jobs (compare steady states jobs) + if self.post_settings.compare_ss_jobs is not None: + print("Starting to compare steady states...") + for ss_comparison_job in self.post_settings.compare_ss_jobs: for jobid in alljobs: for gsampPath in generatedPaths[jobid]: # outputPath = self.jobs[jobid]['outputPath'] settings = {} - settings['outputPath'] = dbscan_job.get('outputPath') - settings['perform_PyBoolNet'] = dbscan_job.get('perform_PyBoolNet', False) + settings['outputPath'] = ss_comparison_job.get('outputPath') + settings['perform_PyBoolNet'] = ss_comparison_job.get('perform_PyBoolNet', False) # To use genSamples generated ExpressionData for # this specific post-processing test as ExpressionData # settings['expressionDataFileLocation'] = Path(gsampPath,\ @@ -231,11 +231,11 @@ def do_post_processing(self): parent_directory_path = Path(self.global_settings.model_dir) parent_directory_path = parent_directory_path.parent.absolute() - # DBSCAN will need to know what model is being analyzed if + # Will need to know what model is being analyzed if # it is running PyBoolNet - settings['modelPath'] = str(parent_directory_path) + "/" + data_file_name - po.dbscan_run(settings) + settings['modelPath'] = str(parent_directory_path) + "/" + data_file_name + po.compare_ss(settings) if self.post_settings.dimred_jobs is not None: print("Starting dimesionality reduction using tSNE") @@ -375,8 +375,8 @@ def __parse_postproc_settings(input_settings_map) -> GlobalSettings: slingshot_jobs = input_settings_map.get('Slingshot', None) dimred_jobs = input_settings_map.get('DimRed', None) gensample_jobs = input_settings_map.get('GenSamples', None) - dbscan_jobs = input_settings_map.get('DBSCAN', None) + compare_ss_jobs = input_settings_map.get('CompareSteadyStates', None) geneexpression_jobs = input_settings_map.get('GeneExpression', None) return PostProcSettings(dropout_jobs, dimred_jobs, slingshot_jobs, gensample_jobs, - dbscan_jobs, geneexpression_jobs) + compare_ss_jobs, geneexpression_jobs) diff --git a/BoolODE/dbscan_evaluation.py b/BoolODE/compare_steady_states.py similarity index 65% rename from BoolODE/dbscan_evaluation.py rename to BoolODE/compare_steady_states.py index 32bd33c..75c6d2c 100644 --- a/BoolODE/dbscan_evaluation.py +++ b/BoolODE/compare_steady_states.py @@ -8,27 +8,72 @@ @Author: Amelia Whitehead (ameliafw@vt.edu) """ -""" - Performs DBSCAN on the ExpressionData file and generates a DBSCAN_ClusterIDs.csv file, which specifies - which cell belongs to what cluster, according to DBSCAN. All noise points are grouped together into - a separate cluster for visualization purposes. - - @Precondition: The number of samples (cells) needs to be greater than two - times the number of genes - - @Note: DBSCAN does not work well with datasets of varying density - - @Params: expression_data_location: the full file path of ExpressionData - output_file_path: the file path where output files should go - compare_with_pyboolnet: 1 if compare output with PyBoolNet, 0 otherwise - model_path: States the path of the model. Needed for PyBoolNet to analyze steady states - - @Citations: https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#sphx-glr-auto-examples-cluster-plot-dbscan-py - https://medium.com/@tarammullin/dbscan-parameter-estimation-ff8330e3a3bd -""" +def compare_ss(expression_data_location, output_file_path, compare_with_pyboolnet, model_path): + """ + Main caller of any steady state comparison techniques. + + @Params: expression_data_location: the full file path of ExpressionData + output_file_path: the file path where output files should go + compare_with_pyboolnet: 1 if compare output with PyBoolNet, 0 otherwise + model_path: States the path of the model. Needed for PyBoolNet to analyze steady states + """ + import os + # Perform DBSCAN, a clustering technique to approximate the number of steady states. + n_clusters_ = run_dbscan_clustering(expression_data_location, output_file_path) + # (Optional) Perform PyBoolNet to calculate the steady states and report the number of steady states. + pyboolnet_result = -1 + if compare_with_pyboolnet: + # Note: run_pyboolnet still has initial conditions section to be added + pyboolnet_result = run_pyboolnet(False, model_path) + + # Only do these print statements if PyBoolNet was ran. + if pyboolnet_result != -1: + if n_clusters_ == pyboolnet_result: + if n_clusters_ == 1: + print("\nDBSCAN and PyBoolNet results match and found " + str(n_clusters_) + " steady state\n") + else: + print("\nDBSCAN and PyBoolNet results match and found " + str(n_clusters_) + " steady states\n") + else: + print("\nDBSCAN and PyBoolNet outputs did not match. \nDBSCAN: " + str(n_clusters_) + ", PyBoolNet: " + str( + pyboolnet_result) + "\n") + output_file_path = os.path.join(output_file_path, "steady_state_comparison.txt") + outputfile = open(output_file_path, "w") + outputfile.write("DBSCAN Number of Steady State Estimation: " + str(n_clusters_) + "\n") + if pyboolnet_result != -1: + outputfile.write("PyBoolNet Number of Steady States: " + str(pyboolnet_result) + "\n") + outputfile.write("\n") + if n_clusters_ == pyboolnet_result: + if n_clusters_ == 1: + outputfile.write("DBSCAN and PyBoolNet outputs match and found " + str(n_clusters_) + " steady state") + else: + outputfile.write("DBSCAN and PyBoolNet outputs match and found " + str(n_clusters_) + " steady states") + else: + outputfile.write("DBSCAN and PyBoolNet outputs did not match.") + else: + outputfile.write("PyBoolNet was not ran because it was not requested") + print("Steady state comparison results were written to steady_state_comparison.txt\n") -def dbscan_clustering(expression_data_location, output_file_path, compare_with_pyboolnet, model_path): + + +def run_dbscan_clustering(expression_data_location, output_file_path): + """ + Performs DBSCAN on the ExpressionData file and generates a DBSCAN_ClusterIDs.csv file, which specifies + which cell belongs to what cluster, according to DBSCAN. All noise points are grouped together into + a separate cluster for visualization purposes. + + @Precondition: The number of samples (cells) needs to be greater than two + times the number of genes + + @Note: DBSCAN does not work well with datasets of varying density + + @Params: expression_data_location: the full file path of ExpressionData + output_file_path: the file path where output files should go + + @Citations: https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#sphx-glr-auto-examples-cluster-plot-dbscan-py + https://medium.com/@tarammullin/dbscan-parameter-estimation-ff8330e3a3bd + """ + import os from sklearn.cluster import DBSCAN from sklearn.neighbors import NearestNeighbors from kneed import KneeLocator @@ -123,25 +168,22 @@ def dbscan_clustering(expression_data_location, output_file_path, compare_with_p cell_names = expression_df.columns.tolist() dictionary = {'': cell_names, 'cl': cluster_values} cluster_df = pandas.DataFrame(dictionary) - cluster_df.to_csv(output_file_path + 'DBSCAN_ClusterIDs.csv', index=False) + output_file_path = os.path.join(output_file_path, 'DBSCAN_ClusterIDs.csv') + cluster_df.to_csv(output_file_path, index=False) print("DBSCAN analysis generated a DBSCAN_ClusterIDs.csv file.") - pyboolnet_result = -1 - if compare_with_pyboolnet: - # Note: not the correct way to express the file path. - pyboolnet_result = pyBoolNet_comparison(0, False, model_path) - - # Only do these print statements if PyBoolNet was ran. - if pyboolnet_result != -1: - if n_clusters_ == pyboolnet_result: - print("\nDBSCAN and PyBoolNet results match and found " + str(n_clusters_) + "steady states\n") - else: - print("\nDBSCAN and PyBoolNet outputs did not match. \nDBSCAN: " + str(n_clusters_) + ", PyBoolNet: " + str( - pyboolnet_result) + "\n") + return n_clusters_ # Runs PyBoolNet -def pyBoolNet_comparison(bnet_file, ics_present, model_path): +def run_pyboolnet(ics_present, model_path): + """ + Performs PyBoolNet to get the steady states. Information on PyBoolNet can be + found at https://pyboolnet.readthedocs.io/en/master/ + + @Params: ics_present: True if initial conditions are present, False otherwise + model_path: States the path of the model. Needed for PyBoolNet to analyze steady states + """ #### Still has initial conditions section to be added print("Starting PyBoolNet...") diff --git a/BoolODE/post_processing.py b/BoolODE/post_processing.py index 658606c..a163000 100644 --- a/BoolODE/post_processing.py +++ b/BoolODE/post_processing.py @@ -6,7 +6,7 @@ from sklearn.cluster import KMeans from sklearn.manifold import TSNE import matplotlib.pyplot as plt -from BoolODE import dbscan_evaluation +from BoolODE import compare_steady_states def genSamples(opts): @@ -293,9 +293,16 @@ def computeSSPT(opts): os.system("rm -rf temp/") -def dbscan_run(opts): +def compare_ss(opts): + """ + Performs steady state estimation on ExpressionData + with compare_steady_states.py, which + currently performs DBSCAN to determine steady states and can be + optionally compared with the steady states calculated by PyBoolNet as + specified by opts['perform_PyBoolNet'] + """ expressionDataFileLocation = opts['expressionDataFileLocation'] outputPath = opts['outputPath'] perform_pyboolnet = opts['perform_PyBoolNet'] modelPath = opts['modelPath'] - dbscan_evaluation.dbscan_clustering(expressionDataFileLocation, outputPath, perform_pyboolnet, modelPath) + compare_steady_states.compare_ss(expressionDataFileLocation, outputPath, perform_pyboolnet, modelPath) diff --git a/config-files/config.yaml b/config-files/config.yaml index c04c2ef..6baeca8 100644 --- a/config-files/config.yaml +++ b/config-files/config.yaml @@ -7,39 +7,39 @@ global_settings: # modeltype: 'heaviside' jobs: -# - name: "dyn-LL-1" -# model_definition: "dyn-linear-long.txt" -# model_initial_conditions: "dyn-linear-long_ics.txt" -# simulation_time: 9 -# num_cells: 300 -# do_parallel: False -# sample_cells: False + - name: dyn-LL-1 + model_definition: "dyn-linear-long.txt" + model_initial_conditions: "dyn-linear-long_ics.txt" + simulation_time: 9 + num_cells: 300 + do_parallel: False + sample_cells: False - - name: "dyn-LI-1" - model_definition: "dyn-linear.txt" - model_initial_conditions: "dyn-linear_ics.txt" - simulation_time: 7 - num_cells: 200 - do_parallel: False - sample_cells: False +# - name: "dyn-LI-1" +# model_definition: "dyn-linear.txt" +# model_initial_conditions: "dyn-linear_ics.txt" +# simulation_time: 7 +# num_cells: 200 +# do_parallel: False +# sample_cells: False - # - name: "dyn-BF-1" - # model_definition: "dyn-bifurcating.txt" - # model_initial_conditions: "dyn-bifurcating_ics.txt" - # simulation_time: 5 - # num_cells: 500 - # do_parallel: False - # sample_cells: False - # nClusters: 2 +# - name: "dyn-BF-1" +# model_definition: "dyn-bifurcating.txt" +# model_initial_conditions: "dyn-bifurcating_ics.txt" +# simulation_time: 5 +# num_cells: 500 +# do_parallel: False +# sample_cells: False +# nClusters: 2 - # - name: "dyn-TF-1" - # model_definition: "dyn-trifurcating.txt" - # model_initial_conditions: "dyn-trifurcating_ics.txt" - # simulation_time: 8 - # num_cells: 500 - # do_parallel: False - # sample_cells: False - # nClusters: 3 +# - name: "dyn-TF-1" +# model_definition: "dyn-trifurcating.txt" +# model_initial_conditions: "dyn-trifurcating_ics.txt" +# simulation_time: 8 +# num_cells: 500 +# do_parallel: False +# sample_cells: False +# nClusters: 3 # - name: "dyn-CY-1" # model_definition: "dyn-cycle.txt" @@ -54,18 +54,20 @@ post_processing: # Dropouts: # - dropout: False # nCells: 1000 - DBSCAN: - - outputPath: /Users/neelpatel/Desktop/BoolODE/data/ - perform_PyBoolNet: True - # - dropout: False - # nCells: 100 - # drop_cutoff: 0.5 - # drop_prob: 0.5 - - # - dropout: False - # nCells: 100 - # drop_cutoff: 0.7 - # drop_prob: 0.7 +# +# - dropout: False +# nCells: 100 +# drop_cutoff: 0.5 +# drop_prob: 0.5 +# +# - dropout: False +# nCells: 100 +# drop_cutoff: 0.7 +# drop_prob: 0.7 + + CompareSteadyStates: + - outputPath: /Users/ameliawhitehead/Desktop/boolbool/BoolODE/config-files + perform_PyBoolNet: True - # Slingshot: - # - perplexity: 400 +# Slingshot: +# - perplexity: 400 diff --git a/config-files/example-config.yaml b/config-files/example-config.yaml index fe79d80..b545e4c 100644 --- a/config-files/example-config.yaml +++ b/config-files/example-config.yaml @@ -172,12 +172,12 @@ post_processing: # - perplexity: 200 -# Run DBSCAN on BoolODE ExpressionData output -# outputPath is where the user would like output files will generate -# For steady state calculation from PyBoolNet, set perform_PyBoolNet to True, -# the default is false. -# Note: If you set perform_PyBoolNet to true, you need to follow the -# PyBoolNet installation guide provided in README.MD -# DBSCAN: -# - outputPath: /Users/userName/Desktop/BoolODE/data/dbscanOutputFolder -# perform_PyBoolNet: True + # Performs steady state comparison using DBSCAN on BoolODE ExpressionData output + # outputPath is where the user would like output files will generate + # For steady state calculation from PyBoolNet, set perform_PyBoolNet to True, + # the default is false. + # Note: If you set perform_PyBoolNet to true, you need to follow the + # PyBoolNet installation guide provided in README.MD + # CompareSteadyStates: + # - outputPath: /Users/userName/Desktop/BoolODE/data/ssComparisonOutputFolder + # perform_PyBoolNet: True diff --git a/config-files/example_gen_config_input.txt b/config-files/example_gen_config_input.txt new file mode 100644 index 0000000..eece70c --- /dev/null +++ b/config-files/example_gen_config_input.txt @@ -0,0 +1,8 @@ +base_directory_path: path_where_you_want_the_config_files +name: "dyn-LL-1" +model_definition: "dyn-linear-long.txt" +model_initial_conditions: "dyn-linear-long_ics.txt" +simulation_times: 10, 12, 14, 16 +num_cells: 100, 200, 300 +CompareSteadyStates: True +perform_PyBoolNet: True diff --git a/config-files/generate_config_files.py b/config-files/generate_config_files.py new file mode 100644 index 0000000..ae38ad3 --- /dev/null +++ b/config-files/generate_config_files.py @@ -0,0 +1,158 @@ +""" + This script writes config files based on + a given range of cells and range of time values for a given model. + It creates a directory for each cell and time combination. + + Invoke this file as follows: + python generate_config_files.py path_of_input_file.txt + The example_gen_config_input.txt file is the format expected. + + @Author: Neel Patel (neelspatel999@vt.edu) + @Author: Amelia Whitehead (ameliafw@vt.edu) +""" + +import sys +import os + +base_directory_path = "" +model_name = "" +model_definition = "" +model_initial_conditions = "" +cells_list = [] +time_list = [] +CompareSteadyStates = False +perform_PyBoolNet = False + +# NOTE: Right now, we are only considering CompareSteadyStates +# by itself or along with perform_PyBoolNet as +# post_processing requests. We do not look for any other +# post_processing requests at the moment. +do_post_processing = False +def main(): + """ + Main caller function of the generate_config_files.py + """ + + for input_file in sys.argv[1:]: + file = open(input_file, "r") + lines = file.readlines() + + # Get information from input file. # + ########################################### + for line in lines: + line = line.strip() + colon_index = line.find(":") + if "base_directory_path:" in line: + global base_directory_path + base_directory_path += line[colon_index+1:].strip() + elif "name:" in line: + global model_name + model_name += line[colon_index+1:].strip() + elif "model_definition:" in line: + global model_definition + model_definition += line[colon_index+1:].strip() + elif "model_initial_conditions:" in line: + global model_initial_conditions + model_initial_conditions += line[colon_index+1:].strip() + elif "simulation_times:" in line: + times = line[colon_index+1:] + # Split the string up by commas + global time_list + time_list = times.split(", ") + elif "num_cells:" in line: + cells = line[colon_index+1:] + # Split the string up by commas + global cells_list + cells_list = cells.split(", ") + elif "CompareSteadyStates:" in line: + if "True" in line: + global CompareSteadyStates + CompareSteadyStates = True + elif "perform_PyBoolNet:" in line: + if "True" in line: + global perform_PyBoolNet + perform_PyBoolNet = True + ########################################### + generate_requested_config_files() + +def generate_requested_config_files(): + """ + Creates a directory named the model name provided. + Then creates subdirectories for each cell and time combination. + Writes a config file in each directory created. + """ + + # Create the directory where all the files + # will be located + base_path = os.path.join(base_directory_path, model_name.strip('"')) + os.mkdir(base_path) + for cell_number in cells_list: + # Create a directory for that cell number + cell_number = cell_number.strip() + cell_name = "Cells=" + cell_name += cell_number + cell_specific_path = os.path.join(base_path, cell_name) + os.mkdir(cell_specific_path) + for time_amount in time_list: + time_amount = time_amount.strip() + time_point = "Time=" + time_point += time_amount + time_specific_path = os.path.join(cell_specific_path, time_point) + os.mkdir(time_specific_path) + + ## Write all the information in a config file. + config_file_path = os.path.join(time_specific_path, "config.yaml") + config_file = open(config_file_path, "w") + config_file.write("global_settings:\n") + config_file.write(" model_dir: data\n") + info_to_write1 = " output_dir: " + info_to_write1 += time_specific_path + info_to_write1 += "\n" + config_file.write(info_to_write1) + config_file.write(" do_simulations: True\n") + if CompareSteadyStates: + config_file.write(" do_post_processing: True\n") + else: + config_file.write(" do_post_processing: False\n") + config_file.write(" modeltype: 'hill'\n") + config_file.write("jobs:\n") + info_to_write = " - name: " + info_to_write += model_name + info_to_write += "\n" + config_file.write(info_to_write) + info_to_write = " model_definition: " + info_to_write += model_definition + info_to_write += "\n" + config_file.write(info_to_write) + if model_initial_conditions != "" || model_initial_conditions != "None": + info_to_write = " model_initial_conditions: " + info_to_write += model_initial_conditions + info_to_write += "\n" + config_file.write(info_to_write) + info_to_write = " simulation_time: " + info_to_write += time_amount + info_to_write += "\n" + config_file.write(info_to_write) + info_to_write = " num_cells: " + info_to_write += cell_number + info_to_write += "\n" + config_file.write(info_to_write) + config_file.write(" do_parallel: False\n") + config_file.write(" sample_cells: False\n") + config_file.write("post_processing:\n") + if CompareSteadyStates: + config_file.write(" CompareSteadyStates:\n") + info_to_write = " - outputPath: " + info_to_write += time_specific_path + info_to_write += "\n" + config_file.write(info_to_write) + if perform_PyBoolNet: + config_file.write(" perform_PyBoolNet: True\n") + else: + config_file.write(" perform_PyBoolNet: False\n") + +if __name__ == "__main__": + """ + Calls the main method + """ + main() diff --git a/find_and_run_configs.py b/find_and_run_configs.py new file mode 100644 index 0000000..e25dd33 --- /dev/null +++ b/find_and_run_configs.py @@ -0,0 +1,49 @@ +import argparse +import BoolODE as bo +import os + +def get_input_info(): + """ + Gets the root_directory path from the user. + """ + + parser = argparse.ArgumentParser( + description='Run BoolODE to generate synthetic scRNAseq data for all' + 'config files located within the given directory and ' + 'its subdirectories.\n ' + 'Specify the main directory where all config files are' + 'contained. This is to be used in conjunction with ' + 'generate_config_files.py.') + + parser.add_argument('--root_directory', default="None", + help='Provide the root directory path' + 'created by generate_config_files.py. ' + 'where its subdirectories contain config files.') + + return parser.parse_args().root_directory + + +def main(): + """ + Main caller function of the find_and_run_configs.py + """ + + root_directory = get_input_info() + if root_directory == "None": + print("Please provide a valid root directory path with --root_directory.") + else: + print(root_directory) + + for root, subdirectories, files in os.walk(root_directory): + for file in files: + if file == "config.yaml": + with open(os.path.join(root, file), 'r') as conf: + boolodejobs = bo.ConfigParser.parse(conf) + boolodejobs.execute_jobs() + print('Done with running all config files.') + +if __name__ == '__main__': + """ + Calls the main function + """ + main() \ No newline at end of file From e0ec8db0b323f56aef782b56063013587d898521 Mon Sep 17 00:00:00 2001 From: Neel Patel <67388292+neelspatel999@users.noreply.github.com> Date: Sun, 5 Dec 2021 23:37:51 -0500 Subject: [PATCH 11/14] Delete .DS_Store --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index c7f0070eea755cc54d2fd5bc217a74ff8b887982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKyGjH>5Ukb<4lcRSaDKqRKNyY^F5e#zR8)`^Lo z^mNU#6>M(F(RFJ+~XE6c)&HzXVu3O&Rt=^J4Q0U z^LKB<^Z58Q-sSDb>B>q0DIf);fE17dzf{0`FKxL>RFnczKni>*;NOQvckG2zVthIn zVgw*Am=5DQW(i{R1hE%RiOkR}sl=pOjTn}6=3CYE!YMK7uo^zBo@_OtSUjEgwvna~C=4+n!!YMK6%m Date: Sun, 5 Dec 2021 23:38:39 -0500 Subject: [PATCH 12/14] Delete .idea directory --- .idea/.gitignore | 3 --- .idea/BoolODE.iml | 10 ---------- .idea/inspectionProfiles/profiles_settings.xml | 6 ------ .idea/misc.xml | 4 ---- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 6 files changed, 37 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/BoolODE.iml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/BoolODE.iml b/.idea/BoolODE.iml deleted file mode 100644 index 74d515a..0000000 --- a/.idea/BoolODE.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 1d3e338..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a19acc7..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 4eef3af329810aa2819b12c4b4c180ec65b78137 Mon Sep 17 00:00:00 2001 From: Neel Patel <67388292+neelspatel999@users.noreply.github.com> Date: Sun, 5 Dec 2021 23:42:24 -0500 Subject: [PATCH 13/14] Delete .DS_Store --- BoolODE/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 BoolODE/.DS_Store diff --git a/BoolODE/.DS_Store b/BoolODE/.DS_Store deleted file mode 100644 index eeb14995af0810c8942a0bfc4476c7f45f8f4335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~O-|!L5QVEDi)cXNN3)m>l23rd4Ge+>YYqT}L=efbBa$Gp^PY>a0C7H6@KtpW zauNf((afkSs(yC6UUk5h-`~U7gy~3plLCEuD)VxsYiLiatviE=X~~M zyb|plu7E4>w<)0S?uNayLn)>C{?1Q}>Z(^%JtA~@IK=ng%((i^8p~X+}vb58F_ik5nt>|NLumFT)SCQC(41MVkO zQ8J^J8H9(W8SKED5v@AhlSL~SGPYJTZO!nylws4x8s`fS2zd8FZ4Ar}U-!fDC zO*Fq<=x+av0{W(5-HnLex&p3%EAXL!t`8Zmm?x|w+R{N|M*y%xw;9*^XF)kx!aQLe zktbM)R4`IQI%0%Kr$0+^dBQqkq)SMLkB~+V>4Xw&bn<5wE+LQTtt;RPEGn=bZ?|>- zKl%Lpzew^sSHKncuM`NK Date: Mon, 28 Mar 2022 11:41:53 -0400 Subject: [PATCH 14/14] Rename beeling-inputs-boolean.yaml to beeline-inputs-boolean.yaml --- .../{beeling-inputs-boolean.yaml => beeline-inputs-boolean.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename config-files/{beeling-inputs-boolean.yaml => beeline-inputs-boolean.yaml} (100%) diff --git a/config-files/beeling-inputs-boolean.yaml b/config-files/beeline-inputs-boolean.yaml similarity index 100% rename from config-files/beeling-inputs-boolean.yaml rename to config-files/beeline-inputs-boolean.yaml