Пример #1
0
def download_checkpoint(checkpoint: int):
    """
    Downloads a zip of model .pt files.

    :param checkpoint: The name of the checkpoint to download.
    """
    ckpt = db.query_db(f'SELECT * FROM ckpt WHERE id = {checkpoint}', one = True)
    models = db.get_models(checkpoint)

    model_data = io.BytesIO()

    with zipfile.ZipFile(model_data, mode='w') as z:
        for model in models:
            model_path = os.path.join(app.config['CHECKPOINT_FOLDER'], f'{model["id"]}.pt')
            z.write(model_path, os.path.basename(model_path))

    model_data.seek(0)

    return send_file(
        model_data,
        mimetype='application/zip',
        as_attachment=True,
        attachment_filename=f'{ckpt["ckpt_name"]}.zip',
        cache_timeout=-1
    )
Пример #2
0
def pred_with_one_model(args, ckpt_id, gpu):
    model = db.get_models(ckpt_id)[0]
    model_path = os.path.join(app.config['CHECKPOINT_FOLDER'],
                              f'{model["id"]}.pt')

    task_names = load_task_names(model_path)
    num_tasks = len(task_names)
    args.checkpoint_path = model_path
    if gpu is not None:
        if gpu == 'None':
            args.no_cuda = True
        else:
            args.gpu = int(gpu)
    modify_predict_args(args)
    # Run predictions
    preds = make_predictions(args)
    return preds, num_tasks
Пример #3
0
def predict():
    """Renders the predict page and makes predictions if the method is POST."""
    if request.method == 'GET':
        return render_predict()

    # Get arguments
    ckpt_id = request.form['checkpointName']

    if request.form['textSmiles'] != '':
        smiles = request.form['textSmiles'].split()
    elif request.form['drawSmiles'] != '':
        smiles = [request.form['drawSmiles']]
    else:
        print(" GOT HERE")
        # Upload data file with SMILES
        data = request.files['data']
        data_name = secure_filename(data.filename)
        data_path = os.path.join(app.config['TEMP_FOLDER'], data_name)
        data.save(data_path)

        # Check if header is smiles
        possible_smiles = get_header(data_path)[0]
        smiles = [possible_smiles] if Chem.MolFromSmiles(possible_smiles) is not None else []

        # Get remaining smiles
        smiles.extend(get_smiles(data_path))

    models = db.get_models(ckpt_id)
    model_paths = [os.path.join(app.config['CHECKPOINT_FOLDER'], f'{model["id"]}.pt') for model in models]

    task_names = load_task_names(model_paths[0])
    num_tasks = len(task_names)
    gpu = request.form.get('gpu')

    # Create and modify args
    args = load_args(model_paths[0])

    if args.features_path != None:
        args.features_generator = ["rdkit_2d_normalized"]
        args.features_path = None

    preds_path = os.path.join(app.config['TEMP_FOLDER'], app.config['PREDICTIONS_FILENAME'])
    args.test_path = 'None'  # TODO: Remove this hack to avoid assert crashing in modify_predict_args
    args.preds_path = preds_path
    args.checkpoint_paths = model_paths
    if gpu is not None:
        if gpu == 'None':
            args.no_cuda = True
        else:
            args.gpu = int(gpu)

    modify_predict_args(args)

    # Run predictions
    preds = make_predictions(args, smiles=smiles)

    if all(p is None for p in preds):
        return render_predict(errors=['All SMILES are invalid'])

    # Replace invalid smiles with message
    invalid_smiles_warning = "Invalid SMILES String"
    preds = [pred if pred is not None else [invalid_smiles_warning] * num_tasks for pred in preds]

    return render_predict(predicted=True,
                          smiles=smiles,
                          num_smiles=min(10, len(smiles)),
                          show_more=max(0, len(smiles)-10),
                          task_names=task_names,
                          num_tasks=len(task_names),
                          preds=preds,
                          warnings=["List contains invalid SMILES strings"] if None in preds else None,
                          errors=["No SMILES strings given"] if len(preds) == 0 else None)
