agfm (version 1.30, 2005/11/12)
index
/Users/schwehr/projects/xcore/src/pmag-kds-py/agfm.py

Command line utility to process Alternating Grandient Force data... especially hysteresis loops.
 
     Copyright (C) 2005  Kurt Schwehr
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 
Modules
       
math
os
pmag_sqlhelp
sys
units

 
Classes
       
agfm

 
class agfm
    MicroMag 2900 running NewMag Windows 1995
 
  Methods defined here:
__init__(self, filename, doHystCrunch=True, doLocalHystCrunch=False, verbosity=0)
        Parse the header and the data.
 
        filename - read the data from here!
        doHystCrunch - do we crunch the data to produce Mr, Ms, etc?
        doLocalHystCrunch - use the code in this module to calculate the hysteresis values
 
        One big line of fields followined by field and value pairs
 
        e.g.
 
"Model 2900 ASCII Data File",7,-1,+2.500000E-01,+4.506305E+02,2,+0.000000E+00,+1.000000E+02,+1.000000E+04,+4.000000E+03,+0.000000E+00,0,82,164,+5.000000E-04,16,+4.833203E+01,+4.507500E+02,-8.161081E+01,+2.549891E-01,+4.703352E+01,3,"bp04-4gw-s1-063",+0.000000E+00,+0.000000E+00,+0.000000E+00,-1.000000E+03,"10/11/2005  11:02",0,0,0,0
 
+4.000500E+03,+2.925250E-04
+3.978000E+03,+2.916750E-04
+3.884500E+03,+2.867250E-04
+3.784500E+03,+2.811250E-04
...
+3.906500E+03,+2.879250E-04
+4.000500E+03,+2.933750E-04
"Model 2900 Data File ends"
getSqlInsert(self, table='hyst')
Return a SQL Insert object suitable for inserting this sample header info into a database
 
Note that this leaves out the data block
getSqlInsertStr(self, table='hyst')
Get the insert string
isStandard(self)
Return true if the comment field looks like this is a standard calibration sample
 
Know standards are ni-[24] and ???
plot(self, filename=None)
use matplotlib to make a simple graph of the data in the plot

 
Functions
       
findHystParams(data, verbosity=0)
Calculate hysteresis parameters from a flattened loop
 
data in in Oe, while output is SI.  FIX: Is it really Oe going in?
 
Pass in data = [(4000.5,5.939e-05), (3978.0,5.986e-05), ...]
 
returns Mr, Ms, Bc, hopefully Bcr in a dict
 
 
Looking at agfmcrunch, Ms is the y intercept of the unflattened data.
Is that equiv to the flattened max?
see agfmcrunch.f:linreg
 
    call linreg(nreg,x,y,slope,Ms)
    subroutine linreg(n,x,y,s,b)
 
  Mr is the y intercept
  Ms is the saturation value
  Bc is the x axis.
 
  you get bcr by:
  subract ascending/descending loops
  b at which delta m is .5 of initial value is bcr
flattenHysteresis(sampleData, distanceCounts=None, distancePercent=None, verbosity=0)
Detrend a hysteresis loop to remove the slope at high fields.
 
FIX: write a better description of what this really means
 
sampleData - agfm data (sample.data) in [ (x,y),(x,y) ... ]
distanceCounts - how many samples you want to use on each tail
distancePercent - [0..1] percent distance from the end that you want for correction
 
Mr is the y intercept
Ms is the saturation value
Bc is the x axis.
 
you get bcr by:
subract ascending/descending loops
b at which delta m is .5 of initial value is bcr
getSlope(data)
Find the slope for a series of data points
 
[(x1,y1),(x2,y2),(x3,y3),...(xn,yn)]
 
Uses a leastSquaresFit from scientific python to y = mx + b
hystcrunch(filename, adjustslope=False, verbosity=0)
Use pmag >= 1.9 fortran hystcrunch to calculate hysteresis parameters.
Requires hystcrunch in the path
 
sid,s,Ms,Mr*Ms,Bc,Bcr,Bcrn*1e-3
 
Mr*Ms is really Mr?
lineFrom2Pts(pt1, pt2)
Return slope (m) and y intercept (b) for the line that fits two points
linear(parameters, values)
printTodo()
Things that need to be done to this code:
 
FIX: Better labeling of graphs
FIX: Ability to close the hysteresis loops and center them vertically
FIX: Plot out the 1st and 2nd derivatives
FIX: Write out a nice report about the sample
rows2cols(list)
convert a big list of rows to list of columns.
 
[ [1,2], [3,4], [5,6] ] to  [ [1,3,5], [2,4,6] ]
sqlCreate(tableName='agfm')
Return an SQL CREATE string to build a table for agfm data
 
I currently have no idea what man of these fields mean
 
returns - sqlcreate object from the pmag_sqlhelp module
sqlCreateStr(tableName='agfm')
Avoids returning a sqlcreate object... returns a create string

 
Data
        ALWAYS = 0
BOMBASTIC = 4
TERSE = 1
TRACE = 2
VERBOSE = 3
VERSION = '0.11'
__author__ = 'Kurt Schwehr'
__date__ = '2005/11/12'
__version__ = '1.30'

 
Author
        Kurt Schwehr