예제 #1
0
def retro(request, smiles=None, chiral=True, mincount=0, max_n=200):
    '''
    Retrosynthesis homepage
    '''
    context = {}

    # Set default inputs
    context['form'] = {}
    context['form']['template_prioritization'] = request.session.get(
        'template_prioritization', 'Relevance')
    context['form']['precursor_prioritization'] = request.session.get(
        'precursor_prioritization', 'RelevanceHeuristic')
    context['form']['template_count'] = request.session.get(
        'template_count', '100')
    context['form']['max_cum_prob'] = request.session.get(
        'max_cum_prob', '0.995')
    context['form']['filter_threshold'] = request.session.get(
        'filter_threshold', '0.75')

    print(request)
    if request.method == 'POST':
        print(request)
        smiles = str(request.POST['smiles'])  # not great...
        context['form']['template_prioritization'] = str(
            request.POST['template_prioritization'])
        request.session['template_prioritization'] = context['form'][
            'template_prioritization']
        context['form']['precursor_prioritization'] = str(
            request.POST['precursor_prioritization'])
        request.session['precursor_prioritization'] = context['form'][
            'precursor_prioritization']

        if 'template_count' in request.POST:
            context['form']['template_count'] = str(
                request.POST['template_count'])
            request.session['template_count'] = context['form'][
                'template_count']
        if 'max_cum_prob' in request.POST:
            context['form']['max_cum_prob'] = str(request.POST['max_cum_prob'])
            request.session['max_cum_prob'] = context['form']['max_cum_prob']
        if 'filter_threshold' in request.POST:
            context['form']['filter_threshold'] = str(
                request.POST['filter_threshold'])
            request.session['filter_threshold'] = context['form'][
                'filter_threshold']

        smiles = resolve_smiles(smiles)
        if smiles is None:
            context['err'] = 'Could not parse!'
            return render(request, 'retro.html', context)

    if smiles is not None and not is_banned(request, smiles):

        # OLD: ALWAYS CHIRAL NOW
        # if 'retro_lit' in request.POST: return redirect('retro_lit_target', smiles=smiles)
        # if 'retro' in request.POST:
        #     return retro_target(request, smiles, chiral=False)
        # if 'retro_chiral' in request.POST:
        #     return retro_target(request, smiles, chiral=True)

        # Look up target
        smiles_img = reverse('draw_smiles', kwargs={'smiles': smiles})
        context['target'] = {'smiles': smiles, 'img': smiles_img}

        # Perform retrosynthesis
        context['form']['smiles'] = smiles
        template_prioritization = context['form']['template_prioritization']
        precursor_prioritization = context['form']['precursor_prioritization']
        filter_threshold = context['form']['filter_threshold']

        try:
            template_count = int(context['form']['template_count'])
            if (template_count < 1):
                raise ValueError
        except ValueError:
            context['err'] = 'Invalid template count specified!'
            return render(request, 'retro.html', context)

        try:
            max_cum_prob = float(context['form']['max_cum_prob'])
            if (max_cum_prob <= 0):
                raise ValueError
        except ValueError:
            context[
                'err'] = 'Invalid maximum cumulative probability specified!'
            return render(request, 'retro.html', context)

        try:
            filter_threshold = float(context['form']['filter_threshold'])
            filter_threshold = min(1, filter_threshold)
            filter_threshold = max(0, filter_threshold)
            apply_fast_filter = filter_threshold > 0
        except ValueError:
            context['err'] = 'Invalid filter threshold specified!'
            return render(request, 'retro.html', context)

        if template_prioritization == 'Popularity':
            template_count = 1e9

        print('Retro expansion conditions:')
        print(smiles)
        print(template_prioritization)
        print(precursor_prioritization)
        print(template_count)
        print(max_cum_prob)
        print(filter_threshold)

        startTime = time.time()
        if chiral:

            res = get_top_precursors_c.delay(
                smiles,
                template_prioritization,
                precursor_prioritization,
                mincount=0,
                max_branching=max_n,
                template_count=template_count,
                max_cum_prob=max_cum_prob,
                apply_fast_filter=apply_fast_filter,
                filter_threshold=filter_threshold)
            (smiles, precursors) = res.get(300)
            # allow up to 5 minutes...can be pretty slow
            context['precursors'] = precursors
            context['footnote'] = RETRO_CHIRAL_FOOTNOTE
        else:

            # Use apply_async so we can force high priority
            res = get_top_precursors.delay(smiles,
                                           template_prioritization,
                                           precursor_prioritization,
                                           mincount=0,
                                           max_branching=max_n,
                                           template_count=template_count,
                                           max_cum_prob=max_cum_prob,
                                           apply_fast_filter=apply_fast_filter,
                                           filter_threshold=filter_threshold)
            context['precursors'] = res.get(120)
            context['footnote'] = RETRO_FOOTNOTE
        context['time'] = '%0.3f' % (time.time() - startTime)

        # Change 'tform' field to be reaction SMARTS, not ObjectID from Mongo
        # Also add up total number of examples
        for (i, precursor) in enumerate(context['precursors']):
            context['precursors'][i]['tforms'] = \
                [dict(RetroTransformer.lookup_id(ObjectId(_id)), **
                      {'id': str(_id)}) for _id in precursor['tforms']]
            context['precursors'][i]['mols'] = []
            # Overwrite num examples
            context['precursors'][i]['num_examples'] = sum(
                tform['count'] for tform in precursor['tforms'])
            for smiles in precursor['smiles_split']:
                ppg = price_smiles_func(smiles)
                context['precursors'][i]['mols'].append({
                    'smiles':
                    smiles,
                    'ppg':
                    '${}/g'.format(ppg) if ppg else 'cannot buy',
                })

    elif smiles is not None:
        context[
            'err'] = 'ASKCOS does not provide results for compounds on restricted lists such as the CWC and DEA schedules'
    else:

        # Define suggestions
        context['suggestions'] = [
            {
                'name': 'Diphenhydramine',
                'smiles': 'CN(C)CCOC(c1ccccc1)c2ccccc2'
            },
            {
                'name': 'Fluconazole',
                'smiles': 'OC(Cn1cncn1)(Cn2cncn2)c3ccc(F)cc3F'
            },
            {
                'name': 'Nevirapine',
                'smiles': 'Cc1ccnc2N(C3CC3)c4ncccc4C(=O)Nc12'
            },
            {
                'name': 'Atropine',
                'smiles': 'CN1C2CCC1CC(C2)OC(=O)C(CO)c3ccccc3'
            },
            {
                'name': 'Diazepam',
                'smiles': 'CN1C(=O)CN=C(c2ccccc2)c3cc(Cl)ccc13'
            },
        ]

    context['footnote'] = RETRO_CHIRAL_FOOTNOTE
    return render(request, 'retro.html', context)