Пример #4
0
def predict():
    """Renders the predict page and makes predictions if the method is POST."""
    if request.method == 'GET':
        return render_predict()

    # Get arguments
    ckpt_id = request.form['checkpointName']

    if request.form['textSmiles'] != '':
        smiles = request.form['textSmiles'].split()
    elif request.form['drawSmiles'] != '':
        smiles = [request.form['drawSmiles']]
    else:
        # Upload data file with SMILES
        data = request.files['data']
        data_name = secure_filename(data.filename)
        data_path = os.path.join(app.config['TEMP_FOLDER'], data_name)
        data.save(data_path)

        # Check if header is smiles
        possible_smiles = get_header(data_path)[0]
        smiles = [possible_smiles
                  ] if Chem.MolFromSmiles(possible_smiles) is not None else []

        # Get remaining smiles
        smiles.extend(get_smiles(data_path))

    models = db.get_models(ckpt_id)
    model_paths = [
        os.path.join(app.config['CHECKPOINT_FOLDER'], f'{model["id"]}.pt')
        for model in models
    ]

    task_names = load_task_names(model_paths[0])
    num_tasks = len(task_names)
    gpu = request.form.get('gpu')
    train_args = load_args(model_paths[0])

    # Build arguments
    arguments = [
        '--test_path', 'None', '--preds_path',
        os.path.join(app.config['TEMP_FOLDER'],
                     app.config['PREDICTIONS_FILENAME']), '--checkpoint_paths',
        *model_paths
    ]

    if gpu is not None:
        if gpu == 'None':
            arguments.append('--no_cuda')
        else:
            arguments += ['--gpu', gpu]

    # Handle additional features
    if train_args.features_path is not None:
        # TODO: make it possible to specify the features generator if trained using features_path
        arguments += [
            '--features_generator', 'rdkit_2d_normalized',
            '--no_features_scaling'
        ]
    elif train_args.features_generator is not None:
        arguments += ['--features_generator', *train_args.features_generator]

        if not train_args.features_scaling:
            arguments.append('--no_features_scaling')

    # Parse arguments
    args = PredictArgs().parse_args(arguments)

    # Run predictions
    preds = make_predictions(args=args, smiles=smiles)

    if all(p is None for p in preds):
        return render_predict(errors=['All SMILES are invalid'])

    # Replace invalid smiles with message
    invalid_smiles_warning = 'Invalid SMILES String'
    preds = [
        pred if pred is not None else [invalid_smiles_warning] * num_tasks
        for pred in preds
    ]

    return render_predict(
        predicted=True,
        smiles=smiles,
        num_smiles=min(10, len(smiles)),
        show_more=max(0,
                      len(smiles) - 10),
        task_names=task_names,
        num_tasks=len(task_names),
        preds=preds,
        warnings=["List contains invalid SMILES strings"]
        if None in preds else None,
        errors=["No SMILES strings given"] if len(preds) == 0 else None)
