Exemple #1
0
    def Prepare_file(self, request,build=False):
        self.Tree = PrepareTree(build)
        a=Alignment()

        sets = ProteinSet.objects.all()
        #### Get additional data ####
        crysts=[]
        for n in sets:
            if n.id==1:
                for prot in n.proteins.all():
                    crysts.append(prot.entry_name)


        #############################
        # get the user selection from session
        if build != False:
        ################################## FOR BUILDING STATISTICS ONLY##########################
            build_proteins=[]
            if build == '001':
                cons_prots = []
                for prot in Protein.objects.filter(sequence_type__slug='consensus', species_id=1):
                    if prot.family.slug.startswith('001') and len(prot.family.slug.split('_'))==3:
                        build_proteins.append(prot)
                for set in sets:
                    if set.id==1:
                        for prot in set.proteins.all():
                            if prot.family.slug.startswith('001_') and prot.species.latin_name=='H**o sapiens':
                                build_proteins.append(prot)
            else:
                for prot in Protein.objects.filter(sequence_type__slug='wt', species_id=1):
                    if prot.family.slug.startswith(build):
                        build_proteins.append(prot)
            a.load_proteins(build_proteins)
            segments = ProteinSegment.objects.all()
            a.load_segments(segments)
            self.bootstrap,self.UPGMA,self.branches,self.ttype=[0,1,1,0]
        ##################################################################
        else:
            simple_selection=request.session.get('selection', False)
            a.load_proteins_from_selection(simple_selection)
            a.load_segments_from_selection(simple_selection)
            self.bootstrap,self.UPGMA,self.branches,self.ttype = map(int,simple_selection.tree_settings)
        if self.bootstrap!=0:
            self.bootstrap=pow(10,self.bootstrap)
        #### Create an alignment object
        a.build_alignment()
        a.calculate_statistics()
        a.calculate_similarity()
        self.total = len(a.proteins)
        total_length = 0
        for chain in a.proteins[0].alignment:
            total_length += len(a.proteins[0].alignment[chain])
        families = ProteinFamily.objects.all()
        self.famdict = {}
        for n in families:
            self.famdict[self.Tree.trans_0_2_A(n.slug)]=n.name
        dirname = unique_filename = uuid.uuid4()
        os.mkdir('/tmp/%s' %dirname)
        infile = open('/tmp/%s/infile' %dirname,'w')
        infile.write('    '+str(self.total)+'    '+str(total_length)+'\n')
        if len(a.proteins) < 3:
            return 'More_prots',None, None, None, None,None,None,None,None
        ####Get additional protein information
        accesions = {}
        for n in a.proteins:
            fam = self.Tree.trans_0_2_A(n.protein.family.slug)
            if n.protein.sequence_type.slug == 'consensus':
                fam+='_CON'
            entry_name = n.protein.entry_name
            name = n.protein.name.replace('<sub>','').replace('</sub>','').replace('<i>','').replace('</i>','')
            if '&' in name and ';' in name:
                name = name.replace('&','').replace(';',' ')
            acc = n.protein.accession
            if acc:
                acc = acc.replace('-','_')
            else:
                acc = link.replace('-','_')[:6]
            spec = str(n.protein.species)
            fam += '_'+n.protein.species.common_name.replace(' ','_').upper()
            desc = name
            if entry_name in crysts:
                if not fam in self.Additional_info['crystal']['proteins']:
                    self.Additional_info['crystal']['proteins'].append(fam)
            if len(name)>25:
                name=name[:25]+'...'
            self.family[entry_name] = {'name':name,'family':fam,'description':desc,'species':spec,'class':'','accession':acc,'ligand':'','type':'','link': entry_name}
            accesions[acc]=entry_name
            ####Write PHYLIP input
            sequence = ''
            for chain in n.alignment:
                for residue in n.alignment[chain]:
                    sequence += residue[2].replace('_','-')
            infile.write(acc+' '*9+sequence+'\n')
        infile.close()

        ####Run bootstrap
        if self.bootstrap:
        ### Write phylip input options
            inp = open('/tmp/%s/temp' %dirname,'w')
            inp.write('\n'.join(['r',str(self.bootstrap),'y','77','y'])+'\n')
            inp.close()
        ###
            try:
                subprocess.check_output(['phylip seqboot<temp'], shell=True, cwd = '/tmp/%s' %dirname, timeout=300)
                os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)
            except:
                kill_phylo() #FIXME, needs better way of handling this!
                return "too big","too big","too big","too big","too big","too big","too big","too big","too big"

        ### Write phylip input options
        inp = open('/tmp/%s/temp' %dirname,'w')
        if self.bootstrap:
            inp.write('\n'.join(['m','d',str(self.bootstrap),'y'])+'\n')
        else:
            inp.write('y\n')
        inp.close()
        ###
        try:
            subprocess.check_output(['phylip protdist<temp>>log'], shell=True, cwd = '/tmp/%s' %dirname, timeout=300)
        except:
            kill_phylo() #FIXME, needs better way of handling this!
            return "too big","too big","too big","too big","too big","too big","too big","too big","too big"
        os.rename('/tmp/%s/infile' %dirname, '/tmp/%s/dupa' %dirname)
        os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)
        inp = open('/tmp/%s/temp' %dirname,'w')
        if self.bootstrap:
        ### Write phylip input options
            if self.UPGMA:
                inp.write('\n'.join(['N','m',str(self.bootstrap),'111','y'])+'\n')
            else:
                inp.write('\n'.join(['m',str(self.bootstrap),'111','y'])+'\n')
        else:
            if self.UPGMA:
                inp.write('N\ny\n')
            else:
                inp.write('y\n')
        inp.close()
        ###
        try:
            subprocess.check_output(['phylip neighbor<temp'], shell=True, cwd = '/tmp/%s' %dirname, timeout=300)
        except:
            kill_phylo() #FIXME, needs better way of handling this!
            return "too big","too big","too big","too big","too big","too big","too big","too big"
        if self.bootstrap:
            os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)
            os.rename('/tmp/%s/outtree' %dirname, '/tmp/%s/intree' %dirname)
           ### Write phylip input options
            inp = open('/tmp/%s/temp' %dirname,'w')
            inp.write('y\n')
            inp.close()
        ###
            try:
                subprocess.check_output(['phylip consense<temp'], shell=True, cwd = '/tmp/%s' %dirname, timeout=300)
            except:
                kill_phylo() #FIXME, needs better way of handling this!
                return "too big","too big","too big","too big","too big","too big","too big","too big"
        self.phylip = open('/tmp/%s/outtree' %dirname).read()
        for acc in accesions.keys():
            self.phylip=self.phylip.replace(acc,accesions[acc])
