{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analysing FORC Data\n",
"Assuming an Input as multiple csv files (with a space as separator) like the following Table: \n",
"
| $H_{ext}$ | $V_H$ |
\n",
" | units | units |
\n",
" | $H_0$ | $V_0$ |
\n",
" | $H_i$ | $V_i$ |
\n",
" | $H_N$ | $V_N$ |
\n",
"
\n",
"The unit row is being ignored by this script.\n",
"Optional a third row with the temperature is valid (need to change code in the end).\n",
"Adjust `folder` to the place where you've put your `*.dat` files.\n",
"$V_i$ will be devided by `current` to determine the resistance $R_i$.\n",
"\n",
"## File structure\n",
"The csv input files should use the following naming convention:\n",
"* Every File contains `HA=` in the name to determine the reversal Field $H_A$\n",
" * Immediately after `HA=` must be the field value followed by `.dat`\n",
"* Down Sweeps: contain the word `down_to` in the name and will be ignored\n",
"* Saturation Measurements at $H_S$ (containing only information about the saturation field value): contain the word `_sat_`\n",
"* All other files are up sweeps from $H_A$ to $H_S$\n",
"\n",
"### Example\n",
"```\n",
"Some_Ignored_Informations_down_to_HA=1.500000.dat\n",
"Some_Ignored_Informations_sat_HA=1.500000.dat\n",
"Some_Ignored_Informations_upinformation_HA=1.500000.dat\n",
"Some_Ignored_Informations_down_to_HA=0.000000.dat\n",
"Some_Ignored_Informations_sat_HA=0.000000.dat\n",
"Some_Ignored_Informations_upinformation_HA=0.000000.dat\n",
"Some_Ignored_Informations_down_to_HA=-1.500000.dat\n",
"Some_Ignored_Informations_sat_HA=-1.500000.dat\n",
"Some_Ignored_Informations_upinformation_HA=-1.500000.dat\n",
"```\n",
"\n",
"## Output\n",
"The output will be a file `output.dat` which contains a header that is readable by FORCinel and a Table like the following:\n",
"\n",
" | $\\langle H_S\\rangle$ | $\\langle R_S \\rangle$ |
\n",
" | $H_{A_1}$ | $R(H_{A_1})$ |
\n",
" | $H_S$ | $R(H_S)$ |
\n",
" | |
\n",
" | $\\langle H_S\\rangle$ | $\\langle R_S \\rangle$ |
\n",
" | $H_{A_2}$ | $R(H_{A_2})$ |
\n",
" | $H_{i}$ | $R(H_i)$ |
\n",
" | $H_S$ | $R(H_S)$ |
\n",
"
\n",
"With 2 entries for the first reversal field $H_{A_1}$ and one more entry with each following reversal field (ordered by the magnitude of the reversal fields starting at $\\max(H_{A_i})$ and ending at $\\min(H_{A_i})$)\n",
"\n",
"### Example\n",
"```\n",
"MicroMag 2900/3900 Data File (Series 0015)\n",
"First-order reversal curves\n",
"Configuration : VSM\n",
"Hardware version: 0004\n",
"Software version: 11/20/2006\n",
"Units of measure: mks\n",
"Temperature in : Kelvin\n",
"01/11/2007 15:01\n",
"bg1.11 frag c.03 taped sample forc\n",
"\n",
"Averaging time = +1.000000E-01\n",
"Hb1 = -1.000000E+03\n",
"Hb2 = +1.000000E+03\n",
"Hc1 = 0.000000E+00\n",
"Hc2 = +3.000000E+03\n",
"HCal = +1.500000E-01\n",
"HNcr = +2.000005E-03\n",
"HSat = +1.500000E-01\n",
"NCrv = 100\n",
"PauseCal = +1.000000E+00\n",
"PauseNtl = +1.000000E+00\n",
"PauseSat = +1.000000E+00\n",
"SlewRate = +1.000000E+04\n",
"Smoothing = 5\n",
"\n",
"Field range = +1.500000E-01\n",
"Moment range = +1.000000E-02\n",
"Temperature = +0.000000E+00\n",
"Orientation = +9.000001E+01\n",
"Elapsed time = +6.436355E+06\n",
"Slope corr. = N/A\n",
"Saturation = N/A\n",
"NData = 5250\n",
"\n",
"1.500000E+02,1.320206E+00\n",
"\n",
"+4.820400E+01,+1.226155E+00\n",
"+1.500000E+02,+1.320205E+00\n",
"\n",
"1.500000E+02,1.320204E+00\n",
"\n",
"+4.620800E+01,+1.221773E+00\n",
"+9.810400E+01,+1.293156E+00\n",
"+1.500000E+02,+1.320204E+00\n",
"\n",
"1.500000E+02,1.320207E+00\n",
"\n",
"+4.421200E+01,+1.217202E+00\n",
"+7.947467E+01,+1.275475E+00\n",
"+1.147373E+02,+1.304538E+00\n",
"+1.500000E+02,+1.320206E+00\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"__author__ = 'Jonathan Pieper'\n",
"__license__ = 'tbd'\n",
"__version__ = '0.1'\n",
"__status__ = \"Development\"\n",
"\n",
"import os, sys, time\n",
"from glob import glob\n",
"import pylab as plt\n",
"import numpy as np\n",
"from scipy import stats\n",
"import pandas as pd\n",
"from scipy.interpolate import interp1d \n",
"\n",
"folder = \"C:\\\\Users\\\\user\\\\Documents\\\\cubes_theta_0deg\"\n",
"header = ['H', 'V'] # Column names\n",
"current = 1 #2.5e-6\n",
"fit_data = True # Fitting gradiometry data (subtracting linear fit)\n",
"out_name = \"output.dat\""
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def get_filenames(datadir):\n",
" \"\"\"Returns all *.dat files in data directory\"\"\"\n",
" os.chdir(datadir)\n",
" return glob(\"*.dat\")\n",
"\n",
"def sort_files(filenames):\n",
" \"\"\"Sorting files by filename key HA\"\"\"\n",
" sort_dict = {}\n",
" saturation_dict = {}\n",
" for f in filenames:\n",
" if(f.find(\"HA=\") == -1 or # File must have HA=\n",
" f.find(\"down_to\") != -1): # File musn't have down_to\n",
" continue\n",
" \n",
" pos1 = f.find(\"HA=\") + 3 # Cursor Position after HA=\n",
" pos2 = f.find(\".dat\") # Cursor Position before .dat\n",
" HA = float(f[pos1:pos2]) # Number between cursor positions\n",
" \n",
" if(f.find(\"_sat_\") != -1): # Saturation for Average\n",
" saturation_dict[HA] = f\n",
" else: # Up-Sweeps\n",
" sort_dict[HA] = f\n",
"\n",
" new_filenames = []\n",
" saturation = []\n",
" for HA in sorted(sort_dict):\n",
" new_filenames.append(sort_dict[HA])\n",
" saturation.append(saturation_dict[HA])\n",
" new_filenames.reverse() # From + to -\n",
" saturation.reverse() # From + to -\n",
" \n",
" return new_filenames, saturation\n",
"\n",
"def load_file(filename):\n",
" \"\"\"Loading File into an Array\"\"\"\n",
" data = np.genfromtxt(filename, skip_footer=1, skip_header=5, delimiter='\\t')\n",
" return data\n",
"\n",
"def write(name, H, R, T, sat):\n",
" \"\"\"Writing results into file\"\"\"\n",
" len_data = len(H)\n",
" for i in range(len(H)):\n",
" len_data += i+2\n",
" num_curves = len(H)\n",
" \n",
" if not T:\n",
" Temp = 0\n",
" else:\n",
" Temp = T[0][0]\n",
"\n",
" f = open(name, 'w')\n",
" f.write('MicroMag 2900/3900 Data File (Series 0015)\\n' + \n",
"'First-order reversal curves\\n' +\n",
"'Configuration : VSM\\n' +\n",
"'Hardware version: 0004\\n' + \n",
"'Software version: 11/20/2006\\n' + \n",
"'Units of measure: mks\\n' +\n",
"'Temperature in : Kelvin\\n' +\n",
"'01/11/2007 15:01\\n' +\n",
"'bg1.11 frag c.03 taped sample forc\\n'+\n",
"'\\n'+\n",
"'Averaging time = +1.000000E-01\\n' +\n",
"'Hb1 = -1.000000E+03\\n' +\n",
"'Hb2 = +1.000000E+03\\n' +\n",
"'Hc1 = 0.000000E+00\\n' +\n",
"'Hc2 = +3.000000E+03\\n' +\n",
"'HCal = +1.500000E-01\\n' +\n",
"'HNcr = +2.000005E-03\\n' +\n",
"'HSat = +1.500000E-01\\n' +\n",
"'NCrv = %d\\n' % (num_curves) +\n",
"'PauseCal = +1.000000E+00\\n' +\n",
"'PauseNtl = +1.000000E+00\\n' +\n",
"'PauseSat = +1.000000E+00\\n' +\n",
"'SlewRate = +1.000000E+04\\n' +\n",
"'Smoothing = 5\\n' +\n",
"'\\n' +\n",
"'Field range = +1.500000E-01\\n' +\n",
"'Moment range = +1.000000E-02\\n' +\n",
"'Temperature = +%.6E\\n' % (Temp) +\n",
"'Orientation = +9.000001E+01\\n' +\n",
"'Elapsed time = +6.436355E+06\\n' +\n",
"'Slope corr. = N/A\\n' +\n",
"'Saturation = N/A\\n' +\n",
"'NData = %d\\n' % (len_data))\n",
"\n",
" fig = plt.figure()\n",
" for i in range(len(H)):\n",
" c = np.linspace(H[i][0], H[i][-1], i+2)\n",
" # c = Array between beginning and end H with i+2 values.\n",
" f1 = interp1d(H[i], R[i], kind = 'linear')\n",
" if T:\n",
" t = interp1d(H[i], T[i], kind = 'linear')\n",
" y=[]\n",
" if not T:\n",
" f.write('\\n%.6E,%.6E\\n\\n' % (H[i][-1],sat[i]))\n",
" else:\n",
" f.write('\\n%.6E,%.6E,%.6E\\n\\n' % (H[i][-1],sat[i],T[i][-1]))\n",
" for k in range(len(c)):\n",
" val = f1(c[k])\n",
" y.append(val)\n",
" if not T:\n",
" f.write('%+.6E,%+.6E\\n' % (c[k], val))\n",
" else:\n",
" f.write('%+.6E,%+.6E,%+.6E\\n' % (c[k], val, t(c[k])))\n",
"\n",
" plt.plot(c, y, linestyle=\"solid\", marker=\".\")\n",
"\n",
"# for i in range(len(H)):\n",
"# f.write(\"\\n%.5E,%.5E,%.5E\\n\\n\" % (.15, sat[i], T[i][0]))\n",
"# for j in range(len(H[i])):\n",
"# f.write(\"%.5E,%.5E,%.5E\\n\" % (H[i][j], R[i][j], T[i][j]))\n",
" f.close()\n",
" \n",
" plt.xlabel(\"$\\mu_0 H$\")\n",
" plt.ylabel(\"$R_H$\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def cut_data(data):\n",
" \"\"\"Cuts off the first and last values that are equal.\n",
" Returns Index of first and last value.\n",
" e.g.: [1,1,1,.5,0,0,0] -> (2, 4)\"\"\"\n",
" min_A = max_A = 0\n",
"\n",
" if(data[0] == data[1]):\n",
" for i in range(len(data)):\n",
" if data[i] == data[i+1]:\n",
" min_A += 1\n",
" else:\n",
" break\n",
"\n",
" if(data[-1] == data[-2]):\n",
" for i in range(len(data)-1):\n",
" if data[-(i+1)] == data[-(i+2)]:\n",
" max_A += 1\n",
" else:\n",
" break\n",
" return min_A, -max_A"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"all_files = get_filenames(folder)\n",
"all_files_sorted, saturation = sort_files(all_files)\n",
"#fig = plt.figure()\n",
"H_list = []\n",
"R_list = []\n",
"T_list = []\n",
"for f in all_files_sorted:\n",
" data = pd.read_csv(f, sep=' ', header=2, names=header, index_col=False)\n",
" H = np.array(data.H)\n",
" V = np.array(data.V)\n",
" \n",
" if fit_data:\n",
" fit_area = data[data.H < data.H.min() + 150]\n",
" fit = scipy.stats.linregress(fit_area.H, fit_area.H)\n",
" fitting_line = (data.H*fit.slope + fit.intercept)\n",
" V = V - fitting_line\n",
" \n",
" #data = filehandler.load_file(f)\n",
" #H = [data[i][H_idx] for i in np.arange(len(data))]\n",
" #V = [data[i][V_idx] for i in np.arange(len(data))]\n",
" #T = [data[i][T_idx] for i in np.arange(len(data))]\n",
"\n",
" # Cut of unneccessary data and calculate R_H\n",
" #min_H, max_H = cut_data(H)\n",
" #H = np.array(H[min_H:max_H])\n",
" #V = np.array(V[min_H:max_H])\n",
" #T = np.array(T[min_H:max_H])\n",
" R = V/current\n",
"\n",
" H_list.append(H)\n",
" R_list.append(R)\n",
" #T_list.append(T)\n",
"\n",
" #plt.plot(list(H) ,list(R))\n",
"\n",
"sat_avg = []\n",
"for sat in saturation:\n",
" sat_data = pd.read_csv(sat, sep=' ', header=2, names=header, index_col=False)\n",
" sat_V = np.array(sat_data.V)\n",
" sat_R = sat_V/current\n",
"\n",
" sat_avg.append(np.average(sat_R))\n",
"\n",
"write(out_name, H_list, R_list, T_list, sat_avg)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}