Пример #5
0
def docking():
    """Renders the predict page and makes predictions if the method is POST."""
    if request.method == 'GET':
        return render_docking()

    # Create and modify args
    parser = ArgumentParser()
    add_predict_args(parser)
    args = parser.parse_args([])
    # Get arguments
    ckpt_id = request.form['checkpointName']
    app.config[
        'TEMP_FOLDER'] = '/work01/home/yjxu/documents/A1_IIPharam_project/PKUMDL_ChemAI/test_space'

    args.test_path = app.config['TEMP_FOLDER']

    if request.form['textSmiles'] != '':
        smiles = request.form['textSmiles'].split()
    elif request.form['drawSmiles'] != '':
        smiles = [request.form['drawSmiles']]
    else:
        print(" GOT HERE")
        # Upload data file with SMILES
        data = request.files['data']
        data_name = secure_filename(data.filename)
        data_path = os.path.join(app.config['TEMP_FOLDER'], "raw", data_name)
        data.save(data_path)
        args.preds_path = os.path.join("prediction", data_name)
        args.data_name = data_name.split(".")[0]
        app.config['PREDICTIONS_FILENAME'] = os.path.join(
            "prediction", data_name)

        # Check if header is smiles
        possible_smiles = get_header(data_path)[0]
        smiles = [possible_smiles
                  ] if Chem.MolFromSmiles(possible_smiles) is not None else []
        print(data_path)
        # Get remaining smiles
        smiles.extend(get_smiles(data_path))

    print(smiles)
    models = db.get_models(ckpt_id)
    model_paths = [
        os.path.join(app.config['CHECKPOINT_FOLDER'], f'{model["id"]}.pt')
        for model in models
    ]

    task_names = load_task_names(model_paths[0])
    num_tasks = len(task_names)
    gpu = request.form.get('gpu')
    args.checkpoint_paths = model_paths
    if gpu is not None:
        if gpu == 'None':
            args.no_cuda = True
        else:
            args.gpu = int(gpu)
    modify_predict_args(args)
    # Run predictions
    preds = make_predictions(args)

    if all(p is None for p in preds):
        return render_docking(errors=['All SMILES are invalid'])

    # Replace invalid smiles with message
    invalid_smiles_warning = "Invalid SMILES String"
    preds = [
        pred if pred is not None else [invalid_smiles_warning] * num_tasks
        for pred in preds
    ]

    return render_docking(
        predicted=True,
        smiles=smiles,
        num_smiles=len(smiles),
        show_more=0,
        task_names=task_names,
        num_tasks=len(task_names),
        preds=preds,
        warnings=["List contains invalid SMILES strings"]
        if None in preds else None,
        errors=["No SMILES strings given"] if len(preds) == 0 else None)
Пример #6
0
def generate():
    """Renders the generate page

    Content-Type: application/json

    args:
        {"checkpointName": "igm_char_rnn, igm_atom_rnn, igm_frag_vae","n_sample_per_model" : "1000", "filter": "None" or "MW_0_1, logP_0_4, SAS_0_5, QED_0_1" }

    return:
        json {"igm_char_rnn": "path_to_charrnn_file", "igm_atom_rnn": "path_to_atomrnn_file","igm_frag_vae": "path_to_fragvae_file", "filtered": "None" or "path_to_filter_file"}
        or
        generate.html

    @@@
    #### example
    ```
    curl -H "Content-Type: application/json" -X POST --data 'args'
    ```

    """
    if request.method == 'GET':
        return render_generate()

    # Get arguments
    print(request.is_json)
    content = request.get_json()
    print(content)

    model_names = content["checkpointName"]
    num_sample = content["n_sample_per_model"]
    isfilter = content["filter"]

    return jsonify({
        "igm_char_rnn": "path_to_charrnn_file",
        "igm_atom_rnn": "path_to_atomrnn_file",
        "igm_frag_vae": "path_to_fragvae_file",
        "filtered": "None or path_to_filter_file"
    })

    ckpt_id = request.form['checkpointName']
    app.config['TEMP_FOLDER'] = 'tmp_log_web/generate'
    args.test_path = app.config['TEMP_FOLDER']

    if request.form['textSmiles'] != '':
        smiles = request.form['textSmiles'].split()
    elif request.form['drawSmiles'] != '':
        smiles = [request.form['drawSmiles']]
    else:
        print(" GOT HERE")
        # Upload data file with SMILES
        data = request.files['data']
        data_name = secure_filename(data.filename)
        data_path = os.path.join(app.config['TEMP_FOLDER'], "raw", data_name)
        data.save(data_path)
        args.preds_path = os.path.join("prediction", data_name)
        args.data_name = data_name.split(".")[0]
        app.config['PREDICTIONS_FILENAME'] = os.path.join(
            "prediction", data_name)

        # Check if header is smiles
        possible_smiles = get_header(data_path)[0]
        smiles = [possible_smiles
                  ] if Chem.MolFromSmiles(possible_smiles) is not None else []
        print(data_path)
        # Get remaining smiles
        smiles.extend(get_smiles(data_path))

    print(smiles)
    models = db.get_models(ckpt_id)
    model_paths = [
        os.path.join(app.config['CHECKPOINT_FOLDER'], f'{model["id"]}.pt')
        for model in models
    ]

    task_names = load_task_names(model_paths[0])
    num_tasks = len(task_names)
    gpu = request.form.get('gpu')
    args.checkpoint_paths = model_paths
    if gpu is not None:
        if gpu == 'None':
            args.no_cuda = True
        else:
            args.gpu = int(gpu)
    modify_predict_args(args)
    # Run predictions
    preds = make_predictions(args)

    if all(p is None for p in preds):
        return render_generate(errors=['All SMILES are invalid'])

    # Replace invalid smiles with message
    invalid_smiles_warning = "Invalid SMILES String"
    preds = [
        pred if pred is not None else [invalid_smiles_warning] * num_tasks
        for pred in preds
    ]

    return render_generate(
        predicted=True,
        smiles=smiles,
        num_smiles=len(smiles),
        show_more=0,
        task_names=task_names,
        num_tasks=len(task_names),
        preds=preds,
        warnings=["List contains invalid SMILES strings"]
        if None in preds else None,
        errors=["No SMILES strings given"] if len(preds) == 0 else None)