#        self.phylogeny_output = self.phylip
        self.outtree = open('/tmp/%s/outfile' %dirname).read().lstrip()
        phylogeny_input = self.get_phylogeny('/tmp/%s/' %dirname)
        shutil.rmtree('/tmp/%s' %dirname)

        if build != False:
            open('static/home/images/'+build+'_legend.svg','w').write(str(self.Tree.legend))
            open('static/home/images/'+build+'_tree.xml','w').write(phylogeny_input)
        else:
            return phylogeny_input, self.branches, self.ttype, self.total, str(self.Tree.legend), self.Tree.box, self.Additional_info, self.buttons, a.proteins
Exemple #2
0
class Treeclass:
    family = {}
    
    def __init__(self):
        self.Additional_info={"crystal": {"include":"False", "order":6, "colours":{"crystal_true":"#6dcde1","crystal_false":"#EEE"}, "color_type":"single", "proteins":[], "parent":None, "child": None, "name":"Crystals"},
                "class": {"include":"True", "order":0, "colours":{}, "proteins":[], "color_type":"grayscale", "parent":[], "child": ["family,ligand"], "name":"Class"},
                "family": {"include":"True", "order":1, "colours":{}, "proteins":[], "color_type":"spectrum", "parent":[], "child": ["ligand"], "name":"Ligand type"},
                "ligand": {"include":"True", "order":2, "colours":{}, "proteins":[], "color_type":"spectrum", "parent":["family","class"], "child": [], "name":"Receptor type"},
                "mutant": {"include":"False", "order":3, "colours":{"mutant_true":"#6dcde1","mutant_false":"#EEE"}, "color_type":"single", "proteins":[], "parent":[], "child": ["mutant_plus","mutant_minus"], "name":"Mutated proteins"},
                "mutant_plus": {"include":"False", "order":4, "colours":{"mutant_plus_true":"#6dcde1","mutant_plus_false":"#EEE"}, "color_type":"single", "proteins":[], "parent":"mutant", "child": [], "name":"Positive affinity mutants"},
                "mutant_minus": {"include":"False", "order":5, "colours":{"mutant_minus_true":"#6dcde1","mutant_minus_false":"#EEE"}, "color_type":"single", "proteins":[], "parent":"mutant", "child": [], "name":"Negative affinity mutants"}
                }
        self.buttons = [(x[1]['order'],x[1]['name']) for x in sorted(self.Additional_info.items(), key= lambda x: x[1]['order']) if x[1]['include']=='True']
        self.family = {}
        self.phylip = None
        self.outtree = None
        self.dir = ''


    def Prepare_file(self, request,build=False):
        self.Tree = PrepareTree(build)
        a=Alignment()

        sets = ProteinSet.objects.all()
        #### Get additional data ####
        crysts=[]
        for n in sets:
            if n.id==1:
                for prot in n.proteins.all():
                    crysts.append(prot.entry_name)

            
        #############################
        # get the user selection from session
        if build != False:
        ################################## FOR BUILDING STATISTICS ONLY##########################
            build_proteins=[]
            if build == '001':
                cons_prots = []
                for prot in Protein.objects.filter(sequence_type__slug='consensus', species_id=1):
                    if prot.family.slug.startswith('001') and len(prot.family.slug.split('_'))==3:
                        build_proteins.append(prot)
                for set in sets:
                    if set.id==1:
                        for prot in set.proteins.all():
                            if prot.family.slug.startswith('001_') and prot.species.latin_name=='H**o sapiens':
                                build_proteins.append(prot)
            else:
                for prot in Protein.objects.filter(sequence_type__slug='wt', species_id=1):
                    if prot.family.slug.startswith(build):
                        build_proteins.append(prot)
            a.load_proteins(build_proteins)
            segments = ProteinSegment.objects.all()
            a.load_segments(segments)
            self.bootstrap,self.UPGMA,self.branches,self.ttype=[0,1,1,0]
        ##################################################################
        else:
            simple_selection=request.session.get('selection', False)
            a.load_proteins_from_selection(simple_selection)
            a.load_segments_from_selection(simple_selection)
            self.bootstrap,self.UPGMA,self.branches,self.ttype = map(int,simple_selection.tree_settings)
        if self.bootstrap!=0:
            self.bootstrap=pow(10,self.bootstrap)
        #### Create an alignment object
        a.build_alignment()
        a.calculate_statistics()
        a.calculate_similarity()
        self.total = len(a.proteins)
        total_length = 0
        for chain in a.proteins[0].alignment:
            total_length += len(a.proteins[0].alignment[chain])
        families = ProteinFamily.objects.all()
        self.famdict = {}
        for n in families:
            self.famdict[self.Tree.trans_0_2_A(n.slug)]=n.name
        dirname = unique_filename = uuid.uuid4()
        os.mkdir('/tmp/%s' %dirname)
        infile = open('/tmp/%s/infile' %dirname,'w')
        infile.write('    '+str(self.total)+'    '+str(total_length)+'\n')
        if len(a.proteins) < 3:
            return 'More_prots',None, None, None, None,None,None,None
        ####Get additional protein information
        accesions = {}
        for n in a.proteins:
            fam = self.Tree.trans_0_2_A(n.protein.family.slug)
            if n.protein.sequence_type.slug == 'consensus':
                fam+='_CON'
            entry_name = n.protein.entry_name
            name = n.protein.name.replace('<sub>','').replace('</sub>','').replace('<i>','').replace('</i>','')
            if '&' in name and ';' in name:
                name = name.replace('&','').replace(';',' ')
            acc = n.protein.accession
            if acc:
                acc = acc.replace('-','_')
            else:
                acc = link.replace('-','_')[:6]
            spec = str(n.protein.species)
            fam += '_'+n.protein.species.common_name.replace(' ','_').upper()
            desc = name
            if entry_name in crysts:
                if not fam in self.Additional_info['crystal']['proteins']:
                    self.Additional_info['crystal']['proteins'].append(fam)
            if len(name)>25:
                name=name[:25]+'...'
            self.family[entry_name] = {'name':name,'family':fam,'description':desc,'species':spec,'class':'','accession':acc,'ligand':'','type':'','link': entry_name}
            accesions[acc]=entry_name
            ####Write PHYLIP input
            sequence = ''
            for chain in n.alignment:
                for residue in n.alignment[chain]:
                    sequence += residue[2].replace('_','-')
            infile.write(acc+' '*9+sequence+'\n')
        infile.close()
        
        ####Run bootstrap
        if self.bootstrap:
        ### Write phylip input options
            inp = open('/tmp/%s/temp' %dirname,'w')
            inp.write('\n'.join(['r',str(self.bootstrap),'y','77','y'])+'\n')
            inp.close()
        ###
            try:
                subprocess.check_output(['phylip seqboot<temp'], shell=True, cwd = '/tmp/%s' %dirname, timeout=60)
                os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)
            except:
                kill_phylo() #FIXME, needs better way of handling this!
                return "too big","too big","too big","too big","too big","too big","too big","too big"

        ### Write phylip input options
        inp = open('/tmp/%s/temp' %dirname,'w')
        if self.bootstrap:
            inp.write('\n'.join(['m','d',str(self.bootstrap),'y'])+'\n')
        else:
            inp.write('y\n')
        inp.close()
        ###
        try:
            subprocess.check_output(['phylip protdist<temp>>log'], shell=True, cwd = '/tmp/%s' %dirname, timeout=60)
        except:
            kill_phylo() #FIXME, needs better way of handling this!
            return "too big","too big","too big","too big","too big","too big","too big","too big"
        os.rename('/tmp/%s/infile' %dirname, '/tmp/%s/dupa' %dirname)
        os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)
        inp = open('/tmp/%s/temp' %dirname,'w')
        if self.bootstrap:
        ### Write phylip input options
            if self.UPGMA:
                inp.write('\n'.join(['N','m',str(self.bootstrap),'111','y'])+'\n')
            else:
                inp.write('\n'.join(['m',str(self.bootstrap),'111','y'])+'\n')
        else:
            if self.UPGMA:
                inp.write('N\ny\n')
            else:
                inp.write('y\n')
        inp.close()
        ###
        try: 
            subprocess.check_output(['phylip neighbor<temp'], shell=True, cwd = '/tmp/%s' %dirname, timeout=60)
        except:
            kill_phylo() #FIXME, needs better way of handling this!
            return "too big","too big","too big","too big","too big","too big","too big","too big"
        if self.bootstrap:
            os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)
            os.rename('/tmp/%s/outtree' %dirname, '/tmp/%s/intree' %dirname)
           ### Write phylip input options
            inp = open('/tmp/%s/temp' %dirname,'w')
            inp.write('y\n')
            inp.close()
        ###
            try:
                subprocess.check_output(['phylip consense<temp'], shell=True, cwd = '/tmp/%s' %dirname, timeout=60)
            except:
                kill_phylo() #FIXME, needs better way of handling this!
                return "too big","too big","too big","too big","too big","too big","too big","too big"
        self.phylip = open('/tmp/%s/outtree' %dirname).read()
        for acc in accesions.keys():
            self.phylip=self.phylip.replace(acc,accesions[acc])
