Changeset 710
- Timestamp:
- 10/06/17 16:06:17 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
mds-and-trees/tree-genealogy.py
r709 r710 154 154 self.h_margin+self.h_no_margs*chi_pos['y']/max_height), line_style) 155 155 156 def draw_scale(self, file, filename): 157 self.add_text(file, "Generated from " + filename.split("\\")[-1], (5, 5), "start") 156 def draw_scale(self, file, filenames): 157 self.add_text(file, "Generated from " + filenames[0].split("\\")[-1] 158 + (" and " + str(len(filenames)-1) + " more" if len(filenames) > 1 else ""), (5, 5), "start") 158 159 159 160 start_text = "" … … 692 693 pass 693 694 694 def load(self, filename , max_nodes=0):695 def load(self, filenames, max_nodes=0): 695 696 print("Loading...") 696 697 … … 726 727 return creature 727 728 728 file = open(filename)729 729 730 730 # counting the number of expected nodes 731 731 732 nodes = 0 732 for line in file: 733 line_arr = line.split(' ', 1) 734 if len(line_arr) == 2: 735 if line_arr[0] == CLI_PREFIX: 736 line_arr = line_arr[1].split(' ', 1) 737 if line_arr[0] == "[BORN]": 738 nodes += 1 733 for filename in filenames: 734 file = open(filename) 735 for line in file: 736 line_arr = line.split(' ', 1) 737 if len(line_arr) == 2: 738 if line_arr[0] == CLI_PREFIX: 739 line_arr = line_arr[1].split(' ', 1) 740 if line_arr[0] == "[BORN]": 741 nodes += 1 739 742 740 743 nodes = min(nodes, max_nodes if max_nodes != 0 else nodes)+1 … … 748 751 print("nodes: %d" % len(self.parents)) 749 752 750 file.seek(0) 753 754 get_id("virtual_parent") 751 755 loaded_so_far = 0 752 lasttime = timelib.time() 753 754 get_id("virtual_parent") 755 756 for line in file: 757 line_arr = line.split(' ', 1) 758 if len(line_arr) == 2: 759 if line_arr[0] == CLI_PREFIX: 760 line_arr = line_arr[1].split(' ', 1) 761 if line_arr[0] == "[BORN]": 762 creature = try_to_load(line_arr[1]) 763 if not creature: 764 nodes -= 1 765 break 766 767 creature_id = get_id(creature["ID"]) 768 769 # debug 770 if loaded_so_far%1000 == 0: 771 #print(". " + str(creature_id) + " " + str(timelib.time() - lasttime)) 772 lasttime = timelib.time() 773 774 if "Time" in creature: 775 self.time[creature_id] = creature["Time"] 776 777 for prop in creature: 778 if prop not in default_props: 779 if prop not in self.props: 780 self.props[prop] = [0 for i in range(nodes)] 781 self.props[prop][creature_id] = creature[prop] 782 783 loaded_so_far += 1 784 785 if line_arr[0] == "[OFFSPRING]": 786 creature = try_to_load(line_arr[1]) 787 if not creature: 788 nodes -= 1 789 break 790 791 if "FromIDs" in creature: 792 # make sure that ID's of parents are lower than that of their children 793 for i in range(0, len(creature["FromIDs"])): 794 if creature["FromIDs"][i] not in self.ids: 795 get_id("virtual_parent") 796 797 creature_id = get_id(creature["ID"])#, False) 798 799 # we assign to each parent its contribution to the genotype of the child 800 for i in range(0, len(creature["FromIDs"])): 801 if creature["FromIDs"][i] in self.ids: 802 parent_id = get_id(creature["FromIDs"][i]) 803 else: 804 if creature["FromIDs"][i] not in merged_with_virtual_parent: 805 merged_with_virtual_parent.append(creature["FromIDs"][i]) 806 parent_id = get_id("virtual_parent") 807 inherited = (creature["Inherited"][i] if 'Inherited' in creature else 1) 808 self.parents[creature_id][parent_id] = inherited 809 810 if "Kind" in creature: 811 self.kind[creature_id] = creature["Kind"] 812 else: 813 raise LoadingError("[OFFSPRING] misses the 'FromIDs' field!") 814 815 if line_arr[0] == "[DIED]" or line_arr[0] == "[BORN]": 816 creature = try_to_load(line_arr[1]) 817 if not creature: 818 nodes -= 1 819 break 820 creature_id = get_id(creature["ID"], False) 821 if creature_id is not None: 756 max_time = 0 757 # rewind the file 758 759 for filename in filenames: 760 file = open(filename) 761 time_offset = max_time 762 if max_time != 0: 763 print("NOTE: merging the files, the time offset for the file " + filename + " is: " + str(time_offset)) 764 765 lasttime = timelib.time() 766 767 for line in file: 768 line_arr = line.split(' ', 1) 769 if len(line_arr) == 2: 770 if line_arr[0] == CLI_PREFIX: 771 line_arr = line_arr[1].split(' ', 1) 772 if line_arr[0] == "[BORN]": 773 creature = try_to_load(line_arr[1]) 774 if not creature: 775 nodes -= 1 776 break 777 778 creature_id = get_id(creature["ID"]) 779 780 # debug 781 if loaded_so_far%1000 == 0: 782 #print(". " + str(creature_id) + " " + str(timelib.time() - lasttime)) 783 lasttime = timelib.time() 784 785 if "Time" in creature: 786 self.time[creature_id] = creature["Time"] + time_offset 787 max_time = max(self.time[creature_id], max_time) 788 822 789 for prop in creature: 823 790 if prop not in default_props: … … 826 793 self.props[prop][creature_id] = creature[prop] 827 794 828 795 loaded_so_far += 1 796 797 if line_arr[0] == "[OFFSPRING]": 798 creature = try_to_load(line_arr[1]) 799 if not creature: 800 nodes -= 1 801 break 802 803 if "FromIDs" in creature: 804 # make sure that ID's of parents are lower than that of their children 805 for i in range(0, len(creature["FromIDs"])): 806 if creature["FromIDs"][i] not in self.ids: 807 get_id("virtual_parent") 808 809 creature_id = get_id(creature["ID"])#, False) 810 811 # we assign to each parent its contribution to the genotype of the child 812 for i in range(0, len(creature["FromIDs"])): 813 if creature["FromIDs"][i] in self.ids: 814 parent_id = get_id(creature["FromIDs"][i]) 815 else: 816 if creature["FromIDs"][i] not in merged_with_virtual_parent: 817 merged_with_virtual_parent.append(creature["FromIDs"][i]) 818 parent_id = get_id("virtual_parent") 819 inherited = (creature["Inherited"][i] if 'Inherited' in creature else 1) 820 self.parents[creature_id][parent_id] = inherited 821 822 if "Kind" in creature: 823 self.kind[creature_id] = creature["Kind"] 824 else: 825 raise LoadingError("[OFFSPRING] misses the 'FromIDs' field!") 826 827 if line_arr[0] == "[DIED]" or line_arr[0] == "[BORN]": 828 creature = try_to_load(line_arr[1]) 829 if not creature: 830 nodes -= 1 831 break 832 creature_id = get_id(creature["ID"], False) 833 if creature_id is not None: 834 for prop in creature: 835 if prop not in default_props: 836 if prop not in self.props: 837 self.props[prop] = [0 for i in range(nodes)] 838 self.props[prop][creature_id] = creature[prop] 839 840 # breaking both loops 841 if loaded_so_far >= max_nodes and max_nodes != 0: 842 break 829 843 if loaded_so_far >= max_nodes and max_nodes != 0: 830 844 break … … 848 862 parser = argparse.ArgumentParser(description='Draws a genealogical tree (generates a SVG file) based on parent-child relationship ' 849 863 'information from a text file. Supports files generated by Framsticks experiments.') 850 parser.add_argument('-i', '--in', dest='input', required=True, help='input file name with stuctured evolutionary data')864 parser.add_argument('-i', '--in', nargs='+', dest='input', required=True, help='input file name with stuctured evolutionary data (or a list of input files)') 851 865 parser.add_argument('-o', '--out', dest='output', required=True, help='output file name for the evolutionary tree (SVG/PNG/JPG/BMP)') 852 866 parser.add_argument('-c', '--config', dest='config', default="", help='config file name ') … … 886 900 887 901 dir = args.input 902 888 903 seed = args.seed 889 904 if seed == -1:
Note: See TracChangeset
for help on using the changeset viewer.