Пример #7
0
def predict_old():
    """Renders the predict page and makes predictions if the method is POST.

    @@@
    #### example
    ```
    curl -X POST url  -F 'checkpointName=<checkpointName option>' -F 'textSmiles=<smiles>'
    curl -X POST url -F 'checkpointName=<checkpointName option>' -F 'textSmiles=' -F 'drawSmiles=<drawSmilesInput>'
    curl -X POST url -F 'checkpointName=<checkpointName option>' -F 'textSmiles=' -F 'drawSmiles=' -F 'data=@<fileSmilesInput>'
    ```
    #### return
    - ##### predict.html
    @@@

    """
    if request.method == 'GET':
        return render_predict()

    ckpt_id = request.form['checkpointName']
    app.config['TEMP_FOLDER'] = './web/web_log'

    if request.form['textSmiles'] != '':
        smiles = request.form['textSmiles'].split()
    elif request.form['drawSmiles'] != '':
        smiles = [request.form['drawSmiles']]
    else:
        # Upload data file with SMILES
        data = request.files['data']
        data_name = secure_filename(data.filename)
        data_path = os.path.join(app.config['TEMP_FOLDER'], data_name)
        data.save(data_path)

        # Check if header is smiles
        possible_smiles = get_header(data_path)[0]
        smiles = [possible_smiles
                  ] if Chem.MolFromSmiles(possible_smiles) is not None else []

        # Get remaining smiles
        smiles.extend(get_smiles(data_path))

    # Create and modify args
    parser = ArgumentParser()
    add_predict_args(parser)
    args = parser.parse_args([])

    args.test_path = app.config['TEMP_FOLDER']
    args.data_name = data_name.split(".")[0]
    gpu = request.form.get('gpu')

    model = db.get_models(ckpt_id)[0]
    model_path = os.path.join(app.config['CHECKPOINT_FOLDER'],
                              f'{model["id"]}.pt')

    task_names = load_task_names(model_path)
    num_tasks = len(task_names)

    preds_path = os.path.join(app.config['TEMP_FOLDER'], "predict",
                              app.config['PREDICTIONS_FILENAME'])

    args.preds_path = preds_path
    args.checkpoint_paths = model_path
    if gpu is not None:
        if gpu == 'None':
            args.no_cuda = True
        else:
            args.gpu = int(gpu)

    train_args = load_args(model_path)

    for key, value in vars(train_args).items():
        if not hasattr(args, key):
            setattr(args, key, value)

    modify_predict_args(args)

    # Run predictions
    preds = make_predictions(args)

    if all(p is None for p in preds):
        return render_predict(errors=['All SMILES are invalid'])

    # Replace invalid smiles with message
    invalid_smiles_warning = "Invalid SMILES String"
    preds = [
        pred if pred is not None else [invalid_smiles_warning] * num_tasks
        for pred in preds
    ]

    print(preds)

    return render_predict(
        predicted=True,
        smiles=smiles,
        num_smiles=min(10, len(smiles)),
        show_more=max(0,
                      len(smiles) - 10),
        task_names=task_names,
        num_tasks=len(task_names),
        preds=preds,
        warnings=["List contains invalid SMILES strings"]
        if None in preds else None,
        errors=["No SMILES strings given"] if len(preds) == 0 else None)
