{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "16d0d565-999c-439b-b898-2ac8e038f874",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import glob\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from openpyxl import load_workbook\n",
    "import csv\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import datetime as dt\n",
    "from datetime import datetime as dt2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b568bf59-ab51-4b88-a1e8-a6be3a3954c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# paths\n",
    "v0_path = r\"C:\\Users\\Nora Greenwood\\Desktop\\CONTRASTS\\processing_albedo_data\\v0_CONTRASTS_albedo\"\n",
    "\n",
    "# make a list of things in v0_path that 1) are folders and 2) have a kipps file in them\n",
    "kipps_dirs = [subdir for subdir in os.listdir(v0_path)\n",
    "    if os.path.isdir(os.path.join(v0_path, subdir)) and\n",
    "       any(fname.startswith(\"kipps\") for fname in os.listdir(os.path.join(v0_path, subdir)))]\n",
    "             # and any(fname.endswith(\"transect\") for fname in os.listdir(os.path.join(v0_path, subdir)))]\n",
    "\n",
    "notes_path = r\"C:\\Users\\Nora Greenwood\\Desktop\\CONTRASTS\\processing_albedo_data\\v1_CONTRASTS_albedo\\albedonotes\"\n",
    "\n",
    "v3_path = r\"C:\\Users\\Nora Greenwood\\Desktop\\CONTRASTS\\processing_albedo_data\\v3_CONTRASTS_albedo\\broadband\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a71279d8-3247-453a-a3be-02dacb4887d0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# load in GPS data\n",
    "\n",
    "gps_path = r\"C:\\Users\\Nora Greenwood\\Desktop\\CONTRASTS\\processing_albedo_data\\PS149_mastertrack.tab\"\n",
    "# Read in ship track\n",
    "# data format is list of lists of strings of dateTtime, lat, lon, speed [kn], course [deg]\n",
    "gps_data = []\n",
    "with open(gps_path, newline='') as f:\n",
    "    reader = csv.reader(f, delimiter='\\t')\n",
    "    for row in reader:\n",
    "        # Skip empty lines\n",
    "        if not row:\n",
    "            continue\n",
    "        # Check if this line starts the real data\n",
    "        if row[0].startswith('2025'):\n",
    "            # Convert to numbers if appropriate\n",
    "            gps_data.append(row)\n",
    "\n",
    "gps_dt = []\n",
    "lats = []\n",
    "lons = []\n",
    "for row in gps_data:\n",
    "    date = row[0]\n",
    "    gps_dt.append(dt.datetime(int(date[0:4]),int(date[5:7]),int(date[8:10]),int(date[11:13]),int(date[14:16])))\n",
    "    lats.append(float(row[1]))\n",
    "    lons.append(float(row[2]))\n",
    "\n",
    "gps = {\"datetime\": gps_dt, \"latitude\": lats, \"longitude\": lons}\n",
    "\n",
    "# Convert to a dataframe\n",
    "gps_df = pd.DataFrame(gps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b6963fdd-7986-4319-8c1f-3670297984ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "# load in event IDs\n",
    "event_path = r\"C:\\Users\\Nora Greenwood\\Desktop\\CONTRASTS\\processing_albedo_data\\eventIDs.xlsx\"\n",
    "events = pd.read_excel(event_path,'Kipps')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "0ca0c1a1-4e82-4ebf-968e-09700431e11f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def process_kipps(site, out_path, notes_path = notes_path):\n",
    "    \"\"\"\n",
    "    Reads in albedo notes, Kipps files, and ship track data and converts them into processed formatted albedo\n",
    "\n",
    "    parameters: \n",
    "    -------\n",
    "    in_list: path\n",
    "    \"\"\"\n",
    "    files = os.listdir(v0_path + '\\\\' + site)\n",
    "\n",
    "    # maybe re-write with file names\n",
    "    for filename in files:\n",
    "        if filename.startswith(\"k\"):\n",
    "            kipps_path = os.path.join(v0_path, site, filename)\n",
    "    notes_path = os.path.join(notes_path, 'albedonotes-contrasts-'+site+'-v1.csv')\n",
    "\n",
    "\n",
    "    # read in notes and pull in position data\n",
    "    notes = pd.read_csv(notes_path,header=2)\n",
    "    # filter to just important notes columns\n",
    "    notes_info = notes.loc[:,['Position','Repetition','Snow or Pond (s/p)','S/P Depth (cm)','Notes on footprint','Trampled']]\n",
    "    notes_info = notes_info.rename(columns={'Position': 'position', 'Repetition': 'repetition', 'Snow or Pond (s/p)': 'surface type', 'S/P Depth (cm)': 'surface thickness (cm)', 'Notes on footprint': 'notes', 'Trampled': 'trampled'})\n",
    "    notes_info = notes_info.drop_duplicates()\n",
    "    # notes_info = notes_info.set_index(['position','repetition'])\n",
    "    \n",
    "    # read in Kipps, rename columns\n",
    "    kipps = pd.read_excel(kipps_path,header=2)\n",
    "    kipps = kipps.rename(columns={'Position': 'position', 'Repetition': 'repetition', 'Incoming': 'incoming (milliV)', 'Incoming (corrected)': 'incoming (W m^-2)', \n",
    "                                          'Reflected': 'reflected (milliV)', 'Reflected (corrected)': 'reflected (W m^-2)', 'Albedo (corrected)': 'albedo'})\n",
    "    # round data\n",
    "    kipps['albedo'] = kipps['albedo'].round(3)\n",
    "    kipps['incoming (W m^-2)'] = 1000*kipps['incoming (W m^-2)'].round(3)\n",
    "    kipps['reflected (W m^-2)'] = 1000*kipps['reflected (W m^-2)'].round(3)\n",
    "\n",
    "    if 'Transect' in site:\n",
    "        # add blank positions as needed\n",
    "        if 'R2_main' in site:\n",
    "            pos = pd.DataFrame({'position': range(0, 91, 5)})\n",
    "        elif 'R1_mainB' in site:\n",
    "            pos = pd.DataFrame({'position': range(0, 186, 5)})\n",
    "        elif 'R1_mainA' in site:\n",
    "            pos = pd.DataFrame({'position': range(0, 201, 5)})\n",
    "        elif 'main' in site or 'R1_opticsC' in site or 'R2_tTransect' in site or 'R3_optics' in site:\n",
    "            pos = pd.DataFrame({'position': range(0, 101, 5)})\n",
    "        elif 'raftedIce' in site:\n",
    "            pos = pd.DataFrame({'position': range(15, 101, 5)})\n",
    "        elif 'R2_optics' in site:\n",
    "            pos = pd.DataFrame({'position': range(0, 91, 5)})\n",
    "        elif 'R1_opticsB' in site:\n",
    "            pos = pd.DataFrame({'position': range(5, 66, 5)})\n",
    "        \n",
    "\n",
    "    # kipps = kipps.set_index(['position','repetition'])\n",
    "    # kipps_notes_merged = kipps.join(notes_info).reset_index()\n",
    "    # return kipps, notes_info\n",
    "\n",
    "\n",
    "    if kipps['repetition'].max() > notes_info['repetition'].max():\n",
    "        notes_info = notes_info[notes_info['repetition'] == 1]\n",
    "        notes_info = notes_info.drop('repetition',axis='columns')\n",
    "        notes_info = notes_info.drop_duplicates()\n",
    "        kipps_notes_merged = kipps.merge(notes_info,how='left',on='position')\n",
    "    else:\n",
    "        kipps_notes_merged = kipps.merge(notes_info,how='left',on=['position','repetition'])\n",
    "    \n",
    "    kipps_notes_merged = kipps_notes_merged[['position','repetition', 'surface type','surface thickness (cm)','trampled','notes','incoming (milliV)','incoming (W m^-2)','reflected (milliV)','reflected (W m^-2)','albedo']]\n",
    "\n",
    "\n",
    "    ## QC flags\n",
    "    #1. add estimate for error based on resolution of instrument\n",
    "    k_acc = 0.005 #assumed accuracy of kipps measurement \n",
    "    kipps_notes_merged['albedo error'] = ((kipps_notes_merged['reflected (milliV)']+.005)/(kipps_notes_merged['incoming (milliV)']-.005) - (kipps_notes_merged['reflected (milliV)']-.005)/(kipps_notes_merged['incoming (milliV)']+.005)).round(3)\n",
    "    \n",
    "    #2. add percent change of incident compared to before/after\n",
    "    kipps_notes_merged['incoming change (%)'] = -999.9\n",
    "    incoming_diff = kipps_notes_merged['incoming (milliV)'].diff().abs()\n",
    "    for di in range(0,len(kipps_notes_merged)-1):\n",
    "        kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
    "    kipps_notes_merged.loc[len(incoming_diff)-1, 'incoming change (%)'] = (incoming_diff[len(incoming_diff)-1]/kipps_notes_merged['incoming (milliV)'][len(incoming_diff)-1]*100).round(1)\n",
    "    kipps_notes_merged['surface thickness (cm)'] = kipps_notes_merged['surface thickness (cm)'].round(1)\n",
    "\n",
    "    \n",
    "    #read in met file again to get additional header information\n",
    "    header = pd.read_csv(notes_path,header=None, nrows=2)\n",
    "    header = header.fillna('NaN')\n",
    "    start_time = header.iloc[1,3]\n",
    "    timing = dt2.strptime(start_time, \"%H:%M:%S\").time()\n",
    "    date = dt.datetime(int(site[0:4]),int(site[4:6]),int(site[6:8])).date()\n",
    "    \n",
    "    datetime = dt.datetime.combine(date,timing)\n",
    "    idx = (gps_df['datetime'] - datetime).abs().idxmin()\n",
    "    lat = round(gps_df['latitude'][idx],5)\n",
    "    lon = round(gps_df['longitude'][idx],5)\n",
    "\n",
    "    event_id = events.loc[events['Site'] == site, 'Event IDs'].squeeze()\n",
    "    \n",
    "    \n",
    "    sky_cond = header.iloc[0,3]\n",
    "    sky_cond = sky_cond.replace(',',';')\n",
    "    print(site, sky_cond)\n",
    "    print('')\n",
    "    other = str(header.iloc[1,5])\n",
    "    other = other.replace(',',';')\n",
    "    line = header.iloc[0,1]\n",
    "    \n",
    "    #write a new csv with the header and data\n",
    "    # write the header\n",
    "\n",
    "    \n",
    "    header = 'Site, ' + line + '\\n Event ID, ' + str(event_id) + '\\n Date, '+ str(date) + '\\n Start time (UTC), '+ str(start_time) + ' \\n Sky conditions, '+ sky_cond+' \\n Other notes, ' +other+' \\n Ship latitude, '+str(lat)+'\\n Ship longitude, '+str(lon)+'\\n'\n",
    "    header = header.replace(', nan\\n',', NaN\\n')\n",
    "    newname = 'broadband-contrasts-' + site + '-v3.csv'\n",
    "    newfilename = os.path.join(out_path, newname)\n",
    "    \n",
    "    with open(newfilename, 'w') as fp:\n",
    "        fp.write(header)\n",
    "    \n",
    "    # write the rest\n",
    "    kipps_notes_merged.to_csv(newfilename, header=True,index=False, mode='a', na_rep='NaN')\n",
    "\n",
    "    print('wrote: '+newname)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f80a61ba-b99d-4005-9ee1-fab06e84e883",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "20250710-r1a-R1_mainATransect PC to SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250710-r1a-R1_mainATransect-v3.csv\n",
      "20250711-r1a-ponds-library SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250711-r1a-ponds-library-v3.csv\n",
      "20250711-r1a-R1_mainATransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250711-r1a-R1_mainATransect-v3.csv\n",
      "20250712-r1a-ponds-colocated SDV/SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250712-r1a-ponds-colocated-v3.csv\n",
      "20250712-r1a-ssl-experiment-am1 SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250712-r1a-ssl-experiment-am1-v3.csv\n",
      "20250712-r1a-ssl-experiment-pm1 SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250712-r1a-ssl-experiment-pm1-v3.csv\n",
      "20250712-r1a-ssl-experiment-pm2 SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250712-r1a-ssl-experiment-pm2-v3.csv\n",
      "20250715-r2a-R2_mainTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250715-r2a-R2_mainTransect-v3.csv\n",
      "20250715-r2a-R2_opticsTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250715-r2a-R2_opticsTransect-v3.csv\n",
      "20250715-r2a-ssl1-experiment-am1 SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250715-r2a-ssl1-experiment-am1-v3.csv\n",
      "20250715-r2a-ssl1-experiment-pm1 SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250715-r2a-ssl1-experiment-pm1-v3.csv\n",
      "20250715-r2a-ssl1-experiment-pm2 SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250715-r2a-ssl1-experiment-pm2-v3.csv\n",
      "20250716-r2a-ssl1-experiment-am1 SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250716-r2a-ssl1-experiment-am1-v3.csv\n",
      "20250716-r2a-ssl1-experiment-pm1 SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250716-r2a-ssl1-experiment-pm1-v3.csv\n",
      "20250717-r2a-ponds-library SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250717-r2a-ponds-library-v3.csv\n",
      "20250717-r2a-R2_raftedIceTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250717-r2a-R2_raftedIceTransect-v3.csv\n",
      "20250717-r2a-snow-colocated SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250717-r2a-snow-colocated-v3.csv\n",
      "20250717-r2a-ssl1-experiment-pm1 SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250717-r2a-ssl1-experiment-pm1-v3.csv\n",
      "20250717-r2a-ssl1-experiment-pm2 SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250717-r2a-ssl1-experiment-pm2-v3.csv\n",
      "20250720-r3a-R3_mainTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250720-r3a-R3_mainTransect-v3.csv\n",
      "20250720-r3a-R3_opticsTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250720-r3a-R3_opticsTransect-v3.csv\n",
      "20250721-r3a-ssl-experiment-am1 BC\n",
      "\n",
      "wrote: broadband-contrasts-20250721-r3a-ssl-experiment-am1-v3.csv\n",
      "20250721-r3a-ssl-experiment-pm1 BC\n",
      "\n",
      "wrote: broadband-contrasts-20250721-r3a-ssl-experiment-pm1-v3.csv\n",
      "20250721-r3a-ssl-experiment-pm2 BC\n",
      "\n",
      "wrote: broadband-contrasts-20250721-r3a-ssl-experiment-pm2-v3.csv\n",
      "20250722-r3a-ponds-colocated BC\n",
      "\n",
      "wrote: broadband-contrasts-20250722-r3a-ponds-colocated-v3.csv\n",
      "20250722-r3a-ponds-library BC\n",
      "\n",
      "wrote: broadband-contrasts-20250722-r3a-ponds-library-v3.csv\n",
      "20250722-r3a-ssl-experiment-pm1 SDV (pm1); BC (pm2)\n",
      "\n",
      "wrote: broadband-contrasts-20250722-r3a-ssl-experiment-pm1-v3.csv\n",
      "20250722-r3a-ssl-experiment-pm2 SDV (pm1); BC (pm2)\n",
      "\n",
      "wrote: broadband-contrasts-20250722-r3a-ssl-experiment-pm2-v3.csv\n",
      "20250726-r1b-ponds-library SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250726-r1b-ponds-library-v3.csv\n",
      "20250726-r1b-R1_mainBTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250726-r1b-R1_mainBTransect-v3.csv\n",
      "20250727-r1b-metcity-colocated SD NV; low stratus\n",
      "\n",
      "wrote: broadband-contrasts-20250727-r1b-metcity-colocated-v3.csv\n",
      "20250727-r1b-ponds-colocated SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250727-r1b-ponds-colocated-v3.csv\n",
      "20250727-r1b-ponds-library-am SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250727-r1b-ponds-library-am-v3.csv\n",
      "20250727-r1b-ponds-library-pm SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250727-r1b-ponds-library-pm-v3.csv\n",
      "20250727-r1b-R1_opticsBTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250727-r1b-R1_opticsBTransect-v3.csv\n",
      "20250728-r1b-ponds-colocated SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250728-r1b-ponds-colocated-v3.csv\n",
      "20250730-r2b-R2_opticsTransect SDNV mostly\n",
      "\n",
      "wrote: broadband-contrasts-20250730-r2b-R2_opticsTransect-v3.csv\n",
      "20250731-r2b-metcity-colocated SDV; very variable lighting\n",
      "\n",
      "wrote: broadband-contrasts-20250731-r2b-metcity-colocated-v3.csv\n",
      "20250731-r2b-ponds-colocated SDV/SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250731-r2b-ponds-colocated-v3.csv\n",
      "20250731-r2b-ponds-library SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250731-r2b-ponds-library-v3.csv\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "20250731-r2b-R2_raftedIceTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250731-r2b-R2_raftedIceTransect-v3.csv\n",
      "20250731-r2b-ssl2-experiment SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250731-r2b-ssl2-experiment-v3.csv\n",
      "20250801-r2b-R2_mainTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250801-r2b-R2_mainTransect-v3.csv\n",
      "20250801-r2b-R2_opticsTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250801-r2b-R2_opticsTransect-v3.csv\n",
      "20250801-r2b-R2_raftedIceTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250801-r2b-R2_raftedIceTransect-v3.csv\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "20250801-r2b-ssl2-experiment SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250801-r2b-ssl2-experiment-v3.csv\n",
      "20250804-r3b-ponds-colocated SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250804-r3b-ponds-colocated-v3.csv\n",
      "20250804-r3b-R3_mainTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250804-r3b-R3_mainTransect-v3.csv\n",
      "20250804-r3b-ssl-experiment SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250804-r3b-ssl-experiment-v3.csv\n",
      "20250805-r3b-ponds-colocated SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250805-r3b-ponds-colocated-v3.csv\n",
      "20250805-r3b-R3_opticsTransect-am SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250805-r3b-R3_opticsTransect-am-v3.csv\n",
      "20250805-r3b-ssl-experiment-am1 SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250805-r3b-ssl-experiment-am1-v3.csv\n",
      "20250806-r3b-metcity-colocated SDNV; fog\n",
      "\n",
      "wrote: broadband-contrasts-20250806-r3b-metcity-colocated-v3.csv\n",
      "20250806-r3b-ssl-experiment SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250806-r3b-ssl-experiment-v3.csv\n",
      "20250809-r1c-R1_mainCTransect BC\n",
      "\n",
      "wrote: broadband-contrasts-20250809-r1c-R1_mainCTransect-v3.csv\n",
      "20250810-r1c-coring-colocated SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250810-r1c-coring-colocated-v3.csv\n",
      "20250810-r1c-ponds-colocated SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250810-r1c-ponds-colocated-v3.csv\n",
      "20250810-r1c-R1_mainCTransect SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250810-r1c-R1_mainCTransect-v3.csv\n",
      "20250810-r1c-R1_opticsCTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250810-r1c-R1_opticsCTransect-v3.csv\n",
      "20250812-r2c-R2_raftedIceTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250812-r2c-R2_raftedIceTransect-v3.csv\n",
      "20250812-r2c-R2_tTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250812-r2c-R2_tTransect-v3.csv\n",
      "20250812-r2c-ssl3-experiment SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250812-r2c-ssl3-experiment-v3.csv\n",
      "20250813-r2c-coring-colocated CO-SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250813-r2c-coring-colocated-v3.csv\n",
      "20250813-r2c-ssl3-experiment-am1 SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250813-r2c-ssl3-experiment-am1-v3.csv\n",
      "20250814-r2c-ssl3-experiment-am1 SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250814-r2c-ssl3-experiment-am1-v3.csv\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "20250817-r3c-R3_mainTransect SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250817-r3c-R3_mainTransect-v3.csv\n",
      "20250817-r3c-R3_opticsTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250817-r3c-R3_opticsTransect-v3.csv\n",
      "20250823-r2d-beartracks-library SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250823-r2d-beartracks-library-v3.csv\n",
      "20250823-r2d-ponds-library SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250823-r2d-ponds-library-v3.csv\n",
      "20250823-r2d-R2_raftedIceTransect SDNV\n",
      "\n",
      "wrote: broadband-contrasts-20250823-r2d-R2_raftedIceTransect-v3.csv\n",
      "20250823-r2d-R2_tTransect SDNV/SDV\n",
      "\n",
      "wrote: broadband-contrasts-20250823-r2d-R2_tTransect-v3.csv\n",
      "20250827-r3d-R3_mainTransect BC\n",
      "\n",
      "wrote: broadband-contrasts-20250827-r3d-R3_mainTransect-v3.csv\n",
      "20250827-r3d-R3_opticsTransect BC\n",
      "\n",
      "wrote: broadband-contrasts-20250827-r3d-R3_opticsTransect-v3.csv\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n",
      "C:\\Users\\Nora Greenwood\\AppData\\Local\\Temp\\ipykernel_25084\\2353823898.py:78: RuntimeWarning: Mean of empty slice\n",
      "  kipps_notes_merged.loc[di, 'incoming change (%)'] = (np.nanmean([incoming_diff[di],incoming_diff[di+1]])/kipps_notes_merged['incoming (milliV)'][di]*100).round(1)\n"
     ]
    }
   ],
   "source": [
    "# convert data\n",
    "\n",
    "for i in range(len(kipps_dirs)):\n",
    "    try:\n",
    "        process_kipps(kipps_dirs[i], v3_path)\n",
    "    except Exception as e:\n",
    "        print('')\n",
    "        print(kipps_dirs[i])\n",
    "        print(f\"An unexpected error occurred: {e}\")\n",
    "        print('')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.14.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