예제 #2
0
def retro(request, smiles=None, chiral=True, mincount=0, max_n=200):
    '''
    Retrosynthesis homepage
    '''
    context = {}

    # Set default inputs
    context['form'] = {}
    context['form']['template_prioritization'] = request.session.get(
        'template_prioritization', 'Relevance')
    context['form']['precursor_prioritization'] = request.session.get(
        'precursor_prioritization', 'RelevanceHeuristic')
    context['form']['template_count'] = request.session.get(
        'template_count', '100')
    context['form']['max_cum_prob'] = request.session.get(
        'max_cum_prob', '0.995')
    context['form']['filter_threshold'] = request.session.get(
        'filter_threshold', '0.75')

    print(request)
    if request.method == 'POST':
        print(request)
        smiles = str(request.POST['smiles'])  # not great...
        context['form']['template_prioritization'] = str(
            request.POST['template_prioritization'])
        request.session['template_prioritization'] = context['form'][
            'template_prioritization']
        context['form']['precursor_prioritization'] = str(
            request.POST['precursor_prioritization'])
        request.session['precursor_prioritization'] = context['form'][
            'precursor_prioritization']

        if 'template_count' in request.POST:
            context['form']['template_count'] = str(
                request.POST['template_count'])
            request.session['template_count'] = context['form'][
                'template_count']
        if 'max_cum_prob' in request.POST:
            context['form']['max_cum_prob'] = str(request.POST['max_cum_prob'])
            request.session['max_cum_prob'] = context['form']['max_cum_prob']
        if 'filter_threshold' in request.POST:
            context['form']['filter_threshold'] = str(
                request.POST['filter_threshold'])
            request.session['filter_threshold'] = context['form'][
                'filter_threshold']

        smiles = resolve_smiles(smiles)
        if smiles is None:
            context['err'] = 'Could not parse!'
            return render(request, 'retro.html', context)

    if smiles is not None and not is_banned(request, smiles):

        # OLD: ALWAYS CHIRAL NOW
        # if 'retro_lit' in request.POST: return redirect('retro_lit_target', smiles=smiles)
        # if 'retro' in request.POST:
        #     return retro_target(request, smiles, chiral=False)
        # if 'retro_chiral' in request.POST:
        #     return retro_target(request, smiles, chiral=True)

        # Look up target
        smiles_img = reverse('draw_smiles', kwargs={'smiles': smiles})
        context['target'] = {'smiles': smiles, 'img': smiles_img}

        # Perform retrosynthesis
        context['form']['smiles'] = smiles
        template_prioritization = context['form']['template_prioritization']
        precursor_prioritization = context['form']['precursor_prioritization']
        filter_threshold = context['form']['filter_threshold']

        try:
            template_count = int(context['form']['template_count'])
            if (template_count < 1):
                raise ValueError
        except ValueError:
            context['err'] = 'Invalid template count specified!'
            return render(request, 'retro.html', context)

        try:
            max_cum_prob = float(context['form']['max_cum_prob'])
            if (max_cum_prob <= 0):
                raise ValueError
        except ValueError:
            context[
                'err'] = 'Invalid maximum cumulative probability specified!'
            return render(request, 'retro.html', context)

        try:
            filter_threshold = float(context['form']['filter_threshold'])
            filter_threshold = min(1, filter_threshold)
            filter_threshold = max(0, filter_threshold)
            apply_fast_filter = filter_threshold > 0
        except ValueError:
            context['err'] = 'Invalid filter threshold specified!'
            return render(request, 'retro.html', context)

        if template_prioritization == 'Popularity':
            template_count = 1e9

        print('Retro expansion conditions:')
        print(smiles)
        print(template_prioritization)
        print(precursor_prioritization)
        print(template_count)
        print(max_cum_prob)
        print(filter_threshold)

        startTime = time.time()
        if chiral:
            if max_cum_prob > 0.999 and template_count > 1000:
                res = get_top_precursors_p.delay(
                    smiles,
                    max_num_templates=template_count,
                    max_cum_prob=max_cum_prob,
                    fast_filter_threshold=filter_threshold)
            else:
                res = get_top_precursors_c.delay(
                    smiles,
                    max_num_templates=template_count,
                    max_cum_prob=max_cum_prob,
                    fast_filter_threshold=filter_threshold)

            (smiles, precursors) = res.get(300)
            # allow up to 5 minutes...can be pretty slow
            context['precursors'] = precursors
            context['footnote'] = RETRO_CHIRAL_FOOTNOTE
        else:

            # Use apply_async so we can force high priority
            res = get_top_precursors.delay(smiles,
                                           template_prioritization,
                                           precursor_prioritization,
                                           mincount=0,
                                           max_branching=max_n,
                                           template_count=template_count,
                                           max_cum_prob=max_cum_prob,
                                           apply_fast_filter=apply_fast_filter,
                                           filter_threshold=filter_threshold)
            context['precursors'] = res.get(120)
            context['footnote'] = ''
        context['time'] = '%0.3f' % (time.time() - startTime)

        # Change 'tform' field to be reaction SMARTS, not ObjectID from Mongo
        # Also add up total number of examples
        for (i, precursor) in enumerate(context['precursors']):
            context['precursors'][i]['tforms'] = \
                [dict(RetroTransformer.lookup_id(_id), **{'id': str(_id)}) for _id in precursor['tforms']]
            context['precursors'][i]['mols'] = []
            # Overwrite num examples
            context['precursors'][i]['num_examples'] = sum(
                tform['count'] for tform in precursor['tforms'])
            for smiles in precursor['smiles_split']:
                ppg = Pricer.lookup_smiles(smiles)
                context['precursors'][i]['mols'].append({
                    'smiles':
                    smiles,
                    'ppg':
                    '${}/g'.format(ppg) if ppg else 'cannot buy',
                })

    elif smiles is not None:
        context[
            'err'] = 'ASKCOS does not provide results for compounds on restricted lists such as the CWC and DEA schedules'
    else:

        # Define suggestions
        context['suggestions'] = [
            {
                'name': 'Diphenhydramine',
                'smiles': 'CN(C)CCOC(c1ccccc1)c2ccccc2'
            },
            {
                'name': 'Fluconazole',
                'smiles': 'OC(Cn1cncn1)(Cn2cncn2)c3ccc(F)cc3F'
            },
            {
                'name': 'Nevirapine',
                'smiles': 'Cc1ccnc2N(C3CC3)c4ncccc4C(=O)Nc12'
            },
            {
                'name': 'Atropine',
                'smiles': 'CN1C2CCC1CC(C2)OC(=O)C(CO)c3ccccc3'
            },
            {
                'name': 'Diazepam',
                'smiles': 'CN1C(=O)CN=C(c2ccccc2)c3cc(Cl)ccc13'
            },
        ]
        hidden = [
            {
                'name': 'Hydroxychloroquine',
                'smiles': 'CCN(CCO)CCCC(C)Nc1ccnc2cc(Cl)ccc12'
            },
            {
                'name': 'Ibuprofen',
                'smiles': 'CC(C)Cc1ccc(cc1)C(C)C(O)=O'
            },
            {
                'name': 'Tramadol',
                'smiles': 'CN(C)C[C@H]1CCCC[C@@]1(C2=CC(=CC=C2)OC)O'
            },
            {
                'name': 'Lamivudine',
                'smiles': 'NC1=NC(=O)N(C=C1)[C@@H]2CS[C@H](CO)O2'
            },
            {
                'name': 'Pregabalin',
                'smiles': 'CC(C)C[C@H](CN)CC(O)=O'
            },
            {
                'name': 'Naproxen',
                'smiles': 'COc1ccc2cc([C@H](C)C(=O)O)ccc2c1'
            },
            {
                'name':
                'Imatinib',
                'smiles':
                'CN1CCN(CC1)Cc2ccc(cc2)C(=O)Nc3ccc(C)c(Nc4nccc(n4)c5cccnc5)c3'
            },
            {
                'name':
                'Quinapril',
                'smiles':
                'CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O'
            },
            {
                'name':
                'Atorvastatin',
                'smiles':
                'CC(C)c1n(CC[C@@H](O)C[C@@H](O)CC(O)=O)c(c2ccc(F)cc2)c(c3ccccc3)c1C(=O)Nc4ccccc4'
            },
            {
                'name':
                'Bortezomib',
                'smiles':
                'CC(C)C[C@@H](NC(=O)[C@@H](Cc1ccccc1)NC(=O)c2cnccn2)B(O)O'
            },
            {
                'name':
                'Itraconazole',
                'smiles':
                'CCC(C)N1N=CN(C1=O)c2ccc(cc2)N3CCN(CC3)c4ccc(OC[C@H]5CO[C@@](Cn6cncn6)(O5)c7ccc(Cl)cc7Cl)cc4'
            },
            {
                'name':
                '6-Carboxytetramethylrhodamine',
                'smiles':
                'CN(C)C1=CC2=C(C=C1)C(=C3C=CC(=[N+](C)C)C=C3O2)C4=C(C=CC(=C4)C(=O)[O-])C(=O)O'
            },
            {
                'name':
                '6-Carboxytetramethylrhodamine isomer',
                'smiles':
                'CN(C)c1ccc2c(c1)Oc1cc(N(C)C)ccc1C21OC(=O)c2ccc(C(=O)O)c1c2'
            },
            {
                'name': '(S)-Warfarin',
                'smiles': 'CC(=O)C[C@@H](C1=CC=CC=C1)C2=C(C3=CC=CC=C3OC2=O)O'
            },
            {
                'name': 'Tranexamic Acid',
                'smiles': 'NC[C@@H]1CC[C@H](CC1)C(O)=O'
            },
        ]

    context['footnote'] = RETRO_CHIRAL_FOOTNOTE
    return render(request, 'retro.html', context)