#        self.phylogeny_output = self.phylip
        self.outtree = open('/tmp/%s/outfile' %dirname).read().lstrip()
        phylogeny_input = self.get_phylogeny('/tmp/%s/' %dirname)
        shutil.rmtree('/tmp/%s' %dirname)
        
        if build != False:
            open('static/home/images/'+build+'_legend.svg','w').write(str(self.Tree.legend))
            open('static/home/images/'+build+'_tree.xml','w').write(phylogeny_input)
        else:
            return phylogeny_input, self.branches, self.ttype, self.total, str(self.Tree.legend), self.Tree.box, self.Additional_info, self.buttons
        
    def get_phylogeny(self, dirname):

        self.Tree.treeDo(dirname, self.phylip,self.branches,self.family,self.Additional_info, self.famdict)
        phylogeny_input = open('%s/out.xml' %dirname,'r').read().replace('\n','')
        return phylogeny_input
    
    def get_data(self):
        return self.branches, self.ttype, self.total, str(self.Tree.legend), self.Tree.box, self.Additional_info, self.buttons
Exemple #3
0
class Treeclass:
    family = {}

    def __init__(self):
        self.Additional_info = {
            "crystal": {
                "include": "False",
                "order": 6,
                "colours": {
                    "crystal_true": "#6dcde1",
                    "crystal_false": "#EEE"
                },
                "color_type": "single",
                "proteins": [],
                "parent": None,
                "child": None,
                "name": "Crystals"
            },
            "class": {
                "include": "True",
                "order": 0,
                "colours": {},
                "proteins": [],
                "color_type": "grayscale",
                "parent": [],
                "child": ["family,ligand"],
                "name": "Class"
            },
            "family": {
                "include": "True",
                "order": 1,
                "colours": {},
                "proteins": [],
                "color_type": "spectrum",
                "parent": [],
                "child": ["ligand"],
                "name": "Ligand type"
            },
            "ligand": {
                "include": "True",
                "order": 2,
                "colours": {},
                "proteins": [],
                "color_type": "spectrum",
                "parent": ["family", "class"],
                "child": [],
                "name": "Receptor type"
            },
            "mutant": {
                "include": "False",
                "order": 3,
                "colours": {
                    "mutant_true": "#6dcde1",
                    "mutant_false": "#EEE"
                },
                "color_type": "single",
                "proteins": [],
                "parent": [],
                "child": ["mutant_plus", "mutant_minus"],
                "name": "Mutated proteins"
            },
            "mutant_plus": {
                "include": "False",
                "order": 4,
                "colours": {
                    "mutant_plus_true": "#6dcde1",
                    "mutant_plus_false": "#EEE"
                },
                "color_type": "single",
                "proteins": [],
                "parent": "mutant",
                "child": [],
                "name": "Positive affinity mutants"
            },
            "mutant_minus": {
                "include": "False",
                "order": 5,
                "colours": {
                    "mutant_minus_true": "#6dcde1",
                    "mutant_minus_false": "#EEE"
                },
                "color_type": "single",
                "proteins": [],
                "parent": "mutant",
                "child": [],
                "name": "Negative affinity mutants"
            }
        }
        self.buttons = [(x[1]['order'], x[1]['name'])
                        for x in sorted(self.Additional_info.items(),
                                        key=lambda x: x[1]['order'])
                        if x[1]['include'] == 'True']
        self.family = {}
        self.phylip = None
        self.outtree = None
        self.dir = ''

    def Prepare_file(self, request, build=False):
        self.Tree = PrepareTree(build)
        a = Alignment()

        sets = ProteinSet.objects.all()
        #### Get additional data ####
        crysts = []
        for n in sets:
            if n.id == 1:
                for prot in n.proteins.all():
                    crysts.append(prot.accession)

        #############################
        # get the user selection from session
        if build != False:
            ################################## FOR BUILDING STATISTICS ONLY##########################
            build_proteins = []
            if build == '001':
                cons_prots = []
                for prot in Protein.objects.filter(
                        sequence_type__slug='consensus', species_id=1):
                    if prot.family.slug.startswith('001') and len(
                            prot.family.slug.split('_')) == 3:
                        build_proteins.append(prot)
                for set in sets:
                    if set.id == 1:
                        for prot in set.proteins.all():
                            if prot.family.slug.startswith(
                                    '001_'
                            ) and prot.species.latin_name == 'H**o sapiens':
                                build_proteins.append(prot)
            else:
                for prot in Protein.objects.filter(sequence_type__slug='wt',
                                                   species_id=1):
                    if prot.family.slug.startswith(build):
                        build_proteins.append(prot)
            a.load_proteins(build_proteins)
            segments = ProteinSegment.objects.all()
            a.load_segments(segments)
            self.bootstrap, self.UPGMA, self.branches, self.ttype = [
                0, 1, 1, 0
            ]
        ##################################################################
        else:
            simple_selection = request.session.get('selection', False)
            a.load_proteins_from_selection(simple_selection)
            a.load_segments_from_selection(simple_selection)
            self.bootstrap, self.UPGMA, self.branches, self.ttype = map(
                int, simple_selection.tree_settings)
        if self.bootstrap != 0:
            self.bootstrap = pow(10, self.bootstrap)
        #### Create an alignment object
        a.build_alignment()
        a.calculate_statistics()
        a.calculate_similarity()
        self.total = len(a.proteins)
        total_length = 0
        for chain in a.proteins[0].alignment:
            total_length += len(a.proteins[0].alignment[chain])
        families = ProteinFamily.objects.all()
        self.famdict = {}
        for n in families:
            self.famdict[self.Tree.trans_0_2_A(n.slug)] = n.name
        dirname = unique_filename = uuid.uuid4()
        os.mkdir('/tmp/%s' % dirname)
        infile = open('/tmp/%s/infile' % dirname, 'w')
        infile.write('    ' + str(self.total) + '    ' + str(total_length) +
                     '\n')
        if len(a.proteins) < 3:
            return 'More_prots', None, None, None, None, None, None, None
        ####Get additional protein information
        for n in a.proteins:
            fam = self.Tree.trans_0_2_A(n.protein.family.slug)
            if n.protein.sequence_type.slug == 'consensus':
                fam += '_CON'
            link = n.protein.entry_name
            name = n.protein.name.replace('<sub>',
                                          '').replace('</sub>', '').replace(
                                              '<i>', '').replace('</i>', '')
            if '&' in name and ';' in name:
                name = name.replace('&', '').replace(';', ' ')
            acc = n.protein.accession
            if acc:
                acc = acc.replace('-', '_')
            else:
                acc = link.replace('-', '_')[:6]
            spec = str(n.protein.species)
            fam += '_' + n.protein.species.common_name.replace(' ',
                                                               '_').upper()
            desc = name
            if acc in crysts:
                if not fam in self.Additional_info['crystal']['proteins']:
                    self.Additional_info['crystal']['proteins'].append(fam)
            if len(name) > 25:
                name = name[:25] + '...'
            self.family[acc] = {
                'name': name,
                'family': fam,
                'description': desc,
                'species': spec,
                'class': '',
                'ligand': '',
                'type': '',
                'link': link
            }
            ####Write PHYLIP input
            sequence = ''
            for chain in n.alignment:
                for residue in n.alignment[chain]:
                    sequence += residue[2].replace('_', '-')
            infile.write(acc + ' ' * 9 + sequence + '\n')
        infile.close()

        ####Run bootstrap
        if self.bootstrap:
            ### Write phylip input options
            inp = open('/tmp/%s/temp' % dirname, 'w')
            inp.write('\n'.join(['r', str(self.bootstrap), 'y', '77', 'y']) +
                      '\n')
            inp.close()
            ###
            subprocess.check_output(['phylip seqboot<temp'],
                                    shell=True,
                                    cwd='/tmp/%s' % dirname)
            os.rename('/tmp/%s/outfile' % dirname, '/tmp/%s/infile' % dirname)

        ### Write phylip input options
        inp = open('/tmp/%s/temp' % dirname, 'w')
        if self.bootstrap:
            inp.write('\n'.join(['m', 'd', str(self.bootstrap), 'y']) + '\n')
        else:
            inp.write('y\n')
        inp.close()
        ###
        subprocess.check_output(['phylip protdist<temp>>log'],
                                shell=True,
                                cwd='/tmp/%s' % dirname)
        os.rename('/tmp/%s/infile' % dirname, '/tmp/%s/dupa' % dirname)
        os.rename('/tmp/%s/outfile' % dirname, '/tmp/%s/infile' % dirname)
        inp = open('/tmp/%s/temp' % dirname, 'w')
        if self.bootstrap:
            ### Write phylip input options
            if self.UPGMA:
                inp.write('\n'.join(
                    ['N', 'm', str(self.bootstrap), '111', 'y']) + '\n')
            else:
                inp.write('\n'.join(['m', str(self.bootstrap), '111', 'y']) +
                          '\n')
        else:
            if self.UPGMA:
                inp.write('N\ny\n')
            else:
                inp.write('y\n')
        inp.close()
        ###
        subprocess.check_output(['phylip neighbor<temp'],
                                shell=True,
                                cwd='/tmp/%s' % dirname)
        if self.bootstrap:
            os.rename('/tmp/%s/outfile' % dirname, '/tmp/%s/infile' % dirname)
            os.rename('/tmp/%s/outtree' % dirname, '/tmp/%s/intree' % dirname)
            ### Write phylip input options
            inp = open('/tmp/%s/temp' % dirname, 'w')
            inp.write('y\n')
            inp.close()
            ###
            subprocess.check_output(['phylip consense<temp'],
                                    shell=True,
                                    cwd='/tmp/%s' % dirname)
        self.phylip = open('/tmp/%s/outtree' % dirname).read()
        self.outtree = open('/tmp/%s/outfile' % dirname).read().lstrip()
        phylogeny_input = self.get_phylogeny('/tmp/%s/' % dirname)
        shutil.rmtree('/tmp/%s' % dirname)
        if build != False:
            open('static/home/images/' + build + '_legend.svg',
                 'w').write(str(self.Tree.legend))
            open('static/home/images/' + build + '_tree.xml',
                 'w').write(phylogeny_input)
        else:
            return phylogeny_input, self.branches, self.ttype, self.total, str(
                self.Tree.legend
            ), self.Tree.box, self.Additional_info, self.buttons

    def get_phylogeny(self, dirname):
        self.Tree.treeDo(dirname, self.phylip, self.branches, self.family,
                         self.Additional_info, self.famdict)
        phylogeny_input = open('%s/out.xml' % dirname,
                               'r').read().replace('\n', '')
        return phylogeny_input

    def get_data(self):
        return self.branches, self.ttype, self.total, str(
            self.Tree.legend
        ), self.Tree.box, self.Additional_info, self.buttons