Пример #8
0
def predict():
    """Renders the predict page and makes predictions if the method is POST.

    Content-Type: multipart/form-data
    @@@
    #### example
    ```
    curl -X POST url  -F 'checkpointName=<checkpointName option>' -F 'textSmiles=<smiles>'
    curl -X POST url -F 'checkpointName=<checkpointName option>' -F 'textSmiles=' -F 'drawSmiles=<drawSmilesInput>'
    curl -X POST url -F 'checkpointName=<checkpointName option>' -F 'textSmiles=' -F 'drawSmiles=' -F 'data=@<fileSmilesInput>' or -F "usejson=True"
    ```
    #### return
    - ##### predict.html
    - ##### json data if usejson is True
    @@@
    """
    if request.method == 'GET':
        return render_predict()

    # Create and modify args
    parser = ArgumentParser()
    add_predict_args(parser)
    args = parser.parse_args([])
    # Get arguments
    ckpt_id = request.form['checkpointName']
    print(ckpt_id)
    args.test_path = app.config['TEMP_FOLDER']

    if request.form['textSmiles'] != '':
        smiles = request.form['textSmiles'].split()
    elif request.form['drawSmiles'] != '':
        smiles = [request.form['drawSmiles']]
    else:
        print(" GOT HERE")
        # Upload data file with SMILES
        data = request.files['data']
        # print(data)
        data_name = secure_filename(data.filename)
        data_path = os.path.join(app.config['TEMP_FOLDER'], "raw", data_name)
        data.save(data_path)
        args.preds_path = os.path.join("prediction", data_name)
        args.data_name = data_name.split(".")[0]
        app.config['PREDICTIONS_FILENAME'] = args.preds_path

        # Check if header is smiles
        possible_smiles = get_header(data_path)[0]
        smiles = [possible_smiles
                  ] if Chem.MolFromSmiles(possible_smiles) is not None else []
        # print(data_path)
        # Get remaining smiles
        smiles.extend(get_smiles(data_path))

    # print(smiles)
    models = db.get_models(ckpt_id)
    model_paths = [
        os.path.join(app.config['CHECKPOINT_FOLDER'], f'{model["id"]}.pt')
        for model in models
    ]

    task_names = load_task_names(model_paths[0])
    num_tasks = len(task_names)
    gpu = request.form.get('gpu')
    args.checkpoint_paths = model_paths
    if gpu is not None:
        if gpu == 'None':
            args.no_cuda = True
        else:
            args.gpu = int(gpu)
    modify_predict_args(args)
    # Run predictions
    preds = make_predictions(args)

    if request.form['usejson']:
        preds_arr = np.array(preds)
        jsondata = {}
        jsondata["smiles"] = smiles
        for i, task_name in enumerate(task_names):
            jsondata[task_name] = list(preds_arr[:, i])
        return jsonify(jsondata)

    if all(p is None for p in preds):
        return render_predict(errors=['All SMILES are invalid'])

    # Replace invalid smiles with message
    invalid_smiles_warning = "Invalid SMILES String"
    preds = [
        pred if pred is not None else [invalid_smiles_warning] * num_tasks
        for pred in preds
    ]

    return render_predict(
        predicted=True,
        smiles=smiles,
        num_smiles=len(smiles),
        show_more=0,
        task_names=task_names,
        num_tasks=len(task_names),
        preds=preds,
        warnings=["List contains invalid SMILES strings"]
        if None in preds else None,
        errors=["No SMILES strings given"] if len(preds) == 0 else None)