[7e250a]: / src / gpt / gpt.ipynb

Download this file

801 lines (800 with data), 98.7 kB

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from openai import OpenAI\n",
    "import tiktoken\n",
    "\n",
    "from pytrial.data.demo_data import load_trial_outcome_data\n",
    "from pytrial.data.trial_data import TrialOutcomeDatasetBase\n",
    "\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import *\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "\n",
    "import requests\n",
    "from dotenv import load_dotenv\n",
    "import traceback\n",
    "from typing import Iterable\n",
    "from tqdm import tqdm\n",
    "import json\n",
    "from datetime import datetime\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_length(model, text):\n",
    "    assert model == \"gpt-3.5-turbo\" or model == \"gpt-4-0125-preview\"\n",
    "    encoder = tiktoken.encoding_for_model(model)\n",
    "    token_cnt = len(encoder.encode(text))\n",
    "    return token_cnt\n",
    "\n",
    "def get_pricing(direction, model, text):\n",
    "    assert (model == \"gpt-3.5-turbo\" or model == \"gpt-4-0125-preview\") and (direction == \"in\" or direction == \"out\")\n",
    "    token_cnt = get_length(model, text)\n",
    "    if direction == \"in\":\n",
    "        return (token_cnt * 0.01 / 1e3 if model == \"gpt-4-0125-preview\" else token_cnt * 0.0005 / 1e3)\n",
    "    else:\n",
    "        return (token_cnt * 0.03 / 1e3 if model == \"gpt-4-0125-preview\" else token_cnt * 0.0015 / 1e3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "load_dotenv()\n",
    "assert os.getenv(\"OPENAI_API_KEY\") is not None\n",
    "\n",
    "client = OpenAI()\n",
    "\n",
    "def get_assistant_msg(content: str):\n",
    "    return {\"role\": \"assistant\",\n",
    "            \"content\": content}\n",
    "\n",
    "def pipe_qa_chat(trial: str, base_messages: list, summary_prompt: str, model: str, tool_data: dict, questions = None):\n",
    "    \n",
    "    trial_message = {\"role\": \"user\",\n",
    "                     \"content\": f\"The trial data is the following.\\n{trial}\\nLet's explain this clinical trial for predicting its success. Let's examine, step by step.\"}\n",
    "    \n",
    "    messages = base_messages.copy()\n",
    "    messages.append(trial_message)\n",
    "    history = messages.copy()\n",
    "    response = get_assistant_msg(get_response(history, model, None))\n",
    "    history.append(response)\n",
    "\n",
    "    question_responses = []\n",
    "    for question in questions:\n",
    "        question_responses.append(question)\n",
    "        response = get_assistant_msg(get_response(\n",
    "            messages + [question], model, None))\n",
    "        question_responses.append(response)\n",
    "\n",
    "    history += question_responses\n",
    "\n",
    "    summary_message = {\"role\": \"user\",\n",
    "                       \"content\": f\"{summary_prompt} With that in mind, predict the outcome of this clinical trial. Let's examine, step by step.\"}\n",
    "    \n",
    "    history.append(summary_message)\n",
    "    response = get_response(history, model, tool_data)\n",
    "\n",
    "    return response\n",
    "\n",
    "\n",
    "def get_response(messages: list, model: str, tool_data: dict):\n",
    "    # print(len(messages))\n",
    "    # return {\"reasoning\": \"\", \"prediction\": \"\"}\n",
    "\n",
    "    if tool_data is not None:\n",
    "        tools = [\n",
    "            {\n",
    "                \"type\": \"function\",\n",
    "                \"function\": {\n",
    "                    \"name\": \"predict_trial_outcome\",\n",
    "                    \"description\": tool_data.get(\"description\"),\n",
    "                    \"parameters\": tool_data.get(\"parameters\")\n",
    "                }\n",
    "            }\n",
    "        ]\n",
    "    \n",
    "        completion = client.chat.completions.create(\n",
    "            model=model,\n",
    "            messages=messages,\n",
    "            tools=tools,\n",
    "            tool_choice=\"auto\",\n",
    "            temperature=0,\n",
    "        )\n",
    "\n",
    "    else:\n",
    "        completion = client.chat.completions.create(\n",
    "            model=model,\n",
    "            messages=messages\n",
    "        )\n",
    "\n",
    "    assert completion.choices is not None\n",
    "\n",
    "    message = completion.choices[0].message\n",
    "    if message.tool_calls is not None:\n",
    "        tool_calls = message.tool_calls\n",
    "        response = tool_calls[0].function.arguments\n",
    "    else:\n",
    "        response = message.content\n",
    "\n",
    "    if response is None:\n",
    "        raise ValueError(f\"Invalid response structure: {completion}\")\n",
    "\n",
    "    return response"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "results_folder = \"../../results/gpt\"\n",
    "results_file = \"gpt4-phase3-subtasks+clinical_knowledge+augmented_data.json\"\n",
    "model = \"gpt-4-0125-preview\"\n",
    "limit = 30"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def serialize_row(row: pd.Series) -> str:\n",
    "    text_values = []\n",
    "    for colname, value in row.items():\n",
    "        text_values.append(f\"{colname} is {value if value is not None else 'unknown'}\")\n",
    "\n",
    "    return \", \".join(text_values) + \".\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_nct_data(nct_ids: list[str]):\n",
    "    url_prefix = \"https://clinicaltrials.gov/api/v2/studies\"\n",
    "    headers = {\n",
    "        \"accept\": \"application/json\",\n",
    "    }\n",
    "\n",
    "    query_enc_ids = [\"%22\" + nct_id + \"%22\" for nct_id  in nct_ids]\n",
    "    query = \"?query.id=\" + \"+OR+\".join(query_enc_ids) + \"&pageSize=200\"\n",
    "\n",
    "    try:\n",
    "        response = requests.get(f\"{url_prefix}{query}\", headers=headers)\n",
    "\n",
    "        if response.status_code == 200:\n",
    "            trial_data = response.json()\n",
    "            trials = []\n",
    "\n",
    "            print(f\"Study count: {len(trial_data['studies'])}\")\n",
    "\n",
    "            for study in trial_data['studies']:\n",
    "                identificationModule = study.get('protocolSection', {}).get('identificationModule', {})\n",
    "                sponsorCollaboratorsModule = study.get('protocolSection', {}).get('sponsorCollaboratorsModule', {})\n",
    "                descriptionModule = study.get('protocolSection', {}).get('descriptionModule', {})\n",
    "                designModule = study.get('protocolSection', {}).get('designModule', {})\n",
    "                contactsLocationsModule = study.get('protocolSection', {}).get('contactsLocationsModule', {})\n",
    "\n",
    "                extracted_trial = {\n",
    "                    \"nctId\": identificationModule.get(\"nctId\"),\n",
    "                    \"description\": descriptionModule.get(\"briefSummary\"),\n",
    "                    \"lead_sponsor\": sponsorCollaboratorsModule.get(\"leadSponsor\", {}).get(\"name\"),\n",
    "                    \"collaborators\": [collaborator.get(\"name\") for collaborator in sponsorCollaboratorsModule.get(\"collaborators\", [])],\n",
    "                    \"study_type\": designModule.get(\"studyType\"),\n",
    "                    \"location_count\": len(contactsLocationsModule.get(\"locations\", [])),\n",
    "                }\n",
    "                trials.append(extracted_trial)\n",
    "            return trials\n",
    "        else:\n",
    "            print(f\"Request failed with status code: {response.status_code}\")\n",
    "            return None\n",
    "    except requests.RequestException as e:\n",
    "        print(f\"Request exception occurred: {e}\")\n",
    "        return None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Study count: 30\n"
     ]
    }
   ],
   "source": [
    "df = load_trial_outcome_data(phase='III', split='test')['data']\n",
    "\n",
    "test_data = TrialOutcomeDatasetBase(df).data\n",
    "\n",
    "successful_trials = test_data[test_data['label']\n",
    "                           == 1].sample(n=limit//2, random_state=42)\n",
    "failed_trials = test_data[test_data['label']\n",
    "                           == 0].sample(n=limit - limit//2, random_state=42)\n",
    "\n",
    "test_data = pd.concat(\n",
    "    [successful_trials, failed_trials]).sample(frac=1, random_state=42)\n",
    "\n",
    "nct_ids = test_data['nctid'].unique().tolist()\n",
    "augmented_data = get_nct_data(nct_ids)\n",
    "augmented_df = pd.DataFrame(augmented_data)\n",
    "test_data = test_data.merge(augmented_df, left_on='nctid', right_on='nctId', how='left')\n",
    "\n",
    "remaining_data = test_data[~test_data.index.isin(test_data.index)]\n",
    "\n",
    "outcomes = test_data[['nctid', 'label', 'why_stop', 'status']]\n",
    "test_data.drop(['smiless', 'label', 'why_stop',\n",
    "               'study_first_submitted_date', 'nctid', 'status'], axis=1, inplace=True)\n",
    "\n",
    "serialized_trials = test_data.apply(serialize_row, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nctid</th>\n",
       "      <th>status</th>\n",
       "      <th>why_stop</th>\n",
       "      <th>label</th>\n",
       "      <th>phase</th>\n",
       "      <th>diseases</th>\n",
       "      <th>icdcodes</th>\n",
       "      <th>drugs</th>\n",
       "      <th>smiless</th>\n",
       "      <th>criteria</th>\n",
       "      <th>title</th>\n",
       "      <th>study_first_submitted_date</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>NCT01308528</td>\n",
       "      <td>completed</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>phase 3</td>\n",
       "      <td>['venous thromboembolism']</td>\n",
       "      <td>[\"['O88.22', 'O88.23', 'O88.211', 'O88.212', '...</td>\n",
       "      <td>['sodium enoxaparin', 'sodium enoxaparin clexa...</td>\n",
       "      <td>['[H][N]([H])([H])[Pt](Cl)(Cl)[N]([H])([H])[H]...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>Prophylactic Use of Sodium Enoxaparin for Veno...</td>\n",
       "      <td>2011-03-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NCT01670552</td>\n",
       "      <td>completed</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>phase 3</td>\n",
       "      <td>['acute and chronic inflammation', 'dyspepsia']</td>\n",
       "      <td>[\"['K30']\"]</td>\n",
       "      <td>['nimesulide + pantoprazole', 'naproxen + esom...</td>\n",
       "      <td>['COC1=C(OC)C(CS(=O)C2=NC3=C(N2)C=C(OC(F)F)C=C...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>Evaluation of Two Therapies for the Treatment ...</td>\n",
       "      <td>2012-08-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NCT01786824</td>\n",
       "      <td>terminated</td>\n",
       "      <td>\\n    patient pathway has become infeasible du...</td>\n",
       "      <td>0</td>\n",
       "      <td>phase 3</td>\n",
       "      <td>['acute kidney injury', 'renal insufficiency']</td>\n",
       "      <td>[\"['N26.2', 'Q63.0', 'Q63.2', 'Z52.4', 'I75.81...</td>\n",
       "      <td>['hydration strategy using saline', 'hydration...</td>\n",
       "      <td>['NS(=O)(=O)C1=C(Cl)C=C(NCC2=CC=CO2)C(=C1)C(O)...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>Preventing Contrast-induced Nephropathy: Evalu...</td>\n",
       "      <td>2013-02-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NCT01877668</td>\n",
       "      <td>completed</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>phase 3</td>\n",
       "      <td>['psoriatic arthritis']</td>\n",
       "      <td>[\"['L40.52']\"]</td>\n",
       "      <td>['tofacitinib 5 mg bid', 'tofacitinib 10 mg bi...</td>\n",
       "      <td>['[H][C@@]1(C)CCN(C[C@]1([H])N(C)C1=NC=NC2=C1C...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>Efficacy And Safety Of Tofacitinib In Psoriati...</td>\n",
       "      <td>2013-06-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NCT01887717</td>\n",
       "      <td>terminated</td>\n",
       "      <td>\\n    poor accrual.\\n</td>\n",
       "      <td>0</td>\n",
       "      <td>phase 3</td>\n",
       "      <td>['hepatocellular carcinoma']</td>\n",
       "      <td>[\"['C22.0', 'C4A.9', 'C7B.1', 'C4A.0', 'C4A.31...</td>\n",
       "      <td>['sorafenib']</td>\n",
       "      <td>['CNC(=O)C1=NC=CC(OC2=CC=C(NC(=O)NC3=CC(=C(Cl)...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>Efficacy Evaluation of TheraSphere to Treat In...</td>\n",
       "      <td>2013-06-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1141</th>\n",
       "      <td>NCT03716050</td>\n",
       "      <td>terminated</td>\n",
       "      <td>\\n    pi decision due to slow accrual\\n</td>\n",
       "      <td>0</td>\n",
       "      <td>phase 2/phase 3</td>\n",
       "      <td>['perfusion; complications']</td>\n",
       "      <td>[\"['A36.89', 'B01.89', 'B02.9', 'B05.89', 'B06...</td>\n",
       "      <td>['nitroglycerin']</td>\n",
       "      <td>['COC(=O)C1=C(C)NC(C)=C(C1C1=CC(=CC=C1)[N+]([O...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>The Effect of Nitroglycerin Ointment, Fluoresc...</td>\n",
       "      <td>2018-10-19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1142</th>\n",
       "      <td>NCT03733301</td>\n",
       "      <td>completed</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>phase 3</td>\n",
       "      <td>['atopic dermatitis']</td>\n",
       "      <td>[\"['L20.89', 'L20.9']\"]</td>\n",
       "      <td>['baricitinib', 'topical corticosteroid', 'pla...</td>\n",
       "      <td>['CCS(=O)(=O)N1CC(CC#N)(C1)N1C=C(C=N1)C1=C2C=C...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>A Study of Baricitinib (LY3009104) in Combinat...</td>\n",
       "      <td>2018-10-30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1143</th>\n",
       "      <td>NCT03907072</td>\n",
       "      <td>terminated</td>\n",
       "      <td>\\n    lack of efficacy\\n</td>\n",
       "      <td>0</td>\n",
       "      <td>phase 2/phase 3</td>\n",
       "      <td>['duchenne muscular dystrophy']</td>\n",
       "      <td>[\"['G71.01']\"]</td>\n",
       "      <td>['wve-210201 (suvodirsen)', 'placebo']</td>\n",
       "      <td>['CN1C(=O)C=C(N2CCC[C@@H](N)C2)N(CC2=C(C=CC=C2...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          1. ...</td>\n",
       "      <td>Efficacy and Safety Study of WVE-210201 (Suvod...</td>\n",
       "      <td>2019-04-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1144</th>\n",
       "      <td>NCT04060888</td>\n",
       "      <td>withdrawn</td>\n",
       "      <td>\\n    pre-planned ia (global study) showed lac...</td>\n",
       "      <td>0</td>\n",
       "      <td>phase 3</td>\n",
       "      <td>['lupus erythematosus, systemic']</td>\n",
       "      <td>[\"['M32.9', 'M32.0', 'M32.11', 'M32.12', 'M32....</td>\n",
       "      <td>['ustekinumab (approximately 6 mg/kg)', 'ustek...</td>\n",
       "      <td>['CN1C(=O)C=C(N2CCC[C@@H](N)C2)N(CC2=C(C=CC=C2...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>A Study of Ustekinumab in Chinese Participants...</td>\n",
       "      <td>2019-08-16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1145</th>\n",
       "      <td>NCT04341727</td>\n",
       "      <td>suspended</td>\n",
       "      <td>\\n    dsmb recommended study suspension slow a...</td>\n",
       "      <td>0</td>\n",
       "      <td>phase 3</td>\n",
       "      <td>['coronavirus infection']</td>\n",
       "      <td>[\"['B34.2']\"]</td>\n",
       "      <td>['hydroxychloroquine sulfate', 'azithromycin',...</td>\n",
       "      <td>['CCN(CCO)CCCC(C)NC1=C2C=CC(Cl)=CC2=NC=C1', '[...</td>\n",
       "      <td>\\n        Inclusion Criteria:\\n\\n          -  ...</td>\n",
       "      <td>Hydroxychloroquine,Hydroxychloroquine,Azithrom...</td>\n",
       "      <td>2020-04-04</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1146 rows × 12 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            nctid      status  \\\n",
       "0     NCT01308528   completed   \n",
       "1     NCT01670552   completed   \n",
       "2     NCT01786824  terminated   \n",
       "3     NCT01877668   completed   \n",
       "4     NCT01887717  terminated   \n",
       "...           ...         ...   \n",
       "1141  NCT03716050  terminated   \n",
       "1142  NCT03733301   completed   \n",
       "1143  NCT03907072  terminated   \n",
       "1144  NCT04060888   withdrawn   \n",
       "1145  NCT04341727   suspended   \n",
       "\n",
       "                                               why_stop  label  \\\n",
       "0                                                   NaN      1   \n",
       "1                                                   NaN      1   \n",
       "2     \\n    patient pathway has become infeasible du...      0   \n",
       "3                                                   NaN      1   \n",
       "4                               \\n    poor accrual.\\n        0   \n",
       "...                                                 ...    ...   \n",
       "1141          \\n    pi decision due to slow accrual\\n        0   \n",
       "1142                                                NaN      1   \n",
       "1143                         \\n    lack of efficacy\\n        0   \n",
       "1144  \\n    pre-planned ia (global study) showed lac...      0   \n",
       "1145  \\n    dsmb recommended study suspension slow a...      0   \n",
       "\n",
       "                phase                                         diseases  \\\n",
       "0             phase 3                       ['venous thromboembolism']   \n",
       "1             phase 3  ['acute and chronic inflammation', 'dyspepsia']   \n",
       "2             phase 3   ['acute kidney injury', 'renal insufficiency']   \n",
       "3             phase 3                          ['psoriatic arthritis']   \n",
       "4             phase 3                     ['hepatocellular carcinoma']   \n",
       "...               ...                                              ...   \n",
       "1141  phase 2/phase 3                     ['perfusion; complications']   \n",
       "1142          phase 3                            ['atopic dermatitis']   \n",
       "1143  phase 2/phase 3                  ['duchenne muscular dystrophy']   \n",
       "1144          phase 3                ['lupus erythematosus, systemic']   \n",
       "1145          phase 3                        ['coronavirus infection']   \n",
       "\n",
       "                                               icdcodes  \\\n",
       "0     [\"['O88.22', 'O88.23', 'O88.211', 'O88.212', '...   \n",
       "1                                           [\"['K30']\"]   \n",
       "2     [\"['N26.2', 'Q63.0', 'Q63.2', 'Z52.4', 'I75.81...   \n",
       "3                                        [\"['L40.52']\"]   \n",
       "4     [\"['C22.0', 'C4A.9', 'C7B.1', 'C4A.0', 'C4A.31...   \n",
       "...                                                 ...   \n",
       "1141  [\"['A36.89', 'B01.89', 'B02.9', 'B05.89', 'B06...   \n",
       "1142                            [\"['L20.89', 'L20.9']\"]   \n",
       "1143                                     [\"['G71.01']\"]   \n",
       "1144  [\"['M32.9', 'M32.0', 'M32.11', 'M32.12', 'M32....   \n",
       "1145                                      [\"['B34.2']\"]   \n",
       "\n",
       "                                                  drugs  \\\n",
       "0     ['sodium enoxaparin', 'sodium enoxaparin clexa...   \n",
       "1     ['nimesulide + pantoprazole', 'naproxen + esom...   \n",
       "2     ['hydration strategy using saline', 'hydration...   \n",
       "3     ['tofacitinib 5 mg bid', 'tofacitinib 10 mg bi...   \n",
       "4                                         ['sorafenib']   \n",
       "...                                                 ...   \n",
       "1141                                  ['nitroglycerin']   \n",
       "1142  ['baricitinib', 'topical corticosteroid', 'pla...   \n",
       "1143             ['wve-210201 (suvodirsen)', 'placebo']   \n",
       "1144  ['ustekinumab (approximately 6 mg/kg)', 'ustek...   \n",
       "1145  ['hydroxychloroquine sulfate', 'azithromycin',...   \n",
       "\n",
       "                                                smiless  \\\n",
       "0     ['[H][N]([H])([H])[Pt](Cl)(Cl)[N]([H])([H])[H]...   \n",
       "1     ['COC1=C(OC)C(CS(=O)C2=NC3=C(N2)C=C(OC(F)F)C=C...   \n",
       "2     ['NS(=O)(=O)C1=C(Cl)C=C(NCC2=CC=CO2)C(=C1)C(O)...   \n",
       "3     ['[H][C@@]1(C)CCN(C[C@]1([H])N(C)C1=NC=NC2=C1C...   \n",
       "4     ['CNC(=O)C1=NC=CC(OC2=CC=C(NC(=O)NC3=CC(=C(Cl)...   \n",
       "...                                                 ...   \n",
       "1141  ['COC(=O)C1=C(C)NC(C)=C(C1C1=CC(=CC=C1)[N+]([O...   \n",
       "1142  ['CCS(=O)(=O)N1CC(CC#N)(C1)N1C=C(C=N1)C1=C2C=C...   \n",
       "1143  ['CN1C(=O)C=C(N2CCC[C@@H](N)C2)N(CC2=C(C=CC=C2...   \n",
       "1144  ['CN1C(=O)C=C(N2CCC[C@@H](N)C2)N(CC2=C(C=CC=C2...   \n",
       "1145  ['CCN(CCO)CCCC(C)NC1=C2C=CC(Cl)=CC2=NC=C1', '[...   \n",
       "\n",
       "                                               criteria  \\\n",
       "0     \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "1     \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "2     \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "3     \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "4     \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "...                                                 ...   \n",
       "1141  \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "1142  \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "1143  \\n        Inclusion Criteria:\\n\\n          1. ...   \n",
       "1144  \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "1145  \\n        Inclusion Criteria:\\n\\n          -  ...   \n",
       "\n",
       "                                                  title  \\\n",
       "0     Prophylactic Use of Sodium Enoxaparin for Veno...   \n",
       "1     Evaluation of Two Therapies for the Treatment ...   \n",
       "2     Preventing Contrast-induced Nephropathy: Evalu...   \n",
       "3     Efficacy And Safety Of Tofacitinib In Psoriati...   \n",
       "4     Efficacy Evaluation of TheraSphere to Treat In...   \n",
       "...                                                 ...   \n",
       "1141  The Effect of Nitroglycerin Ointment, Fluoresc...   \n",
       "1142  A Study of Baricitinib (LY3009104) in Combinat...   \n",
       "1143  Efficacy and Safety Study of WVE-210201 (Suvod...   \n",
       "1144  A Study of Ustekinumab in Chinese Participants...   \n",
       "1145  Hydroxychloroquine,Hydroxychloroquine,Azithrom...   \n",
       "\n",
       "     study_first_submitted_date  \n",
       "0                    2011-03-01  \n",
       "1                    2012-08-17  \n",
       "2                    2013-02-06  \n",
       "3                    2013-06-12  \n",
       "4                    2013-06-03  \n",
       "...                         ...  \n",
       "1141                 2018-10-19  \n",
       "1142                 2018-10-30  \n",
       "1143                 2019-04-05  \n",
       "1144                 2019-08-16  \n",
       "1145                 2020-04-04  \n",
       "\n",
       "[1146 rows x 12 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "30it [35:11, 70.37s/it]\n"
     ]
    }
   ],
   "source": [
    "with open(\"prompts.json\", \"r\") as file:\n",
    "    prompts = json.load(file)\n",
    "\n",
    "prompt = prompts['templates']['subtasks+clinical_knowledge']\n",
    "\n",
    "base_messages = prompt['base_messages']\n",
    "summary_prompt = prompt['summary_prompt']\n",
    "tool_data = prompt['tool_data']\n",
    "questions = prompt['questions']\n",
    "\n",
    "\n",
    "with open(f\"{results_folder}/{results_file}\", \"w\") as file:\n",
    "    json.dump([], file)\n",
    "\n",
    "def process_trial(trial, outcome):\n",
    "    idx, outcome = outcome\n",
    "    \n",
    "    try:\n",
    "        res = pipe_qa_chat(\n",
    "            trial, base_messages, summary_prompt, model, tool_data, questions)\n",
    "\n",
    "        response = json.loads(res) if isinstance(res, str) else res\n",
    "        response['ground_truth'] = \"success\" if outcome.get(\n",
    "            'label') == 1 else \"failure\"\n",
    "        response['nctid'] = outcome.get('nctid')\n",
    "        if str(outcome[\"why_stop\"]).lower() != \"nan\":\n",
    "            response[\"fail_reason\"] = outcome[\"why_stop\"] \n",
    "\n",
    "        with open(f\"{results_folder}/{results_file}\", \"r+\") as file:\n",
    "            file_data = json.load(file)\n",
    "            file_data.append(response)\n",
    "            file.seek(0)\n",
    "            json.dump(file_data, file, indent=4)\n",
    "            file.truncate()\n",
    "\n",
    "    except Exception as e:\n",
    "        print(f\"Error processing trial {outcome.get('nctid', 'Unknown')}: {e}\")\n",
    "        log_error(e, outcome)\n",
    "\n",
    "\n",
    "def log_error(exception, outcome):\n",
    "    error_message = {\n",
    "        \"trial_id\": outcome.get('nctid', 'unknown'),\n",
    "        \"error\": str(exception),\n",
    "        \"stack_trace\": traceback.format_exc(),\n",
    "        \"time\": datetime.now().isoformat()\n",
    "    }\n",
    "\n",
    "    with open(f\"{results_folder}/error_log.json\", \"a+\") as error_file:\n",
    "        error_file.seek(0)\n",
    "        try:\n",
    "            errors = json.load(error_file)\n",
    "        except json.JSONDecodeError:\n",
    "            errors = []\n",
    "        errors.append(error_message)\n",
    "        error_file.seek(0)\n",
    "        json.dump(errors, error_file, indent=4)\n",
    "        error_file.truncate()\n",
    "\n",
    "for trial, outcome in tqdm(zip(serialized_trials[:limit], outcomes.iterrows())):\n",
    "    process_trial(trial, outcome)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Acc': 0.6, 'F1': 0.7142857142857143, 'Precision': 0.5555555555555556, 'Recall': 1.0, 'ROC-AUC': 0.6, 'PR-AUC': 0.5555555555555556, 'Specificity': 0.2}\n"
     ]
    }
   ],
   "source": [
    "preds = pd.read_json(f\"{results_folder}/{results_file}\")\n",
    "\n",
    "preds['prediction'] = preds['prediction'].apply(\n",
    "    lambda x: 'failure' if x != 'success' else 'success')\n",
    "preds['ground_truth'] = preds['ground_truth'].apply(\n",
    "    lambda x: 'failure' if x != 'success' else 'success')\n",
    "\n",
    "le = LabelEncoder()\n",
    "y_true = le.fit_transform(preds['ground_truth'])\n",
    "y_pred = le.transform(preds['prediction'])\n",
    "\n",
    "\n",
    "def calculate_metrics(y_true, y_pred):\n",
    "    metrics = {}\n",
    "    metrics['Acc'] = accuracy_score(y_true, y_pred)\n",
    "    metrics['F1'] = f1_score(y_true, y_pred)\n",
    "    metrics['Precision'] = precision_score(y_true, y_pred)\n",
    "    metrics['Recall'] = recall_score(y_true, y_pred)\n",
    "    metrics['ROC-AUC'] = roc_auc_score(y_true, y_pred)\n",
    "    metrics['PR-AUC'] = average_precision_score(y_true, y_pred)\n",
    "    tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()\n",
    "    metrics['Specificity'] = tn / (tn + fp)\n",
    "\n",
    "    return metrics\n",
    "\n",
    "\n",
    "metrics = calculate_metrics(y_true, y_pred)\n",
    "print(metrics)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhIAAAHHCAYAAADqJrG+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxfUlEQVR4nO3de5xO9d7/8feaYa4ZY4yzmREzKCIih2wph5+JbETukg4a07kcymBjlzCqq1QoRHUXk2hrJ5IOiIRMOY50knGo7jKOGc3gMs2s3x/dc91dZmhmWcs11n4992M9Hvv6XmvW97vmsfHen893XZdhmqYpAAAAC0KCvQAAAHDhIkgAAADLCBIAAMAyggQAALCMIAEAACwjSAAAAMsIEgAAwDKCBAAAsIwgAQAALCNIAA7auXOnunbtqujoaBmGocWLF9t6/b1798owDM2ZM8fW617IOnXqpE6dOgV7GcB/DIIEXG/Xrl267777VL9+fYWHh6tSpUpq3769nn/+eZ04ccLRuZOSkrR9+3Y98cQTmjt3rlq3bu3ofOfTwIEDZRiGKlWqVOzvcefOnTIMQ4Zh6Nlnny319X/55ReNHz9eGRkZNqwWgFPKBXsBgJPef/993XTTTfJ4PLrjjjvUtGlTnTp1SuvWrdPIkSP19ddf6+WXX3Zk7hMnTig9PV2PPPKIBg8e7Mgc8fHxOnHihMqXL+/I9f9KuXLldPz4cb333nvq169fwHvz5s1TeHi4Tp48aenav/zyiyZMmKCEhAS1aNGixD+3fPlyS/MBsIYgAdfas2eP+vfvr/j4eK1atUqxsbH+9wYNGqTMzEy9//77js1/8OBBSVLlypUdm8MwDIWHhzt2/b/i8XjUvn17vfnmm0WCxPz589WjRw8tXLjwvKzl+PHjqlChgsLCws7LfAD+QGsDrjVp0iTl5OTo1VdfDQgRhS6++GI99NBD/te///67Jk6cqAYNGsjj8SghIUH//Oc/5fP5An4uISFBPXv21Lp163TllVcqPDxc9evX1+uvv+4/Z/z48YqPj5ckjRw5UoZhKCEhQdIfLYHC//5n48ePl2EYAWMrVqzQ1VdfrcqVK6tixYpq1KiR/vnPf/rfP9MeiVWrVumaa65RZGSkKleurN69e+vbb78tdr7MzEwNHDhQlStXVnR0tJKTk3X8+PEz/2JPc+utt+rDDz/U0aNH/WMbN27Uzp07deuttxY5/8iRIxoxYoSaNWumihUrqlKlSurevbu2bdvmP2f16tVq06aNJCk5OdnfIim8z06dOqlp06bavHmzOnTooAoVKvh/L6fvkUhKSlJ4eHiR++/WrZuqVKmiX375pcT3CqAoggRc67333lP9+vV11VVXlej8u+++W4899phatmypKVOmqGPHjvJ6verfv3+RczMzM3XjjTfq2muv1XPPPacqVapo4MCB+vrrryVJffv21ZQpUyRJt9xyi+bOnaupU6eWav1ff/21evbsKZ/Pp9TUVD333HO6/vrr9dlnn5315z7++GN169ZNBw4c0Pjx45WSkqL169erffv22rt3b5Hz+/Xrp99++01er1f9+vXTnDlzNGHChBKvs2/fvjIMQ++8845/bP78+br00kvVsmXLIufv3r1bixcvVs+ePTV58mSNHDlS27dvV8eOHf3/qDdu3FipqamSpHvvvVdz587V3Llz1aFDB/91Dh8+rO7du6tFixaaOnWqOnfuXOz6nn/+edWoUUNJSUnKz8+XJL300ktavny5pk2bpri4uBLfK4BimIALZWdnm5LM3r17l+j8jIwMU5J59913B4yPGDHClGSuWrXKPxYfH29KMtesWeMfO3DggOnxeMzhw4f7x/bs2WNKMp955pmAayYlJZnx8fFF1jBu3Djzz38kp0yZYkoyDx48eMZ1F84xe/Zs/1iLFi3MmjVrmocPH/aPbdu2zQwJCTHvuOOOIvPdeeedAde84YYbzGrVqp1xzj/fR2RkpGmapnnjjTeaXbp0MU3TNPPz882YmBhzwoQJxf4OTp48aebn5xe5D4/HY6ampvrHNm7cWOTeCnXs2NGUZM6aNavY9zp27BgwtmzZMlOS+fjjj5u7d+82K1asaPbp0+cv7xHAX6MiAVc6duyYJCkqKqpE53/wwQeSpJSUlIDx4cOHS1KRvRRNmjTRNddc439do0YNNWrUSLt377a85tMV7q149913VVBQUKKf2bdvnzIyMjRw4EBVrVrVP3755Zfr2muv9d/nn91///0Br6+55hodPnzY/zssiVtvvVWrV69WVlaWVq1apaysrGLbGtIf+ypCQv74qyc/P1+HDx/2t222bNlS4jk9Ho+Sk5NLdG7Xrl113333KTU1VX379lV4eLheeumlEs8F4MwIEnClSpUq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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Calculate confusion matrix\n",
    "cm = confusion_matrix(y_true, y_pred)\n",
    "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')\n",
    "plt.xlabel('Predicted')\n",
    "plt.ylabel('True')\n",
    "plt.title('Confusion Matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fpr, tpr, thresholds = roc_curve(y_true, y_pred)\n",
    "roc_auc = auc(fpr, tpr)\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(fpr, tpr, color='darkorange', lw=2,\n",
    "         label='ROC curve (area = %0.2f)' % roc_auc)\n",
    "plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')\n",
    "plt.xlim([0.0, 1.0])\n",
    "plt.ylim([0.0, 1.05])\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver Operating Characteristic')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}