Exemple #4
0
    def Prepare_file(self, request,build=False):
        self.Tree = PrepareTree(build)
        a=Alignment()

        sets = ProteinSet.objects.all()
        #### Get additional data ####
        crysts=[]
        for n in sets:
            if n.id==1:
                for prot in n.proteins.all():
                    crysts.append(prot.entry_name)

            
        #############################
        # get the user selection from session
        if build != False:
        ################################## FOR BUILDING STATISTICS ONLY##########################
            build_proteins=[]
            if build == '001':
                cons_prots = []
                for prot in Protein.objects.filter(sequence_type__slug='consensus', species_id=1):
                    if prot.family.slug.startswith('001') and len(prot.family.slug.split('_'))==3:
                        build_proteins.append(prot)
                for set in sets:
                    if set.id==1:
                        for prot in set.proteins.all():
                            if prot.family.slug.startswith('001_') and prot.species.latin_name=='H**o sapiens':
                                build_proteins.append(prot)
            else:
                for prot in Protein.objects.filter(sequence_type__slug='wt', species_id=1):
                    if prot.family.slug.startswith(build):
                        build_proteins.append(prot)
            a.load_proteins(build_proteins)
            segments = ProteinSegment.objects.all()
            a.load_segments(segments)
            self.bootstrap,self.UPGMA,self.branches,self.ttype=[0,1,1,0]
        ##################################################################
        else:
            simple_selection=request.session.get('selection', False)
            a.load_proteins_from_selection(simple_selection)
            a.load_segments_from_selection(simple_selection)
            self.bootstrap,self.UPGMA,self.branches,self.ttype = map(int,simple_selection.tree_settings)
        if self.bootstrap!=0:
            self.bootstrap=pow(10,self.bootstrap)
        #### Create an alignment object
        a.build_alignment()
        a.calculate_statistics()
        a.calculate_similarity()
        self.total = len(a.proteins)
        total_length = 0
        for chain in a.proteins[0].alignment:
            total_length += len(a.proteins[0].alignment[chain])
        families = ProteinFamily.objects.all()
        self.famdict = {}
        for n in families:
            self.famdict[self.Tree.trans_0_2_A(n.slug)]=n.name
        dirname = unique_filename = uuid.uuid4()
        os.mkdir('/tmp/%s' %dirname)
        infile = open('/tmp/%s/infile' %dirname,'w')
        infile.write('    '+str(self.total)+'    '+str(total_length)+'\n')
        if len(a.proteins) < 3:
            return 'More_prots',None, None, None, None,None,None,None
        ####Get additional protein information
        accesions = {}
        for n in a.proteins:
            fam = self.Tree.trans_0_2_A(n.protein.family.slug)
            if n.protein.sequence_type.slug == 'consensus':
                fam+='_CON'
            entry_name = n.protein.entry_name
            name = n.protein.name.replace('<sub>','').replace('</sub>','').replace('<i>','').replace('</i>','')
            if '&' in name and ';' in name:
                name = name.replace('&','').replace(';',' ')
            acc = n.protein.accession
            if acc:
                acc = acc.replace('-','_')
            else:
                acc = link.replace('-','_')[:6]
            spec = str(n.protein.species)
            fam += '_'+n.protein.species.common_name.replace(' ','_').upper()
            desc = name
            if entry_name in crysts:
                if not fam in self.Additional_info['crystal']['proteins']:
                    self.Additional_info['crystal']['proteins'].append(fam)
            if len(name)>25:
                name=name[:25]+'...'
            self.family[entry_name] = {'name':name,'family':fam,'description':desc,'species':spec,'class':'','accession':acc,'ligand':'','type':'','link': entry_name}
            accesions[acc]=entry_name
            ####Write PHYLIP input
            sequence = ''
            for chain in n.alignment:
                for residue in n.alignment[chain]:
                    sequence += residue[2].replace('_','-')
            infile.write(acc+' '*9+sequence+'\n')
        infile.close()
        
        ####Run bootstrap
        if self.bootstrap:
        ### Write phylip input options
            inp = open('/tmp/%s/temp' %dirname,'w')
            inp.write('\n'.join(['r',str(self.bootstrap),'y','77','y'])+'\n')
            inp.close()
        ###
            subprocess.check_output(['phylip seqboot<temp'], shell=True, cwd = '/tmp/%s' %dirname)
            os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)

        ### Write phylip input options
        inp = open('/tmp/%s/temp' %dirname,'w')
        if self.bootstrap:
            inp.write('\n'.join(['m','d',str(self.bootstrap),'y'])+'\n')
        else:
            inp.write('y\n')
        inp.close()
        ###
        subprocess.check_output(['phylip protdist<temp>>log'], shell=True, cwd = '/tmp/%s' %dirname)
        os.rename('/tmp/%s/infile' %dirname, '/tmp/%s/dupa' %dirname)
        os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)
        inp = open('/tmp/%s/temp' %dirname,'w')
        if self.bootstrap:
        ### Write phylip input options
            if self.UPGMA:
                inp.write('\n'.join(['N','m',str(self.bootstrap),'111','y'])+'\n')
            else:
                inp.write('\n'.join(['m',str(self.bootstrap),'111','y'])+'\n')
        else:
            if self.UPGMA:
                inp.write('N\ny\n')
            else:
                inp.write('y\n')
        inp.close()
        ### 
        subprocess.check_output(['phylip neighbor<temp'], shell=True, cwd = '/tmp/%s' %dirname)
        if self.bootstrap:
            os.rename('/tmp/%s/outfile' %dirname, '/tmp/%s/infile' %dirname)
            os.rename('/tmp/%s/outtree' %dirname, '/tmp/%s/intree' %dirname)
           ### Write phylip input options
            inp = open('/tmp/%s/temp' %dirname,'w')
            inp.write('y\n')
            inp.close()
        ###
            subprocess.check_output(['phylip consense<temp'], shell=True, cwd = '/tmp/%s' %dirname)
        self.phylip = open('/tmp/%s/outtree' %dirname).read()
        for acc in accesions.keys():
            self.phylip=self.phylip.replace(acc,accesions[acc])
#        self.phylogeny_output = self.phylip
        self.outtree = open('/tmp/%s/outfile' %dirname).read().lstrip()
        phylogeny_input = self.get_phylogeny('/tmp/%s/' %dirname)
        shutil.rmtree('/tmp/%s' %dirname)
        
        if build != False:
            open('static/home/images/'+build+'_legend.svg','w').write(str(self.Tree.legend))
            open('static/home/images/'+build+'_tree.xml','w').write(phylogeny_input)
        else:
            return phylogeny_input, self.branches, self.ttype, self.total, str(self.Tree.legend), self.Tree.box, self.Additional_info, self.buttons