def __init__(self, WD=None, name='Main Frame', dmodel=None, title=None, contribution=None): try: version = pmag.get_version() except: version = "" if not title: title = "MagIC GUI version: %s" % version #if sys.platform in ['win32', 'win64']: # title += " Powered by Enthought Canopy" wx.Frame.__init__(self, None, wx.ID_ANY, title, name=name) # self.grid_frame = None self.panel = wx.Panel(self, size=wx.GetDisplaySize(), name='main panel') print('-I- Fetching working directory') self.WD = os.path.realpath(WD) or os.getcwd() print('-I- Initializing magic data model') if dmodel is None: dmodel = data_model3.DataModel() self.data_model = dmodel self.edited = False self.validation_mode = False print('-I- Initializing interface') self.InitUI() print('-I- Completed interface') if contribution: self.contribution = contribution elif not WD: wx.CallAfter(self.on_change_dir_button) else: wx.CallAfter(self.get_wd_data)
def __init__(self, WD=None, name='Main Frame'): try: version = pmag.get_version() except: version = "" title = "MagIC GUI version: %s" % version if sys.platform in ['win32', 'win64']: title += " Powered by Enthought Canopy" wx.Frame.__init__(self, None, wx.ID_ANY, title, name=name) # self.grid_frame = None self.panel = wx.Panel(self, size=wx.GetDisplaySize(), name='main panel') print '-I- Fetching working directory' self.WD = os.path.realpath(WD) or os.getcwd() print '-I- Initializing magic data model' #self.data_model = validate_upload.get_data_model() self.data_model = data_model3.DataModel() print '-I- Read in any available data from working directory' self.contribution = nb.Contribution(self.WD, dmodel=self.data_model) #self.er_magic = builder.ErMagicBuilder(self.WD, self.data_model) self.edited = False self.validation_mode = False print '-I- Initializing interface' self.InitUI()
def __init__(self, WD=None, name='Main Frame', dmodel=None): try: version= pmag.get_version() except: version = "" title = "MagIC GUI version: %s"%version if sys.platform in ['win32', 'win64']: title += " Powered by Enthought Canopy" wx.Frame.__init__(self, None, wx.ID_ANY, title, name=name) # self.grid_frame = None self.panel = wx.Panel(self, size=wx.GetDisplaySize(), name='main panel') print('-I- Fetching working directory') self.WD = os.path.realpath(WD) or os.getcwd() print('-I- Initializing magic data object') if dmodel is None: dmodel = validate_upload.get_data_model() self.data_model = dmodel self.er_magic = builder.ErMagicBuilder(self.WD, self.data_model) self.edited = False self.validation_mode = False # initialize magic data object # attempt to read magic_measurements.txt, and all er_* and pmag_* files print('-I- Read in any available data from working directory') self.er_magic.get_all_magic_info() # POSSIBLY RELOCATE THIS EVENTUALLY: print('-I- Initializing headers') self.er_magic.init_default_headers() self.er_magic.init_actual_headers() # print('-I- Initializing interface') self.InitUI()
def main(): """ NAME aniso_magic.py DESCRIPTION plots anisotropy data with either bootstrap or hext ellipses SYNTAX aniso_magic.py [-h] [command line options] OPTIONS -h plots help message and quits -usr USER: set the user name -f AFILE, specify rmag_anisotropy formatted file for input -F RFILE, specify rmag_results formatted file for output -x Hext [1963] and bootstrap -B DON'T do bootstrap, do Hext -par Tauxe [1998] parametric bootstrap -v plot bootstrap eigenvectors instead of ellipses -sit plot by site instead of entire file -crd [s,g,t] coordinate system, default is specimen (g=geographic, t=tilt corrected) -P don't make any plots - just make rmag_results table -sav don't make the rmag_results table - just save all the plots -fmt [svg, jpg, eps] format for output images, pdf default -gtc DEC INC dec,inc of pole to great circle [down(up) in green (cyan) -d Vi DEC INC; Vi (1,2,3) to compare to direction DEC INC -nb N; specifies the number of bootstraps - default is 1000 DEFAULTS AFILE: rmag_anisotropy.txt RFILE: rmag_results.txt plot bootstrap ellipses of Constable & Tauxe [1987] NOTES minor axis: circles major axis: triangles principal axis: squares directions are plotted on the lower hemisphere for bootstrapped eigenvector components: Xs: blue, Ys: red, Zs: black """ # dir_path = "." version_num = pmag.get_version() verbose = pmagplotlib.verbose args = sys.argv ipar, ihext, ivec, iboot, imeas, isite, iplot, vec = 0, 0, 0, 1, 1, 0, 1, 0 hpars, bpars, PDir = [], [], [] CS, crd = '-1', 's' nb = 1000 fmt = 'pdf' ResRecs = [] orlist = [] outfile, comp, Dir, gtcirc, PDir = 'rmag_results.txt', 0, [], 0, [] infile = 'rmag_anisotropy.txt' if "-h" in args: print(main.__doc__) sys.exit() if '-WD' in args: ind = args.index('-WD') dir_path = args[ind + 1] if '-nb' in args: ind = args.index('-nb') nb = int(args[ind + 1]) if '-usr' in args: ind = args.index('-usr') user = args[ind + 1] else: user = "" if '-B' in args: iboot, ihext = 0, 1 if '-par' in args: ipar = 1 if '-x' in args: ihext = 1 if '-v' in args: ivec = 1 if '-sit' in args: isite = 1 if '-P' in args: iplot = 0 if '-f' in args: ind = args.index('-f') infile = args[ind + 1] if '-F' in args: ind = args.index('-F') outfile = args[ind + 1] if '-crd' in sys.argv: ind = sys.argv.index('-crd') crd = sys.argv[ind + 1] if crd == 'g': CS = '0' if crd == 't': CS = '100' if '-fmt' in args: ind = args.index('-fmt') fmt = args[ind + 1] if '-sav' in args: plots = 1 verbose = 0 else: plots = 0 if '-gtc' in args: ind = args.index('-gtc') d, i = float(args[ind + 1]), float(args[ind + 2]) PDir.append(d) PDir.append(i) if '-d' in args: comp = 1 ind = args.index('-d') vec = int(args[ind + 1]) - 1 Dir = [float(args[ind + 2]), float(args[ind + 3])] # # set up plots # if infile[0] != '/': infile = dir_path + '/' + infile if outfile[0] != '/': outfile = dir_path + '/' + outfile ANIS = {} initcdf, inittcdf = 0, 0 ANIS['data'], ANIS['conf'] = 1, 2 if iboot == 1: ANIS['tcdf'] = 3 if iplot == 1: inittcdf = 1 pmagplotlib.plot_init(ANIS['tcdf'], 5, 5) if comp == 1 and iplot == 1: initcdf = 1 ANIS['vxcdf'], ANIS['vycdf'], ANIS['vzcdf'] = 4, 5, 6 pmagplotlib.plot_init(ANIS['vxcdf'], 5, 5) pmagplotlib.plot_init(ANIS['vycdf'], 5, 5) pmagplotlib.plot_init(ANIS['vzcdf'], 5, 5) if iplot == 1: pmagplotlib.plot_init(ANIS['conf'], 5, 5) pmagplotlib.plot_init(ANIS['data'], 5, 5) # read in the data data, ifiletype = pmag.magic_read(infile) for rec in data: # find all the orientation systems if 'anisotropy_tilt_correction' not in rec.keys(): rec['anisotropy_tilt_correction'] = '-1' if rec['anisotropy_tilt_correction'] not in orlist: orlist.append(rec['anisotropy_tilt_correction']) if CS not in orlist: if len(orlist) > 0: CS = orlist[0] else: CS = '-1' if CS == '-1': crd = 's' if CS == '0': crd = 'g' if CS == '100': crd = 't' if verbose: print("desired coordinate system not available, using available: ", crd) if isite == 1: sitelist = [] for rec in data: if rec['er_site_name'] not in sitelist: sitelist.append(rec['er_site_name']) sitelist.sort() plt = len(sitelist) else: plt = 1 k = 0 while k < plt: site = "" sdata, Ss = [], [] # list of S format data Locs, Sites, Samples, Specimens, Cits = [], [], [], [], [] if isite == 0: sdata = data else: site = sitelist[k] for rec in data: if rec['er_site_name'] == site: sdata.append(rec) anitypes = [] csrecs = pmag.get_dictitem(sdata, 'anisotropy_tilt_correction', CS, 'T') for rec in csrecs: if rec['anisotropy_type'] not in anitypes: anitypes.append(rec['anisotropy_type']) if rec['er_location_name'] not in Locs: Locs.append(rec['er_location_name']) if rec['er_site_name'] not in Sites: Sites.append(rec['er_site_name']) if rec['er_sample_name'] not in Samples: Samples.append(rec['er_sample_name']) if rec['er_specimen_name'] not in Specimens: Specimens.append(rec['er_specimen_name']) if rec['er_citation_names'] not in Cits: Cits.append(rec['er_citation_names']) s = [] s.append(float(rec["anisotropy_s1"])) s.append(float(rec["anisotropy_s2"])) s.append(float(rec["anisotropy_s3"])) s.append(float(rec["anisotropy_s4"])) s.append(float(rec["anisotropy_s5"])) s.append(float(rec["anisotropy_s6"])) if s[0] <= 1.0: Ss.append(s) # protect against crap #tau,Vdirs=pmag.doseigs(s) ResRec = {} ResRec['er_location_names'] = rec['er_location_name'] ResRec['er_citation_names'] = rec['er_citation_names'] ResRec['er_site_names'] = rec['er_site_name'] ResRec['er_sample_names'] = rec['er_sample_name'] ResRec['er_specimen_names'] = rec['er_specimen_name'] ResRec['rmag_result_name'] = rec['er_specimen_name'] + ":" + rec[ 'anisotropy_type'] ResRec["er_analyst_mail_names"] = user ResRec["tilt_correction"] = CS ResRec["anisotropy_type"] = rec['anisotropy_type'] if "anisotropy_n" not in rec.keys(): rec["anisotropy_n"] = "6" if "anisotropy_sigma" not in rec.keys(): rec["anisotropy_sigma"] = "0" fpars = pmag.dohext( int(rec["anisotropy_n"]) - 6, float(rec["anisotropy_sigma"]), s) ResRec["anisotropy_v1_dec"] = '%7.1f' % (fpars['v1_dec']) ResRec["anisotropy_v2_dec"] = '%7.1f' % (fpars['v2_dec']) ResRec["anisotropy_v3_dec"] = '%7.1f' % (fpars['v3_dec']) ResRec["anisotropy_v1_inc"] = '%7.1f' % (fpars['v1_inc']) ResRec["anisotropy_v2_inc"] = '%7.1f' % (fpars['v2_inc']) ResRec["anisotropy_v3_inc"] = '%7.1f' % (fpars['v3_inc']) ResRec["anisotropy_t1"] = '%10.8f' % (fpars['t1']) ResRec["anisotropy_t2"] = '%10.8f' % (fpars['t2']) ResRec["anisotropy_t3"] = '%10.8f' % (fpars['t3']) ResRec["anisotropy_ftest"] = '%10.3f' % (fpars['F']) ResRec["anisotropy_ftest12"] = '%10.3f' % (fpars['F12']) ResRec["anisotropy_ftest23"] = '%10.3f' % (fpars['F23']) ResRec["result_description"] = 'F_crit: ' + fpars[ 'F_crit'] + '; F12,F23_crit: ' + fpars['F12_crit'] ResRec['anisotropy_type'] = pmag.makelist(anitypes) ResRecs.append(ResRec) if len(Ss) > 1: if pmagplotlib.isServer: title = "LO:_" + ResRec[ 'er_location_names'] + '_SI:_' + site + '_SA:__SP:__CO:_' + crd else: title = ResRec['er_location_names'] if site: title += "_{}".format(site) title += '_{}'.format(crd) ResRec['er_location_names'] = pmag.makelist(Locs) bpars, hpars = pmagplotlib.plotANIS(ANIS, Ss, iboot, ihext, ivec, ipar, title, iplot, comp, vec, Dir, nb) if len(PDir) > 0: pmagplotlib.plotC(ANIS['data'], PDir, 90., 'g') pmagplotlib.plotC(ANIS['conf'], PDir, 90., 'g') if verbose and plots == 0: pmagplotlib.drawFIGS(ANIS) ResRec['er_location_names'] = pmag.makelist(Locs) if plots == 1: save(ANIS, fmt, title) ResRec = {} ResRec['er_citation_names'] = pmag.makelist(Cits) ResRec['er_location_names'] = pmag.makelist(Locs) ResRec['er_site_names'] = pmag.makelist(Sites) ResRec['er_sample_names'] = pmag.makelist(Samples) ResRec['er_specimen_names'] = pmag.makelist(Specimens) ResRec['rmag_result_name'] = pmag.makelist( Sites) + ":" + pmag.makelist(anitypes) ResRec['anisotropy_type'] = pmag.makelist(anitypes) ResRec["er_analyst_mail_names"] = user ResRec["tilt_correction"] = CS if isite == "0": ResRec[ 'result_description'] = "Study average using coordinate system: " + CS if isite == "1": ResRec[ 'result_description'] = "Site average using coordinate system: " + CS if hpars != [] and ihext == 1: HextRec = {} for key in ResRec.keys(): HextRec[key] = ResRec[key] # copy over stuff HextRec["anisotropy_v1_dec"] = '%7.1f' % (hpars["v1_dec"]) HextRec["anisotropy_v2_dec"] = '%7.1f' % (hpars["v2_dec"]) HextRec["anisotropy_v3_dec"] = '%7.1f' % (hpars["v3_dec"]) HextRec["anisotropy_v1_inc"] = '%7.1f' % (hpars["v1_inc"]) HextRec["anisotropy_v2_inc"] = '%7.1f' % (hpars["v2_inc"]) HextRec["anisotropy_v3_inc"] = '%7.1f' % (hpars["v3_inc"]) HextRec["anisotropy_t1"] = '%10.8f' % (hpars["t1"]) HextRec["anisotropy_t2"] = '%10.8f' % (hpars["t2"]) HextRec["anisotropy_t3"] = '%10.8f' % (hpars["t3"]) HextRec["anisotropy_hext_F"] = '%7.1f ' % (hpars["F"]) HextRec["anisotropy_hext_F12"] = '%7.1f ' % (hpars["F12"]) HextRec["anisotropy_hext_F23"] = '%7.1f ' % (hpars["F23"]) HextRec["anisotropy_v1_eta_semi_angle"] = '%7.1f ' % ( hpars["e12"]) HextRec["anisotropy_v1_eta_dec"] = '%7.1f ' % (hpars["v2_dec"]) HextRec["anisotropy_v1_eta_inc"] = '%7.1f ' % (hpars["v2_inc"]) HextRec["anisotropy_v1_zeta_semi_angle"] = '%7.1f ' % ( hpars["e13"]) HextRec["anisotropy_v1_zeta_dec"] = '%7.1f ' % ( hpars["v3_dec"]) HextRec["anisotropy_v1_zeta_inc"] = '%7.1f ' % ( hpars["v3_inc"]) HextRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( hpars["e12"]) HextRec["anisotropy_v2_eta_dec"] = '%7.1f ' % (hpars["v1_dec"]) HextRec["anisotropy_v2_eta_inc"] = '%7.1f ' % (hpars["v1_inc"]) HextRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( hpars["e23"]) HextRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( hpars["v3_dec"]) HextRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( hpars["v3_inc"]) HextRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( hpars["e12"]) HextRec["anisotropy_v3_eta_dec"] = '%7.1f ' % (hpars["v1_dec"]) HextRec["anisotropy_v3_eta_inc"] = '%7.1f ' % (hpars["v1_inc"]) HextRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( hpars["e23"]) HextRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( hpars["v2_dec"]) HextRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( hpars["v2_inc"]) HextRec["magic_method_codes"] = 'LP-AN:AE-H' if verbose: print("Hext Statistics: ") print( " tau_i, V_i_D, V_i_I, V_i_zeta, V_i_zeta_D, V_i_zeta_I, V_i_eta, V_i_eta_D, V_i_eta_I" ) print(HextRec["anisotropy_t1"], HextRec["anisotropy_v1_dec"], HextRec["anisotropy_v1_inc"], HextRec["anisotropy_v1_eta_semi_angle"], HextRec["anisotropy_v1_eta_dec"], HextRec["anisotropy_v1_eta_inc"], HextRec["anisotropy_v1_zeta_semi_angle"], HextRec["anisotropy_v1_zeta_dec"], HextRec["anisotropy_v1_zeta_inc"]) print(HextRec["anisotropy_t2"], HextRec["anisotropy_v2_dec"], HextRec["anisotropy_v2_inc"], HextRec["anisotropy_v2_eta_semi_angle"], HextRec["anisotropy_v2_eta_dec"], HextRec["anisotropy_v2_eta_inc"], HextRec["anisotropy_v2_zeta_semi_angle"], HextRec["anisotropy_v2_zeta_dec"], HextRec["anisotropy_v2_zeta_inc"]) print(HextRec["anisotropy_t3"], HextRec["anisotropy_v3_dec"], HextRec["anisotropy_v3_inc"], HextRec["anisotropy_v3_eta_semi_angle"], HextRec["anisotropy_v3_eta_dec"], HextRec["anisotropy_v3_eta_inc"], HextRec["anisotropy_v3_zeta_semi_angle"], HextRec["anisotropy_v3_zeta_dec"], HextRec["anisotropy_v3_zeta_inc"]) HextRec['magic_software_packages'] = version_num ResRecs.append(HextRec) if bpars != []: BootRec = {} for key in ResRec.keys(): BootRec[key] = ResRec[key] # copy over stuff BootRec["anisotropy_v1_dec"] = '%7.1f' % (bpars["v1_dec"]) BootRec["anisotropy_v2_dec"] = '%7.1f' % (bpars["v2_dec"]) BootRec["anisotropy_v3_dec"] = '%7.1f' % (bpars["v3_dec"]) BootRec["anisotropy_v1_inc"] = '%7.1f' % (bpars["v1_inc"]) BootRec["anisotropy_v2_inc"] = '%7.1f' % (bpars["v2_inc"]) BootRec["anisotropy_v3_inc"] = '%7.1f' % (bpars["v3_inc"]) BootRec["anisotropy_t1"] = '%10.8f' % (bpars["t1"]) BootRec["anisotropy_t2"] = '%10.8f' % (bpars["t2"]) BootRec["anisotropy_t3"] = '%10.8f' % (bpars["t3"]) BootRec["anisotropy_v1_eta_inc"] = '%7.1f ' % ( bpars["v1_eta_inc"]) BootRec["anisotropy_v1_eta_dec"] = '%7.1f ' % ( bpars["v1_eta_dec"]) BootRec["anisotropy_v1_eta_semi_angle"] = '%7.1f ' % ( bpars["v1_eta"]) BootRec["anisotropy_v1_zeta_inc"] = '%7.1f ' % ( bpars["v1_zeta_inc"]) BootRec["anisotropy_v1_zeta_dec"] = '%7.1f ' % ( bpars["v1_zeta_dec"]) BootRec["anisotropy_v1_zeta_semi_angle"] = '%7.1f ' % ( bpars["v1_zeta"]) BootRec["anisotropy_v2_eta_inc"] = '%7.1f ' % ( bpars["v2_eta_inc"]) BootRec["anisotropy_v2_eta_dec"] = '%7.1f ' % ( bpars["v2_eta_dec"]) BootRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( bpars["v2_eta"]) BootRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( bpars["v2_zeta_inc"]) BootRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( bpars["v2_zeta_dec"]) BootRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( bpars["v2_zeta"]) BootRec["anisotropy_v3_eta_inc"] = '%7.1f ' % ( bpars["v3_eta_inc"]) BootRec["anisotropy_v3_eta_dec"] = '%7.1f ' % ( bpars["v3_eta_dec"]) BootRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( bpars["v3_eta"]) BootRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( bpars["v3_zeta_inc"]) BootRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( bpars["v3_zeta_dec"]) BootRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( bpars["v3_zeta"]) BootRec["anisotropy_hext_F"] = '' BootRec["anisotropy_hext_F12"] = '' BootRec["anisotropy_hext_F23"] = '' BootRec[ "magic_method_codes"] = 'LP-AN:AE-H:AE-BS' # regular bootstrap if ipar == 1: BootRec[ "magic_method_codes"] = 'LP-AN:AE-H:AE-BS-P' # parametric bootstrap if verbose: print("Boostrap Statistics: ") print( " tau_i, V_i_D, V_i_I, V_i_zeta, V_i_zeta_D, V_i_zeta_I, V_i_eta, V_i_eta_D, V_i_eta_I" ) print(BootRec["anisotropy_t1"], BootRec["anisotropy_v1_dec"], BootRec["anisotropy_v1_inc"], BootRec["anisotropy_v1_eta_semi_angle"], BootRec["anisotropy_v1_eta_dec"], BootRec["anisotropy_v1_eta_inc"], BootRec["anisotropy_v1_zeta_semi_angle"], BootRec["anisotropy_v1_zeta_dec"], BootRec["anisotropy_v1_zeta_inc"]) print(BootRec["anisotropy_t2"], BootRec["anisotropy_v2_dec"], BootRec["anisotropy_v2_inc"], BootRec["anisotropy_v2_eta_semi_angle"], BootRec["anisotropy_v2_eta_dec"], BootRec["anisotropy_v2_eta_inc"], BootRec["anisotropy_v2_zeta_semi_angle"], BootRec["anisotropy_v2_zeta_dec"], BootRec["anisotropy_v2_zeta_inc"]) print(BootRec["anisotropy_t3"], BootRec["anisotropy_v3_dec"], BootRec["anisotropy_v3_inc"], BootRec["anisotropy_v3_eta_semi_angle"], BootRec["anisotropy_v3_eta_dec"], BootRec["anisotropy_v3_eta_inc"], BootRec["anisotropy_v3_zeta_semi_angle"], BootRec["anisotropy_v3_zeta_dec"], BootRec["anisotropy_v3_zeta_inc"]) BootRec['magic_software_packages'] = version_num ResRecs.append(BootRec) k += 1 goon = 1 while goon == 1 and iplot == 1 and verbose: if iboot == 1: print("compare with [d]irection ") print( " plot [g]reat circle, change [c]oord. system, change [e]llipse calculation, s[a]ve plots, [q]uit " ) if isite == 1: print(" [p]revious, [s]ite, [q]uit, <return> for next ") ans = input("") if ans == "q": sys.exit() if ans == "e": iboot, ipar, ihext, ivec = 1, 0, 0, 0 e = input("Do Hext Statistics 1/[0]: ") if e == "1": ihext = 1 e = input("Suppress bootstrap 1/[0]: ") if e == "1": iboot = 0 if iboot == 1: e = input("Parametric bootstrap 1/[0]: ") if e == "1": ipar = 1 e = input("Plot bootstrap eigenvectors: 1/[0]: ") if e == "1": ivec = 1 if iplot == 1: if inittcdf == 0: ANIS['tcdf'] = 3 pmagplotlib.plot_init(ANIS['tcdf'], 5, 5) inittcdf = 1 bpars, hpars = pmagplotlib.plotANIS( ANIS, Ss, iboot, ihext, ivec, ipar, title, iplot, comp, vec, Dir, nb) if verbose and plots == 0: pmagplotlib.drawFIGS(ANIS) if ans == "c": print("Current Coordinate system is: ") if CS == '-1': print(" Specimen") if CS == '0': print(" Geographic") if CS == '100': print(" Tilt corrected") key = input( " Enter desired coordinate system: [s]pecimen, [g]eographic, [t]ilt corrected " ) if key == 's': CS = '-1' if key == 'g': CS = '0' if key == 't': CS = '100' if CS not in orlist: if len(orlist) > 0: CS = orlist[0] else: CS = '-1' if CS == '-1': crd = 's' if CS == '0': crd = 'g' if CS == '100': crd = 't' print( "desired coordinate system not available, using available: ", crd) k -= 1 goon = 0 if ans == "": if isite == 1: goon = 0 else: print("Good bye ") sys.exit() if ans == 'd': if initcdf == 0: initcdf = 1 ANIS['vxcdf'], ANIS['vycdf'], ANIS['vzcdf'] = 4, 5, 6 pmagplotlib.plot_init(ANIS['vxcdf'], 5, 5) pmagplotlib.plot_init(ANIS['vycdf'], 5, 5) pmagplotlib.plot_init(ANIS['vzcdf'], 5, 5) Dir, comp = [], 1 print(""" Input: Vi D I to compare eigenvector Vi with direction D/I where Vi=1: principal Vi=2: major Vi=3: minor D= declination of comparison direction I= inclination of comparison direction""") con = 1 while con == 1: try: vdi = input("Vi D I: ").split() vec = int(vdi[0]) - 1 Dir = [float(vdi[1]), float(vdi[2])] con = 0 except IndexError: print(" Incorrect entry, try again ") bpars, hpars = pmagplotlib.plotANIS( ANIS, Ss, iboot, ihext, ivec, ipar, title, iplot, comp, vec, Dir, nb) Dir, comp = [], 0 if ans == 'g': con, cnt = 1, 0 while con == 1: try: print( " Input: input pole to great circle ( D I) to plot a great circle: " ) di = input(" D I: ").split() PDir.append(float(di[0])) PDir.append(float(di[1])) con = 0 except: cnt += 1 if cnt < 10: print( " enter the dec and inc of the pole on one line " ) else: print( "ummm - you are doing something wrong - i give up" ) sys.exit() pmagplotlib.plotC(ANIS['data'], PDir, 90., 'g') pmagplotlib.plotC(ANIS['conf'], PDir, 90., 'g') if verbose and plots == 0: pmagplotlib.drawFIGS(ANIS) if ans == "p": k -= 2 goon = 0 if ans == "q": k = plt goon = 0 if ans == "s": keepon = 1 site = input(" print site or part of site desired: ") while keepon == 1: try: k = sitelist.index(site) keepon = 0 except: tmplist = [] for qq in range(len(sitelist)): if site in sitelist[qq]: tmplist.append(sitelist[qq]) print(site, " not found, but this was: ") print(tmplist) site = input('Select one or try again\n ') k = sitelist.index(site) goon, ans = 0, "" if ans == "a": locs = pmag.makelist(Locs) if pmagplotlib.isServer: # use server plot naming convention title = "LO:_" + locs + '_SI:__' + '_SA:__SP:__CO:_' + crd else: # use more readable plot naming convention title = "{}_{}".format(locs, crd) save(ANIS, fmt, title) goon = 0 else: if verbose: print('skipping plot - not enough data points') k += 1 # put rmag_results stuff here if len(ResRecs) > 0: ResOut, keylist = pmag.fillkeys(ResRecs) pmag.magic_write(outfile, ResOut, 'rmag_results') if verbose: print(" Good bye ")
def main(command_line=True, **kwargs): """ NAME utrecht_magic.py DESCRIPTION converts Utrecht magnetometer data files to magic_measurements files SYNTAX utrecht_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -Fsa: specify er_samples format file for appending, default is new er_samples.txt (Not working yet) -WD: output directory for MagIC files -ncn: Site Naming Convention Site to Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2: default] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name = sample name [6] site name entered in site_name column in the orient.txt format input file -- NOT CURRENTLY SUPPORTED [7-Z] [XXX]YYY: XXX is site designation with Z characters from samples XXXYYY -spc: number of characters to remove to generate sample names from specimen names -dmy: European date format -loc LOCNAME : specify location/study name -lat latitude of samples -lon longitude of samples -A: don't average replicate measurements -mcd: [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented -dc: B PHI THETA: dc lab field (in microTesla), phi,and theta must be input as a tuple "(DC,PHI,THETA)". If not input user will be asked for values, this is advantagious if there are differing dc fields between steps or specimens. Note: this currently only works with the decimal IZZI naming convetion (XXX.0,1,2,3 where XXX is the treatment temperature and 0 is a zero field step, 1 is in field, and 2 is a pTRM check, 3 is a tail check). All other steps are hardcoded dc_field = 0. INPUT Utrecht magnetometer data file """ # initialize some stuff sample_lat = 0.0 sample_lon = 0.0 noave = 0 er_location_name = "unknown" args = sys.argv meth_code = "LP-NO" version_num = pmag.get_version() site_num = 1 mag_file = "" dir_path = '.' MagRecs = [] SpecOuts = [] SampOuts = [] SiteOuts = [] meas_file='magic_measurements.txt' spec_file='er_specimens.txt' samp_file='er_samples.txt' site_file='er_sites.txt' meth_code = "" # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path = sys.argv[ind+1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind+1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print(main.__doc__) return False if '-F' in args: ind = args.index("-F") meas_file = args[ind+1] if '-Fsp' in args: ind=args.index("-Fsp") spec_file=args[ind+1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind+1] if '-Fsi' in args: # LORI addition ind=args.index("-Fsi") site_file=args[ind+1] #try: # open(samp_file,'r') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file = args[ind+1] if "-loc" in args: ind = args.index("-loc") er_location_name = args[ind+1] if "-lat" in args: ind = args.index("-lat") site_lat = args[ind+1] if "-lon" in args: ind = args.index("-lon") site_lon = args[ind+1] if "-A" in args: noave = 1 if "-mcd" in args: ind = args.index("-mcd") meth_code = args[ind+1] #samp_con='5' if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: site_num=samp_con.split("-")[1] samp_con="4" elif "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "naming convention option [7] must be in form 7-Z where Z is an integer" else: site_num=samp_con.split("-")[1] samp_con="7" else: samp_con="1" if '-dc' in args: ind=args.index('-dc') DC_FIELD,DC_PHI,DC_THETA=list(map(float,args[ind+1].strip('( ) [ ]').split(','))) DC_FIELD *= 1e-6 yn='' GET_DC_PARAMS=False else: DC_FIELD,DC_PHI,DC_THETA=0,0,-90 if '-spc' in args: ind=args.index("-spc") specnum=-int(args[ind+1]) else: specnum = 0 if '-dmy' in args: ind=args.index("-dmy") dmy_flag=True else: dmy_flag=False if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') spec_file = kwargs.get('spec_file', 'er_specimens.txt') # specimen outfile samp_file = kwargs.get('samp_file', 'er_samples.txt') site_file = kwargs.get('site_file', 'er_sites.txt') # site outfile er_location_name = kwargs.get('location_name', '') site_lat = kwargs.get('site_lat', '') site_lon = kwargs.get('site_lon', '') #oave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") specnum = -int(kwargs.get('specnum', 0)) samp_con = kwargs.get('samp_con', '2') if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: site_num=samp_con.split("-")[1] samp_con="4" elif "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "naming convention option [7] must be in form 7-Z where Z is an integer" else: site_num=samp_con.split("-")[1] samp_con="7" DC_FIELD,DC_PHI,DC_THETA = list(map(float, kwargs.get('dc_params', (0,0,-90)))) DC_FIELD *= 1e-6 noave = kwargs.get('avg', True) dmy_flag = kwargs.get('dmy_flag', False) # format variables if not mag_file: return False, 'You must provide a Utrecht formated file' mag_file = os.path.join(input_dir_path, mag_file) meas_file = os.path.join(output_dir_path, meas_file) spec_file = os.path.join(output_dir_path, spec_file) samp_file = os.path.join(output_dir_path, samp_file) site_file = os.path.join(output_dir_path, site_file) # parse data # Open up the Utrecht file and read the header information print('mag_file in utrecht_file', mag_file) AF_or_T = mag_file.split('.')[-1] data = open(mag_file, 'r') line = data.readline() line_items = line.split(',') operator=line_items[0] operator=operator.replace("\"","") machine=line_items[1] machine=machine.replace("\"","") machine=machine.rstrip('\n') print("operator=", operator) print("machine=", machine) #read in measurement data line = data.readline() while line != "END" and line != '"END"': ErSpecRec,ErSampRec,ErSiteRec = {},{},{} line_items = line.split(',') spec_name=line_items[0] spec_name=spec_name.replace("\"","") print("spec_name=", spec_name) free_string=line_items[1] free_string=free_string.replace("\"","") print("free_string=", free_string) dec=line_items[2] print("dec=", dec) inc=line_items[3] print("inc=", inc) volume=float(line_items[4]) volume=volume * 1e-6 # enter volume in cm^3, convert to m^3 print("volume=", volume) bed_plane=line_items[5] print("bed_plane=", bed_plane) bed_tilt=line_items[6] print("bed_tilt=", bed_tilt) # Configure et er_ tables ErSpecRec['er_specimen_name'] = spec_name if specnum==0: sample_name = spec_name else: sample_name = spec_name[:specnum] ErSampRec['er_sample_name'] = sample_name ErSpecRec['er_sample_name'] = sample_name er_site_name = pmag.parse_site(sample_name,samp_con,site_num) ErSpecRec['er_site_name']=er_site_name ErSpecRec['er_location_name']=er_location_name ErSampRec['sample_azimuth'] = dec ErSampRec['sample_dip'] = str(float(inc)-90) ErSampRec['sample_bed_dip_direction'] = bed_plane ErSampRec['sample_bed_tilt'] = bed_tilt ErSiteRec['site_lat'] = site_lat ErSiteRec['site_lon'] = site_lon ErSpecRec['magic_method_codes'] = meth_code ErSampRec['er_location_name'] = er_location_name ErSiteRec['er_location_name'] = er_location_name ErSiteRec['er_site_name'] = er_site_name ErSampRec['er_site_name'] = er_site_name ErSampRec['er_citation_names'] = 'This study' SpecOuts.append(ErSpecRec) SampOuts.append(ErSampRec) SiteOuts.append(ErSiteRec) #measurement data line = data.readline() line = line.rstrip("\n") items = line.split(",") while line != '9999': print(line) step=items[0] step=step.split('.') step_value=step[0] step_type = "" if len(step) == 2: step_type=step[1] if step_type=='5': step_value = items[0] A=float(items[1]) B=float(items[2]) C=float(items[3]) # convert to MagIC coordinates Z=-A X=-B Y=C cart = np.array([X, Y, Z]).transpose() direction = pmag.cart2dir(cart).transpose() measurement_dec = direction[0] measurement_inc = direction[1] measurement_magn_moment = direction[2] * 1.0e-12 # the data are in pico-Am^2 - this converts to Am^2 measurement_magn_volume = direction[2] * 1.0e-12 / volume # data volume normalized - converted to A/m print("measurement_magn_moment=", measurement_magn_moment) print("measurement_magn_volume=", measurement_magn_volume) error = items[4] date=items[5] date=date.strip('"') if date.count("-") > 0: date=date.split("-") elif date.count("/") > 0: date=date.split("/") else: print("date format seperator cannot be identified") print(date) time=items[6] time=time.strip('"') time=time.split(":") print(time) if dmy_flag: date_time = date[1] + ":" + date[0] + ":" + date[2] + ":" + time[0] + ":" + time[1] + ":" + "0.0" else: date_time = date[0] + ":" + date[1] + ":" + date[2] + ":" + time[0] + ":" + time[1] + ":" + "0.0" print(date_time) MagRec = {} MagRec["er_analyst_mail_names"] = operator MagRec["magic_instrument_codes"] = "Utrecht_" + machine MagRec["measurement_description"] = "free string = " + free_string MagRec["measurement_date"] = date_time MagRec["er_citation_names"] = "This study" MagRec['er_location_name'] = er_location_name MagRec['er_site_name'] = er_site_name MagRec['er_sample_name'] = sample_name MagRec['magic_software_packages'] = version_num MagRec["measurement_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"] = 'g' MagRec["measurement_standard"] = 'u' MagRec["magic_experiment_name"] = er_location_name + er_site_name + spec_name MagRec["measurement_number"] = er_location_name + er_site_name + spec_name + items[0] MagRec["er_specimen_name"] = spec_name # MagRec["treatment_ac_field"] = '0' if AF_or_T.lower() == "th": MagRec["treatment_temp"] = '%8.3e' % (float(step_value)+273.) # temp in kelvin MagRec['treatment_ac_field']='0' meas_type = "LP-DIR-T:LT-T-Z" else: MagRec['treatment_temp']='273' MagRec['treatment_ac_field']='%10.3e'%(float(step_value)*1e-3) meas_type = "LP-DIR-AF:LT-AF-Z" MagRec['treatment_dc_field']='0' if step_value == '0': meas_type = "LT-NO" print("step_type=", step_type) if step_type == '0' and AF_or_T.lower() == 'th': if meas_type == "": meas_type = "LT-T-Z" else: meas_type = meas_type + ":" + "LT-T-Z" elif step_type == '1': if meas_type == "": meas_type = "LT-T-I" else: meas_type = meas_type + ":" + "LT-T-I" MagRec['treatment_dc_field']='%1.2e'%DC_FIELD elif step_type == '2': if meas_type == "": meas_type = "LT-PTRM-I" else: meas_type = meas_type + ":" + "LT-PTRM-I" MagRec['treatment_dc_field']='%1.2e'%DC_FIELD elif step_type == '3': if meas_type == "" : meas_type = "LT-PTRM-Z" else: meas_type = meas_type + ":" + "LT-PTRM-Z" print("meas_type=", meas_type) MagRec['treatment_dc_field_phi'] = '%1.2f'%DC_PHI MagRec['treatment_dc_field_theta'] = '%1.2f'%DC_THETA MagRec['magic_method_codes'] = meas_type MagRec["measurement_magn_moment"] = measurement_magn_moment MagRec["measurement_magn_volume"] = measurement_magn_volume MagRec["measurement_dec"] = measurement_dec MagRec["measurement_inc"] = measurement_inc MagRec['measurement_csd'] = error # MagRec['measurement_positions'] = '1' MagRecs.append(MagRec) line = data.readline() line = line.rstrip("\n") items = line.split(",") line = data.readline() line = line.rstrip("\n") items = line.split(",") # write out the data to MagIC data files pmag.magic_write(spec_file, SpecOuts, 'er_specimens') pmag.magic_write(samp_file, SampOuts, 'er_samples') pmag.magic_write(site_file, SiteOuts, 'er_sites') # MagOuts = pmag.measurements_methods(MagRecs, noave) # pmag.magic_write(meas_file, MagOuts, 'magic_measurements') pmag.magic_write(meas_file, MagRecs, 'magic_measurements') print("results put in ", meas_file) print("exit!") return True, meas_file
def main(command_line=True, **kwargs): """ NAME ldeo_magic.py DESCRIPTION converts LDEO format files to magic_measurements format files SYNTAX ldeo_magic.py [command line options] OPTIONS -h: prints the help message and quits. -usr USER: identify user, default is "" -f FILE: specify .ldeo format input file, required -F FILE: specify output file, default is magic_measurements.txt -Fsy: specify er_synthetics file, default is er_sythetics.txt -LP [colon delimited list of protocols, include all that apply] AF: af demag T: thermal including thellier but not trm acquisition S: Shaw method I: IRM (acquisition) N: NRM only TRM: trm acquisition ANI: anisotropy experiment D: double AF demag G: triple AF demag (GRM protocol) -V [1,2,3] units of IRM field in volts using ASC coil #1,2 or 3 -spc NUM : specify number of characters to designate a specimen, default = 0 -loc LOCNAME : specify location/study name, must have either LOCNAME or SAMPFILE or be a synthetic -syn INST TYPE: sets these specimens as synthetics created at institution INST and of type TYPE -ins INST : specify which demag instrument was used (e.g, SIO-Suzy or SIO-Odette),default is "" -dc B PHI THETA: dc lab field (in micro tesla) and phi,theta, default is none NB: use PHI, THETA = -1 -1 to signal that it changes, i.e. in anisotropy experiment -ac B : peak AF field (in mT) for ARM acquisition, default is none -ARM_dc # default value is 50e-6 -ARM_temp # default is 600c -ncn NCON: specify naming convention: default is #1 below -A: don't average replicate measurements Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. [8] synthetic - has no site name INPUT Best to put separate experiments (all AF, thermal, thellier, trm aquisition, Shaw, etc.) in seperate .mag files (eg. af.mag, thermal.mag, etc.) Format of LDEO files: isaf2.fix LAT: .00 LON: .00 ID TREAT I CD J CDECL CINCL GDECL GINCL BDECL BINCL SUSC M/V ________________________________________________________________________________ is031c2 .0 SD 0 461.600 163.9 17.5 337.1 74.5 319.1 74.4 .0 .0 ID: specimen name TREAT: treatment step I: Instrument CD: Circular standard devation J: intensity. assumed to be total moment in 10^-4 (emu) CDECL: Declination in specimen coordinate system CINCL: Declination in specimen coordinate system GDECL: Declination in geographic coordinate system GINCL: Declination in geographic coordinate system BDECL: Declination in bedding adjusted coordinate system BINCL: Declination in bedding adjusted coordinate system SUSC: magnetic susceptibility (in micro SI)a M/V: mass or volume for nomalizing (0 won't normalize) """ # initialize some stuff noave=0 codelist = '' methcode,inst="LP-NO","" phi,theta,peakfield,labfield=0,0,0,0 pTRM,MD,samp_con,Z=0,0,'1',1 dec=[315,225,180,135,45,90,270,270,270,90,180,180,0,0,0] inc=[0,0,0,0,0,-45,-45,0,45,45,45,-45,-90,-45,45] tdec=[0,90,0,180,270,0,0,90,0] tinc=[0,0,90,0,0,-90,0,0,90] missing=1 demag="N" er_location_name="" citation='This study' args=sys.argv fmt='old' syn=0 synfile='er_synthetics.txt' magfile = '' trm=0 irm=0 specnum=0 coil="" arm_labfield = 50e-6 trm_peakT = 600+273 # # get command line arguments # meas_file="magic_measurements.txt" user="" if command_line: if "-h" in args: print main.__doc__ return False if "-usr" in args: ind=args.index("-usr") user=args[ind+1] if '-F' in args: ind=args.index("-F") meas_file=args[ind+1] if '-Fsy' in args: ind=args.index("-Fsy") synfile=args[ind+1] if '-f' in args: ind=args.index("-f") magfile=args[ind+1] if "-dc" in args: ind=args.index("-dc") labfield=float(args[ind+1])*1e-6 phi=float(args[ind+2]) theta=float(args[ind+3]) if "-ac" in args: ind=args.index("-ac") peakfield=float(args[ind+1])*1e-3 if "-spc" in args: ind=args.index("-spc") specnum=int(args[ind+1]) if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if '-syn' in args: syn=1 ind=args.index("-syn") institution=args[ind+1] syntype=args[ind+2] if '-fsy' in args: ind=args.index("-fsy") synfile=args[ind+1] if "-ins" in args: ind=args.index("-ins") inst=args[ind+1] if "-A" in args: noave=1 if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if '-LP' in args: ind=args.index("-LP") codelist=args[ind+1] if "-V" in args: ind=args.index("-V") coil=args[ind+1] if '-ARM_dc' in args: ind = args.index("-ARM_dc") arm_labfield = args[ind+1] if '-ARM_temp' in args: ind = args.index('-ARM_temp') trm_peakT = args[ind+1] if not command_line: user = kwargs.get('user', '') meas_file = kwargs.get('meas_file', 'magic_measurements.txt') synfile = kwargs.get('synfile', 'er_synthetics.txt') # rm samp_file = kwargs.get('samp_file', '') magfile = kwargs.get('magfile', '') labfield = int(kwargs.get('labfield', 0)) *1e-6 phi = int(kwargs.get('phi', 0)) theta = int(kwargs.get('theta', 0)) peakfield = int(kwargs.get('peakfield', 0))*1e-3 specnum = int(kwargs.get('specnum', 0)) er_location_name = kwargs.get('er_location_name', '') # rm samp_infile = kwargs.get('samp_infile', '') syn = kwargs.get('syn', 0) institution = kwargs.get('institution', '') syntype = kwargs.get('syntype', '') inst = kwargs.get('inst', '') noave = kwargs.get('noave', 0) # 0 means "do average", is default samp_con = kwargs.get('samp_con', '1') codelist = kwargs.get('codelist', '') coil = kwargs.get('coil', '') arm_labfield = kwargs.get('arm_labfield', 50e-6) trm_peakT = kwargs.get('trm_peakT', 600+273) # format/organize variables if magfile: try: input=open(magfile,'rU') except: print "bad mag file name" return False, "bad mag file name" else: print "mag_file field is required option" print main.__doc__ return False, "mag_file field is required option" if specnum!=0:specnum=-specnum if "4" in samp_con: if "-" not in samp_con: print "naming convention option [4] must be in form 4-Z where Z is an integer" return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="4" if "7" in samp_con: if "-" not in samp_con: print "naming convention option [7] must be in form 7-Z where Z is an integer" return False, "naming convention option [7] must be in form 7-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="4" codes=codelist.split(':') if "AF" in codes: demag='AF' if not labfield: methcode="LT-AF-Z" if labfield: methcode="LT-AF-I" if "T" in codes: demag="T" if not labfield: methcode="LT-T-Z" if labfield: methcode="LT-T-I" if "I" in codes: methcode="LP-IRM" irmunits="mT" if "S" in codes: demag="S" methcode="LP-PI-TRM:LP-PI-ALT-AFARM" trm_labfield=labfield # should use arm_labfield and trm_peakT as well, but these values are currently never asked for if "G" in codes: methcode="LT-AF-G" if "D" in codes: methcode="LT-AF-D" if "TRM" in codes: demag="T" trm=1 if coil: methcode="LP-IRM" irmunits="V" if coil not in ["1","2","3"]: print main.__doc__ print 'not a valid coil specification' return False, 'not a valid coil specification' if demag=="T" and "ANI" in codes: methcode="LP-AN-TRM" if demag=="AF" and "ANI" in codes: methcode="LP-AN-ARM" if labfield==0: labfield=50e-6 if peakfield==0: peakfield=.180 SynRecs,MagRecs=[],[] version_num=pmag.get_version() if 1: # ldeo file format # # find start of data: # DIspec=[] Data,k=input.readlines(),0 for k in range(len(Data)): rec=Data[k].split() if rec[0][0]=="_" or rec[0][0:2]=="!_": break start=k+1 for k in range(start,len(Data)): rec=Data[k].split() if len(rec)>0: MagRec={} MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["treatment_ac_field"]='0' MagRec["treatment_dc_field"]='0' MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' meas_type="LT-NO" MagRec["measurement_flag"]='g' MagRec["measurement_standard"]='u' MagRec["measurement_number"]='1' MagRec["er_specimen_name"]=rec[0] if specnum!=0: MagRec["er_sample_name"]=rec[0][:specnum] else: MagRec["er_sample_name"]=rec[0] site=pmag.parse_site(MagRec['er_sample_name'],samp_con,Z) MagRec["er_site_name"]=site MagRec["er_location_name"]=er_location_name MagRec["measurement_csd"]=rec[3] MagRec["measurement_magn_moment"]='%10.3e'% (float(rec[4])*1e-7) # moment in Am^2 (from 10^-4 emu) # #if samp_file!="" and MagRec["er_sample_name"] not in Samps: # create er_samples.txt file with these data # cdec,cinc=float(rec[5]),float(rec[6]) # gdec,ginc=float(rec[7]),float(rec[8]) # az,pl=pmag.get_azpl(cdec,cinc,gdec,ginc) # bdec,binc=float(rec[9]),float(rec[10]) # if rec[7]!=rec[9] and rec[6]!=rec[8]: # dipdir,dip=pmag.get_tilt(gdec,ginc,bdec,binc) # else: # dipdir,dip=0,0 # ErSampRec={} # ErSampRec['er_location_name']=MagRec['er_location_name'] # ErSampRec['er_sample_name']=MagRec['er_sample_name'] # ErSampRec['er_site_name']=MagRec['er_site_name'] # ErSampRec['sample_azimuth']='%7.1f'%(az) # ErSampRec['sample_dip']='%7.1f'%(pl) # ErSampRec['sample_bed_dip_direction']='%7.1f'%(dipdir) # ErSampRec['sample_bed_dip']='%7.1f'%(dip) # ErSampRec['sample_description']='az,pl,dip_dir and dip recalculated from [c,g,b][dec,inc] in ldeo file' # ErSampRec['magic_method_codes']='SO-REC' # ErSamps.append(ErSampRec) # Samps.append(ErSampRec['er_sample_name']) MagRec["measurement_dec"]=rec[5] MagRec["measurement_inc"]=rec[6] MagRec["measurement_chi"]='%10.3e'%(float(rec[11])*1e-5)#convert to SI (assume Bartington, 10-5 SI) #MagRec["magic_instrument_codes"]=rec[2] #MagRec["er_analyst_mail_names"]="" MagRec["er_citation_names"]="This study" MagRec["magic_method_codes"]=meas_type if demag=="AF": if methcode != "LP-AN-ARM": MagRec["treatment_ac_field"]='%8.3e' %(float(rec[1])*1e-3) # peak field in tesla meas_type="LT-AF-Z" MagRec["treatment_dc_field"]='0' else: # AARM experiment if treat[1][0]=='0': meas_type="LT-AF-Z" MagRec["treatment_ac_field"]='%8.3e' %(peakfield) # peak field in tesla else: meas_type="LT-AF-I" ipos=int(treat[0])-1 MagRec["treatment_dc_field_phi"]='%7.1f' %(dec[ipos]) MagRec["treatment_dc_field_theta"]='%7.1f'% (inc[ipos]) MagRec["treatment_dc_field"]='%8.3e'%(labfield) MagRec["treatment_ac_field"]='%8.3e' %(peakfield) # peak field in tesla elif demag=="T": if rec[1][0]==".":rec[1]="0"+rec[1] treat=rec[1].split('.') if len(treat)==1:treat.append('0') MagRec["treatment_temp"]='%8.3e' % (float(rec[1])+273.) # temp in kelvin meas_type="LT-T-Z" MagRec["treatment_temp"]='%8.3e' % (float(treat[0])+273.) # temp in kelvin if trm==0: # demag=T and not trmaq if treat[1][0]=='0': meas_type="LT-T-Z" else: MagRec["treatment_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"]='%7.1f' % (phi) # labfield phi MagRec["treatment_dc_field_theta"]='%7.1f' % (theta) # labfield theta if treat[1][0]=='1':meas_type="LT-T-I" # in-field thermal step if treat[1][0]=='2': meas_type="LT-PTRM-I" # pTRM check pTRM=1 if treat[1][0]=='3': MagRec["treatment_dc_field"]='0' # this is a zero field step meas_type="LT-PTRM-MD" # pTRM tail check else: meas_type="LT-T-I" # trm acquisition experiment MagRec['magic_method_codes']=meas_type MagRecs.append(MagRec) MagOuts=pmag.measurements_methods(MagRecs,noave) pmag.magic_write(meas_file,MagOuts,'magic_measurements') print "results put in ",meas_file if len(SynRecs)>0: pmag.magic_write(synfile,SynRecs,'er_synthetics') print "synthetics put in ",synfile return True, meas_file
def main(command_line=True, **kwargs): """ NAME jr6_txt_magic.py DESCRIPTION converts JR6 .txt format files to magic_measurements format files SYNTAX jr6_txt_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -Fsa: specify er_samples format file for appending, default is new er_samples.txt (Not working yet) -spc NUM : specify number of characters to designate a specimen, default = 1 -loc LOCNAME : specify location/study name -A: don't average replicate measurements -ncn NCON: specify sample naming convention (6 and 7 not yet implemented) -mcd [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented -v NUM : specify the volume of the sample, default 2.5cm^3. Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. INPUT JR6 .txt format file """ # initialize some stuff noave=0 volume = 2.5 * 1e-6 # default volume is 2.5 cm^3 (2.5 * 1e-6 meters^3) inst="" samp_con,Z='1',"" missing=1 demag="N" er_location_name="unknown" citation='This study' args=sys.argv meth_code="LP-NO" specnum=-1 MagRecs=[] version_num=pmag.get_version() Samps=[] # keeps track of sample orientations user="" mag_file="" dir_path='.' ErSamps=[] SampOuts=[] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path=sys.argv[ind+1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind+1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print(main.__doc__) return False if '-F' in args: ind=args.index("-F") meas_file = args[ind+1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind+1] #try: # open(samp_file,'r') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file= args[ind+1] if "-spc" in args: ind = args.index("-spc") specnum = int(args[ind+1]) if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-A" in args: noave=1 if "-mcd" in args: ind=args.index("-mcd") meth_code=args[ind+1] if "-v" in args: ind=args.index("-v") volume=float(args[ind+1]) * 1e-6 if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') samp_file = kwargs.get('samp_file', 'er_samples.txt') specnum = kwargs.get('specnum', 1) samp_con = kwargs.get('samp_con', '1') er_location_name = kwargs.get('er_location_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") volume = float(kwargs.get('volume', 0)) if not volume: volume = 2.5 * 1e-6 #default volume is a 2.5 cm cube, translated to meters cubed else: #convert cm^3 to m^3 volume *= 1e-6 # format variables mag_file = input_dir_path+"/" + mag_file meas_file = output_dir_path+"/" + meas_file samp_file = output_dir_path+"/" + samp_file if specnum!=0: specnum=-specnum if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") return False, "option [4] must be in form 4-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="4" if "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "option [7] must be in form 7-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="7" ErSampRec,ErSiteRec={},{} # parse data data=open(mag_file,'r') line=data.readline() line=data.readline() line=data.readline() while line !='': parsedLine=line.split() sampleName=parsedLine[0] demagLevel=parsedLine[2] date=parsedLine[3] line=data.readline() line=data.readline() line=data.readline() line=data.readline() parsedLine=line.split() specimenAngleDec=parsedLine[1] specimenAngleInc=parsedLine[2] while parsedLine[0] != 'MEAN' : line=data.readline() parsedLine=line.split() if len(parsedLine) == 0: parsedLine=["Hello"] Mx=parsedLine[1] My=parsedLine[2] Mz=parsedLine[3] line=data.readline() line=data.readline() parsedLine=line.split() splitExp = parsedLine[2].split('A') intensityVolStr=parsedLine[1] + splitExp[0] intensityVol = float(intensityVolStr) # check and see if Prec is too big and messes with the parcing. precisionStr='' if len(parsedLine) == 6: #normal line precisionStr=parsedLine[5][0:-1] else: precisionStr=parsedLine[4][0:-1] precisionPer = float(precisionStr) precision=intensityVol*precisionPer/100 while parsedLine[0] != 'SPEC.' : line=data.readline() parsedLine=line.split() if len(parsedLine) == 0: parsedLine=["Hello"] specimenDec=parsedLine[2] specimenInc=parsedLine[3] line=data.readline() line=data.readline() parsedLine=line.split() geographicDec=parsedLine[1] geographicInc=parsedLine[2] # Add data to various MagIC data tables. er_specimen_name = sampleName if specnum!=0: er_sample_name=er_specimen_name[:specnum] else: er_sample_name=er_specimen_name if int(samp_con) in [1, 2, 3, 4, 5, 7]: er_site_name=pmag.parse_site(er_sample_name,samp_con,Z) else: print("-W- Using unreognized sample convention option: ", samp_con) # else: # if 'er_site_name' in ErSampRec.keys():er_site_name=ErSampRec['er_site_name'] # if 'er_location_name' in ErSampRec.keys():er_location_name=ErSampRec['er_location_name'] # check sample list(SampOuts) to see if sample already exists in list before adding new sample info sampleFlag=0 for sampRec in SampOuts: if sampRec['er_sample_name'] == er_sample_name: sampleFlag=1 break if sampleFlag == 0: ErSampRec['er_sample_name']=er_sample_name ErSampRec['sample_azimuth']=specimenAngleDec sample_dip=str(float(specimenAngleInc)-90.0) #convert to magic orientation ErSampRec['sample_dip']=sample_dip ErSampRec['magic_method_codes']=meth_code ErSampRec['er_location_name']=er_location_name ErSampRec['er_site_name']=er_site_name ErSampRec['er_citation_names']='This study' SampOuts.append(ErSampRec.copy()) MagRec={} MagRec['measurement_description']='Date: '+date MagRec["er_citation_names"]="This study" MagRec['er_location_name']=er_location_name MagRec['er_site_name']=er_site_name MagRec['er_sample_name']=er_sample_name MagRec['magic_software_packages']=version_num MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"]='g' MagRec["measurement_standard"]='u' MagRec["measurement_number"]='1' MagRec["er_specimen_name"]=er_specimen_name MagRec["treatment_ac_field"]='0' if demagLevel == 'NRM': meas_type="LT-NO" elif demagLevel[0] == 'A': meas_type="LT-AF-Z" treat=float(demagLevel[1:]) MagRec["treatment_ac_field"]='%8.3e' %(treat*1e-3) # convert from mT to tesla elif demagLevel[0] == 'T': meas_type="LT-T-Z" treat=float(demagLevel[1:]) MagRec["treatment_temp"]='%8.3e' % (treat+273.) # temp in kelvin else: print("measurement type unknown", demag_level) return False, "measurement type unknown" MagRec["measurement_magn_moment"]=str(intensityVol*volume) # Am^2 MagRec["measurement_magn_volume"]=intensityVolStr # A/m MagRec["measurement_dec"]=specimenDec MagRec["measurement_inc"]=specimenInc MagRec['magic_method_codes']=meas_type MagRecs.append(MagRec.copy()) #read lines till end of record line=data.readline() line=data.readline() line=data.readline() line=data.readline() line=data.readline() # read all the rest of the special characters. Some data files not consistantly formatted. while (len(line) <=3 and line!=''): line=data.readline() #end of data while loop MagOuts=pmag.measurements_methods(MagRecs,noave) pmag.magic_write(samp_file,SampOuts,'er_samples') print("sample orientations put in ",samp_file) pmag.magic_write(meas_file,MagOuts,'magic_measurements') print("results put in ",meas_file) return True, meas_file
class MagMainFrame(wx.Frame): """""" try: version = pmag.get_version() except: version = "" title = "Pmag GUI version: %s" % version def __init__(self, WD=None, DM=None, dmodel=None): """ Input working directory, data model number (2.5 or 3), and data model (optional). """ wx.Frame.__init__(self, None, wx.ID_ANY, self.title, name='pmag_gui mainframe') #set icon self.icon = wx.Icon() icon_path = os.path.join(PMAGPY_DIRECTORY, 'programs', 'images', 'PmagPy.ico') if os.path.isfile(icon_path): self.icon.CopyFromBitmap(wx.Bitmap(icon_path, wx.BITMAP_TYPE_ANY)) self.SetIcon(self.icon) else: print("-I- PmagPy icon file not found -- skipping") # if DM was provided: if DM: self.data_model_num = int(float(DM)) # try to get DM from command line args if not DM: self.data_model_num = int(float(pmag.get_named_arg("-DM", 0))) DM = self.data_model_num # if WD was provided: if WD: self.WD = WD else: WD = pmag.get_named_arg("-WD", '') self.WD = WD self.WD = os.path.realpath(self.WD) self.data_model = dmodel self.FIRST_RUN = True self.panel = wx.Panel(self, name='pmag_gui main panel') self.InitUI() if WD and DM: self.set_dm(self.data_model_num) if WD: self.dir_path.SetValue(self.WD) # for use as module: self.resource_dir = os.getcwd() # set some things self.HtmlIsOpen = False self.Bind(wx.EVT_CLOSE, self.on_menu_exit) # if not specified on the command line, # make the user choose data model num (2 or 3) # and working directory wx.CallAfter(self.get_dm_and_wd, DM, WD) # if specified directory doesn't exist, try to make it try: if not os.path.exists(self.WD): os.mkdir(self.WD) pw.simple_warning("New directory: {}\nwill be created".format( self.WD)) except FileNotFoundError: pw.simple_warning( "You have provided a directory that does not exist and cannot be created.\n Please pick a different directory." ) print( "-W- You have provided a directory that does not exist and cannot be created.\n Please pick a different directory." ) def get_dm_and_wd(self, DM=None, WD=None): """ If DM and/or WD are missing, call user-input dialogs to ascertain that information. Parameters ---------- self DM : int number of data model to use (2 or 3), default None WD : str name of working directory, default None """ if DM: self.set_dm(DM) if not DM: self.get_dm_num() if not WD: self.get_dir() return if self.data_model_num == 2: self.get_wd_data2() else: self.get_wd_data() def get_dm_num(self): """ Show dialog to get user input for which data model to use, 2 or 3. Set self.data_model_num, and create 3.0 contribution or 2.5 ErMagicBuilder as needed Called by self.get_dm_and_wd """ ui_dialog = demag_dialogs.user_input( self, ['data_model'], parse_funcs=[float], heading= "Please input prefered data model (2.5,3.0). Note: 2.5 is for legacy projects only, if you have new data OR if you want to upgrade your old data, please use 3.0.", values=[3]) # figure out where to put this res = ui_dialog.ShowModal() vals = ui_dialog.get_values() self.data_model_num = int(vals[1]['data_model']) # if self.data_model_num not in (2, 3): pw.simple_warning( "Input data model not recognized, defaulting to 3") self.data_model_num = 3 self.set_dm(self.data_model_num) def set_dm(self, num): """ Make GUI changes based on data model num. Get info from WD in appropriate format. Called by self.get_dm_and_wd """ #enable or disable self.btn1a if self.data_model_num == 3: self.btn1a.Enable() else: self.btn1a.Disable() # # set pmag_gui_dialogs global pmag_gui_dialogs if self.data_model_num == 2: pmag_gui_dialogs = pgd2 #wx.CallAfter(self.get_wd_data2) elif self.data_model_num == 3: pmag_gui_dialogs = pgd3 #wx.CallAfter(self.get_wd_data) # do / re-do menubar menubar = pmag_gui_menu.MagICMenu(self, data_model_num=self.data_model_num) self.SetMenuBar(menubar) def get_wd_data(self): """ Show dialog to get user input for which directory to set as working directory. Called by self.get_dm_and_wd """ wait = wx.BusyInfo( 'Reading in data from current working directory, please wait...') #wx.Yield() print('-I- Read in any available data from working directory') self.contribution = cb.Contribution(self.WD, dmodel=self.data_model) del wait def get_wd_data2(self): """ Get 2.5 data from self.WD and put it into ErMagicBuilder object. Called by get_dm_and_wd """ wait = wx.BusyInfo( 'Reading in data from current working directory, please wait...') #wx.Yield() print( '-I- Read in any available data from working directory (data model 2)' ) self.er_magic = builder.ErMagicBuilder(self.WD, data_model=self.data_model) del wait def InitUI(self): """ Build the mainframe """ menubar = pmag_gui_menu.MagICMenu(self, data_model_num=self.data_model_num) self.SetMenuBar(menubar) #pnl = self.panel #---sizer logo ---- #start_image = wx.Image("/Users/ronshaar/PmagPy/images/logo2.png") #start_image = wx.Image("/Users/Python/simple_examples/001.png") #start_image.Rescale(start_image.GetWidth(), start_image.GetHeight()) #image = wx.BitmapFromImage(start_image) #self.logo = wx.StaticBitmap(self.panel, -1, image) #---sizer 0 ---- bSizer0 = wx.StaticBoxSizer( wx.StaticBox(self.panel, wx.ID_ANY, "Choose MagIC project directory"), wx.HORIZONTAL) self.dir_path = wx.TextCtrl(self.panel, id=-1, size=(600, 25), style=wx.TE_READONLY) self.change_dir_button = buttons.GenButton(self.panel, id=-1, label="change directory", size=(-1, -1)) self.change_dir_button.SetBackgroundColour("#F8F8FF") self.change_dir_button.InitColours() self.Bind(wx.EVT_BUTTON, self.on_change_dir_button, self.change_dir_button) bSizer0.Add(self.change_dir_button, wx.ALIGN_LEFT) bSizer0.AddSpacer(40) bSizer0.Add(self.dir_path, wx.ALIGN_CENTER_VERTICAL) # not fully implemented method for saving/reverting WD # last saved: [] #bSizer0_1 = wx.StaticBoxSizer( wx.StaticBox( self.panel, wx.ID_ANY, "Save MagIC project directory in current state or revert to last-saved state" ), wx.HORIZONTAL ) #saved_label = wx.StaticText(self.panel, -1, "Last saved:", (20, 120)) #self.last_saved_time = wx.TextCtrl(self.panel, id=-1, size=(100,25), style=wx.TE_READONLY) #now = datetime.datetime.now() #now_string = "{}:{}:{}".format(now.hour, now.minute, now.second) #self.last_saved_time.write(now_string) #self.save_dir_button = buttons.GenButton(self.panel, id=-1, label = "save dir", size=(-1, -1)) #self.revert_dir_button = buttons.GenButton(self.panel, id=-1, label = "revert dir", size=(-1, -1)) #self.Bind(wx.EVT_BUTTON, self.on_revert_dir_button, self.revert_dir_button) #self.Bind(wx.EVT_BUTTON, self.on_save_dir_button, self.save_dir_button) #bSizer0_1.Add(saved_label, flag=wx.RIGHT, border=10) #bSizer0_1.Add(self.last_saved_time, flag=wx.RIGHT, border=10) #bSizer0_1.Add(self.save_dir_button,flag=wx.ALIGN_LEFT|wx.RIGHT, border=10) #bSizer0_1.Add(self.revert_dir_button,wx.ALIGN_LEFT) # #---sizer 1 ---- bSizer1 = wx.StaticBoxSizer( wx.StaticBox(self.panel, wx.ID_ANY, "Import data to working directory"), wx.HORIZONTAL) text = "1. Convert magnetometer files to MagIC format" self.btn1 = buttons.GenButton(self.panel, id=-1, label=text, size=(450, 50), name='step 1') self.btn1.SetBackgroundColour("#FDC68A") self.btn1.InitColours() self.Bind(wx.EVT_BUTTON, self.on_convert_file, self.btn1) text = "2. (optional) Calculate geographic/tilt-corrected directions" self.btn2 = buttons.GenButton(self.panel, id=-1, label=text, size=(450, 50), name='step 2') self.btn2.SetBackgroundColour("#FDC68A") self.btn2.InitColours() self.Bind(wx.EVT_BUTTON, self.on_btn_orientation, self.btn2) text = "3. (optional) Add MagIC metadata for uploading data to MagIC " self.btn3 = buttons.GenButton(self.panel, id=-1, label=text, size=(450, 50), name='step 3') self.btn3.SetBackgroundColour("#FDC68A") self.btn3.InitColours() self.Bind(wx.EVT_BUTTON, self.on_btn_metadata, self.btn3) text = "Unpack txt file downloaded from MagIC" self.btn4 = buttons.GenButton(self.panel, id=-1, label=text, size=(330, 50)) self.btn4.SetBackgroundColour("#FDC68A") self.btn4.InitColours() self.Bind(wx.EVT_BUTTON, self.on_btn_unpack, self.btn4) text = "Convert directory to 3.0. format (legacy data only)" self.btn1a = buttons.GenButton(self.panel, id=-1, label=text, size=(330, 50), name='step 1a') self.btn1a.SetBackgroundColour("#FDC68A") self.btn1a.InitColours() self.Bind(wx.EVT_BUTTON, self.on_btn_convert_3, self.btn1a) #str = "OR" OR = wx.StaticText(self.panel, -1, "or", (20, 120)) font = wx.Font(18, wx.SWISS, wx.NORMAL, wx.NORMAL) OR.SetFont(font) #bSizer0.Add(self.panel,self.btn1,wx.ALIGN_TOP) bSizer1_1 = wx.BoxSizer(wx.VERTICAL) bSizer1_1.AddSpacer(20) bSizer1_1.Add(self.btn1, wx.ALIGN_TOP) bSizer1_1.AddSpacer(20) bSizer1_1.Add(self.btn2, wx.ALIGN_TOP) bSizer1_1.AddSpacer(20) bSizer1_1.Add(self.btn3, wx.ALIGN_TOP) bSizer1_1.AddSpacer(20) bSizer1.Add(bSizer1_1, wx.ALIGN_CENTER, wx.EXPAND) bSizer1.AddSpacer(20) bSizer1.Add(OR, 0, wx.ALIGN_CENTER, 0) bSizer1.AddSpacer(20) bSizer1_2 = wx.BoxSizer(wx.VERTICAL) spacing = 60 #if self.data_model_num == 3 else 90 bSizer1_2.AddSpacer(spacing) bSizer1_2.Add(self.btn4, 0, wx.ALIGN_CENTER, 0) bSizer1_2.AddSpacer(20) bSizer1_2.Add(self.btn1a, 0, wx.ALIGN_CENTER, 0) bSizer1_2.AddSpacer(20) bSizer1.Add(bSizer1_2) bSizer1.AddSpacer(20) #---sizer 2 ---- bSizer2 = wx.StaticBoxSizer( wx.StaticBox(self.panel, wx.ID_ANY, "Analysis and plots"), wx.HORIZONTAL) text = "Demag GUI" self.btn_demag_gui = buttons.GenButton(self.panel, id=-1, label=text, size=(300, 50), name='demag gui') self.btn_demag_gui.SetBackgroundColour("#6ECFF6") self.btn_demag_gui.InitColours() self.Bind(wx.EVT_BUTTON, self.on_btn_demag_gui, self.btn_demag_gui) text = "Thellier GUI" self.btn_thellier_gui = buttons.GenButton(self.panel, id=-1, label=text, size=(300, 50), name='thellier gui') self.btn_thellier_gui.SetBackgroundColour("#6ECFF6") self.btn_thellier_gui.InitColours() self.Bind(wx.EVT_BUTTON, self.on_btn_thellier_gui, self.btn_thellier_gui) bSizer2.AddSpacer(20) bSizer2.Add(self.btn_demag_gui, 0, wx.ALIGN_CENTER, 0) bSizer2.AddSpacer(20) bSizer2.Add(self.btn_thellier_gui, 0, wx.ALIGN_CENTER, 0) bSizer2.AddSpacer(20) #---sizer 3 ---- bSizer3 = wx.StaticBoxSizer( wx.StaticBox(self.panel, wx.ID_ANY, "Create file for upload to MagIC database"), wx.HORIZONTAL) text = "Create MagIC txt file for upload" self.btn_upload = buttons.GenButton(self.panel, id=-1, label=text, size=(300, 50)) self.btn_upload.SetBackgroundColour("#C4DF9B") self.btn_upload.InitColours() bSizer3.AddSpacer(20) bSizer3.Add(self.btn_upload, 0, wx.ALIGN_CENTER, 0) bSizer3.AddSpacer(20) self.Bind(wx.EVT_BUTTON, self.on_btn_upload, self.btn_upload) #---arange sizers ---- hbox = wx.BoxSizer(wx.HORIZONTAL) vbox = wx.BoxSizer(wx.VERTICAL) vbox.AddSpacer(5) #vbox.Add(self.logo,0,wx.ALIGN_CENTER,0) vbox.AddSpacer(5) vbox.Add(bSizer0, 0, wx.ALIGN_CENTER, 0) vbox.AddSpacer(10) #vbox.Add(bSizer0_1, 0, wx.ALIGN_CENTER, 0) #vbox.AddSpacer(10) vbox.Add(bSizer1, 0, wx.ALIGN_CENTER, 0) vbox.AddSpacer(10) vbox.Add(bSizer2, 0, wx.ALIGN_CENTER, 0) vbox.AddSpacer(10) vbox.Add(bSizer3, 0, wx.ALIGN_CENTER, 0) vbox.AddSpacer(10) hbox.AddSpacer(10) hbox.Add(vbox, 0, wx.ALIGN_CENTER, 0) hbox.AddSpacer(5) self.panel.SetSizer(hbox) hbox.Fit(self) #---------------------------------------------------------------------- def get_dir(self): """ Choose a working directory dialog. Called by self.get_dm_and_wd. """ if "-WD" in sys.argv and self.FIRST_RUN: ind = sys.argv.index('-WD') self.WD = os.path.abspath(sys.argv[ind + 1]) os.chdir(self.WD) self.WD = os.getcwd() self.dir_path.SetValue(self.WD) else: self.on_change_dir_button(None) #self.WD = os.getcwd() self.FIRST_RUN = False # this functionality is not fully working yet, so I've removed it for now #try: # print "trying listdir" # os.listdir(self.WD) #except Exception as ex: # print ex #print "self.WD.split('/')", self.WD.split('/') #if len(self.WD.split('/')) <= 4: # print "no to saving this directory" #else: # print "do on_save_dir_button" # self.on_save_dir_button(None) #---------------------------------------------------------------------- #def getFolderBitmap(): # img = folder_icon.GetImage().Rescale(50, 50) # return img.ConvertToBitmap() def on_change_dir_button(self, event, show=True): currentDirectory = os.getcwd() self.change_dir_dialog = wx.DirDialog( self.panel, "Choose your working directory to create or edit a MagIC contribution:", defaultPath=currentDirectory, style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON | wx.DD_CHANGE_DIR) if show: self.on_finish_change_dir(self.change_dir_dialog) def on_finish_change_dir(self, dialog, show=True): if not show: self.WD = dialog.GetPath() os.chdir(self.WD) self.dir_path.SetValue(self.WD) elif dialog.ShowModal() == wx.ID_OK: self.WD = dialog.GetPath() os.chdir(self.WD) self.dir_path.SetValue(self.WD) dialog.Destroy() if self.data_model_num == 2: self.get_wd_data2() else: self.get_wd_data() else: dialog.Destroy() # def on_revert_dir_button(self, event): # if self.last_saved_time.GetLineText(0) == "not saved": # dia = wx.MessageDialog(self.panel, "You can't revert, because your working directory has not been saved. Are you sure you're in the right directory?", "Can't be done", wx.OK) # dia.ShowModal() # return # dia = wx.MessageDialog(self.panel, "Are you sure you want to revert to the last saved state? All changes since {} will be lost".format(self.last_saved_time.GetLineText(0)), "Not so fast", wx.YES_NO|wx.NO_DEFAULT) # ok = dia.ShowModal() # if ok == wx.ID_YES: # os.chdir('..') # wd = self.WD # shutil.rmtree(wd) # shutil.move(self.saved_dir, self.WD) # os.chdir(self.WD) # self.on_save_dir_button(None) # else: # print "-I Don't revert" # def on_save_dir_button(self, event): # try: # if len(self.WD.split('/')) <= 4: # self.last_saved_time.Clear() # self.last_saved_time.write("not saved") # return # os.chdir('..') # wd = self.WD # wd = wd.rstrip('/') # ind = wd.rfind('/') + 1 # saved_prefix, saved_folder = wd[:ind], wd[ind:] # self.saved_dir = saved_prefix + "copy_" + saved_folder # if "copy_" + saved_folder in os.listdir(saved_prefix): # shutil.rmtree(self.saved_dir) # shutil.copytree(self.WD, self.saved_dir) # self.last_saved_time.Clear() # now = datetime.datetime.now() # now_string = "{}:{}:{}".format(now.hour, now.minute, now.second) # self.last_saved_time.write(now_string) # os.chdir(self.WD) # except:# OSError: # print "-I Problem copying working directory" # self.last_saved_time.Clear() # self.last_saved_time.write("not saved") def on_btn_thellier_gui(self, event): """ Open Thellier GUI """ if not self.check_for_meas_file(): return if not self.check_for_uncombined_files(): return outstring = "thellier_gui.py -WD %s" % self.WD print("-I- running python script:\n %s" % (outstring)) if self.data_model_num == 2.5: thellier_gui.main(self.WD, standalone_app=False, parent=self, DM=self.data_model_num) else: # disable and hide Pmag GUI mainframe self.Disable() self.Hide() # show busyinfo wait = wx.BusyInfo('Compiling required data, please wait...') wx.SafeYield() # create custom Thellier GUI closing event and bind it ThellierGuiExitEvent, EVT_THELLIER_GUI_EXIT = newevent.NewCommandEvent( ) self.Bind(EVT_THELLIER_GUI_EXIT, self.on_analysis_gui_exit) # make and show the Thellier GUI frame thellier_gui_frame = thellier_gui.Arai_GUI( self.WD, self, standalone=False, DM=self.data_model_num, evt_quit=ThellierGuiExitEvent) if not thellier_gui_frame: print("Thellier GUI failed to start aborting") del wait return thellier_gui_frame.Centre() thellier_gui_frame.Show() del wait def on_btn_demag_gui(self, event): """ Open Demag GUI """ if not self.check_for_meas_file(): return if not self.check_for_uncombined_files(): return outstring = "demag_gui.py -WD %s" % self.WD print("-I- running python script:\n %s" % (outstring)) if self.data_model_num == 2: demag_gui.start(self.WD, standalone_app=False, parent=self, DM=self.data_model_num) else: # disable and hide Pmag GUI mainframe self.Disable() self.Hide() # show busyinfo wait = wx.BusyInfo('Compiling required data, please wait...') wx.SafeYield() # create custom Demag GUI closing event and bind it DemagGuiExitEvent, EVT_DEMAG_GUI_EXIT = newevent.NewCommandEvent() self.Bind(EVT_DEMAG_GUI_EXIT, self.on_analysis_gui_exit) # make and show the Demag GUI frame demag_gui_frame = demag_gui.Demag_GUI( self.WD, self, write_to_log_file=False, data_model=self.data_model_num, evt_quit=DemagGuiExitEvent) demag_gui_frame.Centre() demag_gui_frame.Show() del wait def on_analysis_gui_exit(self, event): """ When Thellier or Demag GUI closes, show and enable Pmag GUI main frame. Read in an updated contribution object based on any changed files. (For Pmag GUI 3.0 only) """ self.Enable() self.Show() # also, refresh contribution object based on files # that may have been written/overwritten by Thellier GUI self.get_wd_data() def on_convert_file(self, event): pmag_dialogs_dia = pmag_gui_dialogs.import_magnetometer_data( self, wx.ID_ANY, '', self.WD) pmag_dialogs_dia.Show() pmag_dialogs_dia.Center() self.Hide() def on_btn_convert_3(self, event): """ Open dialog for rough conversion of 2.5 files to 3.0 files. Offer link to earthref for proper upgrade. """ dia = pw.UpgradeDialog(None) dia.Center() res = dia.ShowModal() if res == wx.ID_CANCEL: webbrowser.open("https://www2.earthref.org/MagIC/upgrade", new=2) return ## more nicely styled way, but doesn't link to earthref #msg = "This tool is meant for relatively simple upgrades (for instance, a measurement file, a sample file, and a criteria file).\nIf you have a more complex contribution to upgrade, and you want maximum accuracy, use the upgrade tool at https://www2.earthref.org/MagIC/upgrade.\n\nDo you want to continue?" #result = pw.warning_with_override(msg) #if result == wx.ID_NO: #webbrowser.open("https://www2.earthref.org/MagIC/upgrade", new=2) #return # turn files from 2.5 --> 3.0 (rough translation) meas, upgraded, no_upgrade = pmag.convert_directory_2_to_3( 'magic_measurements.txt', input_dir=self.WD, output_dir=self.WD, data_model=self.contribution.data_model) if not meas: wx.MessageBox( '2.5 --> 3.0 failed. Do you have a magic_measurements.txt file in your working directory?', 'Info', wx.OK | wx.ICON_INFORMATION) return # create a contribution self.contribution = cb.Contribution(self.WD) # make skeleton files with specimen, sample, site, location data self.contribution.propagate_measurement_info() # pop up upgraded_string = ", ".join(upgraded) if no_upgrade: no_upgrade_string = ", ".join(no_upgrade) msg = '2.5 --> 3.0 translation completed!\n\nThese 3.0 format files were created: {}.\n\nHowever, these 2.5 format files could not be upgraded: {}.\n\nTo convert all 2.5 files, use the MagIC upgrade tool: https://www2.earthref.org/MagIC/upgrade\n'.format( upgraded_string, no_upgrade_string) if 'criteria.txt' in upgraded: msg += '\nNote: Please check your criteria file for completeness and accuracy, as not all 2.5 files will be fully upgraded.' if 'pmag_criteria.txt' in no_upgrade: msg += '\nNote: Not all criteria files can be upgraded, even on the MagIC site. You may need to recreate an old pmag_criteria file from scratch in Thellier GUI or Demag GUI.' wx.MessageBox(msg, 'Warning', wx.OK | wx.ICON_INFORMATION) else: msg = '2.5 --> 3.0 translation completed!\nThese files were converted: {}'.format( upgraded_string) wx.MessageBox(msg, 'Info', wx.OK | wx.ICON_INFORMATION) def on_btn_metadata(self, event): """ Initiate the series of windows to add metadata to the contribution. """ # make sure we have a measurements file if not self.check_for_meas_file(): return # make sure all files of the same type have been combined if not self.check_for_uncombined_files(): return if self.data_model_num == 2: wait = wx.BusyInfo('Compiling required data, please wait...') wx.SafeYield() self.ErMagic_frame = ErMagicBuilder.MagIC_model_builder( self.WD, self, self.er_magic) elif self.data_model_num == 3: wait = wx.BusyInfo('Compiling required data, please wait...') wx.SafeYield() self.ErMagic_frame = ErMagicBuilder.MagIC_model_builder3( self.WD, self, self.contribution) # self.ErMagic_frame.Show() self.ErMagic_frame.Center() # gets total available screen space - 10% size = wx.DisplaySize() size = (size[0] - 0.3 * size[0], size[1] - 0.3 * size[1]) self.ErMagic_frame.Raise() del wait def init_check_window2(self): """ initiates the object that will control steps 1-6 of checking headers, filling in cell values, etc. """ self.check_dia = pmag_er_magic_dialogs.ErMagicCheckFrame( self, 'Check Data', self.WD, self.er_magic) def init_check_window(self): """ initiates the object that will control steps 1-6 of checking headers, filling in cell values, etc. """ self.check_dia = pmag_er_magic_dialogs.ErMagicCheckFrame3( self, 'Check Data', self.WD, self.contribution) def on_btn_orientation(self, event): """ Create and fill wxPython grid for entering orientation data. """ wait = wx.BusyInfo('Compiling required data, please wait...') wx.SafeYield() #dw, dh = wx.DisplaySize() size = wx.DisplaySize() size = (size[0] - 0.1 * size[0], size[1] - 0.1 * size[1]) if self.data_model_num == 3: frame = pmag_gui_dialogs.OrientFrameGrid3(self, -1, 'demag_orient.txt', self.WD, self.contribution, size) else: frame = pmag_gui_dialogs.OrientFrameGrid(self, -1, 'demag_orient.txt', self.WD, self.er_magic, size) frame.Show(True) frame.Centre() self.Hide() del wait def on_btn_unpack(self, event): """ Create dialog to choose a file to unpack with download magic. Then run download_magic and create self.contribution. """ dlg = wx.FileDialog( None, message="choose txt file to unpack", defaultDir=self.WD, defaultFile="", style=wx.FD_OPEN #| wx.FD_CHANGE_DIR ) if dlg.ShowModal() == wx.ID_OK: FILE = dlg.GetPath() input_dir, f = os.path.split(FILE) else: return False outstring = "download_magic.py -f {} -WD {} -ID {} -DM {}".format( f, self.WD, input_dir, self.data_model_num) # run as module: print("-I- running python script:\n %s" % (outstring)) wait = wx.BusyInfo("Please wait, working...") wx.SafeYield() ex = None try: if ipmag.download_magic(f, self.WD, input_dir, overwrite=True, data_model=self.data_model): text = "Successfully ran download_magic.py program.\nMagIC files were saved in your working directory.\nSee Terminal/message window for details." else: text = "Something went wrong. Make sure you chose a valid file downloaded from the MagIC database and try again." except Exception as ex: text = "Something went wrong. Make sure you chose a valid file downloaded from the MagIC database and try again." del wait dlg = wx.MessageDialog(self, caption="Saved", message=text, style=wx.OK) result = dlg.ShowModal() if result == wx.ID_OK: dlg.Destroy() if ex: raise (ex) self.contribution = cb.Contribution(self.WD) def on_btn_upload(self, event): """ Try to run upload_magic. Open validation mode if the upload file has problems. """ if not self.check_for_uncombined_files(): return outstring = "upload_magic.py" print("-I- running python script:\n %s" % (outstring)) wait = wx.BusyInfo("Please wait, working...") wx.SafeYield() self.contribution.tables['measurements'].add_measurement_names() if self.data_model_num == 3: res, error_message, has_problems, all_failing_items = ipmag.upload_magic3( dir_path=self.WD, vocab=self.contribution.vocab, contribution=self.contribution) if self.data_model_num == 2: res, error_message, errors = ipmag.upload_magic( dir_path=self.WD, data_model=self.er_magic.data_model) del wait if res: text = "You are ready to upload!\n{} was generated in {}".format( os.path.split(res)[1], os.path.split(res)[0]) dlg = pw.ChooseOne(self, "Go to MagIC for uploading", "Not ready yet", text, "Saved") del wait #dlg = wx.MessageDialog(self, caption="Saved", message=text, style=wx.OK) else: text = "There were some problems with the creation of your upload file.\nError message: {}\nSee Terminal/message window for details".format( error_message) dlg = wx.MessageDialog(self, caption="Error", message=text, style=wx.OK) dlg.Centre() result = dlg.ShowModal() if result == wx.ID_OK: dlg.Destroy() if result == wx.ID_YES: pw.on_database_upload(None) if self.data_model_num == 3: if not res: from programs import magic_gui self.Disable() self.Hide() self.magic_gui_frame = magic_gui.MainFrame( self.WD, dmodel=self.data_model, title="Validations", contribution=self.contribution) self.magic_gui_frame.validation_mode = ['specimens'] self.magic_gui_frame.failing_items = all_failing_items self.magic_gui_frame.change_dir_button.Disable() self.magic_gui_frame.Centre() self.magic_gui_frame.Show() self.magic_gui_frame.highlight_problems(has_problems) # # change name of upload button to 'exit validation mode' self.magic_gui_frame.bSizer2.GetStaticBox().SetLabel( 'return to main GUI') self.magic_gui_frame.btn_upload.SetLabel( "exit validation mode") # bind that button to quitting magic gui and re-enabling Pmag GUI self.magic_gui_frame.Bind(wx.EVT_BUTTON, self.on_end_validation, self.magic_gui_frame.btn_upload) def on_end_validation(self, event): """ Switch back from validation mode to main Pmag GUI mode. Hide validation frame and show main frame. """ self.Enable() self.Show() self.magic_gui_frame.Destroy() def on_menu_exit(self, event): """ Exit the GUI """ # also delete appropriate copy file try: self.help_window.Destroy() except: pass if '-i' in sys.argv: self.Destroy() try: sys.exit() # can raise TypeError if wx inspector was used except Exception as ex: if isinstance(ex, TypeError): pass else: raise ex def check_for_uncombined_files(self): """ Go through working directory and check for uncombined files. (I.e., location1_specimens.txt and location2_specimens.txt but no specimens.txt.) Show a warning if uncombined files are found. Return True if no uncombined files are found OR user elects to continue anyway. """ wd_files = os.listdir(self.WD) if self.data_model_num == 2: ftypes = [ 'er_specimens.txt', 'er_samples.txt', 'er_sites.txt', 'er_locations.txt', 'pmag_specimens.txt', 'pmag_samples.txt', 'pmag_sites.txt', 'rmag_specimens.txt', 'rmag_results.txt', 'rmag_anisotropy.txt' ] else: ftypes = [ 'specimens.txt', 'samples.txt', 'sites.txt', 'locations.txt' ] uncombined = set() for ftype in ftypes: if ftype not in wd_files: for f in wd_files: if f.endswith('_' + ftype): uncombined.add(ftype) if uncombined: msg = 'It looks like you may have uncombined files of type(s) {} in your working directory.\nYou may want to go back to Step 1 and finish combining all files.\nIf you continue, the program will try to extract as much information as possible from your measurement file.'.format( ", ".join(list(uncombined))) dlg = pw.ChooseOne(self, 'Continue anyway', 'Go back', msg, title="Warning!") res = dlg.ShowModal() if res == wx.ID_NO: return return True def check_for_meas_file(self): """ Check the working directory for a measurement file. If not found, show a warning and return False. Otherwise return True. """ if self.data_model_num == 2: meas_file_name = "magic_measurements.txt" dm = "2.5" else: meas_file_name = "measurements.txt" dm = "3.0" if not os.path.isfile(os.path.join(self.WD, meas_file_name)): pw.simple_warning( "Your working directory must have a {} format {} file to run this step. Make sure you have fully completed step 1 (import magnetometer file) and ALSO converted to 3.0., if necessary), then try again." .format(dm, meas_file_name)) return False return True
def main(command_line=True, **kwargs): """ NAME iodp_jr6_magic.py DESCRIPTION converts shipboard .jr6 format files to magic_measurements format files SYNTAX iodp_jr6_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -fsa FILE: specify er_samples.txt file for sample name lookup , default is 'er_samples.txt' -loc HOLE : specify hole name (U1456A) -A: don't average replicate measurements INPUT JR6 .jr6 format file """ def fix_separation(filename, new_filename): old_file = open(filename, 'r') data = old_file.readlines() new_data = [] for line in data: new_line = line.replace('-', ' -') new_line = new_line.replace(' ', ' ') new_data.append(new_line) new_file = open(new_filename, 'w') for s in new_data: new_file.write(s) old_file.close() new_file.close() return new_filename def old_fix_separation(filename, new_filename): old_file = open(filename, 'r') data = old_file.readlines() new_data = [] for line in data: new_line = [] for i in line.split(): if '-' in i[1:]: lead_char = '-' if i[0] == '-' else '' if lead_char: v = i[1:].split('-') else: v = i.split('-') new_line.append(lead_char + v[0]) new_line.append('-' + v[1]) else: new_line.append(i) new_line = (' '.join(new_line)) + '\n' new_data.append(new_line) new_file = open(new_filename, 'w') for s in new_data: new_file.write(s) new_file.close() old_file.close() return new_filename # initialize some stuff noave = 0 volume = 2.5**3 #default volume is a 2.5cm cube inst = "" samp_con, Z = '5', "" missing = 1 demag = "N" er_location_name = "unknown" citation = 'This study' args = sys.argv meth_code = "LP-NO" version_num = pmag.get_version() dir_path = '.' MagRecs = [] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' mag_file = '' # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path = sys.argv[ind + 1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind + 1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print(main.__doc__) return False if '-F' in args: ind = args.index("-F") meas_file = args[ind + 1] if '-fsa' in args: ind = args.index("-fsa") samp_file = args[ind + 1] if samp_file[0] != '/': samp_file = os.path.join(input_dir_path, samp_file) try: open(samp_file, 'r') ErSamps, file_type = pmag.magic_read(samp_file) except: print(samp_file, ' not found: ') print( ' download csv file and import to MagIC with iodp_samples_magic.py' ) if '-f' in args: ind = args.index("-f") mag_file = args[ind + 1] if "-loc" in args: ind = args.index("-loc") er_location_name = args[ind + 1] if "-A" in args: noave = 1 if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file', '') samp_file = kwargs.get('samp_file', 'er_samples.txt') specnum = kwargs.get('specnum', 1) samp_con = kwargs.get('samp_con', '1') if len(str(samp_con)) > 1: samp_con, Z = samp_con.split('-') else: Z = '' er_location_name = kwargs.get('er_location_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") # format variables meth_code = meth_code + ":FS-C-DRILL-IODP:SP-SS-C:SO-V" meth_code = meth_code.strip(":") if mag_file: mag_file = os.path.join(input_dir_path, mag_file) samp_file = os.path.join(input_dir_path, samp_file) meas_file = os.path.join(output_dir_path, meas_file) # validate variables if not mag_file: print("You must provide an IODP_jr6 format file") return False, "You must provide an IODP_jr6 format file" if not os.path.exists(mag_file): print( 'The input file you provided: {} does not exist.\nMake sure you have specified the correct filename AND correct input directory name.' .format(mag_file)) return False, 'The input file you provided: {} does not exist.\nMake sure you have specified the correct filename AND correct input directory name.'.format( mag_file) if not os.path.exists(samp_file): print( "Your input directory:\n{}\nmust contain an er_samples.txt file, or you must explicitly provide one" .format(input_dir_path)) return False, "Your input directory:\n{}\nmust contain an er_samples.txt file, or you must explicitly provide one".format( input_dir_path) # parse data temp = os.path.join(output_dir_path, 'temp.txt') fix_separation(mag_file, temp) samples, filetype = pmag.magic_read(samp_file) with open(temp, 'r') as finput: lines = finput.readlines() os.remove(temp) for line in lines: MagRec = {} line = line.split() spec_text_id = line[0].split('_')[1] SampRecs = pmag.get_dictitem(samples, 'er_sample_alternatives', spec_text_id, 'has') if len(SampRecs) > 0: # found one MagRec['er_specimen_name'] = SampRecs[0]['er_sample_name'] MagRec['er_sample_name'] = MagRec['er_specimen_name'] MagRec['er_site_name'] = MagRec['er_specimen_name'] MagRec["er_citation_names"] = "This study" MagRec['er_location_name'] = er_location_name MagRec['magic_software_packages'] = version_num MagRec["treatment_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"] = 'g' MagRec["measurement_standard"] = 'u' MagRec["measurement_number"] = '1' MagRec["treatment_ac_field"] = '0' volume = float(SampRecs[0]['sample_volume']) x = float(line[4]) y = float(line[3]) negz = float(line[2]) cart = np.array([x, y, -negz]).transpose() direction = pmag.cart2dir(cart).transpose() expon = float(line[5]) magn_volume = direction[2] * (10.0**expon) moment = magn_volume * volume MagRec["measurement_magn_moment"] = str(moment) MagRec["measurement_magn_volume"] = str( magn_volume) #str(direction[2] * (10.0 ** expon)) MagRec["measurement_dec"] = '%7.1f' % (direction[0]) MagRec["measurement_inc"] = '%7.1f' % (direction[1]) step = line[1] if step == 'NRM': meas_type = "LT-NO" elif step[0:2] == 'AD': meas_type = "LT-AF-Z" treat = float(step[2:]) MagRec["treatment_ac_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla elif step[0:2] == 'TD': meas_type = "LT-T-Z" treat = float(step[2:]) MagRec["treatment_temp"] = '%8.3e' % (treat + 273. ) # temp in kelvin elif step[0:3] == 'ARM': # meas_type = "LT-AF-I" treat = float(row['step'][3:]) MagRec["treatment_ac_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla MagRec["treatment_dc_field"] = '%8.3e' % ( 50e-6) # assume 50uT DC field MagRec[ "measurement_description"] = 'Assumed DC field - actual unknown' elif step[0:3] == 'IRM': # meas_type = "LT-IRM" treat = float(step[3:]) MagRec["treatment_dc_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla else: print('unknown treatment type for ', row) return False, 'unknown treatment type for ', row MagRec['magic_method_codes'] = meas_type MagRecs.append(MagRec.copy()) else: print('sample name not found: ', row['specname']) MagOuts = pmag.measurements_methods(MagRecs, noave) file_created, error_message = pmag.magic_write(meas_file, MagOuts, 'magic_measurements') if file_created: return True, meas_file else: return False, 'Results not written to file'
def main(command_line=True, **kwargs): """ NAME bgc_magic.py DESCRIPTION converts Berkeley Geochronology Center (BGC) format files to magic_measurements format files SYNTAX bgc_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -Fsa: specify er_samples format file for appending, default is new er_samples.txt (Not working yet) -loc LOCNAME : specify location/study name -site SITENAME : specify site name -A: don't average replicate measurements -mcd [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented -v NUM : specify the volume in cc of the sample, default 2.5^3cc. Will use vol in data file if volume!=0 in file. INPUT BGC paleomag format file """ # initialize some stuff noave = 0 volume = 0.025**3 #default volume is a 2.5cm cube #inst="" #samp_con,Z='1',"" #missing=1 #demag="N" er_location_name = "unknown" er_site_name = "unknown" #citation='This study' args = sys.argv meth_code = "LP-NO" #specnum=1 version_num = pmag.get_version() mag_file = "" dir_path = '.' MagRecs = [] SampOuts = [] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' meth_code = "" # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path = sys.argv[ind+1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind+1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print(main.__doc__) return False if '-F' in args: ind = args.index("-F") meas_file = args[ind+1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind+1] #try: # open(samp_file,'r') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file = args[ind+1] if "-loc" in args: ind = args.index("-loc") er_location_name = args[ind+1] if "-site" in args: ind = args.index("-site") er_site_name = args[ind+1] if "-A" in args: noave = 1 if "-mcd" in args: ind = args.index("-mcd") meth_code = args[ind+1] #samp_con='5' if "-v" in args: ind = args.index("-v") volume = float(args[ind+1]) * 1e-6 # enter volume in cc, convert to m^3 if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') samp_file = kwargs.get('samp_file', 'er_samples.txt') er_location_name = kwargs.get('er_location_name', '') er_site_name = kwargs.get('er_site_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") volume = float(kwargs.get('volume', 0)) if not volume: volume = 0.025**3 #default volume is a 2.5 cm cube, translated to meters cubed else: #convert cm^3 to m^3 volume *= 1e-6 # format variables if not mag_file: return False, 'You must provide a BCG format file' mag_file = os.path.join(input_dir_path, mag_file) meas_file = os.path.join(output_dir_path, meas_file) samp_file = os.path.join(output_dir_path, samp_file) ErSampRec = {} # parse data # Open up the BGC file and read the header information print('mag_file in bgc_magic', mag_file) pre_data = open(mag_file, 'r') line = pre_data.readline() line_items = line.split(' ') sample_name = line_items[2] sample_name = sample_name.replace('\n', '') line = pre_data.readline() line = pre_data.readline() line_items = line.split('\t') sample_azimuth = float(line_items[1]) sample_dip = float(line_items[2]) sample_bed_dip = line_items[3] sample_bed_azimuth = line_items[4] sample_lon = line_items[5] sample_lat = line_items[6] tmp_volume = line_items[7] if tmp_volume != 0.0: volume = float(tmp_volume) * 1e-6 pre_data.close() data = pd.read_csv(mag_file, sep='\t', header=3, index_col=False) cart = np.array([data['X'], data['Y'], data['Z']]).transpose() direction = pmag.cart2dir(cart).transpose() data['measurement_dec'] = direction[0] data['measurement_inc'] = direction[1] data['measurement_magn_moment'] = old_div(direction[2], 1000) # the data are in EMU - this converts to Am^2 data['measurement_magn_volume'] = old_div((old_div(direction[2], 1000)), volume) # EMU - data converted to A/m # Configure the er_sample table ErSampRec['er_sample_name'] = sample_name ErSampRec['sample_azimuth'] = sample_azimuth ErSampRec['sample_dip'] = sample_dip ErSampRec['sample_bed_dip_direction'] = sample_bed_azimuth ErSampRec['sample_bed_dip'] = sample_bed_dip ErSampRec['sample_lat'] = sample_lat ErSampRec['sample_lon'] = sample_lon ErSampRec['magic_method_codes'] = meth_code ErSampRec['er_location_name'] = er_location_name ErSampRec['er_site_name'] = er_site_name ErSampRec['er_citation_names'] = 'This study' SampOuts.append(ErSampRec.copy()) # Configure the magic_measurements table for rowNum, row in data.iterrows(): MagRec = {} MagRec['measurement_description'] = 'Date: ' + str(row['Date']) + ' Time: ' + str(row['Time']) MagRec["er_citation_names"] = "This study" MagRec['er_location_name'] = er_location_name MagRec['er_site_name'] = er_site_name MagRec['er_sample_name'] = sample_name MagRec['magic_software_packages'] = version_num MagRec["treatment_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"] = 'g' MagRec["measurement_standard"] = 'u' MagRec["measurement_number"] = rowNum MagRec["er_specimen_name"] = sample_name MagRec["treatment_ac_field"] = '0' if row['DM Val'] == '0': meas_type = "LT-NO" elif int(row['DM Type']) > 0.0: meas_type = "LT-AF-Z" treat = float(row['DM Val']) MagRec["treatment_ac_field"] = '%8.3e' %(treat*1e-3) # convert from mT to tesla elif int(row['DM Type']) == -1: meas_type = "LT-T-Z" treat = float(row['DM Val']) MagRec["treatment_temp"] = '%8.3e' % (treat+273.) # temp in kelvin else: print("measurement type unknown:", row['DM Type'], " in row ", rowNum) MagRec["measurement_magn_moment"] = str(row['measurement_magn_moment']) MagRec["measurement_magn_volume"] = str(row['measurement_magn_volume']) MagRec["measurement_dec"] = str(row['measurement_dec']) MagRec["measurement_inc"] = str(row['measurement_inc']) MagRec['magic_method_codes'] = meas_type MagRec['measurement_csd'] = '0.0' # added due to magic.write error MagRec['measurement_positions'] = '1' # added due to magic.write error MagRecs.append(MagRec.copy()) pmag.magic_write(samp_file, SampOuts, 'er_samples') print("sample orientations put in ", samp_file) MagOuts = pmag.measurements_methods(MagRecs, noave) pmag.magic_write(meas_file, MagOuts, 'magic_measurements') print("results put in ", meas_file) return True, meas_file
def main(): """ NAME odp_dcs_magic.py DESCRIPTION converts ODP discrete sample format files to magic_measurements format files SYNTAX odp_dsc_magic.py [command line options] OPTIONS -h: prints the help message and quits. -F FILE: specify output measurements file, default is magic_measurements.txt -Fsp FILE: specify output er_specimens.txt file, default is er_specimens.txt -Fsa FILE: specify output er_samples.txt file for appending, default is er_samples.txt -Fsi FILE: specify output er_sites.txt file, default is er_sites.txt -dc B PHI THETA: dc lab field (in micro tesla) and phi,theta, default is none NB: use PHI, THETA = -1 -1 to signal that it changes, i.e. in anisotropy experiment -ac B : peak AF field (in mT) for ARM acquisition, default is none -A : don't average replicate measurements INPUT Put data from separate experiments (all AF, thermal, thellier, trm aquisition, Shaw, etc.) in separate directory """ # # version_num=pmag.get_version() meas_file='magic_measurements.txt' spec_file='er_specimens.txt' samp_file='er_samples.txt' site_file='er_sites.txt' ErSpecs,ErSamps,ErSites,ErLocs,ErCits=[],[],[],[],[] MagRecs=[] citation="This study" dir_path,demag='.','NRM' args=sys.argv noave=0 if '-WD' in args: ind=args.index("-WD") dir_path=args[ind+1] if "-h" in args: print(main.__doc__) sys.exit() if "-A" in args: noave=1 if '-F' in args: ind=args.index("-F") meas_file=args[ind+1] if '-Fsp' in args: ind=args.index("-Fsp") spec_file=args[ind+1] if '-Fsa' in args: ind=args.index("-Fsa") samp_file=dir_path+'/'+args[ind+1] ErSamps,file_type=pmag.magic_read(samp_file) else: samp_file=dir_path+'/'+samp_file if '-LP' in args: ind=args.index("-LP") codelist=args[ind+1] codes=codelist.split(':') if "AF" in codes: demag='AF' if'-dc' not in args: methcode="LT-AF-Z" if'-dc' in args: methcode="LT-AF-I" if "T" in codes: demag="T" if '-dc' not in args: methcode="LT-T-Z" if '-dc' in args: methcode="LT-T-I" if "I" in codes: methcode="LP-IRM" if "S" in codes: demag="S" methcode="LP-PI-TRM:LP-PI-ALT-AFARM" trm_labfield=labfield ans=input("DC lab field for ARM step: [50uT] ") if ans=="": arm_labfield=50e-6 else: arm_labfield=float(ans)*1e-6 ans=input("temperature for total trm step: [600 C] ") if ans=="": trm_peakT=600+273 # convert to kelvin else: trm_peakT=float(ans)+273 # convert to kelvin if "G" in codes: methcode="LT-AF-G" if "D" in codes: methcode="LT-AF-D" if "TRM" in codes: demag="T" trm=1 if demag=="T" and "ANI" in codes: methcode="LP-AN-TRM" if demag=="AF" and "ANI" in codes: methcode="LP-AN-ARM" if labfield==0: labfield=50e-6 if peakfield==0: peakfield=.180 spec_file=dir_path+'/'+spec_file site_file=dir_path+'/'+site_file meas_file=dir_path+'/'+meas_file filelist=os.listdir(dir_path) # read in list of files to import specimens,samples,sites=[],[],[] MagRecs,SpecRecs,SampRecs=[],[],[] for samp in ErSamps: if samp['er_sample_name'] not in samples: samples.append(samp['er_sample_name']) SampRecs.append(samp) for file in filelist: # parse each file if file[-3:].lower()=='dsc': print('processing: ',file) MagRec,SpecRec,SampRec={},{},{} treatment_type,treatment_value,user="","","" inst="ODP-SRM" input=open(dir_path+'/'+file,'r').readlines() IDs=file.split('_') # splits on underscores pieces=IDs[0].split('-') expedition=pieces[0] location=pieces[1] if file[0]!='_': while len(pieces[2])<4:pieces[2]='0'+pieces[2] # pad core to be 3 characters specimen="" else: specimen="test" for piece in pieces: specimen=specimen+piece+'-' specimen=specimen[:-1] alt_spec=IDs[1] # alternate specimen is second field in field name # set up specimen record for Er_specimens table SpecRec['er_expedition_name']=expedition SpecRec['er_location_name']=location SpecRec['er_site_name']=specimen SpecRec['er_sample_name']=specimen SpecRec['er_citation_names']=citation for key in list(SpecRec.keys()):SampRec[key]=SpecRec[key] SampRec['sample_azimuth']='0' SampRec['sample_dip']='0' SampRec['magic_method_codes']='FS-C-DRILL-IODP:SP-SS-C:SO-V' SpecRec['er_specimen_name']=specimen SampRec['er_specimen_names']=specimen for key in list(SpecRec.keys()):MagRec[key]=SpecRec[key] # set up measurement record - default is NRM MagRec['er_analyst_mail_names']=user MagRec['magic_method_codes']='LT-NO' MagRec['magic_software_packages']=version_num MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["treatment_ac_field"]=0. MagRec["treatment_dc_field"]='0' MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' MagRec["measurement_flag"]='g' # assume all data are "good" MagRec["measurement_standard"]='u' # assume all data are "good" MagRec["measurement_csd"]='' # set csd to blank SpecRec['er_specimen_alternatives']=alt_spec vol=7e-6 # assume 7 cc samples datestamp=input[1].split() # date time is second line of file mmddyy=datestamp[0].split('/') # break into month day year date=mmddyy[2]+':'+mmddyy[0]+":"+mmddyy[1] +':' +datestamp[1] MagRec["measurement_date"]=date for k in range(len(input)): fields= input[k].split("=") if 'treatment_type' in fields[0]: if "Alternating Frequency Demagnetization" in fields[1]: MagRec['magic_method_codes'] = 'LT-AF-Z' inst=inst+':ODP-DTECH' # measured on shipboard AF DTECH D2000 treatment_type="AF" if "Anhysteretic Remanent Magnetization" in fields[1]: MagRec['magic_method_codes'] = 'LT-AF-I' inst=inst+':ODP-DTECH' # measured on shipboard AF DTECH D2000 treatment_type="ARM" if "Isothermal Remanent Magnetization" in fields[1]: MagRec['magic_method_codes'] = 'LT-IRM' inst=inst+':ODP-IMP' # measured on shipboard ASC IMPULSE magnetizer treatment_type="IRM" if "treatment_value" in fields[0]: values=fields[1].split(',') value=values[0] if value!=" \n": if treatment_type=="AF": treatment_value=float(value)*1e-3 MagRec["treatment_ac_field"]=treatment_value # AF demag in treat mT => T elif treatment_type=="IRM": treatment_value=float(value)*1e-3 MagRec["treatment_dc_field"]='%8.3e'%(treatment_value) # IRM treat mT => T if treatment_type=="ARM": treatment_value=float(value)*1e-3 dc_value=float(values[1])*1e-3 MagRec["treatment_ac_field"]=treatment_value # AF demag in treat mT => T MagRec["treatment_dc_field"]='%8.3e'%(dc_value) # DC mT => T if 'user' in fields[0]: user=fields[-1] MagRec["er_analyst_mail_names"]=user if 'sample_orientation' in fields[0]: MagRec["measurement_description"]=fields[-1] MagRec["measurement_standard"]='u' # assume all data are "good" if 'sample_area' in fields[0]: vol=float(fields[1])*1e-6 # takes volume (cc) and converts to m^3 if 'run_number' in fields[0]: MagRec['external_database_ids']=fields[1] # run number is the LIMS measurement number MagRec['external_database_names']='LIMS' if input[k][0:7]=='<MULTI>': rec=input[k+1].split(',') # list of data for item in rec: items=item.split('=') if items[0].strip()=='demag_level' and treatment_value=="" : treat= float(items[1]) if treat!=0: MagRec['magic_method_codes']='LT-AF-Z' inst=inst+':ODP-SRM-AF' MagRec["treatment_ac_field"]=treat*1e-3 # AF demag in treat mT => T if items[0].strip()=='inclination_w_tray_w_bkgrd': MagRec['measurement_inc']=items[1] if items[0].strip()=='declination_w_tray_w_bkgrd': MagRec['measurement_dec']=items[1] if items[0].strip()=='intensity_w_tray_w_bkgrd': MagRec['measurement_magn_moment']='%8.3e'%(float(items[1])*vol) # convert intensity from A/m to Am^2 using vol if items[0].strip()=='x_stdev':MagRec['measurement_x_sd']=items[1] if items[0].strip()=='y_stdev':MagRec['measurement_y_sd']=items[1] if items[0].strip()=='z_stdev':MagRec['measurement_sd_z']=items[1] MagRec['magic_instrument_codes']=inst MagRec['measurement_number']='1' MagRec['measurement_positions']='' MagRecs.append(MagRec) if specimen not in specimens: specimens.append(specimen) SpecRecs.append(SpecRec) if MagRec['er_sample_name'] not in samples: samples.append(MagRec['er_sample_name']) SampRecs.append(SampRec) MagOuts=pmag.sort_diclist(MagRecs,'treatment_ac_field') for MagRec in MagOuts: MagRec["treatment_ac_field"]='%8.3e'%(MagRec["treatment_ac_field"]) # convert to string pmag.magic_write(spec_file,SpecRecs,'er_specimens') if len(SampRecs)>0: SampOut,keys=pmag.fillkeys(SampRecs) pmag.magic_write(samp_file,SampOut,'er_samples') print('samples stored in ',samp_file) pmag.magic_write(samp_file,SampRecs,'er_samples') print('specimens stored in ',spec_file) Fixed=pmag.measurements_methods(MagOuts,noave) pmag.magic_write(meas_file,Fixed,'magic_measurements') print('data stored in ',meas_file)
class MagMainFrame(wx.Frame): """""" try: version = pmag.get_version() except: version = "" title = "Pmag GUI version: %s" % version if sys.platform in ['win32', 'win64']: title += " Powered by Enthought Canopy" def __init__(self, WD=None, dmodel=None): self.FIRST_RUN = True wx.Frame.__init__(self, None, wx.ID_ANY, self.title, name='pmag_gui mainframe') self.panel = wx.Panel(self, name='pmag_gui main panel') self.InitUI() # for use as module: self.resource_dir = os.getcwd() if not WD: self.get_DIR() # choose directory dialog else: self.WD = WD self.HtmlIsOpen = False self.Bind(wx.EVT_CLOSE, self.on_menu_exit) self.er_magic = builder.ErMagicBuilder(self.WD, dmodel) #self.er_magic.init_default_headers() #self.er_magic.init_actual_headers() def InitUI(self): menubar = pmag_gui_menu.MagICMenu(self) self.SetMenuBar(menubar) #pnl = self.panel #---sizer logo ---- #start_image = wx.Image("/Users/ronshaar/PmagPy/images/logo2.png") #start_image = wx.Image("/Users/Python/simple_examples/001.png") #start_image.Rescale(start_image.GetWidth(), start_image.GetHeight()) #image = wx.BitmapFromImage(start_image) #self.logo = wx.StaticBitmap(self.panel, -1, image) #---sizer 0 ---- bSizer0 = wx.StaticBoxSizer( wx.StaticBox(self.panel, wx.ID_ANY, "Choose MagIC project directory"), wx.HORIZONTAL) self.dir_path = wx.TextCtrl(self.panel, id=-1, size=(600, 25), style=wx.TE_READONLY) self.change_dir_button = buttons.GenButton(self.panel, id=-1, label="change dir", size=(-1, -1)) self.change_dir_button.SetBackgroundColour("#F8F8FF") self.change_dir_button.InitColours() self.Bind(wx.EVT_BUTTON, self.on_change_dir_button, self.change_dir_button) bSizer0.Add(self.change_dir_button, wx.ALIGN_LEFT) bSizer0.AddSpacer(40) bSizer0.Add(self.dir_path, wx.ALIGN_CENTER_VERTICAL) # not fully implemented method for saving/reverting WD # last saved: [] #bSizer0_1 = wx.StaticBoxSizer( wx.StaticBox( self.panel, wx.ID_ANY, "Save MagIC project directory in current state or revert to last-saved state" ), wx.HORIZONTAL ) #saved_label = wx.StaticText(self.panel, -1, "Last saved:", (20, 120)) #self.last_saved_time = wx.TextCtrl(self.panel, id=-1, size=(100,25), style=wx.TE_READONLY) #now = datetime.datetime.now() #now_string = "{}:{}:{}".format(now.hour, now.minute, now.second) #self.last_saved_time.write(now_string) #self.save_dir_button = buttons.GenButton(self.panel, id=-1, label = "save dir", size=(-1, -1)) #self.revert_dir_button = buttons.GenButton(self.panel, id=-1, label = "revert dir", size=(-1, -1)) #self.Bind(wx.EVT_BUTTON, self.on_revert_dir_button, self.revert_dir_button) #self.Bind(wx.EVT_BUTTON, self.on_save_dir_button, self.save_dir_button) #bSizer0_1.Add(saved_label, flag=wx.RIGHT, border=10) #bSizer0_1.Add(self.last_saved_time, flag=wx.RIGHT, border=10) #bSizer0_1.Add(self.save_dir_button,flag=wx.ALIGN_LEFT|wx.RIGHT, border=10) #bSizer0_1.Add(self.revert_dir_button,wx.ALIGN_LEFT) # #---sizer 1 ---- bSizer1 = wx.StaticBoxSizer( wx.StaticBox(self.panel, wx.ID_ANY, "Import data to working directory"), wx.HORIZONTAL) TEXT = "1. convert magnetometer files to MagIC format" self.btn1 = buttons.GenButton(self.panel, id=-1, label=TEXT, size=(450, 50), name='step 1') self.btn1.SetBackgroundColour("#FDC68A") self.btn1.InitColours() self.Bind(wx.EVT_BUTTON, self.on_convert_file, self.btn1) text = "2. (optional) calculate geographic/tilt-corrected directions" self.btn2 = buttons.GenButton(self.panel, id=-1, label=text, size=(450, 50), name='step 2') self.btn2.SetBackgroundColour("#FDC68A") self.btn2.InitColours() self.Bind(wx.EVT_BUTTON, self.on_orientation_button, self.btn2) text = "3. complete EarthRef data using EarthRef MagIC Builder " self.btn3 = buttons.GenButton(self.panel, id=-1, label=text, size=(450, 50), name='step 3') self.btn3.SetBackgroundColour("#FDC68A") self.btn3.InitColours() self.Bind(wx.EVT_BUTTON, self.on_er_data, self.btn3) text = "unpack txt file downloaded from MagIC" self.btn4 = buttons.GenButton(self.panel, id=-1, label=text, size=(300, 50)) self.btn4.SetBackgroundColour("#FDC68A") self.btn4.InitColours() self.Bind(wx.EVT_BUTTON, self.on_unpack, self.btn4) #str = "OR" OR = wx.StaticText(self.panel, -1, "or", (20, 120)) font = wx.Font(18, wx.SWISS, wx.NORMAL, wx.NORMAL) OR.SetFont(font) #bSizer0.Add(self.panel,self.btn1,wx.ALIGN_TOP) bSizer1_1 = wx.BoxSizer(wx.VERTICAL) bSizer1_1.AddSpacer(20) bSizer1_1.Add(self.btn1, wx.ALIGN_TOP) bSizer1_1.AddSpacer(20) bSizer1_1.Add(self.btn2, wx.ALIGN_TOP) bSizer1_1.AddSpacer(20) bSizer1_1.Add(self.btn3, wx.ALIGN_TOP) bSizer1_1.AddSpacer(20) bSizer1.Add(bSizer1_1, wx.ALIGN_CENTER, wx.EXPAND) bSizer1.AddSpacer(20) bSizer1.Add(OR, 0, wx.ALIGN_CENTER, 0) bSizer1.AddSpacer(20) bSizer1.Add(self.btn4, 0, wx.ALIGN_CENTER, 0) bSizer1.AddSpacer(20) #---sizer 2 ---- bSizer2 = wx.StaticBoxSizer( wx.StaticBox(self.panel, wx.ID_ANY, "Analysis and plots"), wx.HORIZONTAL) text = "Demag GUI" self.btn_demag_gui = buttons.GenButton(self.panel, id=-1, label=text, size=(300, 50), name='demag gui') self.btn_demag_gui.SetBackgroundColour("#6ECFF6") self.btn_demag_gui.InitColours() self.Bind(wx.EVT_BUTTON, self.on_run_demag_gui, self.btn_demag_gui) text = "Thellier GUI" self.btn_thellier_gui = buttons.GenButton(self.panel, id=-1, label=text, size=(300, 50), name='thellier gui') self.btn_thellier_gui.SetBackgroundColour("#6ECFF6") self.btn_thellier_gui.InitColours() self.Bind(wx.EVT_BUTTON, self.on_run_thellier_gui, self.btn_thellier_gui) bSizer2.AddSpacer(20) bSizer2.Add(self.btn_demag_gui, 0, wx.ALIGN_CENTER, 0) bSizer2.AddSpacer(20) bSizer2.Add(self.btn_thellier_gui, 0, wx.ALIGN_CENTER, 0) bSizer2.AddSpacer(20) #---sizer 3 ---- bSizer3 = wx.StaticBoxSizer( wx.StaticBox(self.panel, wx.ID_ANY, "Upload to MagIC database"), wx.HORIZONTAL) text = "prepare txt file for upload" self.btn_upload = buttons.GenButton(self.panel, id=-1, label=text, size=(300, 50)) self.btn_upload.SetBackgroundColour("#C4DF9B") self.btn_upload.InitColours() bSizer3.AddSpacer(20) bSizer3.Add(self.btn_upload, 0, wx.ALIGN_CENTER, 0) bSizer3.AddSpacer(20) self.Bind(wx.EVT_BUTTON, self.on_btn_upload, self.btn_upload) #---arange sizers ---- hbox = wx.BoxSizer(wx.HORIZONTAL) vbox = wx.BoxSizer(wx.VERTICAL) vbox.AddSpacer(5) #vbox.Add(self.logo,0,wx.ALIGN_CENTER,0) vbox.AddSpacer(5) vbox.Add(bSizer0, 0, wx.ALIGN_CENTER, 0) vbox.AddSpacer(10) #vbox.Add(bSizer0_1, 0, wx.ALIGN_CENTER, 0) #vbox.AddSpacer(10) vbox.Add(bSizer1, 0, wx.ALIGN_CENTER, 0) vbox.AddSpacer(10) vbox.Add(bSizer2, 0, wx.ALIGN_CENTER, 0) vbox.AddSpacer(10) vbox.Add(bSizer3, 0, wx.ALIGN_CENTER, 0) vbox.AddSpacer(10) hbox.AddSpacer(10) hbox.Add(vbox, 0, wx.ALIGN_CENTER, 0) hbox.AddSpacer(5) self.panel.SetSizer(hbox) hbox.Fit(self) #---------------------------------------------------------------------- def get_DIR(self): """ Choose a working directory dialog """ if "-WD" in sys.argv and self.FIRST_RUN: ind = sys.argv.index('-WD') self.WD = os.path.abspath(sys.argv[ind + 1]) else: self.WD = os.getcwd() os.chdir(self.WD) self.WD = os.getcwd() self.dir_path.SetValue(self.WD) self.FIRST_RUN = False # this functionality is not fully working yet, so I've removed it for now #try: # print "trying listdir" # os.listdir(self.WD) #except Exception as ex: # print ex #print "self.WD.split('/')", self.WD.split('/') #if len(self.WD.split('/')) <= 4: # print "no to saving this directory" #else: # print "do on_save_dir_button" # self.on_save_dir_button(None) #---------------------------------------------------------------------- #def getFolderBitmap(): # img = folder_icon.GetImage().Rescale(50, 50) # return img.ConvertToBitmap() def on_change_dir_button(self, event, show=True): currentDirectory = os.getcwd() self.change_dir_dialog = wx.DirDialog( self.panel, "Choose your working directory to create or edit a MagIC contribution:", defaultPath=currentDirectory, style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON | wx.DD_CHANGE_DIR) if show: self.on_finish_change_dir(self.change_dir_dialog) def on_finish_change_dir(self, dialog, show=True): if not show: self.WD = dialog.GetPath() os.chdir(self.WD) self.dir_path.SetValue(self.WD) elif dialog.ShowModal() == wx.ID_OK: self.WD = dialog.GetPath() os.chdir(self.WD) self.dir_path.SetValue(self.WD) dialog.Destroy() #self.ErMagic_data = ErMagicBuilder.ErMagicBuilder(self.WD) self.er_magic = builder.ErMagicBuilder(self.WD, self.er_magic.data_model) else: dialog.Destroy() # def on_revert_dir_button(self, event): # if self.last_saved_time.GetLineText(0) == "not saved": # dia = wx.MessageDialog(self.panel, "You can't revert, because your working directory has not been saved. Are you sure you're in the right directory?", "Can't be done", wx.OK) # dia.ShowModal() # return # dia = wx.MessageDialog(self.panel, "Are you sure you want to revert to the last saved state? All changes since {} will be lost".format(self.last_saved_time.GetLineText(0)), "Not so fast", wx.YES_NO|wx.NO_DEFAULT) # ok = dia.ShowModal() # if ok == wx.ID_YES: # os.chdir('..') # wd = self.WD # shutil.rmtree(wd) # shutil.move(self.saved_dir, self.WD) # os.chdir(self.WD) # self.on_save_dir_button(None) # else: # print "-I Don't revert" # def on_save_dir_button(self, event): # try: # if len(self.WD.split('/')) <= 4: # self.last_saved_time.Clear() # self.last_saved_time.write("not saved") # return # os.chdir('..') # wd = self.WD # wd = wd.rstrip('/') # ind = wd.rfind('/') + 1 # saved_prefix, saved_folder = wd[:ind], wd[ind:] # self.saved_dir = saved_prefix + "copy_" + saved_folder # if "copy_" + saved_folder in os.listdir(saved_prefix): # shutil.rmtree(self.saved_dir) # shutil.copytree(self.WD, self.saved_dir) # self.last_saved_time.Clear() # now = datetime.datetime.now() # now_string = "{}:{}:{}".format(now.hour, now.minute, now.second) # self.last_saved_time.write(now_string) # os.chdir(self.WD) # except:# OSError: # print "-I Problem copying working directory" # self.last_saved_time.Clear() # self.last_saved_time.write("not saved") def on_run_thellier_gui(self, event): outstring = "thellier_gui.py -WD %s" % self.WD print "-I- running python script:\n %s" % (outstring) thellier_gui.main(self.WD, standalone_app=False, parent=self) def on_run_demag_gui(self, event): outstring = "demag_gui.py -WD %s" % self.WD print "-I- running python script:\n %s" % (outstring) demag_gui.main(self.WD, standalone_app=False, parent=self) def on_convert_file(self, event): pmag_dialogs_dia = pmag_basic_dialogs.import_magnetometer_data( self, wx.ID_ANY, '', self.WD) pmag_dialogs_dia.Show() pmag_dialogs_dia.Center() self.Hide() def on_er_data(self, event): if not os.path.isfile(os.path.join(self.WD, 'magic_measurements.txt')): import dialogs.pmag_widgets as pw pw.simple_warning( "Your working directory must have a magic_measurements.txt file to run this step. Make sure you have fully completed step 1 (import magnetometer file), by combining all imported magnetometer files into one magic_measurements file." ) return False #self.ErMagic_frame = ErMagicBuilder.MagIC_model_builder(self.WD, self, self.ErMagic_data)#,self.Data,self.Data_hierarchy) wait = wx.BusyInfo('Compiling required data, please wait...') wx.Yield() self.ErMagic_frame = ErMagicBuilder.MagIC_model_builder( self.WD, self, self.er_magic) #,self.Data,self.Data_hierarchy) self.ErMagic_frame.Show() self.ErMagic_frame.Center() size = wx.DisplaySize() size = (size[0] - 0.3 * size[0], size[1] - 0.3 * size[1] ) # gets total available screen space - 10% self.ErMagic_frame.Raise() del wait def init_check_window(self): self.check_dia = pmag_er_magic_dialogs.ErMagicCheckFrame( self, 'Check Data', self.WD, self.er_magic ) # initiates the object that will control steps 1-6 of checking headers, filling in cell values, etc. def on_orientation_button(self, event): wait = wx.BusyInfo('Compiling required data, please wait...') wx.Yield() #dw, dh = wx.DisplaySize() size = wx.DisplaySize() size = (size[0] - 0.1 * size[0], size[1] - 0.1 * size[1]) frame = pmag_basic_dialogs.OrientFrameGrid(self, -1, 'demag_orient.txt', self.WD, self.er_magic, size) frame.Show(True) frame.Centre() self.Hide() del wait def on_unpack(self, event): dlg = wx.FileDialog( None, message="choose txt file to unpack", defaultDir=self.WD, defaultFile="", style=wx.OPEN #| wx.CHANGE_DIR ) if dlg.ShowModal() == wx.ID_OK: FILE = dlg.GetPath() input_dir, f = os.path.split(FILE) else: return False outstring = "download_magic.py -f {} -WD {} -ID {}".format( f, self.WD, input_dir) # run as module: print "-I- running python script:\n %s" % (outstring) wait = wx.BusyInfo("Please wait, working...") wx.Yield() ex = None try: if ipmag.download_magic(f, self.WD, input_dir, overwrite=True): text = "Successfully ran download_magic.py program.\nMagIC files were saved in your working directory.\nSee Terminal/Command Prompt for details." else: text = "Something went wrong. Make sure you chose a valid file downloaded from the MagIC database and try again." except Exception as ex: text = "Something went wrong. Make sure you chose a valid file downloaded from the MagIC database and try again." del wait dlg = wx.MessageDialog(self, caption="Saved", message=text, style=wx.OK) result = dlg.ShowModal() if result == wx.ID_OK: dlg.Destroy() if ex: raise (ex) def on_btn_upload(self, event): outstring = "upload_magic.py" print "-I- running python script:\n %s" % (outstring) wait = wx.BusyInfo("Please wait, working...") wx.Yield() upfile, error_message, errors = ipmag.upload_magic( dir_path=self.WD, data_model=self.er_magic.data_model) del wait if upfile: text = "You are ready to upload.\n Your file: {} was generated in MagIC Project Directory.\nDrag and drop this file in the MagIC database.".format( os.path.split(upfile)[1]) dlg = wx.MessageDialog(self, caption="Saved", message=text, style=wx.OK) else: text = "There were some problems with the creation of your upload file.\nError message: {}\nSee Terminal/Command Prompt for details".format( error_message) dlg = wx.MessageDialog(self, caption="Error", message=text, style=wx.OK) result = dlg.ShowModal() if result == wx.ID_OK: dlg.Destroy() def on_menu_exit(self, event): # also delete appropriate copy file try: self.help_window.Destroy() except: pass if '-i' in sys.argv: self.Destroy() try: sys.exit() # can raise TypeError if wx inspector was used except Exception as ex: if isinstance(ex, TypeError): pass else: raise ex
def main(command_line=True, **kwargs): """ NAME huji_magic_new.py DESCRIPTION converts HUJI new format files to magic_measurements format files SYNTAX huji_magic.py [command line options] OPTIONS -h: prints the help message and quits. -usr USER: identify user, default is "" -f FILE: specify input file, required -F FILE: specify output file, default is magic_measurements.txt -LP [colon delimited list of protocols, include all that apply] AF: af demag T: thermal including thellier but not trm acquisition N: NRM only TRM: trm acquisition ANI: anisotropy experiment CR: cooling rate experiment. The treatment coding of the measurement file should be: XXX.00,XXX.10, XXX.20 ...XX.70 etc. (XXX.00 is optional) where XXX in the temperature and .10,.20... are running numbers of the cooling rates steps. XXX.00 is optional zerofield baseline. XXX.70 is alteration check. syntax in sio_magic is: -LP CR xxx,yyy,zzz,.....xx where xx, yyy,zzz...xxx are cooling time in [K/minutes], seperated by comma, ordered at the same order as XXX.10,XXX.20 ...XX.70 if you use a zerofield step then no need to specify the cooling rate for the zerofield -spc NUM : specify number of characters to designate a specimen, default = 0 -loc LOCNAME : specify location/study name, must have either LOCNAME or SAMPFILE or be a synthetic -dc B PHI THETA: dc lab field (in micro tesla) and phi,theta, default is none NB: use PHI, THETA = -1 -1 to signal that it changes, i.e. in anisotropy experiment # to do! -ac B : peak AF field (in mT) for ARM acquisition, default is none -ncn NCON: specify naming convention: default is #1 below Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. [8] synthetic - has no site name [9] ODP naming convention INPUT separate experiments ( AF, thermal, thellier, trm aquisition) should be seperate files (eg. af.txt, thermal.txt, etc.) HUJI masurement file format (space delimited text): Spec lab-running-numbe-code Date Hour Treatment-type(T/N/A) Treatment(XXX.XX) dec(geo) inc(geo) dec(tilt) inc(tilt) --------- conventions: Spec: specimen name Treat: treatment step XXX T in Centigrade XXX AF in mT for special experiments: Thellier: XXX.0 first zero field step XXX.1 first in field step [XXX.0 and XXX.1 can be done in any order] XXX.2 second in-field step at lower temperature (pTRM check) ATRM: X.00 optional baseline X.1 ATRM step (+X) X.2 ATRM step (+Y) X.3 ATRM step (+Z) X.4 ATRM step (-X) X.5 ATRM step (-Y) X.6 ATRM step (-Z) X.7 optional alteration check (+X) TRM: XXX.YYY XXX is temperature step of total TRM YYY is dc field in microtesla Intensity assumed to be total moment in 10^3 Am^2 (emu) Declination: Declination in specimen coordinate system Inclination: Inclination in specimen coordinate system Optional metatdata string: mm/dd/yy;hh:mm;[dC,mT];xx.xx;UNITS;USER;INST;NMEAS hh in 24 hours. dC or mT units of treatment XXX (see Treat above) for thermal or AF respectively xx.xxx DC field UNITS of DC field (microT, mT) INST: instrument code, number of axes, number of positions (e.g., G34 is 2G, three axes, measured in four positions) NMEAS: number of measurements in a single position (1,3,200...) """ # initialize some variables mag_file = '' meas_file="magic_measurements.txt" user="" specnum = 0 samp_con = '1' labfield = 0 er_location_name = '' codelist = None # get command line args if command_line: args=sys.argv if "-h" in args: print main.__doc__ return False if "-usr" in args: ind=args.index("-usr") user=args[ind+1] else: user="" if '-F' in args: ind=args.index("-F") meas_file=args[ind+1] if '-f' in args: ind=args.index("-f") magfile=args[ind+1] print "got magfile:", magfile if "-dc" in args: ind=args.index("-dc") labfield=float(args[ind+1])*1e-6 phi=float(args[ind+2]) theta=float(args[ind+3]) if "-ac" in args: ind=args.index("-ac") peakfield=float(args[ind+1])*1e-3 if "-spc" in args: ind=args.index("-spc") specnum=int(args[ind+1]) if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if '-LP' in args: ind=args.index("-LP") codelist=args[ind+1] # lab process: # unpack key-word args if used as module if not command_line: user = kwargs.get('user', '') meas_file = kwargs.get('meas_file', 'magic_measurements.txt') magfile = kwargs.get('magfile', '') specnum = int(kwargs.get('specnum', 0)) labfield = int(kwargs.get('labfield', 0)) *1e-6 phi = int(kwargs.get('phi', 0)) theta = int(kwargs.get('theta', 0)) peakfield = kwargs.get('peakfield', 0) if peakfield: peakfield = float(peakfield)*1e-3 er_location_name = kwargs.get('er_location_name', '') samp_con = kwargs.get('samp_con', '1') codelist = kwargs.get('codelist', '') CR_cooling_times=kwargs.get('CR_cooling_times', None) # format and validate variables if magfile: try: input=open(magfile,'rU') except: print "bad mag file name" return False, "bad mag file name" else: print "mag_file field is required option" print main.__doc__ return False, "mag_file field is required option" if specnum!=0: specnum=-specnum if "4" in samp_con: if "-" not in samp_con: print "option [4] must be in form 4-Z where Z is an integer" return False, "option [4] must be in form 4-Z where Z is an integer" else: Z=int(samp_con.split("-")[1]) samp_con="4" if "7" in samp_con: if "-" not in samp_con: print "option [7] must be in form 7-Z where Z is an integer" return False, "option [7] must be in form 7-Z where Z is an integer" else: Z=int(samp_con.split("-")[1]) samp_con="7" if codelist: codes=codelist.split(':') else: print "Must select experiment type (-LP option)" return False, "Must select experiment type (-LP option)" if "AF" in codes: demag='AF' LPcode="LP-DIR-AF" if "T" in codes: demag="T" if not labfield: LPcode="LP-DIR-T" if labfield: LPcode="LP-PI-TRM" if "ANI" in codes: if not labfield: print "missing lab field option" return False, "missing lab field option" LPcode="LP-AN-TRM" if "TRM" in codes: demag="T" LPcode="LP-TRM" #trm=1 if "CR" in codes: demag="T" # dc should be in the code if not labfield: print "missing lab field option" return False, "missing lab field option" LPcode="LP-TRM-CR" # TRM in different cooling rates if command_line: ind=args.index("-LP") CR_cooling_times=args[ind+2].split(",") #print CR_cooling_time ,"CR_cooling_time" version_num=pmag.get_version() MagRecs=[] #-------------------------------------- # Read the file # Assumption: # 1. different lab protocolsa are in different files # 2. measurements are in the correct order #-------------------------------------- Data={} line_no=0 for line in input.readlines(): line_no+=1 this_line_data={} line_no+=1 instcode="" if len(line)<2: continue if line[0]=="#": #HUJI way of marking bad data points continue rec=line.strip('\n').split() specimen=rec[0] date=rec[2].split("/") hour=rec[3].split(":") treatment_type=rec[4] treatment=rec[5].split(".") dec_core=rec[6] inc_core=rec[7] dec_geo=rec[8] inc_geo=rec[9] dec_tilted=rec[10] inc_tilted=rec[11] moment_emu=float(rec[12]) if specimen not in Data.keys(): Data[specimen]=[] # check duplicate treatments: # if yes, delete the first and use the second if len(Data[specimen])>0: if treatment==Data[specimen][-1]['treatment']: del(Data[specimen][-1]) print "-W- Identical treatments in file %s magfile line %i: specimen %s, treatment %s ignoring the first. " %(magfile, line_no, specimen,".".join(treatment)) this_line_data={} this_line_data['specimen']=specimen this_line_data['date']=date this_line_data['hour']=hour this_line_data['treatment_type']=treatment_type this_line_data['treatment']=treatment this_line_data['dec_core']=dec_core this_line_data['inc_core']=inc_core this_line_data['dec_geo']=dec_geo this_line_data['inc_geo']=inc_geo this_line_data['dec_tilted']=dec_tilted this_line_data['inc_tilted']=inc_tilted this_line_data['moment_emu']=moment_emu Data[specimen].append(this_line_data) print "-I- done reading file %s"%magfile #-------------------------------------- # Convert to MagIC #-------------------------------------- specimens_list=Data.keys() specimens_list.sort() MagRecs=[] for specimen in specimens_list: for i in range(len(Data[specimen])): this_line_data=Data[specimen][i] methcode="" MagRec={} MagRec["er_specimen_name"]=this_line_data['specimen'] if specnum!=0: MagRec["er_sample_name"]=this_line_data['specimen'][:specnum] else: MagRec["er_sample_name"]=this_line_data['specimen'] if samp_con=="1": MagRec["er_site_name"]=MagRec["er_sample_name"][:-1] elif samp_con=="2": parts=MagRec["er_sample_name"].split('-') MagRec["er_site_name"]= parts[0] elif samp_con=="3": parts=MagRec["er_sample_name"].split('.') MagRec["er_site_name"]= parts[0] elif samp_con=='4': MagRec["er_site_name"]=MagRec["er_sample_name"][0:-Z] elif samp_con=='5': MagRec["er_site_name"]=MagRec["er_sample_name"] elif samp_con=='7': MagRec["er_site_name"]=MagRec["er_sample_name"][0:Z] else: MagRec["er_site_name"]=MagRec["er_sample_name"] # site=sample by default if er_location_name: MagRec['er_location_name']=er_location_name else: MagRec['er_location_name']=MagRec["er_site_name"] MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_magn_moment"]='%10.3e'% (float(this_line_data['moment_emu'])*1e-3) # moment in Am^2 (from emu) MagRec["measurement_dec"]=this_line_data['dec_core'] MagRec["measurement_inc"]=this_line_data['inc_core'] date=this_line_data['date'] hour=this_line_data['hour'] if float(date[2])>80: yyyy="19"+date[2] else: yyyy="20"+date[2] if len (date[0])==1: date[0]="0"+date[0] if len (date[1])==1: date[1]="0"+date[1] MagRec["measurement_date"]=":".join([yyyy,date[0],date[1],hour[0],hour[1],"00.00"]) MagRec["measurement_time_zone"]='JER' MagRec['er_analyst_mail_names'] =user MagRec["er_citation_names"]="This study" MagRec["magic_instrument_codes"]="HUJI-2G" MagRec["measurement_flag"]="g" MagRec["measurement_positions"]="1" MagRec["measurement_positions"]="1" MagRec["measurement_standard"]="u" MagRec["measurement_description"]="" #MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin #---------------------------------------- # AF demag # do not support AARM yet #---------------------------------------- if demag=="AF": treatment_type=this_line_data['treatment_type'] # demag in zero field if LPcode != "LP-AN-ARM": MagRec["treatment_ac_field"]='%8.3e' %(float(this_line_data['treatment'][0])*1e-3) # peak field in tesla MagRec["treatment_dc_field"]='0' MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' if treatment_type=="N": methcode="LP-DIR-AF:LT-NO" elif treatment_type=="A": methcode="LP-DIR-AF:LT-AF-Z" else: print "ERROR in treatment field line %i... exiting until you fix the problem" %line_no return False, "ERROR in treatment field line %i... exiting until you fix the problem" %line_no # AARM experiment else: print "Dont supprot AARM in HUJI format yet. sorry... do be DONE" MagRec["magic_method_codes"]=methcode MagRec["magic_experiment_name"]=specimen+ ":" + LPcode MagRec["measurement_number"]="%i"%i MagRec["measurement_description"]="" MagRecs.append(MagRec) #---------------------------------------- # Thermal: # Thellier experiment: "IZ", "ZI", "IZZI", pTRM checks # Thermal demag # Thermal cooling rate experiment # Thermal NLT #---------------------------------------- if demag=="T": treatment=this_line_data['treatment'] treatment_type=this_line_data['treatment_type'] #---------------------------------------- # Thellier experimet #---------------------------------------- if LPcode == "LP-PI-TRM" : # Thelllier experiment MagRec["magic_experiment_name"]=specimen+ ":" + LPcode methcode=LPcode if treatment_type=="N" or ( (treatment[1]=='0' or treatment[1]=='00') and float(treatment[0])==0): LT_code="LT-NO" MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' MagRec["treatment_dc_field"]='0' MagRec["treatment_temp"]='273.' elif treatment[1]=='0' or treatment[1]=='00': LT_code="LT-T-Z" MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' MagRec["treatment_dc_field"]='%8.3e'%(0) MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin # check if this is ZI or IZ: # check if the same temperature already measured: methcode="LP-PI-TRM:LP-PI-TRM-ZI" for j in range (0,i): if Data[specimen][j]['treatment'][0] == treatment[0]: if Data[specimen][j]['treatment'][1] == '1' or Data[specimen][j]['treatment'][1] == '10': methcode="LP-PI-TRM:LP-PI-TRM-IZ" else: methcode="LP-PI-TRM:LP-PI-TRM-ZI" elif treatment[1]=='1' or treatment[1]=='10': LT_code="LT-T-I" MagRec["treatment_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"]='%7.1f' % (phi) # labfield phi MagRec["treatment_dc_field_theta"]='%7.1f' % (theta) # labfield theta MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin # check if this is ZI or IZ: # check if the same temperature already measured: methcode="LP-PI-TRM:LP-PI-TRM-IZ" for j in range (0,i): if Data[specimen][j]['treatment'][0] == treatment[0]: if Data[specimen][j]['treatment'][1] == '0' or Data[specimen][j]['treatment'][1] == '00': methcode="LP-PI-TRM:LP-PI-TRM-ZI" else: methcode="LP-PI-TRM:LP-PI-TRM-IZ" elif treatment[1]=='2' or treatment[1]=='20': LT_code="LT-PTRM-I" MagRec["treatment_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"]='%7.1f' % (phi) # labfield phi MagRec["treatment_dc_field_theta"]='%7.1f' % (theta) # labfield theta MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin methcode="LP-PI-TRM:LP-PI-TRM-IZ" else: print "ERROR in treatment field line %i... exiting until you fix the problem" %line_no return False, "ERROR in treatment field line %i... exiting until you fix the problem" %line_no MagRec["magic_method_codes"]=LT_code+":"+methcode MagRec["measurement_number"]="%i"%i MagRec["measurement_description"]="" MagRecs.append(MagRec) #continue #---------------------------------------- # demag experimet #---------------------------------------- if LPcode == "LP-DIR-T" : MagRec["magic_experiment_name"]=specimen+ ":" + LPcode methcode=LPcode if treatment_type=="N": LT_code="LT-NO" else: LT_code="LT-T-Z" methcode=LPcode+":"+"LT-T-Z" MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' MagRec["treatment_dc_field"]='%8.3e'%(0) MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin MagRec["magic_method_codes"]=LT_code+":"+methcode MagRec["measurement_number"]="%i"%i MagRec["measurement_description"]="" MagRecs.append(MagRec) #continue #---------------------------------------- # ATRM measurements # The direction of the magnetization is used to determine the # direction of the lab field. #---------------------------------------- if LPcode =="LP-AN-TRM" : MagRec["magic_experiment_name"]=specimen+ ":" + LPcode methcode=LPcode if float(treatment[1])==0: MagRec["magic_method_codes"]="LP-AN-TRM:LT-T-Z" MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin MagRec["treatment_dc_field"]='0' else: if float(treatment[1])==7: # alteration check methcode="LP-AN-TRM:LT-PTRM-I" MagRec["measurement_number"]='7'# -z else: MagRec["magic_method_codes"]="LP-AN-TRM:LT-T-I" inc=float(MagRec["measurement_inc"]);dec=float(MagRec["measurement_dec"]) if abs(inc)<45 and (dec<45 or dec>315): # +x tdec,tinc=0,0 MagRec["measurement_number"]='1' if abs(inc)<45 and (dec<135 and dec>45): tdec,tinc=90,0 MagRec["measurement_number"]='2' # +y if inc>45 : tdec,tinc=0,90 MagRec["measurement_number"]='3' # +z if abs(inc)<45 and (dec<225 and dec>135): tdec,tinc=180,0 MagRec["measurement_number"]='4' # -x if abs(inc)<45 and (dec<315 and dec>225): tdec,tinc=270,0 MagRec["measurement_number"]='5'# -y if inc<-45 : tdec,tinc=0,-90 MagRec["measurement_number"]='6'# -z MagRec["treatment_dc_field_phi"]='%7.1f' %(tdec) MagRec["treatment_dc_field_theta"]='%7.1f'% (tinc) MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin MagRec["treatment_dc_field"]='%8.3e'%(labfield) MagRec["measurement_description"]="" MagRecs.append(MagRec) #continue #---------------------------------------- # NLT measurements # or TRM acquisistion experiment #---------------------------------------- if LPcode == "LP-TRM" : MagRec["magic_experiment_name"]=specimen+ ":" + LPcode MagRec["magic_method_codes"]="LP-TRM:LT-T-I" if float(treatment[1])==0: labfield=0 else: labfield=float(float(treatment[1]))*1e-6 MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin MagRec["treatment_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"]='%7.1f' % (phi) # labfield phi MagRec["treatment_dc_field_theta"]='%7.1f' % (theta) # labfield theta MagRec["measurement_number"]="%i"%i MagRec["measurement_description"]="" MagRecs.append(MagRec) #continue #---------------------------------------- # Cooling rate experiments #---------------------------------------- if LPcode =="LP-TRM-CR": index=int(treatment[1][0]) #print index,"index" #print CR_cooling_times,"CR_cooling_times" #print CR_cooling_times[index-1] #print CR_cooling_times[0:index-1] CR_cooling_time=CR_cooling_times[index-1] if CR_cooling_time in CR_cooling_times[0:index-1]: MagRec["magic_method_codes"]="LP-TRM-CR"+":" +"LT-PTRM-I" else: MagRec["magic_method_codes"]="LP-TRM-CR" MagRec["magic_experiment_name"]=specimen+ ":" + LPcode MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin MagRec["treatment_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"]='%7.1f' % (phi) # labfield phi MagRec["treatment_dc_field_theta"]='%7.1f' % (theta) # labfield theta MagRec["measurement_number"]="%i"%index MagRec["measurement_description"]="%i minutes cooling time"%int(CR_cooling_time) MagRecs.append(MagRec) #continue pmag.magic_write(meas_file,MagRecs,'magic_measurements') print "-I- results put in ",meas_file return True, meas_file
def main(): """ NAME zeq_magic_redo.py DESCRIPTION Calculate principal components through demagnetization data using bounds and calculation type stored in "redo" file SYNTAX zeq_magic_redo.py [command line options] OPTIONS -h prints help message -usr USER: identify user, default is "" -f: specify input file, default is magic_measurements.txt -F: specify output file, default is zeq_specimens.txt -fre REDO: specify redo file, default is "zeq_redo" -fsa SAMPFILE: specify er_samples format file, default is "er_samples.txt" -A : don't average replicate measurements, default is yes -crd [s,g,t] : specify coordinate system [s,g,t] [default is specimen coordinates] are specimen, geographic, and tilt corrected respectively NB: you must have a SAMPFILE in this directory to rotate from specimen coordinates -leg: attaches "Recalculated from original measurements; supercedes published results. " to comment field INPUTS zeq_redo format file is: specimen_name calculation_type[DE-BFL,DE-BFL-A,DE-BFL-O,DE-BFP,DE-FM] step_min step_max component_name[A,B,C] """ dir_path='.' INCL=["LT-NO","LT-AF-Z","LT-T-Z","LT-M-Z"] # looking for demag data beg,end,pole,geo,tilt,askave,save=0,0,[],0,0,0,0 user,doave,comment= "",1,"" geo,tilt=0,0 version_num=pmag.get_version() args=sys.argv if '-WD' in args: ind=args.index('-WD') dir_path=args[ind+1] meas_file,pmag_file,mk_file= dir_path+"/"+"magic_measurements.txt",dir_path+"/"+"zeq_specimens.txt",dir_path+"/"+"zeq_redo" samp_file,coord=dir_path+"/"+"er_samples.txt","" if "-h" in args: print(main.__doc__) sys.exit() if "-usr" in args: ind=args.index("-usr") user=sys.argv[ind+1] if "-A" in args:doave=0 if "-leg" in args: comment="Recalculated from original measurements; supercedes published results. " if "-f" in args: ind=args.index("-f") meas_file=dir_path+'/'+sys.argv[ind+1] if "-F" in args: ind=args.index("-F") pmag_file=dir_path+'/'+sys.argv[ind+1] if "-fre" in args: ind=args.index("-fre") mk_file=dir_path+"/"+args[ind+1] try: mk_f=open(mk_file,'r') except: print("Bad redo file") sys.exit() mkspec,skipped=[],[] speclist=[] for line in mk_f.readlines(): tmp=line.split() mkspec.append(tmp) speclist.append(tmp[0]) if "-fsa" in args: ind=args.index("-fsa") samp_file=dir_path+'/'+sys.argv[ind+1] if "-crd" in args: ind=args.index("-crd") coord=sys.argv[ind+1] if coord=="g":geo,tilt=1,0 if coord=="t":geo,tilt=1,1 # # now get down to bidness if geo==1: samp_data,file_type=pmag.magic_read(samp_file) if file_type != 'er_samples': print(file_type) print("This is not a valid er_samples file ") sys.exit() # # # meas_data,file_type=pmag.magic_read(meas_file) if file_type != 'magic_measurements': print(file_type) print(file_type,"This is not a valid magic_measurements file ") sys.exit() # # sort the specimen names # k = 0 print('Processing ',len(speclist), ' specimens - please wait') PmagSpecs=[] while k < len(speclist): s=speclist[k] recnum=0 PmagSpecRec={} method_codes,inst_codes=[],[] # find the data from the meas_data file for this sample # # collect info for the PmagSpecRec dictionary # meas_meth=[] spec=pmag.get_dictitem(meas_data,'er_specimen_name',s,'T') if len(spec)==0: print('no data found for specimen: ',s) print('delete from zeq_redo input file...., then try again') else: for rec in spec: # copy of vital stats to PmagSpecRec from first spec record in demag block skip=1 methods=rec["magic_method_codes"].split(":") if len(set(methods) & set(INCL))>0: PmagSpecRec["er_analyst_mail_names"]=user PmagSpecRec["magic_software_packages"]=version_num PmagSpecRec["er_specimen_name"]=s PmagSpecRec["er_sample_name"]=rec["er_sample_name"] PmagSpecRec["er_site_name"]=rec["er_site_name"] PmagSpecRec["er_location_name"]=rec["er_location_name"] if "er_expedition_name" in list(rec.keys()):PmagSpecRec["er_expedition_name"]=rec["er_expedition_name"] PmagSpecRec["er_citation_names"]="This study" if "magic_experiment_name" not in list(rec.keys()): rec["magic_experiment_name"]="" PmagSpecRec["magic_experiment_names"]=rec["magic_experiment_name"] if "magic_instrument_codes" not in list(rec.keys()): rec["magic_instrument_codes"]="" inst=rec['magic_instrument_codes'].split(":") for I in inst: if I not in inst_codes: # copy over instruments inst_codes.append(I) meths=rec["magic_method_codes"].split(":") for meth in meths: if meth.strip() not in meas_meth:meas_meth.append(meth) if "LP-DIR-AF" in meas_meth or "LT-AF-Z" in meas_meth: PmagSpecRec["measurement_step_unit"]="T" if "LP-DIR-AF" not in method_codes:method_codes.append("LP-DIR-AF") if "LP-DIR-T" in meas_meth or "LT-T-Z" in meas_meth: PmagSpecRec["measurement_step_unit"]="K" if "LP-DIR-T" not in method_codes:method_codes.append("LP-DIR-T") if "LP-DIR-M" in meas_meth or "LT-M-Z" in meas_meth: PmagSpecRec["measurement_step_unit"]="J" if "LP-DIR-M" not in method_codes:method_codes.append("LP-DIR-M") # # datablock,units=pmag.find_dmag_rec(s,spec) # fish out the demag data for this specimen # if len(datablock) <2 or s not in speclist : k+=1 # print 'skipping ', s,len(datablock) else: # # find replicate measurements at given treatment step and average them # # step_meth,avedata=pmag.vspec(data) # # if len(avedata) != len(datablock): # if doave==1: # method_codes.append("DE-VM") # datablock=avedata # # do geo or stratigraphic correction now # if geo==1 or tilt==1: # find top priority orientation method orient,az_type=pmag.get_orient(samp_data,PmagSpecRec["er_sample_name"]) if az_type not in method_codes:method_codes.append(az_type) # # if tilt selected, get stratigraphic correction # tiltblock,geoblock=[],[] for rec in datablock: if "sample_azimuth" in list(orient.keys()) and orient["sample_azimuth"]!="": d_geo,i_geo=pmag.dogeo(rec[1],rec[2],float(orient["sample_azimuth"]),float(orient["sample_dip"])) geoblock.append([rec[0],d_geo,i_geo,rec[3],rec[4],rec[5]]) if tilt==1 and "sample_bed_dip_direction" in list(orient.keys()): d_tilt,i_tilt=pmag.dotilt(d_geo,i_geo,float(orient["sample_bed_dip_direction"]),float(orient["sample_bed_dip"])) tiltblock.append([rec[0],d_tilt,i_tilt,rec[3],rec[4],rec[5]]) elif tilt==1: if PmagSpecRec["er_sample_name"] not in skipped: print('no tilt correction for ', PmagSpecRec["er_sample_name"],' skipping....') skipped.append(PmagSpecRec["er_sample_name"]) else: if PmagSpecRec["er_sample_name"] not in skipped: print('no geographic correction for ', PmagSpecRec["er_sample_name"],' skipping....') skipped.append(PmagSpecRec["er_sample_name"]) # # get beg_pca, end_pca, pca if PmagSpecRec['er_sample_name'] not in skipped: compnum=-1 for spec in mkspec: if spec[0]==s: CompRec={} for key in list(PmagSpecRec.keys()):CompRec[key]=PmagSpecRec[key] compnum+=1 calculation_type=spec[1] beg=float(spec[2]) end=float(spec[3]) if len(spec)>4: comp_name=spec[4] else: comp_name=string.uppercase[compnum] CompRec['specimen_comp_name']=comp_name if beg < float(datablock[0][0]):beg=float(datablock[0][0]) if end > float(datablock[-1][0]):end=float(datablock[-1][0]) for l in range(len(datablock)): if datablock[l][0]==beg:beg_pca=l if datablock[l][0]==end:end_pca=l if geo==1 and tilt==0: mpars=pmag.domean(geoblock,beg_pca,end_pca,calculation_type) if mpars["specimen_direction_type"]!="Error": CompRec["specimen_dec"]='%7.1f ' %(mpars["specimen_dec"]) CompRec["specimen_inc"]='%7.1f ' %(mpars["specimen_inc"]) CompRec["specimen_tilt_correction"]='0' if geo==1 and tilt==1: mpars=pmag.domean(tiltblock,beg_pca,end_pca,calculation_type) if mpars["specimen_direction_type"]!="Error": CompRec["specimen_dec"]='%7.1f ' %(mpars["specimen_dec"]) CompRec["specimen_inc"]='%7.1f ' %(mpars["specimen_inc"]) CompRec["specimen_tilt_correction"]='100' if geo==0 and tilt==0: mpars=pmag.domean(datablock,beg_pca,end_pca,calculation_type) if mpars["specimen_direction_type"]!="Error": CompRec["specimen_dec"]='%7.1f ' %(mpars["specimen_dec"]) CompRec["specimen_inc"]='%7.1f ' %(mpars["specimen_inc"]) CompRec["specimen_tilt_correction"]='-1' if mpars["specimen_direction_type"]=="Error": pass else: CompRec["measurement_step_min"]='%8.3e '%(datablock[beg_pca][0]) try: CompRec["measurement_step_max"]='%8.3e '%(datablock[end_pca][0] ) except: print('error in end_pca ',PmagSpecRec['er_specimen_name']) CompRec["specimen_correction"]='u' if calculation_type!='DE-FM': CompRec["specimen_mad"]='%7.1f '%(mpars["specimen_mad"]) CompRec["specimen_alpha95"]="" else: CompRec["specimen_mad"]="" CompRec["specimen_alpha95"]='%7.1f '%(mpars["specimen_alpha95"]) CompRec["specimen_n"]='%i '%(mpars["specimen_n"]) CompRec["specimen_dang"]='%7.1f '%(mpars["specimen_dang"]) CompMeths=[] for meth in method_codes: if meth not in CompMeths:CompMeths.append(meth) if calculation_type not in CompMeths:CompMeths.append(calculation_type) if geo==1: CompMeths.append("DA-DIR-GEO") if tilt==1: CompMeths.append("DA-DIR-TILT") if "DE-BFP" not in calculation_type: CompRec["specimen_direction_type"]='l' else: CompRec["specimen_direction_type"]='p' CompRec["magic_method_codes"]="" if len(CompMeths) != 0: methstring="" for meth in CompMeths: methstring=methstring+ ":" +meth CompRec["magic_method_codes"]=methstring.strip(':') CompRec["specimen_description"]=comment if len(inst_codes) != 0: inststring="" for inst in inst_codes: inststring=inststring+ ":" +inst CompRec["magic_instrument_codes"]=inststring.strip(':') PmagSpecs.append(CompRec) k+=1 pmag.magic_write(pmag_file,PmagSpecs,'pmag_specimens') print("Recalculated specimen data stored in ",pmag_file)
def main(): """ NAME zeq_magic.py DESCRIPTION reads in magic_measurements formatted file, makes plots of remanence decay during demagnetization experiments. Reads in prior interpretations saved in a pmag_specimens formatted file and allows re-interpretations of best-fit lines and planes and saves (revised or new) interpretations in a pmag_specimens file. interpretations are saved in the coordinate system used. Also allows judicious editting of measurements to eliminate "bad" measurements. These are marked as such in the magic_measurements input file. they are NOT deleted, just ignored. SYNTAX zeq_magic.py [command line options] OPTIONS -h prints help message and quits -f MEASFILE: sets magic_measurements format input file, default: magic_measurements.txt -fsp SPECFILE: sets pmag_specimens format file with prior interpreations, default: zeq_specimens.txt -Fp PLTFILE: sets filename for saved plot, default is name_type.fmt (where type is zijd, eqarea or decay curve) -crd [s,g,t]: sets coordinate system, g=geographic, t=tilt adjusted, default: specimen coordinate system -fsa SAMPFILE: sets er_samples format file with orientation information, default: er_samples.txt -spc SPEC plots single specimen SPEC, saves plot with specified format with optional -dir settings and quits -dir [L,P,F][beg][end]: sets calculation type for principal component analysis, default is none beg: starting step for PCA calculation end: ending step for PCA calculation [L,P,F]: calculation type for line, plane or fisher mean must be used with -spc option -fmt FMT: set format of saved plot [png,svg,jpg] -A: suppresses averaging of replicate measurements, default is to average -sav: saves all plots without review SCREEN OUTPUT: Specimen, N, a95, StepMin, StepMax, Dec, Inc, calculation type """ # initialize some variables doave,e,b=1,0,0 # average replicates, initial end and beginning step plots,coord=0,'s' noorient=0 version_num=pmag.get_version() verbose=pmagplotlib.verbose beg_pca,end_pca,direction_type="","",'l' calculation_type,fmt="","svg" user,spec_keys,locname="",[],'' plot_file="" sfile="" plot_file="" PriorRecs=[] # empty list for prior interpretations backup=0 specimen="" # can skip everything and just plot one specimen with bounds e,b if '-h' in sys.argv: print main.__doc__ sys.exit() if '-WD' in sys.argv: ind=sys.argv.index('-WD') dir_path=sys.argv[ind+1] else: dir_path='.' inspec=dir_path+'/'+'zeq_specimens.txt' meas_file,geo,tilt,ask,samp_file=dir_path+'/magic_measurements.txt',0,0,0,dir_path+'/er_samples.txt' if '-f' in sys.argv: ind=sys.argv.index('-f') meas_file=dir_path+'/'+sys.argv[ind+1] if '-fsp' in sys.argv: ind=sys.argv.index('-fsp') inspec=dir_path+'/'+sys.argv[ind+1] if '-fsa' in sys.argv: ind=sys.argv.index('-fsa') samp_file=dir_path+'/'+sys.argv[ind+1] sfile='ok' if '-crd' in sys.argv: ind=sys.argv.index('-crd') coord=sys.argv[ind+1] if coord=='g' or coord=='t': samp_data,file_type=pmag.magic_read(samp_file) if file_type=='er_samples':sfile='ok' geo=1 if coord=='t':tilt=1 if '-spc' in sys.argv: ind=sys.argv.index('-spc') specimen=sys.argv[ind+1] if '-dir' in sys.argv: ind=sys.argv.index('-dir') direction_type=sys.argv[ind+1] beg_pca=int(sys.argv[ind+2]) end_pca=int(sys.argv[ind+3]) if direction_type=='L':calculation_type='DE-BFL' if direction_type=='P':calculation_type='DE-BFP' if direction_type=='F':calculation_type='DE-FM' if '-Fp' in sys.argv: ind=sys.argv.index('-Fp') plot_file=dir_path+'/'+sys.argv[ind+1] if '-A' in sys.argv: doave=0 if '-sav' in sys.argv: plots=1 verbose=0 if '-fmt' in sys.argv: ind=sys.argv.index('-fmt') fmt=sys.argv[ind+1] # first_save=1 meas_data,file_type=pmag.magic_read(meas_file) changeM,changeS=0,0 # check if data or interpretations have changed if file_type != 'magic_measurements': print file_type print file_type,"This is not a valid magic_measurements file " sys.exit() for rec in meas_data: if "magic_method_codes" not in rec.keys(): rec["magic_method_codes"]="" methods="" tmp=rec["magic_method_codes"].replace(" ","").split(":") for meth in tmp: methods=methods+meth+":" rec["magic_method_codes"]=methods[:-1] # get rid of annoying spaces in Anthony's export files if "magic_instrument_codes" not in rec.keys() :rec["magic_instrument_codes"]="" PriorSpecs=[] PriorRecs,file_type=pmag.magic_read(inspec) if len(PriorRecs)==0: if verbose:print "starting new file ",inspec for Rec in PriorRecs: if 'magic_software_packages' not in Rec.keys():Rec['magic_software_packages']="" if Rec['er_specimen_name'] not in PriorSpecs: if 'specimen_comp_name' not in Rec.keys():Rec['specimen_comp_name']="A" PriorSpecs.append(Rec['er_specimen_name']) else: if 'specimen_comp_name' not in Rec.keys():Rec['specimen_comp_name']="A" if "magic_method_codes" in Rec.keys(): methods=[] tmp=Rec["magic_method_codes"].replace(" ","").split(":") for meth in tmp: methods.append(meth) if 'DE-FM' in methods: Rec['calculation_type']='DE-FM' # this won't be imported but helps if 'DE-BFL' in methods: Rec['calculation_type']='DE-BFL' if 'DE-BFL-A' in methods: Rec['calculation_type']='DE-BFL-A' if 'DE-BFL-O' in methods: Rec['calculation_type']='DE-BFL-O' if 'DE-BFP' in methods: Rec['calculation_type']='DE-BFP' else: Rec['calculation_type']='DE-BFL' # default is to assume a best-fit line # # get list of unique specimen names # sids=pmag.get_specs(meas_data) # # set up plots, angle sets X axis to horizontal, direction_type 'l' is best-fit line # direction_type='p' is great circle # # # draw plots for sample s - default is just to step through zijderveld diagrams # # # define figure numbers for equal area, zijderveld, # and intensity vs. demagnetiztion step respectively ZED={} ZED['eqarea'],ZED['zijd'], ZED['demag']=1,2,3 pmagplotlib.plot_init(ZED['eqarea'],5,5) pmagplotlib.plot_init(ZED['zijd'],6,5) pmagplotlib.plot_init(ZED['demag'],5,5) save_pca=0 if specimen=="": k = 0 else: k=sids.index(specimen) angle,direction_type="","" setangle=0 CurrRecs=[] while k < len(sids): CurrRecs=[] if setangle==0:angle="" method_codes,inst_code=[],"" s=sids[k] PmagSpecRec={} PmagSpecRec["er_analyst_mail_names"]=user PmagSpecRec['magic_software_packages']=version_num PmagSpecRec['specimen_description']="" PmagSpecRec['magic_method_codes']="" if verbose and s!="":print s, k , 'out of ',len(sids) # # collect info for the PmagSpecRec dictionary # s_meas=pmag.get_dictitem(meas_data,'er_specimen_name',s,'T') # fish out this specimen s_meas=pmag.get_dictitem(s_meas,'magic_method_codes','Z','has') # fish out zero field steps if len(s_meas)>0: for rec in s_meas: # fix up a few things for the output record PmagSpecRec["magic_instrument_codes"]=rec["magic_instrument_codes"] # copy over instruments PmagSpecRec["er_citation_names"]="This study" PmagSpecRec["er_specimen_name"]=s PmagSpecRec["er_sample_name"]=rec["er_sample_name"] PmagSpecRec["er_site_name"]=rec["er_site_name"] PmagSpecRec["er_location_name"]=rec["er_location_name"] locname=rec['er_location_name'] if 'er_expedition_name' in rec.keys(): PmagSpecRec["er_expedition_name"]=rec["er_expedition_name"] PmagSpecRec["magic_method_codes"]=rec["magic_method_codes"] if "magic_experiment_name" not in rec.keys(): PmagSpecRec["magic_experiment_names"]="" else: PmagSpecRec["magic_experiment_names"]=rec["magic_experiment_name"] break # # find the data from the meas_data file for this specimen # data,units=pmag.find_dmag_rec(s,meas_data) PmagSpecRec["measurement_step_unit"]= units u=units.split(":") if "T" in units:PmagSpecRec["magic_method_codes"]=PmagSpecRec["magic_method_codes"]+":LP-DIR-AF" if "K" in units:PmagSpecRec["magic_method_codes"]=PmagSpecRec["magic_method_codes"]+":LP-DIR-T" if "J" in units:PmagSpecRec["magic_method_codes"]=PmagSpecRec["magic_method_codes"]+":LP-DIR-M" # # find prior interpretation # if len(CurrRecs)==0: # check if already in beg_pca,end_pca="","" calculation_type="" if inspec !="": if verbose: print " looking up previous interpretations..." precs=pmag.get_dictitem(PriorRecs,'er_specimen_name',s,'T') # get all the prior recs with this specimen name precs=pmag.get_dictitem(precs,'magic_method_codes','LP-DIR','has') # get the directional data PriorRecs=pmag.get_dictitem(PriorRecs,'er_specimen_name',s,'F') # take them all out of prior recs # get the ones that meet the current coordinate system for prec in precs: if 'specimen_tilt_correction' not in prec.keys() or prec['specimen_tilt_correction']=='-1': crd='s' elif prec['specimen_tilt_correction']=='0': crd='g' elif prec['specimen_tilt_correction']=='100': crd='t' else: crd='?' CurrRec={} for key in prec.keys():CurrRec[key]=prec[key] CurrRecs.append(CurrRec) # put in CurrRecs method_codes= CurrRec["magic_method_codes"].replace(" ","").split(':') calculation_type='DE-BFL' if 'DE-FM' in method_codes: calculation_type='DE-FM' if 'DE-BFP' in method_codes: calculation_type='DE-BFP' if 'DE-BFL-A' in method_codes: calculation_type='DE-BFL-A' if 'specimen_dang' not in CurrRec.keys(): if verbose:print 'Run mk_redo.py and zeq_magic_redo.py to get the specimen_dang values' CurrRec['specimen_dang']=-1 if calculation_type!='DE-FM' and crd==coord: # not a fisher mean if verbose:print "Specimen N MAD DANG start end dec inc type component coordinates" if units=='K': if verbose:print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s %s %s \n' % (CurrRec["er_specimen_name"],int(CurrRec["specimen_n"]),float(CurrRec["specimen_mad"]),float(CurrRec["specimen_dang"]),float(CurrRec["measurement_step_min"])-273,float(CurrRec["measurement_step_max"])-273,float(CurrRec["specimen_dec"]),float(CurrRec["specimen_inc"]),calculation_type,CurrRec['specimen_comp_name'],crd) elif units=='T': if verbose:print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s %s %s \n' % (CurrRec["er_specimen_name"],int(CurrRec["specimen_n"]),float(CurrRec["specimen_mad"]),float(CurrRec["specimen_dang"]),float(CurrRec["measurement_step_min"])*1e3,float(CurrRec["measurement_step_max"])*1e3,float(CurrRec["specimen_dec"]),float(CurrRec["specimen_inc"]),calculation_type,CurrRec['specimen_comp_name'],crd) elif 'T' in units and 'K' in units: if float(CurrRec['measurement_step_min'])<1.0 : min=float(CurrRec['measurement_step_min'])*1e3 else: min=float(CurrRec['measurement_step_min'])-273 if float(CurrRec['measurement_step_max'])<1.0 : max=float(CurrRec['measurement_step_max'])*1e3 else: max=float(CurrRec['measurement_step_max'])-273 if verbose:print '%s %i %7.1f %i %i %7.1f %7.1f %7.1f, %s %s\n' % (CurrRec["er_specimen_name"],int(CurrRec["specimen_n"]),float(CurrRec["specimen_mad"]),float(CurrRec['specimen_dang']),min,max,float(CurrRec["specimen_dec"]),float(CurrRec["specimen_inc"]),calculation_type,crd) elif 'J' in units: if verbose:print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s %s %s \n' % (CurrRec["er_specimen_name"],int(CurrRec["specimen_n"]),float(CurrRec["specimen_mad"]),float(CurrRec['specimen_dang']),float(CurrRec["measurement_step_min"]),float(CurrRec["measurement_step_max"]),float(CurrRec["specimen_dec"]),float(CurrRec["specimen_inc"]),calculation_type,CurrRec['specimen_comp_name'],crd) elif calculation_type=='DE-FM' and crd==coord: # fisher mean if verbose:print "Specimen a95 DANG start end dec inc type component coordinates" if units=='K': if verbose:print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %s %s %s \n' % (CurrRec["er_specimen_name"],int(CurrRec["specimen_n"]),float(CurrRec["specimen_alpha95"]),float(CurrRec["measurement_step_min"])-273,float(CurrRec["measurement_step_max"])-273,float(CurrRec["specimen_dec"]),float(CurrRec["specimen_inc"]),calculation_type,CurrRec['specimen_comp_name'],crd) elif units=='T': if verbose:print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %s %s %s \n' % (CurrRec["er_specimen_name"],int(CurrRec["specimen_n"]),float(CurrRec["specimen_alpha95"]),float(CurrRec["measurement_step_min"])*1e3,float(CurrRec["measurement_step_max"])*1e3,float(CurrRec["specimen_dec"]),float(CurrRec["specimen_inc"]),calculation_type,CurrRec['specimen_comp_name'],crd) elif 'T' in units and 'K' in units: if float(CurrRec['measurement_step_min'])<1.0 : min=float(CurrRec['measurement_step_min'])*1e3 else: min=float(CurrRec['measurement_step_min'])-273 if float(CurrRec['measurement_step_max'])<1.0 : max=float(CurrRec['measurement_step_max'])*1e3 else: max=float(CurrRec['measurement_step_max'])-273 if verbose:print '%s %i %7.1f %i %i %7.1f %7.1f %s %s \n' % (CurrRec["er_specimen_name"],int(CurrRec["specimen_n"]),float(CurrRec["specimen_alpha95"]),min,max,float(CurrRec["specimen_dec"]),float(CurrRec["specimen_inc"]),calculation_type,crd) elif 'J' in units: if verbose:print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %s %s %s \n' % (CurrRec["er_specimen_name"],int(CurrRec["specimen_n"]),float(CurrRec["specimen_mad"]),float(CurrRec["measurement_step_min"]),float(CurrRec["measurement_step_max"]),float(CurrRec["specimen_dec"]),float(CurrRec["specimen_inc"]),calculation_type,CurrRec['specimen_comp_name'],crd) if len(CurrRecs)==0:beg_pca,end_pca="","" datablock=data noskip=1 if len(datablock) <3: noskip=0 if backup==0: k+=1 else: k-=1 if len(CurrRecs)>0: for rec in CurrRecs: PriorRecs.append(rec) CurrRecs=[] else: backup=0 if noskip: # # find replicate measurements at given treatment step and average them # # step_meth,avedata=pmag.vspec(data) # if len(avedata) != len(datablock): # if doave==1: # method_codes.append("DE-VM") # datablock=avedata # # # do geo or stratigraphic correction now # if geo==1: # # find top priority orientation method orient,az_type=pmag.get_orient(samp_data,PmagSpecRec["er_sample_name"]) if az_type=='SO-NO': if verbose: print "no orientation data for ",s orient["sample_azimuth"]=0 orient["sample_dip"]=0 noorient=1 method_codes.append("SO-NO") orient["sample_azimuth"]=0 orient["sample_dip"]=0 orient["sample_bed_dip_azimuth"]=0 orient["sample_bed_dip"]=0 noorient=1 method_codes.append("SO-NO") else: noorient=0 # # if stratigraphic selected, get stratigraphic correction # tiltblock,geoblock=[],[] for rec in datablock: d_geo,i_geo=pmag.dogeo(rec[1],rec[2],float(orient["sample_azimuth"]),float(orient["sample_dip"])) geoblock.append([rec[0],d_geo,i_geo,rec[3],rec[4],rec[5],rec[6]]) if tilt==1 and "sample_bed_dip" in orient.keys() and float(orient['sample_bed_dip'])!=0: d_tilt,i_tilt=pmag.dotilt(d_geo,i_geo,float(orient["sample_bed_dip_direction"]),float(orient["sample_bed_dip"])) tiltblock.append([rec[0],d_tilt,i_tilt,rec[3],rec[4],rec[5],rec[6]]) if tilt==1: plotblock=tiltblock if geo==1 and tilt==0:plotblock=geoblock if geo==0 and tilt==0: plotblock=datablock # # set the end pca point to last point if not set if e==0 or e>len(plotblock)-1: e=len(plotblock)-1 if angle=="": angle=plotblock[0][1] # rotate to NRM declination title=s+'_s' if geo==1 and tilt==0 and noorient!=1:title=s+'_g' if tilt==1 and noorient!=1:title=s+'_t' pmagplotlib.plotZED(ZED,plotblock,angle,title,units) if verbose:pmagplotlib.drawFIGS(ZED) if len(CurrRecs)!=0: for prec in CurrRecs: if 'calculation_type' not in prec.keys(): calculation_type='' else: calculation_type=prec["calculation_type"] direction_type=prec["specimen_direction_type"] if calculation_type !="": beg_pca,end_pca="","" for j in range(len(datablock)): if data[j][0]==float(prec["measurement_step_min"]):beg_pca=j if data[j][0]==float(prec["measurement_step_max"]):end_pca=j if beg_pca=="" or end_pca=="": if verbose: print "something wrong with prior interpretation " break if calculation_type!="": if beg_pca=="":beg_pca=0 if end_pca=="":end_pca=len(plotblock)-1 if geo==1 and tilt==0: mpars=pmag.domean(geoblock,beg_pca,end_pca,calculation_type) if mpars["specimen_direction_type"]!="Error": pmagplotlib.plotDir(ZED,mpars,geoblock,angle) if verbose:pmagplotlib.drawFIGS(ZED) if geo==1 and tilt==1: mpars=pmag.domean(tiltblock,beg_pca,end_pca,calculation_type) if mpars["specimen_direction_type"]!="Error": pmagplotlib.plotDir(ZED,mpars,tiltblock,angle) if verbose:pmagplotlib.drawFIGS(ZED) if geo==0 and tilt==0: mpars=pmag.domean(datablock,beg_pca,end_pca,calculation_type) if mpars["specimen_direction_type"]!="Error": pmagplotlib.plotDir(ZED,mpars,plotblock,angle) if verbose:pmagplotlib.drawFIGS(ZED) # # print out data for this sample to screen # recnum=0 for plotrec in plotblock: if units=='T' and verbose: print '%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum,plotrec[0]*1e3," mT",plotrec[3],plotrec[1],plotrec[2],plotrec[6]) if units=="K" and verbose: print '%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum,plotrec[0]-273,' C',plotrec[3],plotrec[1],plotrec[2],plotrec[6]) if units=="J" and verbose: print '%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum,plotrec[0],' J',plotrec[3],plotrec[1],plotrec[2],plotrec[6]) if 'K' in units and 'T' in units: if plotrec[0]>=1. and verbose: print '%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum,plotrec[0]-273,' C',plotrec[3],plotrec[1],plotrec[2],plotrec[6]) if plotrec[0]<1. and verbose: print '%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum,plotrec[0]*1e3," mT",plotrec[3],plotrec[1],plotrec[2],plotrec[6]) recnum += 1 if specimen!="": if plot_file=="": basename=locname+'_'+s else: basename=plot_file files={} for key in ZED.keys(): files[key]=basename+'_'+key+'.'+fmt pmagplotlib.saveP(ZED,files) sys.exit() else: # interactive if plots==0: ans='b' k+=1 changeS=0 while ans != "": if len(CurrRecs)==0: print """ g/b: indicates good/bad measurement. "bad" measurements excluded from calculation set s[a]ve plot, [b]ounds for pca and calculate, [p]revious, [s]pecimen, change [h]orizontal projection angle, change [c]oordinate systems, [e]dit data, [q]uit: """ else: print """ g/b: indicates good/bad measurement. "bad" measurements excluded from calculation set s[a]ve plot, [b]ounds for pca and calculate, [p]revious, [s]pecimen, change [h]orizontal projection angle, change [c]oordinate systems, [d]elete current interpretation(s), [e]dit data, [q]uit: """ ans=raw_input('<Return> for next specimen \n') setangle=0 if ans=='d': # delete this interpretation CurrRecs=[] k-=1 # replot same specimen ans="" changeS=1 if ans=='q': if changeM==1: ans=raw_input('Save changes to magic_measurements.txt? y/[n] ') if ans=='y': pmag.magic_write(meas_file,meas_data,'magic_measurements') print "Good bye" sys.exit() if ans=='a': if plot_file=="": basename=locname+'_'+s+'_' else: basename=plot_file files={} for key in ZED.keys(): files[key]=basename+'_'+coord+'_'+key+'.'+fmt pmagplotlib.saveP(ZED,files) ans="" if ans=='p': k-=2 ans="" backup=1 if ans=='c': k-=1 # replot same block if tilt==0 and geo ==1:print "You are currently viewing geographic coordinates " if tilt==1 and geo ==1:print "You are currently viewing stratigraphic coordinates " if tilt==0 and geo ==0: print "You are currently viewing sample coordinates " print "\n Which coordinate system do you wish to view? " coord=raw_input(" <Return> specimen, [g] geographic, [t] tilt corrected ") if coord=="g":geo,tilt=1,0 if coord=="t": geo=1 tilt=1 if coord=="": coord='s' geo=0 tilt=0 if geo==1 and sfile=="": samp_file=raw_input(" Input er_samples file for sample orientations [er_samples.txt] " ) if samp_file=="":samp_file="er_samples.txt" samp_data,file_type=pmag.magic_read(samp_file) if file_type != 'er_samples': print file_type print "This is not a valid er_samples file - coordinate system not changed" else: sfile="ok" ans="" if ans=='s': keepon=1 sample=raw_input('Enter desired specimen name (or first part there of): ') while keepon==1: try: k =sids.index(sample) keepon=0 except: tmplist=[] for qq in range(len(sids)): if sample in sids[qq]:tmplist.append(sids[qq]) print sample," not found, but this was: " print tmplist sample=raw_input('Select one or try again\n ') angle,direction_type="","" setangle=0 ans="" if ans=='h': k-=1 angle=raw_input("Enter desired declination for X axis 0-360 ") angle=float(angle) if angle==0:angle=0.001 s=sids[k] setangle=1 ans="" if ans=='e': k-=1 ans="" recnum=0 for plotrec in plotblock: if plotrec[0]<=200 and verbose: print '%s: %i %7.1f %s %8.3e %7.1f %7.1f ' % (plotrec[5], recnum,plotrec[0]*1e3," mT",plotrec[3],plotrec[1],plotrec[2]) if plotrec[0]>200 and verbose: print '%s: %i %7.1f %s %8.3e %7.1f %7.1f ' % (plotrec[5], recnum,plotrec[0]-273,' C',plotrec[3],plotrec[1],plotrec[2]) recnum += 1 answer=raw_input('Enter index of point to change from bad to good or vice versa: ') try: ind=int(answer) meas_data=pmag.mark_dmag_rec(s,ind,meas_data) changeM=1 except: 'bad entry, try again' if ans=='b': if end_pca=="":end_pca=len(plotblock)-1 if beg_pca=="":beg_pca=0 k-=1 # stay on same sample until through GoOn=0 while GoOn==0: print 'Enter index of first point for pca: ','[',beg_pca,']' answer=raw_input('return to keep default ') if answer != "": beg_pca=int(answer) print 'Enter index of last point for pca: ','[',end_pca,']' answer=raw_input('return to keep default ') try: end_pca=int(answer) if plotblock[beg_pca][5]=='b' or plotblock[end_pca][5]=='b': print "Can't select 'bad' measurement for PCA bounds -try again" end_pca=len(plotblock)-1 beg_pca=0 elif beg_pca >=0 and beg_pca<=len(plotblock)-2 and end_pca>0 and end_pca<len(plotblock): GoOn=1 else: print beg_pca,end_pca, " are bad entry of indices - try again" end_pca=len(plotblock)-1 beg_pca=0 except: print beg_pca,end_pca, " are bad entry of indices - try again" end_pca=len(plotblock)-1 beg_pca=0 GoOn=0 while GoOn==0: if calculation_type!="": print "Prior calculation type = ",calculation_type ct=raw_input('Enter new Calculation Type: best-fit line, plane or fisher mean [l]/p/f : ' ) if ct=="" or ct=="l": direction_type="l" calculation_type="DE-BFL" GoOn=1 elif ct=='p': direction_type="p" calculation_type="DE-BFP" GoOn=1 elif ct=='f': direction_type="l" calculation_type="DE-FM" GoOn=1 else: print "bad entry of calculation type: try again. " pmagplotlib.plotZED(ZED,plotblock,angle,s,units) if verbose:pmagplotlib.drawFIGS(ZED) if geo==1 and tilt==0: mpars=pmag.domean(geoblock,beg_pca,end_pca,calculation_type) if mpars['specimen_direction_type']=='Error':break PmagSpecRec["specimen_dec"]='%7.1f ' %(mpars["specimen_dec"]) PmagSpecRec["specimen_inc"]='%7.1f ' %(mpars["specimen_inc"]) if "SO-NO" not in method_codes: PmagSpecRec["specimen_tilt_correction"]='0' method_codes.append("DA-DIR-GEO") else: PmagSpecRec["specimen_tilt_correction"]='-1' pmagplotlib.plotDir(ZED,mpars,geoblock,angle) if verbose:pmagplotlib.drawFIGS(ZED) if geo==1 and tilt==1: mpars=pmag.domean(tiltblock,beg_pca,end_pca,calculation_type) if mpars['specimen_direction_type']=='Error':break PmagSpecRec["specimen_dec"]='%7.1f ' %(mpars["specimen_dec"]) PmagSpecRec["specimen_inc"]='%7.1f ' %(mpars["specimen_inc"]) if "SO-NO" not in method_codes: PmagSpecRec["specimen_tilt_correction"]='100' method_codes.append("DA-DIR-TILT") else: PmagSpecRec["specimen_tilt_correction"]='-1' pmagplotlib.plotDir(ZED,mpars,tiltblock,angle) if verbose:pmagplotlib.drawFIGS(ZED) if geo==0 and tilt==0: mpars=pmag.domean(datablock,beg_pca,end_pca,calculation_type) if mpars['specimen_direction_type']=='Error':break PmagSpecRec["specimen_dec"]='%7.1f ' %(mpars["specimen_dec"]) PmagSpecRec["specimen_inc"]='%7.1f ' %(mpars["specimen_inc"]) PmagSpecRec["specimen_tilt_correction"]='-1' pmagplotlib.plotDir(ZED,mpars,plotblock,angle) if verbose:pmagplotlib.drawFIGS(ZED) PmagSpecRec["measurement_step_min"]='%8.3e ' %(mpars["measurement_step_min"]) PmagSpecRec["measurement_step_max"]='%8.3e ' %(mpars["measurement_step_max"]) PmagSpecRec["specimen_correction"]='u' PmagSpecRec["specimen_dang"]='%7.1f ' %(mpars['specimen_dang']) print 'DANG: ',PmagSpecRec["specimen_dang"] if calculation_type!='DE-FM': PmagSpecRec["specimen_mad"]='%7.1f ' %(mpars["specimen_mad"]) PmagSpecRec["specimen_alpha95"]="" else: PmagSpecRec["specimen_alpha95"]='%7.1f ' %(mpars["specimen_alpha95"]) PmagSpecRec["specimen_mad"]="" PmagSpecRec["specimen_n"]='%i ' %(mpars["specimen_n"]) PmagSpecRec["specimen_direction_type"]=direction_type PmagSpecRec["calculation_type"]=calculation_type # redundant and won't be imported - just for convenience method_codes=PmagSpecRec["magic_method_codes"].split(':') if len(method_codes) != 0: methstring="" for meth in method_codes: ctype=meth.split('-') if 'DE' not in ctype:methstring=methstring+ ":" +meth # don't include old direction estimation methods methstring=methstring+':'+calculation_type PmagSpecRec["magic_method_codes"]= methstring.strip(':') print 'Method codes: ',PmagSpecRec['magic_method_codes'] if calculation_type!='DE-FM': if units=='K': print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f, %s \n' % (PmagSpecRec["er_specimen_name"],int(PmagSpecRec["specimen_n"]),float(PmagSpecRec["specimen_mad"]),float(PmagSpecRec["specimen_dang"]),float(PmagSpecRec["measurement_step_min"])-273,float(PmagSpecRec["measurement_step_max"])-273,float(PmagSpecRec["specimen_dec"]),float(PmagSpecRec["specimen_inc"]),calculation_type) elif units== 'T': print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f, %s \n' % (PmagSpecRec["er_specimen_name"],int(PmagSpecRec["specimen_n"]),float(PmagSpecRec["specimen_mad"]),float(PmagSpecRec["specimen_dang"]),float(PmagSpecRec["measurement_step_min"])*1e3,float(PmagSpecRec["measurement_step_max"])*1e3,float(PmagSpecRec["specimen_dec"]),float(PmagSpecRec["specimen_inc"]),calculation_type) elif 'T' in units and 'K' in units: if float(PmagSpecRec['measurement_step_min'])<1.0 : min=float(PmagSpecRec['measurement_step_min'])*1e3 else: min=float(PmagSpecRec['measurement_step_min'])-273 if float(PmagSpecRec['measurement_step_max'])<1.0 : max=float(PmagSpecRec['measurement_step_max'])*1e3 else: max=float(PmagSpecRec['measurement_step_max'])-273 print '%s %i %7.1f %i %i %7.1f %7.1f %7.1f, %s \n' % (PmagSpecRec["er_specimen_name"],int(PmagSpecRec["specimen_n"]),float(PmagSpecRec["specimen_mad"]),float(PmagSpecRec["specimen_dang"]),min,max,float(PmagSpecRec["specimen_dec"]),float(PmagSpecRec["specimen_inc"]),calculation_type) else: print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f, %s \n' % (PmagSpecRec["er_specimen_name"],int(PmagSpecRec["specimen_n"]),float(PmagSpecRec["specimen_mad"]),float(PmagSpecRec["specimen_dang"]),float(PmagSpecRec["measurement_step_min"]),float(PmagSpecRec["measurement_step_max"]),float(PmagSpecRec["specimen_dec"]),float(PmagSpecRec["specimen_inc"]),calculation_type) else: if 'K' in units: print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f, %s \n' % (PmagSpecRec["er_specimen_name"],int(PmagSpecRec["specimen_n"]),float(PmagSpecRec["specimen_alpha95"]),float(PmagSpecRec["specimen_dang"]),float(PmagSpecRec["measurement_step_min"])-273,float(PmagSpecRec["measurement_step_max"])-273,float(PmagSpecRec["specimen_dec"]),float(PmagSpecRec["specimen_inc"]),calculation_type) elif 'T' in units: print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f, %s \n' % (PmagSpecRec["er_specimen_name"],int(PmagSpecRec["specimen_n"]),float(PmagSpecRec["specimen_alpha95"]),float(PmagSpecRec["specimen_dang"]),float(PmagSpecRec["measurement_step_min"])*1e3,float(PmagSpecRec["measurement_step_max"])*1e3,float(PmagSpecRec["specimen_dec"]),float(PmagSpecRec["specimen_inc"]),calculation_type) elif 'T' in units and 'K' in units: if float(PmagSpecRec['measurement_step_min'])<1.0 : min=float(PmagSpecRec['measurement_step_min'])*1e3 else: min=float(PmagSpecRec['measurement_step_min'])-273 if float(PmagSpecRec['measurement_step_max'])<1.0 : max=float(PmagSpecRec['measurement_step_max'])*1e3 else: max=float(PmagSpecRec['measurement_step_max'])-273 print '%s %i %7.1f %i %i %7.1f %7.1f, %s \n' % (PmagSpecRec["er_specimen_name"],int(PmagSpecRec["specimen_n"]),float(PmagSpecRec["specimen_alpha95"]),min,max,float(PmagSpecRec["specimen_dec"]),float(PmagSpecRec["specimen_inc"]),calculation_type) else: print '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f, %s \n' % (PmagSpecRec["er_specimen_name"],int(PmagSpecRec["specimen_n"]),float(PmagSpecRec["specimen_alpha95"]),float(PmagSpecRec["measurement_step_min"]),float(PmagSpecRec["measurement_step_max"]),float(PmagSpecRec["specimen_dec"]),float(PmagSpecRec["specimen_inc"]),calculation_type) saveit=raw_input("Save this interpretation? [y]/n \n") if saveit!="n": changeS=1 # # put in details # angle,direction_type,setangle="","",0 if len(CurrRecs)>0: replace=raw_input(" [0] add new component, or [1] replace existing interpretation(s) [default is replace] ") if replace=="1" or replace=="": CurrRecs=[] PmagSpecRec['specimen_comp_name']='A' CurrRecs.append(PmagSpecRec) else: print 'These are the current component names for this specimen: ' for trec in CurrRecs:print trec['specimen_comp_name'] compnum=raw_input("Enter new component name: ") PmagSpecRec['specimen_comp_name']=compnum print "Adding new component: ",PmagSpecRec['specimen_comp_name'] CurrRecs.append(PmagSpecRec) else: PmagSpecRec['specimen_comp_name']='A' CurrRecs.append(PmagSpecRec) k+=1 ans="" else: ans="" else: # plots=1 k+=1 files={} locname.replace('/','-') print PmagSpecRec for key in ZED.keys(): files[key]="LO:_"+locname+'_SI:_'+PmagSpecRec['er_site_name']+'_SA:_'+PmagSpecRec['er_sample_name']+'_SP:_'+s+'_CO:_'+coord+'_TY:_'+key+'_.'+fmt if pmagplotlib.isServer: black = '#000000' purple = '#800080' titles={} titles['demag']='DeMag Plot' titles['zijd']='Zijderveld Plot' titles['eqarea']='Equal Area Plot' ZED = pmagplotlib.addBorders(ZED,titles,black,purple) pmagplotlib.saveP(ZED,files) if len(CurrRecs)>0: for rec in CurrRecs: PriorRecs.append(rec) if changeS==1: if len(PriorRecs)>0: save_redo(PriorRecs,inspec) else: os.system('rm '+inspec) CurrRecs,beg_pca,end_pca=[],"","" # next up changeS=0 else: k+=1 # skip record - not enough data if changeM==1: pmag.magic_write(meas_file,meas_data,'magic_measurements')
def main(): """ NAME zeq_magic.py DESCRIPTION reads in magic_measurements formatted file, makes plots of remanence decay during demagnetization experiments. Reads in prior interpretations saved in a pmag_specimens formatted file [and allows re-interpretations of best-fit lines and planes and saves (revised or new) interpretations in a pmag_specimens file. interpretations are saved in the coordinate system used. Also allows judicious editting of measurements to eliminate "bad" measurements. These are marked as such in the magic_measurements input file. they are NOT deleted, just ignored. ] Bracketed part not yet implemented SYNTAX zeq_magic.py [command line options] OPTIONS -h prints help message and quits -f MEASFILE: sets measurements format input file, default: measurements.txt -fsp SPECFILE: sets specimens format file with prior interpreations, default: specimens.txt -fsa SAMPFILE: sets samples format file sample=>site information, default: samples.txt -fsi SITEFILE: sets sites format file with site=>location informationprior interpreations, default: samples.txt -Fp PLTFILE: sets filename for saved plot, default is name_type.fmt (where type is zijd, eqarea or decay curve) -crd [s,g,t]: sets coordinate system, g=geographic, t=tilt adjusted, default: specimen coordinate system -spc SPEC plots single specimen SPEC, saves plot with specified format with optional -dir settings and quits -dir [L,P,F][beg][end]: sets calculation type for principal component analysis, default is none beg: starting step for PCA calculation end: ending step for PCA calculation [L,P,F]: calculation type for line, plane or fisher mean must be used with -spc option -fmt FMT: set format of saved plot [png,svg,jpg] -A: suppresses averaging of replicate measurements, default is to average -sav: saves all plots without review SCREEN OUTPUT: Specimen, N, a95, StepMin, StepMax, Dec, Inc, calculation type """ # initialize some variables doave, e, b = 1, 0, 0 # average replicates, initial end and beginning step intlist = ['magn_moment', 'magn_volume', 'magn_mass', 'magnitude'] plots, coord = 0, 's' noorient = 0 version_num = pmag.get_version() verbose = pmagplotlib.verbose calculation_type, fmt = "", "svg" user, spec_keys, locname = "", [], '' geo, tilt, ask = 0, 0, 0 PriorRecs = [] # empty list for prior interpretations backup = 0 specimen = "" # can skip everything and just plot one specimen with bounds e,b if '-h' in sys.argv: print(main.__doc__) sys.exit() dir_path = pmag.get_named_arg_from_sys("-WD", default_val=os.getcwd()) meas_file = pmag.get_named_arg_from_sys( "-f", default_val="measurements.txt") spec_file = pmag.get_named_arg_from_sys( "-fsp", default_val="specimens.txt") samp_file = pmag.get_named_arg_from_sys("-fsa", default_val="samples.txt") site_file = pmag.get_named_arg_from_sys("-fsi", default_val="sites.txt") #meas_file = os.path.join(dir_path, meas_file) #spec_file = os.path.join(dir_path, spec_file) #samp_file = os.path.join(dir_path, samp_file) #site_file = os.path.join(dir_path, site_file) plot_file = pmag.get_named_arg_from_sys("-Fp", default_val="") crd = pmag.get_named_arg_from_sys("-crd", default_val="s") if crd == "s": coord = "-1" elif crd == "t": coord = "100" else: coord = "0" fmt = pmag.get_named_arg_from_sys("-fmt", "svg") specimen = pmag.get_named_arg_from_sys("-spc", default_val="") beg_pca, end_pca = "", "" if '-dir' in sys.argv: ind = sys.argv.index('-dir') direction_type = sys.argv[ind + 1] beg_pca = int(sys.argv[ind + 2]) end_pca = int(sys.argv[ind + 3]) if direction_type == 'L': calculation_type = 'DE-BFL' if direction_type == 'P': calculation_type = 'DE-BFP' if direction_type == 'F': calculation_type = 'DE-FM' if '-A' in sys.argv: doave = 0 if '-sav' in sys.argv: plots, verbose = 1, 0 # first_save = 1 fnames = {'measurements': meas_file, 'specimens': spec_file, 'samples': samp_file, 'sites': site_file} contribution = nb.Contribution(dir_path, custom_filenames=fnames, read_tables=[ 'measurements', 'specimens', 'samples', 'sites']) # # import specimens specimen_cols = ['analysts', 'aniso_ftest', 'aniso_ftest12', 'aniso_ftest23', 'aniso_s', 'aniso_s_mean', 'aniso_s_n_measurements', 'aniso_s_sigma', 'aniso_s_unit', 'aniso_tilt_correction', 'aniso_type', 'aniso_v1', 'aniso_v2', 'aniso_v3', 'citations', 'description', 'dir_alpha95', 'dir_comp', 'dir_dec', 'dir_inc', 'dir_mad_free', 'dir_n_measurements', 'dir_tilt_correction', 'experiments', 'geologic_classes', 'geologic_types', 'hyst_bc', 'hyst_bcr', 'hyst_mr_moment', 'hyst_ms_moment', 'int_abs', 'int_b', 'int_b_beta', 'int_b_sigma', 'int_corr', 'int_dang', 'int_drats', 'int_f', 'int_fvds', 'int_gamma', 'int_mad_free', 'int_md', 'int_n_measurements', 'int_n_ptrm', 'int_q', 'int_rsc', 'int_treat_dc_field', 'lithologies', 'meas_step_max', 'meas_step_min', 'meas_step_unit', 'method_codes', 'sample', 'software_packages', 'specimen'] if 'specimens' in contribution.tables: # contribution.propagate_name_down('sample','measurements') spec_container = contribution.tables['specimens'] if 'method_codes' not in spec_container.df.columns: spec_container.df['method_codes'] = None prior_spec_data = spec_container.get_records_for_code( 'LP-DIR', strict_match=False) # look up all prior directional interpretations # # tie sample names to measurement data # else: spec_container, prior_spec_data = None, [] # # import samples for orientation info # if ('samples' in contribution.tables) and ('specimens' in contribution.tables): # contribution.propagate_name_down('site','measurements') contribution.propagate_cols(col_names=[ 'azimuth', 'dip', 'orientation_quality'], target_df_name='measurements', source_df_name='samples') # # define figure numbers for equal area, zijderveld, # and intensity vs. demagnetiztion step respectively # ZED = {} ZED['eqarea'], ZED['zijd'], ZED['demag'] = 1, 2, 3 pmagplotlib.plot_init(ZED['eqarea'], 6, 6) pmagplotlib.plot_init(ZED['zijd'], 6, 6) pmagplotlib.plot_init(ZED['demag'], 6, 6) # save_pca=0 angle, direction_type, setangle = "", "", 0 # create measurement dataframe # meas_container = contribution.tables['measurements'] meas_data = meas_container.df # meas_data = meas_data[meas_data['method_codes'].str.contains( 'LT-NO|LT-AF-Z|LT-T-Z|LT-M-Z') == True] # fish out steps for plotting meas_data = meas_data[meas_data['method_codes'].str.contains( 'AN|ARM|LP-TRM|LP-PI-ARM') == False] # strip out unwanted experiments intensity_types = [ col_name for col_name in meas_data.columns if col_name in intlist] intensity_types = [ col_name for col_name in intensity_types if any(meas_data[col_name])] if not len(intensity_types): print('-W- No intensity columns found') return # plot first non-empty intensity method found - normalized to initial value anyway - # doesn't matter which used int_key = intensity_types[0] # get all the non-null intensity records of the same type meas_data = meas_data[meas_data[int_key].notnull()] if 'flag' not in meas_data.columns: meas_data['flag'] = 'g' # set the default flag to good # need to treat LP-NO specially for af data, treatment should be zero, # otherwise 273. meas_data['treatment'] = meas_data['treat_ac_field'].where( cond=meas_data['treat_ac_field'] != 0, other=meas_data['treat_temp']) meas_data['ZI'] = 1 # initialize these to one meas_data['instrument_codes'] = "" # initialize these to blank # for unusual case of microwave power.... if 'treat_mw_power' in meas_data.columns: meas_data.loc[ (meas_data.treat_mw_power != 0) & (meas_data.treat_mw_power) & (meas_data.treat_mw_time), 'treatment'] = meas_data.treat_mw_power * meas_data.treat_mw_time # # get list of unique specimen names from measurement data # # this is a list of all the specimen names specimen_names = meas_data.specimen.unique() specimen_names = specimen_names.tolist() specimen_names.sort() # # set up new DataFrame for this sessions specimen interpretations # data_container = nb.MagicDataFrame( dtype='specimens', columns=specimen_cols) # this is for interpretations from this session current_spec_data = data_container.df locname = 'LookItUp' if specimen == "": k = 0 else: k = specimen_names.index(specimen) # let's look at the data now while k < len(specimen_names): mpars = None # set the current specimen for plotting this_specimen = specimen_names[k] # reset beginning/end pca if plotting more than one specimen if not specimen: beg_pca, end_pca = "", "" if verbose and this_specimen != "": print(this_specimen, k + 1, 'out of ', len(specimen_names)) if setangle == 0: angle = "" this_specimen_measurements = meas_data[meas_data['specimen'].str.contains( this_specimen) == True] # fish out this specimen this_specimen_measurements = this_specimen_measurements[this_specimen_measurements['flag'].str.contains( 'g') == True] # fish out this specimen if len(this_specimen_measurements) != 0: # if there are measurements # # set up datablock [[treatment,dec, inc, int, direction_type],[....]] # # # figure out the method codes # units, methods, title = "", "", this_specimen # this is a list of all the specimen method codes` meas_meths = this_specimen_measurements.method_codes.unique() tr = pd.to_numeric(this_specimen_measurements.treatment).tolist() if set(tr) == set([0]): k += 1 continue for m in meas_meths: if 'LT-AF-Z' in m: units = 'T' # units include tesla tr[0] = 0 if 'LT-T-Z' in m: units = units + ":K" # units include kelvin if 'LT-M-Z' in m: units = units + ':J' # units include joules tr[0] = 0 units = units.strip(':') # strip off extra colons if 'LP-' in m: methods = methods + ":" + m decs = pd.to_numeric(this_specimen_measurements.dir_dec).tolist() incs = pd.to_numeric(this_specimen_measurements.dir_inc).tolist() # # fix the coordinate system # if coord != '-1': # need to transform coordinates to geographic azimuths = pd.to_numeric( this_specimen_measurements.azimuth).tolist() # get the azimuths # get the azimuths dips = pd.to_numeric(this_specimen_measurements.dip).tolist() dirs = [decs, incs, azimuths, dips] # this transposes the columns and rows of the list of lists dirs_geo = np.array(list(map(list, list(zip(*dirs))))) decs, incs = pmag.dogeo_V(dirs_geo) if coord == '100': # need to do tilt correction too bed_dip_dirs = pd.to_numeric( this_specimen_measurements.bed_dip_dir).tolist() # get the azimuths bed_dips = pd.to_numeric( this_specimen_measurements.bed_dip).tolist() # get the azimuths dirs = [decs, incs, bed_dip_dirs, bed_dips] # this transposes the columns and rows of the list of lists dirs_tilt = np.array(list(map(list, list(zip(*dirs))))) decs, incs = pmag.dotilt_V(dirs_tilt) title = title + '_t' else: title = title + '_g' if angle == "": angle = decs[0] ints = pd.to_numeric(this_specimen_measurements[int_key]).tolist() ZI = this_specimen_measurements.ZI.tolist() flags = this_specimen_measurements.flag.tolist() codes = this_specimen_measurements.instrument_codes.tolist() datalist = [tr, decs, incs, ints, ZI, flags, codes] # this transposes the columns and rows of the list of lists datablock = list(map(list, list(zip(*datalist)))) pmagplotlib.plotZED(ZED, datablock, angle, title, units) if verbose: pmagplotlib.drawFIGS(ZED) # # collect info for current_specimen_interpretation dictionary # # # find prior interpretation # prior_specimen_interpretations = prior_spec_data[prior_spec_data['specimen'].str.contains(this_specimen) == True] if (beg_pca == "") and (len(prior_specimen_interpretations) != 0): if len(prior_specimen_interpretations)>0: beg_pcas = pd.to_numeric( prior_specimen_interpretations.meas_step_min.values).tolist() end_pcas = pd.to_numeric( prior_specimen_interpretations.meas_step_max.values).tolist() spec_methods = prior_specimen_interpretations.method_codes.tolist() # step through all prior interpretations and plot them for ind in range(len(beg_pcas)): spec_meths = spec_methods[ind].split(':') for m in spec_meths: if 'DE-BFL' in m: calculation_type = 'DE-BFL' # best fit line if 'DE-BFP' in m: calculation_type = 'DE-BFP' # best fit plane if 'DE-FM' in m: calculation_type = 'DE-FM' # fisher mean if 'DE-BFL-A' in m: calculation_type = 'DE-BFL-A' # anchored best fit line start, end = tr.index(beg_pcas[ind]), tr.index( end_pcas[ind]) # getting the starting and ending points # calculate direction/plane mpars = pmag.domean( datablock, start, end, calculation_type) if mpars["specimen_direction_type"] != "Error": # put it on the plot pmagplotlib.plotDir(ZED, mpars, datablock, angle) if verbose: pmagplotlib.drawFIGS(ZED) else: try: start, end = int(beg_pca), int(end_pca) except ValueError: beg_pca = 0 end_pca = len(datablock) - 1 start, end = int(beg_pca), int(end_pca) # calculate direction/plane try: mpars = pmag.domean(datablock, start, end, calculation_type) except Exception as ex: print('-I- Problem with {}'.format(this_specimen)) print(' ', ex) print(' Skipping') k += 1 continue if mpars["specimen_direction_type"] != "Error": # put it on the plot pmagplotlib.plotDir(ZED, mpars, datablock, angle) if verbose: pmagplotlib.drawFIGS(ZED) if plots == 1 or specimen != "": if plot_file == "": basename = title else: basename = plot_file files = {} for key in list(ZED.keys()): files[key] = basename + '_' + key + '.' + fmt pmagplotlib.saveP(ZED, files) if specimen != "": sys.exit() if verbose: recnum = 0 for plotrec in datablock: if units == 'T': print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % ( plotrec[5], recnum, plotrec[0] * 1e3, " mT", plotrec[3], plotrec[1], plotrec[2], plotrec[6])) if units == "K": print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % ( plotrec[5], recnum, plotrec[0] - 273, ' C', plotrec[3], plotrec[1], plotrec[2], plotrec[6])) if units == "J": print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % ( plotrec[5], recnum, plotrec[0], ' J', plotrec[3], plotrec[1], plotrec[2], plotrec[6])) if 'K' in units and 'T' in units: if plotrec[0] >= 1.: print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % ( plotrec[5], recnum, plotrec[0] - 273, ' C', plotrec[3], plotrec[1], plotrec[2], plotrec[6])) if plotrec[0] < 1.: print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % ( plotrec[5], recnum, plotrec[0] * 1e3, " mT", plotrec[3], plotrec[1], plotrec[2], plotrec[6])) recnum += 1 # we have a current interpretation elif mpars["specimen_direction_type"] != "Error": # # create a new specimen record for the interpreation for this # specimen this_specimen_interpretation = { col: "" for col in specimen_cols} # this_specimen_interpretation["analysts"]=user this_specimen_interpretation['software_packages'] = version_num this_specimen_interpretation['specimen'] = this_specimen this_specimen_interpretation["method_codes"] = calculation_type this_specimen_interpretation["meas_step_unit"] = units this_specimen_interpretation["meas_step_min"] = tr[start] this_specimen_interpretation["meas_step_max"] = tr[end] this_specimen_interpretation["dir_dec"] = '%7.1f' % ( mpars['specimen_dec']) this_specimen_interpretation["dir_inc"] = '%7.1f' % ( mpars['specimen_inc']) this_specimen_interpretation["dir_dang"] = '%7.1f' % ( mpars['specimen_dang']) this_specimen_interpretation["dir_n_measurements"] = '%i' % ( mpars['specimen_n']) this_specimen_interpretation["dir_tilt_correction"] = coord methods = methods.replace(" ", "") if "T" in units: methods = methods + ":LP-DIR-AF" if "K" in units: methods = methods + ":LP-DIR-T" if "J" in units: methods = methods + ":LP-DIR-M" this_specimen_interpretation["method_codes"] = methods.strip( ':') this_specimen_interpretation["experiments"] = this_specimen_measurements.experiment.unique()[ 0] # # print some stuff # if calculation_type != 'DE-FM': this_specimen_interpretation["dir_mad_free"] = '%7.1f' % ( mpars['specimen_mad']) this_specimen_interpretation["dir_alpha95"] = '' if verbose: if units == 'K': print('%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation["dir_n_measurements"]), float(this_specimen_interpretation["dir_mad_free"]), float(this_specimen_interpretation["dir_dang"]), float( this_specimen_interpretation["meas_step_min"]) - 273, float(this_specimen_interpretation["meas_step_max"]) - 273, float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) elif units == 'T': print('%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation["dir_n_measurements"]), float(this_specimen_interpretation["dir_mad_free"]), float(this_specimen_interpretation["dir_dang"]), float( this_specimen_interpretation["meas_step_min"]) * 1e3, float(this_specimen_interpretation["meas_step_max"]) * 1e3, float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) elif 'T' in units and 'K' in units: if float(this_specimen_interpretation['meas_step_min']) < 1.0: min = float( this_specimen_interpretation['meas_step_min']) * 1e3 else: min = float( this_specimen_interpretation['meas_step_min']) - 273 if float(this_specimen_interpretation['meas_step_max']) < 1.0: max = float( this_specimen_interpretation['meas_step_max']) * 1e3 else: max = float( this_specimen_interpretation['meas_step_max']) - 273 print('%s %i %7.1f %i %i %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation["dir_n_measurements"]), float(this_specimen_interpretation["dir_mad_free"]), float( this_specimen_interpretation["dir_dang"]), min, max, float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) else: print('%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation["dir_n_measurements"]), float(this_specimen_interpretation["dir_mad_free"]), float(this_specimen_interpretation["dir_dang"]), float( this_specimen_interpretation["meas_step_min"]), float(this_specimen_interpretation["meas_step_max"]), float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) else: this_specimen_interpretation["dir_alpha95"] = '%7.1f' % ( mpars['specimen_alpha95']) this_specimen_interpretation["dir_mad_free"] = '' if verbose: if 'K' in units: print('%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation["dir_n_measurments"]), float(this_specimen_interpretation["dir_mad_free"]), float(this_specimen_interpretation["dir_dang"]), float( this_specimen_interpretation["meas_step_min"]) - 273, float(this_specimen_interpretation["meas_step_max"]) - 273, float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) elif 'T' in units: print('%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation["dir_n_measurements"]), float(this_specimen_interpretation["dir_alpha95"]), float(this_specimen_interpretation["dir_dang"]), float( this_specimen_interpretation["meas_step_min"]) * 1e3, float(this_specimen_interpretation["meas_step_max"]) * 1e3, float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) elif 'T' in units and 'K' in units: if float(this_specimen_interpretation['meas_step_min']) < 1.0: min = float( this_specimen_interpretation['meas_step_min']) * 1e3 else: min = float( this_specimen_interpretation['meas_step_min']) - 273 if float(this_specimen_interpretation['meas_step_max']) < 1.0: max = float( this_specimen_interpretation['meas_step_max']) * 1e3 else: max = float( this_specimen_interpretation['meas_step_max']) - 273 print('%s %i %7.1f %i %i %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation["dir_n_measurements"]), float( this_specimen_interpretation["dir_alpha95"]), min, max, float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) else: print('%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation["dir_n_measurements"]), float(this_specimen_interpretation["dir_alpha95"]), float( this_specimen_interpretation["meas_step_min"]), float(this_specimen_interpretation["meas_step_max"]), float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) if verbose: saveit = input("Save this interpretation? [y]/n \n") # START HERE # # if len(current_spec_data)==0: # no interpretations yet for this session # print "no current interpretation" # beg_pca,end_pca="","" # calculation_type="" # get the ones that meet the current coordinate system else: print("no data") if verbose: res = input(' <return> for next specimen, [q]uit ') if res == 'q': return k += 1
def main(): """ NAME thellier_magic.py DESCRIPTION plots Thellier-Thellier, allowing interactive setting of bounds and customizing of selection criteria. Saves and reads interpretations from a pmag_specimen formatted table, default: thellier_specimens.txt SYNTAX thellier_magic.py [command line options] OPTIONS -h prints help message and quits -f MEAS, set magic_measurements input file -fsp PRIOR, set pmag_specimen prior interpretations file -fan ANIS, set rmag_anisotropy file for doing the anisotropy corrections -fcr CRIT, set criteria file for grading. -fmt [svg,png,jpg], format for images - default is svg -sav, saves plots with out review (default format) -spc SPEC, plots single specimen SPEC, saves plot with specified format with optional -b bounds adn quits -b BEG END: sets bounds for calculation BEG: starting step for slope calculation END: ending step for slope calculation -z use only z component difference for pTRM calculation DEFAULTS MEAS: magic_measurements.txt REDO: thellier_redo CRIT: NONE PRIOR: NONE OUTPUT figures: ALL: numbers refer to temperature steps in command line window 1) Arai plot: closed circles are zero-field first/infield open circles are infield first/zero-field triangles are pTRM checks squares are pTRM tail checks VDS is vector difference sum diamonds are bounds for interpretation 2) Zijderveld plot: closed (open) symbols are X-Y (X-Z) planes X rotated to NRM direction 3) (De/Re)Magnetization diagram: circles are NRM remaining squares are pTRM gained 4) equal area projections: green triangles are pTRM gained direction red (purple) circles are lower(upper) hemisphere of ZI step directions blue (cyan) squares are lower(upper) hemisphere IZ step directions 5) Optional: TRM acquisition 6) Optional: TDS normalization command line window: list is: temperature step numbers, temperatures (C), Dec, Inc, Int (units of magic_measuements) list of possible commands: type letter followed by return to select option saving of plots creates .svg format files with specimen_name, plot type as name """ # # initializations # meas_file, critout, inspec = "magic_measurements.txt", "", "thellier_specimens.txt" first = 1 inlt = 0 version_num = pmag.get_version() TDinit, Tinit, field, first_save = 0, 0, -1, 1 user, comment, AniSpec, locname = "", '', "", "" ans, specimen, recnum, start, end = 0, 0, 0, 0, 0 plots, pmag_out, samp_file, style = 0, "", "", "svg" verbose = pmagplotlib.verbose fmt = '.' + style # # default acceptance criteria # accept = pmag.default_criteria(0)[0] # set the default criteria # # parse command line options # Zdiff, anis = 0, 0 spc, BEG, END = "", "", "" if '-h' in sys.argv: print(main.__doc__) sys.exit() if '-f' in sys.argv: ind = sys.argv.index('-f') meas_file = sys.argv[ind + 1] if '-fsp' in sys.argv: ind = sys.argv.index('-fsp') inspec = sys.argv[ind + 1] if '-fan' in sys.argv: ind = sys.argv.index('-fan') anisfile = sys.argv[ind + 1] anis = 1 anis_data, file_type = pmag.magic_read(anisfile) if verbose: print("Anisotropy data read in from ", anisfile) if '-fmt' in sys.argv: ind = sys.argv.index('-fmt') fmt = '.' + sys.argv[ind + 1] if '-dpi' in sys.argv: ind = sys.argv.index('-dpi') dpi = '.' + sys.argv[ind + 1] else: dpi = 100 if '-sav' in sys.argv: plots = 1 verbose = 0 if '-z' in sys.argv: Zdiff = 1 if '-spc' in sys.argv: ind = sys.argv.index('-spc') spc = sys.argv[ind + 1] if '-b' in sys.argv: ind = sys.argv.index('-b') BEG = int(sys.argv[ind + 1]) END = int(sys.argv[ind + 2]) if '-fcr' in sys.argv: ind = sys.argv.index('-fcr') critout = sys.argv[ind + 1] crit_data, file_type = pmag.magic_read(critout) if file_type != 'pmag_criteria': if verbose: print('bad pmag_criteria file, using no acceptance criteria') accept = pmag.default_criteria(1)[0] else: if verbose: print("Acceptance criteria read in from ", critout) accept = { 'pmag_criteria_code': 'ACCEPTANCE', 'er_citation_names': 'This study' } for critrec in crit_data: if 'sample_int_sigma_uT' in critrec.keys( ): # accommodate Shaar's new criterion critrec['sample_int_sigma'] = '%10.3e' % ( eval(critrec['sample_int_sigma_uT']) * 1e-6) for key in critrec.keys(): if key not in accept.keys() and critrec[key] != '': accept[key] = critrec[key] try: open(inspec, 'rU') PriorRecs, file_type = pmag.magic_read(inspec) if file_type != 'pmag_specimens': print(file_type) print(file_type, inspec, " is not a valid pmag_specimens file ") sys.exit() for rec in PriorRecs: if 'magic_software_packages' not in rec.keys(): rec['magic_software_packages'] = "" except IOError: PriorRecs = [] if verbose: print("starting new specimen interpretation file: ", inspec) meas_data, file_type = pmag.magic_read(meas_file) if file_type != 'magic_measurements': print(file_type) print(file_type, "This is not a valid magic_measurements file ") sys.exit() backup = 0 # define figure numbers for arai, zijderveld and # de-,re-magization diagrams AZD = {} AZD['deremag'], AZD['zijd'], AZD['arai'], AZD['eqarea'] = 1, 2, 3, 4 pmagplotlib.plot_init(AZD['arai'], 5, 5) pmagplotlib.plot_init(AZD['zijd'], 5, 5) pmagplotlib.plot_init(AZD['deremag'], 5, 5) pmagplotlib.plot_init(AZD['eqarea'], 5, 5) # # # # get list of unique specimen names # CurrRec = [] sids = pmag.get_specs(meas_data) # get plots for specimen s - default is just to step through arai diagrams # if spc != "": specimen = sids.index(spc) while specimen < len(sids): methcodes = [] if verbose: print(sids[specimen], specimen + 1, 'of ', len(sids)) MeasRecs = [] s = sids[specimen] datablock, trmblock, tdsrecs = [], [], [] PmagSpecRec = {} if first == 0: for key in keys: # make sure all new records have same set of keys PmagSpecRec[key] = "" PmagSpecRec["er_analyst_mail_names"] = user PmagSpecRec["specimen_correction"] = 'u' # # find the data from the meas_data file for this specimen # for rec in meas_data: if rec["er_specimen_name"] == s: MeasRecs.append(rec) if "magic_method_codes" not in rec.keys(): rec["magic_method_codes"] = "" methods = rec["magic_method_codes"].split(":") meths = [] for meth in methods: meths.append(meth.strip()) # take off annoying spaces methods = "" for meth in meths: if meth.strip() not in methcodes and "LP-" in meth: methcodes.append(meth.strip()) methods = methods + meth + ":" methods = methods[:-1] rec["magic_method_codes"] = methods if "LP-PI-TRM" in meths: datablock.append(rec) if "LP-TRM" in meths: trmblock.append(rec) if "LP-TRM-TD" in meths: tdsrecs.append(rec) if len(trmblock) > 2 and inspec != "": if Tinit == 0: Tinit = 1 AZD['TRM'] = 5 pmagplotlib.plot_init(AZD['TRM'], 5, 5) elif Tinit == 1: # clear the TRM figure if not needed pmagplotlib.clearFIG(AZD['TRM']) if len(tdsrecs) > 2: if TDinit == 0: TDinit = 1 AZD['TDS'] = 6 pmagplotlib.plot_init(AZD['TDS'], 5, 5) elif TDinit == 1: # clear the TDS figure if not needed pmagplotlib.clearFIG(AZD['TDS']) if len(datablock) < 4: if backup == 0: specimen += 1 if verbose: print('skipping specimen - moving forward ', s) else: specimen -= 1 if verbose: print('skipping specimen - moving backward ', s) # # collect info for the PmagSpecRec dictionary # else: rec = datablock[0] PmagSpecRec["er_citation_names"] = "This study" PmagSpecRec["er_specimen_name"] = s PmagSpecRec["er_sample_name"] = rec["er_sample_name"] PmagSpecRec["er_site_name"] = rec["er_site_name"] PmagSpecRec["er_location_name"] = rec["er_location_name"] locname = rec['er_location_name'].replace('/', '-') if "er_expedition_name" in rec.keys(): PmagSpecRec["er_expedition_name"] = rec["er_expedition_name"] if "magic_instrument_codes" not in rec.keys(): rec["magic_instrument_codes"] = "" PmagSpecRec["magic_instrument_codes"] = rec[ "magic_instrument_codes"] PmagSpecRec["measurement_step_unit"] = "K" if "magic_experiment_name" not in rec.keys(): rec["magic_experiment_name"] = "" else: PmagSpecRec["magic_experiment_names"] = rec[ "magic_experiment_name"] meths = rec["magic_method_codes"].split() # sort data into types araiblock, field = pmag.sortarai(datablock, s, Zdiff) first_Z = araiblock[0] GammaChecks = araiblock[5] if len(first_Z) < 3: if backup == 0: specimen += 1 if verbose: print('skipping specimen - moving forward ', s) else: specimen -= 1 if verbose: print('skipping specimen - moving backward ', s) else: backup = 0 zijdblock, units = pmag.find_dmag_rec(s, meas_data) recnum = 0 if verbose: print("index step Dec Inc Int Gamma") for plotrec in zijdblock: if GammaChecks != "": gamma = "" for g in GammaChecks: if g[0] == plotrec[0] - 273: gamma = g[1] break if gamma != "": print('%i %i %7.1f %7.1f %8.3e %7.1f' % (recnum, plotrec[0] - 273, plotrec[1], plotrec[2], plotrec[3], gamma)) else: print('%i %i %7.1f %7.1f %8.3e ' % (recnum, plotrec[0] - 273, plotrec[1], plotrec[2], plotrec[3])) recnum += 1 pmagplotlib.plot_arai_zij(AZD, araiblock, zijdblock, s, units[0]) if verbose: pmagplotlib.draw_figs(AZD) if len(tdsrecs) > 2: # a TDS experiment tdsblock = [] # make a list for the TDS data Mkeys = [ 'measurement_magnitude', 'measurement_magn_moment', 'measurement_magn_volume', 'measuruement_magn_mass' ] mkey, k = "", 0 # find which type of intensity while mkey == "" and k < len(Mkeys) - 1: key = Mkeys[k] if key in tdsrecs[0].keys() and tdsrecs[0][key] != "": mkey = key k += 1 if mkey == "": break # get outta here Tnorm = "" for tdrec in tdsrecs: meths = tdrec['magic_method_codes'].split(":") for meth in meths: # strip off potential nasty spaces meth.replace(" ", "") if 'LT-T-I' in meths and Tnorm == "": # found first total TRM # normalize by total TRM Tnorm = float(tdrec[mkey]) # put in the zero step tdsblock.append([273, zijdblock[0][3] / Tnorm, 1.]) # found a LP-TRM-TD demag step, now need complementary LT-T-Z from zijdblock if 'LT-T-Z' in meths and Tnorm != "": step = float(tdrec['treatment_temp']) Tint = "" if mkey != "": Tint = float(tdrec[mkey]) if Tint != "": for zrec in zijdblock: if zrec[0] == step: # found matching tdsblock.append([ step, zrec[3] / Tnorm, Tint / Tnorm ]) break if len(tdsblock) > 2: pmagplotlib.plot_tds(AZD['TDS'], tdsblock, s + ':LP-PI-TDS:') if verbose: pmagplotlib(draw_figs(AZD)) else: print("Something wrong here") if anis == 1: # look up anisotropy data for this specimen AniSpec = "" for aspec in anis_data: if aspec["er_specimen_name"] == PmagSpecRec[ "er_specimen_name"]: AniSpec = aspec if verbose: print('Found anisotropy record...') break if inspec != "": if verbose: print('Looking up saved interpretation....') found = 0 for k in range(len(PriorRecs)): try: if PriorRecs[k]["er_specimen_name"] == s: found = 1 CurrRec.append(PriorRecs[k]) for j in range(len(zijdblock)): if float(zijdblock[j][0]) == float( PriorRecs[k] ["measurement_step_min"]): start = j if float(zijdblock[j][0]) == float( PriorRecs[k] ["measurement_step_max"]): end = j pars, errcode = pmag.PintPars( datablock, araiblock, zijdblock, start, end, accept) pars['measurement_step_unit'] = "K" pars['experiment_type'] = 'LP-PI-TRM' # put in CurrRec, take out of PriorRecs del PriorRecs[k] if errcode != 1: pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * \ field*pars["specimen_b"] pars["er_specimen_name"] = s if verbose: print('Saved interpretation: ') pars, kill = pmag.scoreit( pars, PmagSpecRec, accept, '', verbose) pmagplotlib.plot_b(AZD, araiblock, zijdblock, pars) if verbose: pmagplotlib.draw_figs(AZD) if len(trmblock) > 2: blab = field best = pars["specimen_int"] Bs, TRMs = [], [] for trec in trmblock: Bs.append( float( trec['treatment_dc_field']) ) TRMs.append( float(trec[ 'measurement_magn_moment']) ) # calculate best fit parameters through TRM acquisition data, and get new banc NLpars = nlt.NLtrm( Bs, TRMs, best, blab, 0) Mp, Bp = [], [] for k in range(int(max(Bs) * 1e6)): Bp.append(float(k) * 1e-6) # predicted NRM for this field npred = nlt.TRM( Bp[-1], NLpars['xopt'][0], NLpars['xopt'][1]) Mp.append(npred) pmagplotlib.plot_trm( AZD['TRM'], Bs, TRMs, Bp, Mp, NLpars, trec['magic_experiment_name']) PmagSpecRec['specimen_int'] = NLpars[ 'banc'] if verbose: print('Banc= ', float(NLpars['banc']) * 1e6) pmagplotlib.draw_figs(AZD) mpars = pmag.domean( araiblock[1], start, end, 'DE-BFL') if verbose: print( 'pTRM direction= ', '%7.1f' % (mpars['specimen_dec']), ' %7.1f' % (mpars['specimen_inc']), ' MAD:', '%7.1f' % (mpars['specimen_mad'])) if AniSpec != "": CpTRM = pmag.Dir_anis_corr([ mpars['specimen_dec'], mpars['specimen_inc'] ], AniSpec) AniSpecRec = pmag.doaniscorr( PmagSpecRec, AniSpec) if verbose: print( 'Anisotropy corrected TRM direction= ', '%7.1f' % (CpTRM[0]), ' %7.1f' % (CpTRM[1])) print( 'Anisotropy corrected intensity= ', float( AniSpecRec['specimen_int']) * 1e6) else: print('error on specimen ', s) except: pass if verbose and found == 0: print(' None found :( ') if spc != "": if BEG != "": pars, errcode = pmag.PintPars(datablock, araiblock, zijdblock, BEG, END, accept) pars['measurement_step_unit'] = "K" pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * field * pars["specimen_b"] pars["er_specimen_name"] = s pars['specimen_grade'] = '' # ungraded pmagplotlib.plot_b(AZD, araiblock, zijdblock, pars) if verbose: pmagplotlib.draw_figs(AZD) if len(trmblock) > 2: if inlt == 0: inlt = 1 blab = field best = pars["specimen_int"] Bs, TRMs = [], [] for trec in trmblock: Bs.append(float(trec['treatment_dc_field'])) TRMs.append( float(trec['measurement_magn_moment'])) # calculate best fit parameters through TRM acquisition data, and get new banc NLpars = nlt.NLtrm(Bs, TRMs, best, blab, 0) # Mp, Bp = [], [] for k in range(int(max(Bs) * 1e6)): Bp.append(float(k) * 1e-6) # predicted NRM for this field npred = nlt.TRM(Bp[-1], NLpars['xopt'][0], NLpars['xopt'][1]) files = {} for key in AZD.keys(): files[key] = s + '_' + key + fmt pmagplotlib.save_plots(AZD, files, dpi=dpi) sys.exit() if verbose: ans = 'b' while ans != "": print(""" s[a]ve plot, set [b]ounds for calculation, [d]elete current interpretation, [p]revious, [s]ample, [q]uit: """) ans = input('Return for next specimen \n') if ans == "": specimen += 1 if ans == "d": save_redo(PriorRecs, inspec) CurrRec = [] pmagplotlib.plot_arai_zij(AZD, araiblock, zijdblock, s, units[0]) if verbose: pmagplotlib.draw_figs(AZD) if ans == 'a': files = {} for key in AZD.keys(): files[key] = "LO:_"+locname+'_SI:_'+PmagSpecRec['er_site_name'] + \ '_SA:_' + \ PmagSpecRec['er_sample_name'] + \ '_SP:_'+s+'_CO:_s_TY:_'+key+fmt pmagplotlib.save_plots(AZD, files) ans = "" if ans == 'q': print("Good bye") sys.exit() if ans == 'p': specimen = specimen - 1 backup = 1 ans = "" if ans == 's': keepon = 1 spec = input( 'Enter desired specimen name (or first part there of): ' ) while keepon == 1: try: specimen = sids.index(spec) keepon = 0 except: tmplist = [] for qq in range(len(sids)): if spec in sids[qq]: tmplist.append(sids[qq]) print(specimen, " not found, but this was: ") print(tmplist) spec = input('Select one or try again\n ') ans = "" if ans == 'b': if end == 0 or end >= len(zijdblock): end = len(zijdblock) - 1 GoOn = 0 while GoOn == 0: answer = input( 'Enter index of first point for calculation: [' + str(start) + '] ') try: start = int(answer) answer = input( 'Enter index of last point for calculation: [' + str(end) + '] ') end = int(answer) if start >= 0 and start < len( zijdblock ) - 2 and end > 0 and end < len( zijdblock) or start >= end: GoOn = 1 else: print("Bad endpoints - try again! ") start, end = 0, len(zijdblock) except ValueError: print("Bad endpoints - try again! ") start, end = 0, len(zijdblock) s = sids[specimen] pars, errcode = pmag.PintPars( datablock, araiblock, zijdblock, start, end, accept) pars['measurement_step_unit'] = "K" pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * field * pars[ "specimen_b"] pars["er_specimen_name"] = s pars, kill = pmag.scoreit(pars, PmagSpecRec, accept, '', 0) PmagSpecRec['specimen_scat'] = pars[ 'specimen_scat'] PmagSpecRec['specimen_frac'] = '%5.3f' % ( pars['specimen_frac']) PmagSpecRec['specimen_gmax'] = '%5.3f' % ( pars['specimen_gmax']) PmagSpecRec["measurement_step_min"] = '%8.3e' % ( pars["measurement_step_min"]) PmagSpecRec["measurement_step_max"] = '%8.3e' % ( pars["measurement_step_max"]) PmagSpecRec["measurement_step_unit"] = "K" PmagSpecRec["specimen_int_n"] = '%i' % ( pars["specimen_int_n"]) PmagSpecRec["specimen_lab_field_dc"] = '%8.3e' % ( pars["specimen_lab_field_dc"]) PmagSpecRec["specimen_int"] = '%9.4e ' % ( pars["specimen_int"]) PmagSpecRec["specimen_b"] = '%5.3f ' % ( pars["specimen_b"]) PmagSpecRec["specimen_q"] = '%5.1f ' % ( pars["specimen_q"]) PmagSpecRec["specimen_f"] = '%5.3f ' % ( pars["specimen_f"]) PmagSpecRec["specimen_fvds"] = '%5.3f' % ( pars["specimen_fvds"]) PmagSpecRec["specimen_b_beta"] = '%5.3f' % ( pars["specimen_b_beta"]) PmagSpecRec["specimen_int_mad"] = '%7.1f' % ( pars["specimen_int_mad"]) PmagSpecRec["specimen_Z"] = '%7.1f' % ( pars["specimen_Z"]) PmagSpecRec["specimen_gamma"] = '%7.1f' % ( pars["specimen_gamma"]) PmagSpecRec["specimen_grade"] = pars[ "specimen_grade"] if pars["method_codes"] != "": tmpcodes = pars["method_codes"].split(":") for t in tmpcodes: if t.strip() not in methcodes: methcodes.append(t.strip()) PmagSpecRec["specimen_dec"] = '%7.1f' % ( pars["specimen_dec"]) PmagSpecRec["specimen_inc"] = '%7.1f' % ( pars["specimen_inc"]) PmagSpecRec["specimen_tilt_correction"] = '-1' PmagSpecRec["specimen_direction_type"] = 'l' # this is redundant, but helpful - won't be imported PmagSpecRec["direction_type"] = 'l' PmagSpecRec["specimen_int_dang"] = '%7.1f ' % ( pars["specimen_int_dang"]) PmagSpecRec["specimen_drats"] = '%7.1f ' % ( pars["specimen_drats"]) PmagSpecRec["specimen_drat"] = '%7.1f ' % ( pars["specimen_drat"]) PmagSpecRec["specimen_int_ptrm_n"] = '%i ' % ( pars["specimen_int_ptrm_n"]) PmagSpecRec["specimen_rsc"] = '%6.4f ' % ( pars["specimen_rsc"]) PmagSpecRec["specimen_md"] = '%i ' % (int( pars["specimen_md"])) if PmagSpecRec["specimen_md"] == '-1': PmagSpecRec["specimen_md"] = "" PmagSpecRec["specimen_b_sigma"] = '%5.3f ' % ( pars["specimen_b_sigma"]) if "IE-TT" not in methcodes: methcodes.append("IE-TT") methods = "" for meth in methcodes: methods = methods + meth + ":" PmagSpecRec["magic_method_codes"] = methods[:-1] PmagSpecRec["specimen_description"] = comment PmagSpecRec[ "magic_software_packages"] = version_num pmagplotlib.plot_arai_zij(AZD, araiblock, zijdblock, s, units[0]) pmagplotlib.plot_b(AZD, araiblock, zijdblock, pars) if verbose: pmagplotlib.draw_figs(AZD) if len(trmblock) > 2: blab = field best = pars["specimen_int"] Bs, TRMs = [], [] for trec in trmblock: Bs.append(float( trec['treatment_dc_field'])) TRMs.append( float(trec['measurement_magn_moment'])) # calculate best fit parameters through TRM acquisition data, and get new banc NLpars = nlt.NLtrm(Bs, TRMs, best, blab, 0) Mp, Bp = [], [] for k in range(int(max(Bs) * 1e6)): Bp.append(float(k) * 1e-6) # predicted NRM for this field npred = nlt.TRM(Bp[-1], NLpars['xopt'][0], NLpars['xopt'][1]) Mp.append(npred) pmagplotlib.plot_trm( AZD['TRM'], Bs, TRMs, Bp, Mp, NLpars, trec['magic_experiment_name']) if verbose: print( 'Non-linear TRM corrected intensity= ', float(NLpars['banc']) * 1e6) if verbose: pmagplotlib.draw_figs(AZD) pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * field * pars[ "specimen_b"] pars, kill = pmag.scoreit(pars, PmagSpecRec, accept, '', verbose) saveit = input( "Save this interpretation? [y]/n \n") if saveit != 'n': # put back an interpretation PriorRecs.append(PmagSpecRec) specimen += 1 save_redo(PriorRecs, inspec) ans = "" elif plots == 1: specimen += 1 if fmt != ".pmag": files = {} for key in AZD.keys(): files[key] = "LO:_"+locname+'_SI:_'+PmagSpecRec['er_site_name']+'_SA:_' + \ PmagSpecRec['er_sample_name'] + \ '_SP:_'+s+'_CO:_s_TY:_'+key+'_'+fmt if pmagplotlib.isServer: black = '#000000' purple = '#800080' titles = {} titles['deremag'] = 'DeReMag Plot' titles['zijd'] = 'Zijderveld Plot' titles['arai'] = 'Arai Plot' AZD = pmagplotlib.add_borders( AZD, titles, black, purple) pmagplotlib.save_plots(AZD, files, dpi=dpi) # pmagplotlib.combineFigs(s,files,3) else: # save in pmag format script = "grep " + s + " output.mag | thellier -mfsi" script = script + ' %8.4e' % (field) min = '%i' % ((pars["measurement_step_min"] - 273)) Max = '%i' % ((pars["measurement_step_max"] - 273)) script = script + " " + min + " " + Max script = script + " |plotxy;cat mypost >>thellier.ps\n" pltf.write(script) pmag.domagicmag(outf, MeasRecs) if len(CurrRec) > 0: for rec in CurrRec: PriorRecs.append(rec) CurrRec = [] if plots != 1 and verbose: ans = input(" Save last plot? 1/[0] ") if ans == "1": if fmt != ".pmag": files = {} for key in AZD.keys(): files[key] = s + '_' + key + fmt pmagplotlib.save_plots(AZD, files, dpi=dpi) else: print("\n Good bye\n") sys.exit() if len(CurrRec) > 0: PriorRecs.append(CurrRec) # put back an interpretation if len(PriorRecs) > 0: save_redo(PriorRecs, inspec) print('Updated interpretations saved in ', inspec) if verbose: print("Good bye")
def main(command_line=True, **kwargs): """ NAME huji_magic_new.py DESCRIPTION converts HUJI new format files to magic_measurements format files SYNTAX huji_magic.py [command line options] OPTIONS -h: prints the help message and quits. -usr USER: identify user, default is "" -f FILE: specify input file, required -F FILE: specify output file, default is magic_measurements.txt -LP [colon delimited list of protocols, include all that apply] AF: af demag T: thermal including thellier but not trm acquisition N: NRM only TRM: trm acquisition ANI: anisotropy experiment CR: cooling rate experiment. The treatment coding of the measurement file should be: XXX.00,XXX.10, XXX.20 ...XX.70 etc. (XXX.00 is optional) where XXX in the temperature and .10,.20... are running numbers of the cooling rates steps. XXX.00 is optional zerofield baseline. XXX.70 is alteration check. syntax in sio_magic is: -LP CR xxx,yyy,zzz,.....xx where xx, yyy,zzz...xxx are cooling time in [K/minutes], seperated by comma, ordered at the same order as XXX.10,XXX.20 ...XX.70 if you use a zerofield step then no need to specify the cooling rate for the zerofield -spc NUM : specify number of characters to designate a specimen, default = 0 -loc LOCNAME : specify location/study name, must have either LOCNAME or SAMPFILE or be a synthetic -dc B PHI THETA: dc lab field (in micro tesla) and phi,theta, default is none NB: use PHI, THETA = -1 -1 to signal that it changes, i.e. in anisotropy experiment # to do! -ac B : peak AF field (in mT) for ARM acquisition, default is none -ncn NCON: specify naming convention: default is #1 below Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. [8] synthetic - has no site name [9] ODP naming convention INPUT separate experiments ( AF, thermal, thellier, trm aquisition) should be seperate files (eg. af.txt, thermal.txt, etc.) HUJI masurement file format (space delimited text): Spec lab-running-numbe-code Date Hour Treatment-type(T/N/A) Treatment(XXX.XX) dec(geo) inc(geo) dec(tilt) inc(tilt) --------- conventions: Spec: specimen name Treat: treatment step XXX T in Centigrade XXX AF in mT for special experiments: Thellier: XXX.0 first zero field step XXX.1 first in field step [XXX.0 and XXX.1 can be done in any order] XXX.2 second in-field step at lower temperature (pTRM check) ATRM: X.00 optional baseline X.1 ATRM step (+X) X.2 ATRM step (+Y) X.3 ATRM step (+Z) X.4 ATRM step (-X) X.5 ATRM step (-Y) X.6 ATRM step (-Z) X.7 optional alteration check (+X) TRM: XXX.YYY XXX is temperature step of total TRM YYY is dc field in microtesla Intensity assumed to be total moment in 10^3 Am^2 (emu) Declination: Declination in specimen coordinate system Inclination: Inclination in specimen coordinate system Optional metatdata string: mm/dd/yy;hh:mm;[dC,mT];xx.xx;UNITS;USER;INST;NMEAS hh in 24 hours. dC or mT units of treatment XXX (see Treat above) for thermal or AF respectively xx.xxx DC field UNITS of DC field (microT, mT) INST: instrument code, number of axes, number of positions (e.g., G34 is 2G, three axes, measured in four positions) NMEAS: number of measurements in a single position (1,3,200...) """ # initialize some variables mag_file = '' meas_file = "magic_measurements.txt" user = "" specnum = 0 samp_con = '1' labfield = 0 er_location_name = '' codelist = None # get command line args if command_line: args = sys.argv if "-h" in args: print(main.__doc__) return False if "-usr" in args: ind = args.index("-usr") user = args[ind + 1] else: user = "" if '-F' in args: ind = args.index("-F") meas_file = args[ind + 1] if '-f' in args: ind = args.index("-f") magfile = args[ind + 1] print("got magfile:", magfile) if "-dc" in args: ind = args.index("-dc") labfield = float(args[ind + 1]) * 1e-6 phi = float(args[ind + 2]) theta = float(args[ind + 3]) if "-ac" in args: ind = args.index("-ac") peakfield = float(args[ind + 1]) * 1e-3 if "-spc" in args: ind = args.index("-spc") specnum = int(args[ind + 1]) if "-loc" in args: ind = args.index("-loc") er_location_name = args[ind + 1] if "-ncn" in args: ind = args.index("-ncn") samp_con = sys.argv[ind + 1] if '-LP' in args: ind = args.index("-LP") codelist = args[ind + 1] # lab process: # unpack key-word args if used as module if not command_line: user = kwargs.get('user', '') meas_file = kwargs.get('meas_file', 'magic_measurements.txt') magfile = kwargs.get('magfile', '') specnum = int(kwargs.get('specnum', 0)) labfield = int(kwargs.get('labfield', 0)) * 1e-6 phi = int(kwargs.get('phi', 0)) theta = int(kwargs.get('theta', 0)) peakfield = kwargs.get('peakfield', 0) if peakfield: peakfield = float(peakfield) * 1e-3 er_location_name = kwargs.get('er_location_name', '') samp_con = kwargs.get('samp_con', '1') codelist = kwargs.get('codelist', '') CR_cooling_times = kwargs.get('CR_cooling_times', None) # format and validate variables if magfile: try: input = open(magfile, 'r') except: print("bad mag file name") return False, "bad mag file name" else: print("mag_file field is required option") print(main.__doc__) return False, "mag_file field is required option" if specnum != 0: specnum = -specnum if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") return False, "option [4] must be in form 4-Z where Z is an integer" else: Z = int(samp_con.split("-")[1]) samp_con = "4" if "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "option [7] must be in form 7-Z where Z is an integer" else: Z = int(samp_con.split("-")[1]) samp_con = "7" if codelist: codes = codelist.split(':') else: print("Must select experiment type (-LP option)") return False, "Must select experiment type (-LP option)" if "AF" in codes: demag = 'AF' LPcode = "LP-DIR-AF" if "T" in codes: demag = "T" if not labfield: LPcode = "LP-DIR-T" if labfield: LPcode = "LP-PI-TRM" if "ANI" in codes: if not labfield: print("missing lab field option") return False, "missing lab field option" LPcode = "LP-AN-TRM" if "TRM" in codes: demag = "T" LPcode = "LP-TRM" #trm=1 if "CR" in codes: demag = "T" # dc should be in the code if not labfield: print("missing lab field option") return False, "missing lab field option" LPcode = "LP-CR-TRM" # TRM in different cooling rates if command_line: ind = args.index("-LP") CR_cooling_times = args[ind + 2].split(",") #print CR_cooling_time ,"CR_cooling_time" version_num = pmag.get_version() MagRecs = [] #-------------------------------------- # Read the file # Assumption: # 1. different lab protocolsa are in different files # 2. measurements are in the correct order #-------------------------------------- Data = {} line_no = 0 for line in input.readlines(): line_no += 1 this_line_data = {} line_no += 1 instcode = "" if len(line) < 2: continue if line[0] == "#": #HUJI way of marking bad data points continue rec = line.strip('\n').split() specimen = rec[0] date = rec[2].split("/") hour = rec[3].split(":") treatment_type = rec[4] treatment = rec[5].split(".") dec_core = rec[6] inc_core = rec[7] dec_geo = rec[8] inc_geo = rec[9] dec_tilted = rec[10] inc_tilted = rec[11] moment_emu = float(rec[12]) if specimen not in list(Data.keys()): Data[specimen] = [] # check duplicate treatments: # if yes, delete the first and use the second if len(Data[specimen]) > 0: if treatment == Data[specimen][-1]['treatment']: del (Data[specimen][-1]) print( "-W- Identical treatments in file %s magfile line %i: specimen %s, treatment %s ignoring the first. " % (magfile, line_no, specimen, ".".join(treatment))) this_line_data = {} this_line_data['specimen'] = specimen this_line_data['date'] = date this_line_data['hour'] = hour this_line_data['treatment_type'] = treatment_type this_line_data['treatment'] = treatment this_line_data['dec_core'] = dec_core this_line_data['inc_core'] = inc_core this_line_data['dec_geo'] = dec_geo this_line_data['inc_geo'] = inc_geo this_line_data['dec_tilted'] = dec_tilted this_line_data['inc_tilted'] = inc_tilted this_line_data['moment_emu'] = moment_emu Data[specimen].append(this_line_data) print("-I- done reading file %s" % magfile) #-------------------------------------- # Convert to MagIC #-------------------------------------- specimens_list = list(Data.keys()) specimens_list.sort() MagRecs = [] for specimen in specimens_list: for i in range(len(Data[specimen])): this_line_data = Data[specimen][i] methcode = "" MagRec = {} MagRec["er_specimen_name"] = this_line_data['specimen'] if specnum != 0: MagRec["er_sample_name"] = this_line_data['specimen'][:specnum] else: MagRec["er_sample_name"] = this_line_data['specimen'] if samp_con == "1": MagRec["er_site_name"] = MagRec["er_sample_name"][:-1] elif samp_con == "2": parts = MagRec["er_sample_name"].split('-') MagRec["er_site_name"] = parts[0] elif samp_con == "3": parts = MagRec["er_sample_name"].split('.') MagRec["er_site_name"] = parts[0] elif samp_con == '4': MagRec["er_site_name"] = MagRec["er_sample_name"][0:-Z] elif samp_con == '5': MagRec["er_site_name"] = MagRec["er_sample_name"] elif samp_con == '7': MagRec["er_site_name"] = MagRec["er_sample_name"][0:Z] else: MagRec["er_site_name"] = MagRec[ "er_sample_name"] # site=sample by default if er_location_name: MagRec['er_location_name'] = er_location_name else: MagRec['er_location_name'] = MagRec["er_site_name"] MagRec["measurement_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_magn_moment"] = '%10.3e' % ( float(this_line_data['moment_emu']) * 1e-3 ) # moment in Am^2 (from emu) MagRec["measurement_dec"] = this_line_data['dec_core'] MagRec["measurement_inc"] = this_line_data['inc_core'] date = this_line_data['date'] hour = this_line_data['hour'] if float(date[2]) > 80: yyyy = "19" + date[2] else: yyyy = "20" + date[2] if len(date[0]) == 1: date[0] = "0" + date[0] if len(date[1]) == 1: date[1] = "0" + date[1] MagRec["measurement_date"] = ":".join( [yyyy, date[0], date[1], hour[0], hour[1], "00.00"]) MagRec["measurement_time_zone"] = 'JER' MagRec['er_analyst_mail_names'] = user MagRec["er_citation_names"] = "This study" MagRec["magic_instrument_codes"] = "HUJI-2G" MagRec["measurement_flag"] = "g" MagRec["measurement_positions"] = "1" MagRec["measurement_positions"] = "1" MagRec["measurement_standard"] = "u" MagRec["measurement_description"] = "" #MagRec["treatment_temp"]='%8.3e' % (float(treatment[0])+273.) # temp in kelvin #---------------------------------------- # AF demag # do not support AARM yet #---------------------------------------- if demag == "AF": treatment_type = this_line_data['treatment_type'] # demag in zero field if LPcode != "LP-AN-ARM": MagRec["treatment_ac_field"] = '%8.3e' % ( float(this_line_data['treatment'][0]) * 1e-3 ) # peak field in tesla MagRec["treatment_dc_field"] = '0' MagRec["treatment_dc_field_phi"] = '0' MagRec["treatment_dc_field_theta"] = '0' if treatment_type == "N": methcode = "LP-DIR-AF:LT-NO" elif treatment_type == "A": methcode = "LP-DIR-AF:LT-AF-Z" else: print( "ERROR in treatment field line %i... exiting until you fix the problem" % line_no) print(this_line_data) return False, "ERROR in treatment field line %i... exiting until you fix the problem" % line_no # AARM experiment else: print( "Dont supprot AARM in HUJI format yet. sorry... do be DONE" ) MagRec["magic_method_codes"] = methcode MagRec["magic_experiment_name"] = specimen + ":" + LPcode MagRec["measurement_number"] = "%i" % i MagRec["measurement_description"] = "" MagRecs.append(MagRec) #---------------------------------------- # Thermal: # Thellier experiment: "IZ", "ZI", "IZZI", pTRM checks # Thermal demag # Thermal cooling rate experiment # Thermal NLT #---------------------------------------- if demag == "T": treatment = this_line_data['treatment'] treatment_type = this_line_data['treatment_type'] #---------------------------------------- # Thellier experimet #---------------------------------------- if LPcode == "LP-PI-TRM": # Thelllier experiment MagRec["magic_experiment_name"] = specimen + ":" + LPcode methcode = LPcode if treatment_type == "N" or ( (treatment[1] == '0' or treatment[1] == '00') and float(treatment[0]) == 0): LT_code = "LT-NO" MagRec["treatment_dc_field_phi"] = '0' MagRec["treatment_dc_field_theta"] = '0' MagRec["treatment_dc_field"] = '0' MagRec["treatment_temp"] = '273.' elif treatment[1] == '0' or treatment[1] == '00': LT_code = "LT-T-Z" MagRec["treatment_dc_field_phi"] = '0' MagRec["treatment_dc_field_theta"] = '0' MagRec["treatment_dc_field"] = '%8.3e' % (0) MagRec["treatment_temp"] = '%8.3e' % ( float(treatment[0]) + 273.) # temp in kelvin # check if this is ZI or IZ: # check if the same temperature already measured: methcode = "LP-PI-TRM:LP-PI-TRM-ZI" for j in range(0, i): if Data[specimen][j]['treatment'][0] == treatment[ 0]: if Data[specimen][j]['treatment'][ 1] == '1' or Data[specimen][j][ 'treatment'][1] == '10': methcode = "LP-PI-TRM:LP-PI-TRM-IZ" else: methcode = "LP-PI-TRM:LP-PI-TRM-ZI" elif treatment[1] == '1' or treatment[1] == '10': LT_code = "LT-T-I" MagRec["treatment_dc_field"] = '%8.3e' % ( labfield ) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"] = '%7.1f' % ( phi) # labfield phi MagRec["treatment_dc_field_theta"] = '%7.1f' % ( theta) # labfield theta MagRec["treatment_temp"] = '%8.3e' % ( float(treatment[0]) + 273.) # temp in kelvin # check if this is ZI or IZ: # check if the same temperature already measured: methcode = "LP-PI-TRM:LP-PI-TRM-IZ" for j in range(0, i): if Data[specimen][j]['treatment'][0] == treatment[ 0]: if Data[specimen][j]['treatment'][ 1] == '0' or Data[specimen][j][ 'treatment'][1] == '00': methcode = "LP-PI-TRM:LP-PI-TRM-ZI" else: methcode = "LP-PI-TRM:LP-PI-TRM-IZ" elif treatment[1] == '2' or treatment[1] == '20': LT_code = "LT-PTRM-I" MagRec["treatment_dc_field"] = '%8.3e' % ( labfield ) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"] = '%7.1f' % ( phi) # labfield phi MagRec["treatment_dc_field_theta"] = '%7.1f' % ( theta) # labfield theta MagRec["treatment_temp"] = '%8.3e' % ( float(treatment[0]) + 273.) # temp in kelvin methcode = "LP-PI-TRM:LP-PI-TRM-IZ" else: print( "ERROR in treatment field line %i... exiting until you fix the problem" % line_no) return False, "ERROR in treatment field line %i... exiting until you fix the problem" % line_no MagRec["magic_method_codes"] = LT_code + ":" + methcode MagRec["measurement_number"] = "%i" % i MagRec["measurement_description"] = "" MagRecs.append(MagRec) #continue #---------------------------------------- # demag experimet #---------------------------------------- if LPcode == "LP-DIR-T": MagRec["magic_experiment_name"] = specimen + ":" + LPcode methcode = LPcode if treatment_type == "N": LT_code = "LT-NO" else: LT_code = "LT-T-Z" methcode = LPcode + ":" + "LT-T-Z" MagRec["treatment_dc_field_phi"] = '0' MagRec["treatment_dc_field_theta"] = '0' MagRec["treatment_dc_field"] = '%8.3e' % (0) MagRec["treatment_temp"] = '%8.3e' % ( float(treatment[0]) + 273.) # temp in kelvin MagRec["magic_method_codes"] = LT_code + ":" + methcode MagRec["measurement_number"] = "%i" % i MagRec["measurement_description"] = "" MagRecs.append(MagRec) #continue #---------------------------------------- # ATRM measurements # The direction of the magnetization is used to determine the # direction of the lab field. #---------------------------------------- if LPcode == "LP-AN-TRM": MagRec["magic_experiment_name"] = specimen + ":" + LPcode methcode = LPcode if float(treatment[1]) == 0: MagRec["magic_method_codes"] = "LP-AN-TRM:LT-T-Z" MagRec["treatment_dc_field_phi"] = '0' MagRec["treatment_dc_field_theta"] = '0' MagRec["treatment_temp"] = '%8.3e' % ( float(treatment[0]) + 273.) # temp in kelvin MagRec["treatment_dc_field"] = '0' else: if float(treatment[1]) == 7: # alteration check methcode = "LP-AN-TRM:LT-PTRM-I" MagRec["measurement_number"] = '7' # -z else: MagRec["magic_method_codes"] = "LP-AN-TRM:LT-T-I" inc = float(MagRec["measurement_inc"]) dec = float(MagRec["measurement_dec"]) if abs(inc) < 45 and (dec < 45 or dec > 315): # +x tdec, tinc = 0, 0 MagRec["measurement_number"] = '1' if abs(inc) < 45 and (dec < 135 and dec > 45): tdec, tinc = 90, 0 MagRec["measurement_number"] = '2' # +y if inc > 45: tdec, tinc = 0, 90 MagRec["measurement_number"] = '3' # +z if abs(inc) < 45 and (dec < 225 and dec > 135): tdec, tinc = 180, 0 MagRec["measurement_number"] = '4' # -x if abs(inc) < 45 and (dec < 315 and dec > 225): tdec, tinc = 270, 0 MagRec["measurement_number"] = '5' # -y if inc < -45: tdec, tinc = 0, -90 MagRec["measurement_number"] = '6' # -z MagRec["treatment_dc_field_phi"] = '%7.1f' % (tdec) MagRec["treatment_dc_field_theta"] = '%7.1f' % (tinc) MagRec["treatment_temp"] = '%8.3e' % ( float(treatment[0]) + 273.) # temp in kelvin MagRec["treatment_dc_field"] = '%8.3e' % (labfield) MagRec["measurement_description"] = "" MagRecs.append(MagRec) #continue #---------------------------------------- # NLT measurements # or TRM acquisistion experiment #---------------------------------------- if LPcode == "LP-TRM": MagRec["magic_experiment_name"] = specimen + ":" + LPcode MagRec["magic_method_codes"] = "LP-TRM:LT-T-I" if float(treatment[1]) == 0: labfield = 0 else: labfield = float(float(treatment[1])) * 1e-6 MagRec["treatment_temp"] = '%8.3e' % ( float(treatment[0]) + 273.) # temp in kelvin MagRec["treatment_dc_field"] = '%8.3e' % ( labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"] = '%i' % ( int(phi)) # labfield phi MagRec["treatment_dc_field_theta"] = '%i' % ( int(theta)) # labfield theta MagRec["measurement_number"] = "%i" % i MagRec["measurement_description"] = "" MagRecs.append(MagRec) #continue #---------------------------------------- # Cooling rate experiments #---------------------------------------- if LPcode == "LP-CR-TRM": index = int(treatment[1][0]) #print index,"index" #print CR_cooling_times,"CR_cooling_times" #print CR_cooling_times[index-1] #print CR_cooling_times[0:index-1] if index == 7 or index == 70: # alteration check as final measurement meas_type = "LT-PTRM-I:LP-CR-TRM" CR_cooling_time = CR_cooling_times[-1] else: meas_type = "LT-T-I:LP-CR-TRM" CR_cooling_time = CR_cooling_times[index - 1] MagRec["magic_method_codes"] = meas_type MagRec["magic_experiment_name"] = specimen + ":" + LPcode MagRec["treatment_temp"] = '%8.3e' % ( float(treatment[0]) + 273.) # temp in kelvin MagRec["treatment_dc_field"] = '%8.3e' % ( labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"] = '%7.1f' % ( phi) # labfield phi MagRec["treatment_dc_field_theta"] = '%7.1f' % ( theta) # labfield theta MagRec["measurement_number"] = "%i" % index MagRec[ "measurement_description"] = "cooling_rate" + ":" + CR_cooling_time + ":" + "K/min" #MagRec["measurement_description"]="%.1f minutes per cooling time"%int(CR_cooling_time) MagRecs.append(MagRec) #continue pmag.magic_write(meas_file, MagRecs, 'magic_measurements') print("-I- results put in ", meas_file) return True, meas_file
import wx, os, sys import pmagpy.find_pmag_dir as find_pmag_dir from copy import copy from numpy import vstack,sqrt from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar from matplotlib.figure import Figure import help_files.demag_interpretation_editor_help as dieh from pmagpy.demag_gui_utilities import * from pmagpy.Fit import * from pmagpy.pmag import get_version global CURRENT_VERSION, PMAGPY_DIRECTORY CURRENT_VERSION = get_version() PMAGPY_DIRECTORY = find_pmag_dir.get_pmag_dir() IMG_DIRECTORY = os.path.join(PMAGPY_DIRECTORY, 'dialogs', 'images') class InterpretationEditorFrame(wx.Frame): #########################Init Funcions############################# def __init__(self,parent): """Constructor""" #set parent and resolution self.parent = parent self.GUI_RESOLUTION=self.parent.GUI_RESOLUTION #call init of super class default_style = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.NO_FULL_REPAINT_ON_RESIZE | wx.WS_EX_CONTEXTHELP | wx.FRAME_EX_CONTEXTHELP wx.Frame.__init__(self, self.parent, title="Interpretation Editor version:%s"%CURRENT_VERSION,style=default_style, size=(675*self.GUI_RESOLUTION,425*self.GUI_RESOLUTION)) self.Bind(wx.EVT_CLOSE, self.on_close_edit_window)
def convert(**kwargs): # initialize some stuff demag = "N" version_num = pmag.get_version() dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'measurements.txt') spec_file = kwargs.get('spec_file', 'specimens.txt') samp_file = kwargs.get('samp_file', 'samples.txt') site_file = kwargs.get('site_file', 'sites.txt') loc_file = kwargs.get('loc_file', 'locations.txt') mag_file = kwargs.get('mag_file', '') site = kwargs.get('site', 'unknown') expedition = kwargs.get('expedition', 'unknown') lat = kwargs.get('lat', '') lon = kwargs.get('lon', '') noave = kwargs.get('noave', False) # default means DO average meth_code = kwargs.get('meth_code', "LP-NO") volume = kwargs.get('volume', 2.5** 3) * 1e-6 #default volume is a 2.5cm cube meth_code = meth_code + ":FS-C-DRILL-IODP:SP-SS-C:SO-V" meth_code = meth_code.strip(":") if not mag_file: print("-W- You must provide an IODP_jr6 format file") return False, "You must provide an IODP_jr6 format file" mag_file = os.path.join(input_dir_path, mag_file) # validate variables if not os.path.isfile(mag_file): print( 'The input file you provided: {} does not exist.\nMake sure you have specified the correct filename AND correct input directory name.' .format(mag_file)) return False, 'The input file you provided: {} does not exist.\nMake sure you have specified the correct filename AND correct input directory name.'.format( mag_file) # parse data temp = os.path.join(output_dir_path, 'temp.txt') fix_separation(mag_file, temp) infile = open(temp, 'r') lines = infile.readlines() infile.close() try: os.remove(temp) except OSError: print("problem with temp file") citations = "This Study" MeasRecs, SpecRecs, SampRecs, SiteRecs, LocRecs = [], [], [], [], [] for line in lines: MeasRec, SpecRec, SampRec, SiteRec, LocRec = {}, {}, {}, {}, {} line = line.split() spec_text_id = line[0] specimen = spec_text_id for dem in ['-', '_']: if dem in spec_text_id: sample = dem.join(spec_text_id.split(dem)[:-1]) break location = expedition + site if specimen != "" and specimen not in [ x['specimen'] if 'specimen' in list(x.keys()) else "" for x in SpecRecs ]: SpecRec['specimen'] = specimen SpecRec['sample'] = sample SpecRec['volume'] = volume SpecRec['citations'] = citations SpecRecs.append(SpecRec) if sample != "" and sample not in [ x['sample'] if 'sample' in list(x.keys()) else "" for x in SampRecs ]: SampRec['sample'] = sample SampRec['site'] = site SampRec['citations'] = citations SampRec['azimuth'] = line[6] SampRec['dip'] = line[7] SampRec['bed_dip_direction'] = line[8] SampRec['bed_dip'] = line[9] SampRec['method_codes'] = meth_code SampRecs.append(SampRec) if site != "" and site not in [ x['site'] if 'site' in list(x.keys()) else "" for x in SiteRecs ]: SiteRec['site'] = site SiteRec['location'] = location SiteRec['citations'] = citations SiteRec['lat'] = lat SiteRec['lon'] = lon SiteRecs.append(SiteRec) if location != "" and location not in [ x['location'] if 'location' in list(x.keys()) else "" for x in LocRecs ]: LocRec['location'] = location LocRec['citations'] = citations LocRec['expedition_name'] = expedition LocRec['lat_n'] = lat LocRec['lon_e'] = lon LocRec['lat_s'] = lat LocRec['lon_w'] = lon LocRecs.append(LocRec) MeasRec['specimen'] = specimen MeasRec["citations"] = citations MeasRec['software_packages'] = version_num MeasRec["treat_temp"] = '%8.3e' % (273) # room temp in kelvin MeasRec["meas_temp"] = '%8.3e' % (273) # room temp in kelvin MeasRec["quality"] = 'g' MeasRec["standard"] = 'u' MeasRec["treat_step_num"] = '1' MeasRec["treat_ac_field"] = '0' x = float(line[4]) y = float(line[3]) negz = float(line[2]) cart = np.array([x, y, -negz]).transpose() direction = pmag.cart2dir(cart).transpose() expon = float(line[5]) magn_volume = direction[2] * (10.0**expon) moment = magn_volume * volume MeasRec["magn_moment"] = str(moment) MeasRec["magn_volume"] = str( magn_volume) #str(direction[2] * (10.0 ** expon)) MeasRec["dir_dec"] = '%7.1f' % (direction[0]) MeasRec["dir_inc"] = '%7.1f' % (direction[1]) step = line[1] if step == 'NRM': meas_type = "LT-NO" elif step[0:2] == 'AD': meas_type = "LT-AF-Z" treat = float(step[2:]) MeasRec["treat_ac_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla elif step[0:2] == 'TD': meas_type = "LT-T-Z" treat = float(step[2:]) MeasRec["treat_temp"] = '%8.3e' % (treat + 273.) # temp in kelvin elif step[0:3] == 'ARM': # meas_type = "LT-AF-I" treat = float(row['step'][3:]) MeasRec["treat_ac_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla MeasRec["treat_dc_field"] = '%8.3e' % (50e-6 ) # assume 50uT DC field MeasRec[ "measurement_description"] = 'Assumed DC field - actual unknown' elif step[0] == 'A': meas_type = "LT-AF-Z" treat = float(step[1:]) MeasRec["treat_ac_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla elif step[0] == 'T': meas_type = "LT-T-Z" treat = float(step[1:]) MeasRec["treat_temp"] = '%8.3e' % (treat + 273.) # temp in kelvin elif step[0:3] == 'IRM': # meas_type = "LT-IRM" treat = float(step[3:]) MeasRec["treat_dc_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla else: print('unknown treatment type for ', row) return False, 'unknown treatment type for ', row MeasRec['method_codes'] = meas_type MeasRecs.append(MeasRec.copy()) con = nb.Contribution(output_dir_path, read_tables=[]) con.add_magic_table_from_data(dtype='specimens', data=SpecRecs) con.add_magic_table_from_data(dtype='samples', data=SampRecs) con.add_magic_table_from_data(dtype='sites', data=SiteRecs) con.add_magic_table_from_data(dtype='locations', data=LocRecs) MeasOuts = pmag.measurements_methods3(MeasRecs, noave) con.add_magic_table_from_data(dtype='measurements', data=MeasOuts) con.tables['specimens'].write_magic_file(custom_name=spec_file) con.tables['samples'].write_magic_file(custom_name=samp_file) con.tables['sites'].write_magic_file(custom_name=site_file) con.tables['locations'].write_magic_file(custom_name=loc_file) con.tables['measurements'].write_magic_file(custom_name=meas_file) return (True, meas_file)
def main(command_line=True, **kwargs): """ NAME sio_magic.py DESCRIPTION converts SIO .mag format files to magic_measurements format files SYNTAX sio_magic.py [command line options] OPTIONS -h: prints the help message and quits. -usr USER: identify user, default is "" -f FILE: specify .mag format input file, required -fsa SAMPFILE : specify er_samples.txt file relating samples, site and locations names,default is none -- values in SAMPFILE will override selections for -loc (location), -spc (designate specimen), and -ncn (sample-site naming convention) -F FILE: specify output file, default is magic_measurements.txt -Fsy: specify er_synthetics file, default is er_sythetics.txt -LP [colon delimited list of protocols, include all that apply] AF: af demag T: thermal including thellier but not trm acquisition S: Shaw method I: IRM (acquisition) I3d: 3D IRM experiment N: NRM only TRM: trm acquisition ANI: anisotropy experiment D: double AF demag G: triple AF demag (GRM protocol) CR: cooling rate experiment. The treatment coding of the measurement file should be: XXX.00,XXX.10, XXX.20 ...XX.70 etc. (XXX.00 is optional) where XXX in the temperature and .10,.20... are running numbers of the cooling rates steps. XXX.00 is optional zerofield baseline. XXX.70 is alteration check. syntax in sio_magic is: -LP CR xxx,yyy,zzz,..... xxx -A where xxx, yyy, zzz...xxx are cooling time in [K/minutes], seperated by comma, ordered at the same order as XXX.10,XXX.20 ...XX.70 if you use a zerofield step then no need to specify the cooling rate for the zerofield It is important to add to the command line the -A option so the measurements will not be averaged. But users need to make sure that there are no duplicate measurements in the file -V [1,2,3] units of IRM field in volts using ASC coil #1,2 or 3 -spc NUM : specify number of characters to designate a specimen, default = 0 -loc LOCNAME : specify location/study name, must have either LOCNAME or SAMPFILE or be a synthetic -syn INST TYPE: sets these specimens as synthetics created at institution INST and of type TYPE -ins INST : specify which demag instrument was used (e.g, SIO-Suzy or SIO-Odette),default is "" -dc B PHI THETA: dc lab field (in micro tesla) and phi,theta, default is none NB: use PHI, THETA = -1 -1 to signal that it changes, i.e. in anisotropy experiment -ac B : peak AF field (in mT) for ARM acquisition, default is none -ncn NCON: specify naming convention: default is #1 below -A: don't average replicate measurements Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. [8] synthetic - has no site name [9] ODP naming convention INPUT Best to put separate experiments (all AF, thermal, thellier, trm aquisition, Shaw, etc.) in seperate .mag files (eg. af.mag, thermal.mag, etc.) Format of SIO .mag files: Spec Treat CSD Intensity Declination Inclination [optional metadata string] Spec: specimen name Treat: treatment step XXX T in Centigrade XXX AF in mT for special experiments: Thellier: XXX.0 first zero field step XXX.1 first in field step [XXX.0 and XXX.1 can be done in any order] XXX.2 second in-field step at lower temperature (pTRM check) XXX.3 second zero-field step after infield (pTRM check step) XXX.3 MUST be done in this order [XXX.0, XXX.1 [optional XXX.2] XXX.3] AARM: X.00 baseline step (AF in zero bias field - high peak field) X.1 ARM step (in field step) where X is the step number in the 15 position scheme (see Appendix to Lecture 13 - http://magician.ucsd.edu/Essentials_2) ATRM: X.00 optional baseline X.1 ATRM step (+X) X.2 ATRM step (+Y) X.3 ATRM step (+Z) X.4 ATRM step (-X) X.5 ATRM step (-Y) X.6 ATRM step (-Z) X.7 optional alteration check (+X) TRM: XXX.YYY XXX is temperature step of total TRM YYY is dc field in microtesla Intensity assumed to be total moment in 10^3 Am^2 (emu) Declination: Declination in specimen coordinate system Inclination: Declination in specimen coordinate system Optional metatdata string: mm/dd/yy;hh:mm;[dC,mT];xx.xx;UNITS;USER;INST;NMEAS hh in 24 hours. dC or mT units of treatment XXX (see Treat above) for thermal or AF respectively xx.xxx DC field UNITS of DC field (microT, mT) INST: instrument code, number of axes, number of positions (e.g., G34 is 2G, three axes, measured in four positions) NMEAS: number of measurements in a single position (1,3,200...) """ # initialize some stuff mag_file = None codelist = None infile_type="mag" noave=0 methcode,inst="LP-NO","" phi,theta,peakfield,labfield=0,0,0,0 pTRM,MD,samp_con,Z=0,0,'1',1 dec=[315,225,180,135,45,90,270,270,270,90,180,180,0,0,0] inc=[0,0,0,0,0,-45,-45,0,45,45,45,-45,-90,-45,45] tdec=[0,90,0,180,270,0,0,90,0] tinc=[0,0,90,0,0,-90,0,0,90] missing=1 demag="N" er_location_name="" citation='This study' args=sys.argv fmt='old' syn=0 synfile='er_synthetics.txt' samp_infile,Samps='',[] trm=0 irm=0 specnum=0 coil="" mag_file="" # # get command line arguments # meas_file="magic_measurements.txt" user="" if not command_line: user = kwargs.get('user', '') meas_file = kwargs.get('meas_file', '') syn_file = kwargs.get('syn_file', '') mag_file = kwargs.get('mag_file', '') labfield = kwargs.get('labfield', '') if labfield: labfield = float(labfield) *1e-6 else: labfield = 0 phi = kwargs.get('phi', 0) if phi: phi = float(phi) else: phi = 0 theta = kwargs.get('theta', 0) if theta: theta=float(theta) else: theta = 0 peakfield = kwargs.get('peakfield', 0) if peakfield: peakfield=float(peakfield) *1e-3 else: peakfield = 0 specnum = kwargs.get('specnum', 0) samp_con = kwargs.get('samp_con', '1') er_location_name = kwargs.get('er_location_name', '') samp_infile = kwargs.get('samp_infile', '') syn = kwargs.get('syn', 0) institution = kwargs.get('institution', '') syntype = kwargs.get('syntype', '') inst = kwargs.get('inst', '') noave = kwargs.get('noave', 0) codelist = kwargs.get('codelist', '') coil = kwargs.get('coil', '') cooling_rates = kwargs.get('cooling_rates', '') if command_line: if "-h" in args: print(main.__doc__) return False if "-usr" in args: ind=args.index("-usr") user=args[ind+1] if '-F' in args: ind=args.index("-F") meas_file=args[ind+1] if '-Fsy' in args: ind=args.index("-Fsy") synfile=args[ind+1] if '-f' in args: ind=args.index("-f") mag_file=args[ind+1] if "-dc" in args: ind=args.index("-dc") labfield=float(args[ind+1])*1e-6 phi=float(args[ind+2]) theta=float(args[ind+3]) if "-ac" in args: ind=args.index("-ac") peakfield=float(args[ind+1])*1e-3 if "-spc" in args: ind=args.index("-spc") specnum=int(args[ind+1]) if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-fsa" in args: ind=args.index("-fsa") samp_infile = args[ind+1] if '-syn' in args: syn=1 ind=args.index("-syn") institution=args[ind+1] syntype=args[ind+2] if '-fsy' in args: ind=args.index("-fsy") synfile=args[ind+1] if "-ins" in args: ind=args.index("-ins") inst=args[ind+1] if "-A" in args: noave=1 if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if '-LP' in args: ind=args.index("-LP") codelist=args[ind+1] if "-V" in args: ind=args.index("-V") coil=args[ind+1] # make sure all initial values are correctly set up (whether they come from the command line or a GUI) if samp_infile: Samps, file_type = pmag.magic_read(samp_infile) if coil: coil = str(coil) methcode="LP-IRM" irmunits = "V" if coil not in ["1","2","3"]: print(main.__doc__) print('not a valid coil specification') return False, '{} is not a valid coil specification'.format(coil) if mag_file: try: #with open(mag_file,'r') as finput: # lines = finput.readlines() lines=pmag.open_file(mag_file) except: print("bad mag file name") return False, "bad mag file name" if not mag_file: print(main.__doc__) print("mag_file field is required option") return False, "mag_file field is required option" if specnum!=0: specnum=-specnum #print 'samp_con:', samp_con if samp_con: if "4" == samp_con[0]: if "-" not in samp_con: print("naming convention option [4] must be in form 4-Z where Z is an integer") print('---------------') return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="4" if "7" == samp_con[0]: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "option [7] must be in form 7-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="7" if codelist: codes=codelist.split(':') if "AF" in codes: demag='AF' if'-dc' not in args: methcode="LT-AF-Z" if'-dc' in args: methcode="LT-AF-I" if "T" in codes: demag="T" if '-dc' not in args: methcode="LT-T-Z" if '-dc' in args: methcode="LT-T-I" if "I" in codes: methcode="LP-IRM" irmunits="mT" if "I3d" in codes: methcode="LT-T-Z:LP-IRM-3D" if "S" in codes: demag="S" methcode="LP-PI-TRM:LP-PI-ALT-AFARM" trm_labfield=labfield ans=input("DC lab field for ARM step: [50uT] ") if ans=="": arm_labfield=50e-6 else: arm_labfield=float(ans)*1e-6 ans=input("temperature for total trm step: [600 C] ") if ans=="": trm_peakT=600+273 # convert to kelvin else: trm_peakT=float(ans)+273 # convert to kelvin if "G" in codes: methcode="LT-AF-G" if "D" in codes: methcode="LT-AF-D" if "TRM" in codes: demag="T" trm=1 if "CR" in codes: demag="T" cooling_rate_experiment=1 if command_line: ind=args.index("CR") cooling_rates=args[ind+1] cooling_rates_list=cooling_rates.split(',') else: cooling_rates_list=str(cooling_rates).split(',') if demag=="T" and "ANI" in codes: methcode="LP-AN-TRM" if demag=="T" and "CR" in codes: methcode="LP-CR-TRM" if demag=="AF" and "ANI" in codes: methcode="LP-AN-ARM" if labfield==0: labfield=50e-6 if peakfield==0: peakfield=.180 SynRecs,MagRecs=[],[] version_num=pmag.get_version() ################################## if 1: #if infile_type=="SIO format": for line in lines: instcode="" if len(line)>2: SynRec={} MagRec={} MagRec['er_location_name']=er_location_name MagRec['magic_software_packages']=version_num MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["treatment_ac_field"]='0' MagRec["treatment_dc_field"]='0' MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' meas_type="LT-NO" rec=line.split() if rec[1]==".00":rec[1]="0.00" treat=rec[1].split('.') if methcode=="LP-IRM": if irmunits=='mT': labfield=float(treat[0])*1e-3 else: labfield=pmag.getfield(irmunits,coil,treat[0]) if rec[1][0]!="-": phi,theta=0.,90. else: phi,theta=0.,-90. meas_type="LT-IRM" MagRec["treatment_dc_field"]='%8.3e'%(labfield) MagRec["treatment_dc_field_phi"]='%7.1f'%(phi) MagRec["treatment_dc_field_theta"]='%7.1f'%(theta) if len(rec)>6: code1=rec[6].split(';') # break e.g., 10/15/02;7:45 indo date and time if len(code1)==2: # old format with AM/PM missing=0 code2=code1[0].split('/') # break date into mon/day/year code3=rec[7].split(';') # break e.g., AM;C34;200 into time;instr/axes/measuring pos;number of measurements yy=int(code2[2]) if yy <90: yyyy=str(2000+yy) else: yyyy=str(1900+yy) mm=int(code2[0]) if mm<10: mm="0"+str(mm) else: mm=str(mm) dd=int(code2[1]) if dd<10: dd="0"+str(dd) else: dd=str(dd) time=code1[1].split(':') hh=int(time[0]) if code3[0]=="PM":hh=hh+12 if hh<10: hh="0"+str(hh) else: hh=str(hh) min=int(time[1]) if min<10: min= "0"+str(min) else: min=str(min) MagRec["measurement_date"]=yyyy+":"+mm+":"+dd+":"+hh+":"+min+":00.00" MagRec["measurement_time_zone"]='SAN' if inst=="": if code3[1][0]=='C':instcode='SIO-bubba' if code3[1][0]=='G':instcode='SIO-flo' else: instcode='' MagRec["measurement_positions"]=code3[1][2] elif len(code1)>2: # newest format (cryo7 or later) if "LP-AN-ARM" not in methcode:labfield=0 fmt='new' date=code1[0].split('/') # break date into mon/day/year yy=int(date[2]) if yy <90: yyyy=str(2000+yy) else: yyyy=str(1900+yy) mm=int(date[0]) if mm<10: mm="0"+str(mm) else: mm=str(mm) dd=int(date[1]) if dd<10: dd="0"+str(dd) else: dd=str(dd) time=code1[1].split(':') hh=int(time[0]) if hh<10: hh="0"+str(hh) else: hh=str(hh) min=int(time[1]) if min<10: min= "0"+str(min) else: min=str(min) MagRec["measurement_date"]=yyyy+":"+mm+":"+dd+":"+hh+":"+min+":00.00" MagRec["measurement_time_zone"]='SAN' if inst=="": if code1[6][0]=='C': instcode='SIO-bubba' if code1[6][0]=='G': instcode='SIO-flo' else: instcode='' if len(code1)>1: MagRec["measurement_positions"]=code1[6][2] else: MagRec["measurement_positions"]=code1[7] # takes care of awkward format with bubba and flo being different if user=="":user=code1[5] if code1[2][-1]=='C': demag="T" if code1[4]=='microT' and float(code1[3])!=0. and "LP-AN-ARM" not in methcode: labfield=float(code1[3])*1e-6 if code1[2]=='mT' and methcode!="LP-IRM": demag="AF" if code1[4]=='microT' and float(code1[3])!=0.: labfield=float(code1[3])*1e-6 if code1[4]=='microT' and labfield!=0. and meas_type!="LT-IRM": phi,theta=0.,-90. if demag=="T": meas_type="LT-T-I" if demag=="AF": meas_type="LT-AF-I" MagRec["treatment_dc_field"]='%8.3e'%(labfield) MagRec["treatment_dc_field_phi"]='%7.1f'%(phi) MagRec["treatment_dc_field_theta"]='%7.1f'%(theta) if code1[4]=='' or labfield==0. and meas_type!="LT-IRM": if demag=='T':meas_type="LT-T-Z" if demag=="AF":meas_type="LT-AF-Z" MagRec["treatment_dc_field"]='0' if syn==0: MagRec["er_specimen_name"]=rec[0] MagRec["er_synthetic_name"]="" MagRec["er_site_name"]="" if specnum!=0: MagRec["er_sample_name"]=rec[0][:specnum] else: MagRec["er_sample_name"]=rec[0] if samp_infile and Samps: # if samp_infile was provided AND yielded sample data samp=pmag.get_dictitem(Samps,'er_sample_name',MagRec['er_sample_name'],'T') if len(samp)>0: MagRec["er_location_name"]=samp[0]["er_location_name"] MagRec["er_site_name"]=samp[0]["er_site_name"] else: MagRec['er_location_name']='' MagRec["er_site_name"]='' elif int(samp_con)!=6: site=pmag.parse_site(MagRec['er_sample_name'],samp_con,Z) MagRec["er_site_name"]=site if MagRec['er_site_name']=="": print('No site name found for: ',MagRec['er_specimen_name'],MagRec['er_sample_name']) if MagRec["er_location_name"]=="": print('no location name for: ',MagRec["er_specimen_name"]) else: MagRec["er_specimen_name"]=rec[0] if specnum!=0: MagRec["er_sample_name"]=rec[0][:specnum] else: MagRec["er_sample_name"]=rec[0] MagRec["er_site_name"]="" MagRec["er_synthetic_name"]=MagRec["er_specimen_name"] SynRec["er_synthetic_name"]=MagRec["er_specimen_name"] site=pmag.parse_site(MagRec['er_sample_name'],samp_con,Z) SynRec["synthetic_parent_sample"]=site SynRec["er_citation_names"]="This study" SynRec["synthetic_institution"]=institution SynRec["synthetic_type"]=syntype SynRecs.append(SynRec) if float(rec[1])==0: pass elif demag=="AF": if methcode != "LP-AN-ARM": MagRec["treatment_ac_field"]='%8.3e' %(float(rec[1])*1e-3) # peak field in tesla if meas_type=="LT-AF-Z": MagRec["treatment_dc_field"]='0' else: # AARM experiment if treat[1][0]=='0': meas_type="LT-AF-Z:LP-AN-ARM:" MagRec["treatment_ac_field"]='%8.3e' %(peakfield) # peak field in tesla MagRec["treatment_dc_field"]='%8.3e'%(0) if labfield!=0 and methcode!="LP-AN-ARM": print("Warning - inconsistency in mag file with lab field - overriding file with 0") else: meas_type="LT-AF-I:LP-AN-ARM" ipos=int(treat[0])-1 MagRec["treatment_dc_field_phi"]='%7.1f' %(dec[ipos]) MagRec["treatment_dc_field_theta"]='%7.1f'% (inc[ipos]) MagRec["treatment_dc_field"]='%8.3e'%(labfield) MagRec["treatment_ac_field"]='%8.3e' %(peakfield) # peak field in tesla elif demag=="T" and methcode == "LP-AN-TRM": MagRec["treatment_temp"]='%8.3e' % (float(treat[0])+273.) # temp in kelvin if treat[1][0]=='0': meas_type="LT-T-Z:LP-AN-TRM" MagRec["treatment_dc_field"]='%8.3e'%(0) MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' else: MagRec["treatment_dc_field"]='%8.3e'%(labfield) if treat[1][0]=='7': # alteration check as final measurement meas_type="LT-PTRM-I:LP-AN-TRM" else: meas_type="LT-T-I:LP-AN-TRM" # find the direction of the lab field in two ways: # (1) using the treatment coding (XX.1=+x, XX.2=+y, XX.3=+z, XX.4=-x, XX.5=-y, XX.6=-z) ipos_code=int(treat[1][0])-1 # (2) using the magnetization DEC=float(rec[4]) INC=float(rec[5]) if INC < 45 and INC > -45: if DEC>315 or DEC<45: ipos_guess=0 if DEC>45 and DEC<135: ipos_guess=1 if DEC>135 and DEC<225: ipos_guess=3 if DEC>225 and DEC<315: ipos_guess=4 else: if INC >45: ipos_guess=2 if INC <-45: ipos_guess=5 # prefer the guess over the code ipos=ipos_guess MagRec["treatment_dc_field_phi"]='%7.1f' %(tdec[ipos]) MagRec["treatment_dc_field_theta"]='%7.1f'% (tinc[ipos]) # check it if ipos_guess!=ipos_code and treat[1][0]!='7': print("-E- ERROR: check specimen %s step %s, ATRM measurements, coding does not match the direction of the lab field!"%(rec[0],".".join(list(treat)))) elif demag=="S": # Shaw experiment if treat[1][1]=='0': if int(treat[0])!=0: MagRec["treatment_ac_field"]='%8.3e' % (float(treat[0])*1e-3) # AF field in tesla MagRec["treatment_dc_field"]='0' meas_type="LT-AF-Z" # first AF else: meas_type="LT-NO" MagRec["treatment_ac_field"]='0' MagRec["treatment_dc_field"]='0' elif treat[1][1]=='1': if int(treat[0])==0: MagRec["treatment_ac_field"]='%8.3e' %(peakfield) # peak field in tesla MagRec["treatment_dc_field"]='%8.3e'%(arm_labfield) MagRec["treatment_dc_field_phi"]='%7.1f'%(phi) MagRec["treatment_dc_field_theta"]='%7.1f'%(theta) meas_type="LT-AF-I" else: MagRec["treatment_ac_field"]='%8.3e' % ( float(treat[0])*1e-3) # AF field in tesla MagRec["treatment_dc_field"]='0' meas_type="LT-AF-Z" elif treat[1][1]=='2': if int(treat[0])==0: MagRec["treatment_ac_field"]='0' MagRec["treatment_dc_field"]='%8.3e'%(trm_labfield) MagRec["treatment_dc_field_phi"]='%7.1f'%(phi) MagRec["treatment_dc_field_theta"]='%7.1f'%(theta) MagRec["treatment_temp"]='%8.3e' % (trm_peakT) meas_type="LT-T-I" else: MagRec["treatment_ac_field"]='%8.3e' % ( float(treat[0])*1e-3) # AF field in tesla MagRec["treatment_dc_field"]='0' meas_type="LT-AF-Z" elif treat[1][1]=='3': if int(treat[0])==0: MagRec["treatment_ac_field"]='%8.3e' %(peakfield) # peak field in tesla MagRec["treatment_dc_field"]='%8.3e'%(arm_labfield) MagRec["treatment_dc_field_phi"]='%7.1f'%(phi) MagRec["treatment_dc_field_theta"]='%7.1f'%(theta) meas_type="LT-AF-I" else: MagRec["treatment_ac_field"]='%8.3e' % ( float(treat[0])*1e-3) # AF field in tesla MagRec["treatment_dc_field"]='0' meas_type="LT-AF-Z" # Cooling rate experient # added by rshaar elif demag=="T" and methcode == "LP-CR-TRM": MagRec["treatment_temp"]='%8.3e' % (float(treat[0])+273.) # temp in kelvin if treat[1][0]=='0': meas_type="LT-T-Z:LP-CR-TRM" MagRec["treatment_dc_field"]='%8.3e'%(0) MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' else: MagRec["treatment_dc_field"]='%8.3e'%(labfield) if treat[1][0]=='7': # alteration check as final measurement meas_type="LT-PTRM-I:LP-CR-TRM" else: meas_type="LT-T-I:LP-CR-TRM" MagRec["treatment_dc_field_phi"]='%7.1f' % (phi) # labfield phi MagRec["treatment_dc_field_theta"]='%7.1f' % (theta) # labfield theta indx=int(treat[1][0])-1 # alteration check matjed as 0.7 in the measurement file if indx==6: cooling_time= cooling_rates_list[-1] else: cooling_time=cooling_rates_list[indx] MagRec["measurement_description"]="cooling_rate"+":"+cooling_time+":"+"K/min" elif demag!='N': if len(treat)==1:treat.append('0') MagRec["treatment_temp"]='%8.3e' % (float(treat[0])+273.) # temp in kelvin if trm==0: # demag=T and not trmaq if treat[1][0]=='0': meas_type="LT-T-Z" else: MagRec["treatment_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"]='%7.1f' % (phi) # labfield phi MagRec["treatment_dc_field_theta"]='%7.1f' % (theta) # labfield theta if treat[1][0]=='1':meas_type="LT-T-I" # in-field thermal step if treat[1][0]=='2': meas_type="LT-PTRM-I" # pTRM check pTRM=1 if treat[1][0]=='3': MagRec["treatment_dc_field"]='0' # this is a zero field step meas_type="LT-PTRM-MD" # pTRM tail check else: labfield=float(treat[1])*1e-6 MagRec["treatment_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MagRec["treatment_dc_field_phi"]='%7.1f' % (phi) # labfield phi MagRec["treatment_dc_field_theta"]='%7.1f' % (theta) # labfield theta meas_type="LT-T-I:LP-TRM" # trm acquisition experiment MagRec["measurement_csd"]=rec[2] MagRec["measurement_magn_moment"]='%10.3e'% (float(rec[3])*1e-3) # moment in Am^2 (from emu) MagRec["measurement_dec"]=rec[4] MagRec["measurement_inc"]=rec[5] MagRec["magic_instrument_codes"]=instcode MagRec["er_analyst_mail_names"]=user MagRec["er_citation_names"]=citation if "LP-IRM-3D" in methcode : meas_type=methcode #MagRec["magic_method_codes"]=methcode.strip(':') MagRec["magic_method_codes"]=meas_type MagRec["measurement_flag"]='g' MagRec["er_specimen_name"]=rec[0] if 'std' in rec[0]: MagRec["measurement_standard"]='s' else: MagRec["measurement_standard"]='u' MagRec["measurement_number"]='1' #print MagRec['treatment_temp'] MagRecs.append(MagRec) MagOuts=pmag.measurements_methods(MagRecs,noave) pmag.magic_write(meas_file,MagOuts,'magic_measurements') print("results put in ",meas_file) if len(SynRecs)>0: pmag.magic_write(synfile,SynRecs,'er_synthetics') print("synthetics put in ",synfile) return True, meas_file
def main(command_line=True, **kwargs): """ NAME jr6_magic.py DESCRIPTION converts JR6 format files to magic_measurements format files SYNTAX jr6_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt # -Fsa: specify er_samples format file for appending, default is new er_samples.txt -spc NUM : specify number of characters to designate a specimen, default = 1 -loc LOCNAME : specify location/study name -A: don't average replicate measurements -ncn NCON: specify sample naming convention (6 and 7 not yet implemented) -mcd [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. INPUT JR6 .txt format file """ # initialize some stuff noave=0 samp_con,Z='1',"" missing=1 demag="N" er_location_name="unknown" citation='This study' args=sys.argv meth_code="LP-NO" specnum=1 MagRecs=[] version_num=pmag.get_version() Samps=[] # keeps track of sample orientations user="" mag_file="" dir_path='.' ErSamps=[] SampOuts=[] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path=sys.argv[ind+1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind+1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print(main.__doc__) return False if '-F' in args: ind=args.index("-F") meas_file = args[ind+1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind+1] #try: # open(samp_file,'r') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file= args[ind+1] if "-spc" in args: ind = args.index("-spc") specnum = int(args[ind+1]) if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-A" in args: noave=1 if "-mcd" in args: ind=args.index("-mcd") meth_code=args[ind+1] if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') samp_file = kwargs.get('samp_file', 'er_samples.txt') specnum = kwargs.get('specnum', 1) samp_con = kwargs.get('samp_con', '1') er_location_name = kwargs.get('er_location_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") # format variables mag_file = input_dir_path+"/" + mag_file meas_file = output_dir_path+"/" + meas_file samp_file = output_dir_path+"/" + samp_file if specnum!=0: specnum=-specnum if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") return False else: Z=samp_con.split("-")[1] samp_con="4" if "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False else: Z=samp_con.split("-")[1] samp_con="7" ErSampRec,ErSiteRec={},{} # parse data data=open(mag_file,'r') line=data.readline() line=data.readline() line=data.readline() while line !='': parsedLine=line.split() sampleName=parsedLine[0] demagLevel=parsedLine[2] date=parsedLine[3] line=data.readline() line=data.readline() line=data.readline() line=data.readline() parsedLine=line.split() specimenAngleDec=parsedLine[1] specimenAngleInc=parsedLine[2] while parsedLine[0] != 'MEAN' : line=data.readline() parsedLine=line.split() if len(parsedLine) == 0: parsedLine=["Hello"] Mx=parsedLine[1] My=parsedLine[2] Mz=parsedLine[3] line=data.readline() line=data.readline() parsedLine=line.split() splitExp = parsedLine[2].split('A') intensityStr=parsedLine[1] + splitExp[0] intensity = float(intensityStr) # check and see if Prec is too big and messes with the parcing. precisionStr='' if len(parsedLine) == 6: #normal line precisionStr=parsedLine[5][0:-1] else: precisionStr=parsedLine[4][0:-1] precisionPer = float(precisionStr) precision=intensity*precisionPer/100 while parsedLine[0] != 'SPEC.' : line=data.readline() parsedLine=line.split() if len(parsedLine) == 0: parsedLine=["Hello"] specimenDec=parsedLine[2] specimenInc=parsedLine[3] line=data.readline() line=data.readline() parsedLine=line.split() geographicDec=parsedLine[1] geographicInc=parsedLine[2] # Add data to various MagIC data tables. er_specimen_name = sampleName if specnum!=0: er_sample_name=er_specimen_name[:specnum] else: er_sample_name=er_specimen_name if int(samp_con) in [1, 2, 3, 4, 5, 7]: er_site_name=pmag.parse_site(er_sample_name,samp_con,Z) # else: # if 'er_site_name' in ErSampRec.keys():er_site_name=ErSampRec['er_site_name'] # if 'er_location_name' in ErSampRec.keys():er_location_name=ErSampRec['er_location_name'] # check sample list(SampOuts) to see if sample already exists in list before adding new sample info sampleFlag=0 for sampRec in SampOuts: if sampRec['er_sample_name'] == er_sample_name: sampleFlag=1 break if sampleFlag == 0: ErSampRec['er_sample_name']=er_sample_name ErSampRec['sample_azimuth']=specimenAngleDec ErSampRec['sample_dip']=specimenAngleInc ErSampRec['magic_method_codes']=meth_code ErSampRec['er_location_name']=er_location_name ErSampRec['er_site_name']=er_site_name ErSampRec['er_citation_names']='This study' SampOuts.append(ErSampRec.copy()) MagRec={} MagRec['measurement_description']='Date: '+date MagRec["er_citation_names"]="This study" MagRec['er_location_name']=er_location_name MagRec['er_site_name']=er_site_name MagRec['er_sample_name']=er_sample_name MagRec['magic_software_packages']=version_num MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"]='g' MagRec["measurement_standard"]='u' MagRec["measurement_number"]='1' MagRec["er_specimen_name"]=er_specimen_name MagRec["treatment_ac_field"]='0' if demagLevel == 'NRM': meas_type="LT-NO" elif demagLevel[0] == 'A': meas_type="LT-AF-Z" treat=float(demagLevel[1:]) MagRec["treatment_ac_field"]='%8.3e' %(treat*1e-3) # convert from mT to tesla elif demagLevel[0] == 'T': meas_type="LT-T-Z" treat=float(demagLevel[1:]) MagRec["treatment_temp"]='%8.3e' % (treat+273.) # temp in kelvin else: print("measurement type unknown") return False # X=[float(Mx),float(My),float(Mz)] # Vec=pmag.cart2dir(X) # MagRec["measurement_magn_moment"]='%10.3e'% (Vec[2]) # Am^2 MagRec["measurement_magn_moment"]=str(intensity*0.025*0.025*0.025) # Am^2 assume 2.5cm cube sample MagRec["measurement_magn_volume"]=intensityStr MagRec["measurement_dec"]=specimenDec MagRec["measurement_inc"]=specimenInc MagRec['magic_method_codes']=meas_type MagRecs.append(MagRec.copy()) #read lines till end of record line=data.readline() line=data.readline() line=data.readline() line=data.readline() line=data.readline() # read all the rest of the special characters. Some data files not consistantly formatted. while (len(line) <=3 and line!=''): line=data.readline() #end of data while loop MagOuts=pmag.measurements_methods(MagRecs,noave) pmag.magic_write(samp_file,SampOuts,'er_samples') print("sample orientations put in ",samp_file) pmag.magic_write(meas_file,MagOuts,'magic_measurements') print("results put in ",meas_file) return True
def main(command_line=True, **kwargs): """ NAME jr6_jr6_magic.py DESCRIPTION converts JR6 .jr6 format files to magic_measurements format files SYNTAX jr6_jr6_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -Fsa: specify er_samples format file for appending, default is new er_samples.txt (Not working yet) -spc NUM : specify number of characters to designate a specimen, default = 1 -loc LOCNAME : specify location/study name -A: don't average replicate measurements -ncn NCON: specify sample naming convention (6 and 7 not yet implemented) -mcd [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented -JR IODP samples measured on the JOIDES RESOLUTION -v NUM : specify the volume in cc of the sample, default 2.5^3cc Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. INPUT JR6 .jr6 format file """ # initialize some stuff noave = 0 #volume=2.5**3 #default volume is a 2.5cm cube volume = 2.5 * 1e-6 #default volume is a 2.5 cm cube, translated to meters cubed inst = "" samp_con, Z = '1', "" missing = 1 demag = "N" er_location_name = "unknown" citation = 'This study' args = sys.argv meth_code = "LP-NO" specnum = 1 version_num = pmag.get_version() Samps = [] # keeps track of sample orientations user = "" mag_file = "" dir_path = '.' MagRecs = [] ErSamps = [] SampOuts = [] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' tmp_file = "fixed.jr6" meth_code, JR = "", 0 # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path = sys.argv[ind + 1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind + 1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print(main.__doc__) return False if '-F' in args: ind = args.index("-F") meas_file = args[ind + 1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind + 1] #try: # open(samp_file,'r') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file = args[ind + 1] if "-spc" in args: ind = args.index("-spc") specnum = int(args[ind + 1]) if "-ncn" in args: ind = args.index("-ncn") samp_con = sys.argv[ind + 1] if "-loc" in args: ind = args.index("-loc") er_location_name = args[ind + 1] if "-A" in args: noave = 1 if "-mcd" in args: ind = args.index("-mcd") meth_code = args[ind + 1] if "-JR" in args: meth_code = meth_code + ":FS-C-DRILL-IODP:SP-SS-C:SO-V" meth_code = meth_code.strip(":") JR = 1 samp_con = '5' if "-v" in args: ind = args.index("-v") volume = float( args[ind + 1]) * 1e-6 # enter volume in cc, convert to m^3 if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') samp_file = kwargs.get('samp_file', 'er_samples.txt') specnum = kwargs.get('specnum', 1) samp_con = kwargs.get('samp_con', '1') er_location_name = kwargs.get('er_location_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") volume = float(kwargs.get('volume', 0)) if not volume: volume = 2.5 * 1e-6 #default volume is a 2.5 cm cube, translated to meters cubed else: #convert cm^3 to m^3 volume *= 1e-6 JR = kwargs.get('JR', 0) if JR: if meth_code == "LP-NO": meth_code = "" meth_code = meth_code + ":FS-C-DRILL-IODP:SP-SS-C:SO-V" meth_code = meth_code.strip(":") samp_con = '5' # format variables mag_file = input_dir_path + "/" + mag_file meas_file = output_dir_path + "/" + meas_file samp_file = output_dir_path + "/" + samp_file tmp_file = output_dir_path + "/" + tmp_file if specnum != 0: specnum = -specnum if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") return False, "option [4] must be in form 4-Z where Z is an integer" else: Z = samp_con.split("-")[1] samp_con = "4" if "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "option [7] must be in form 7-Z where Z is an integer" else: Z = samp_con.split("-")[1] samp_con = "7" ErSampRec, ErSiteRec = {}, {} # parse data # fix .jr6 file so that there are spaces between all the columns. pre_data = open(mag_file, 'r') tmp_data = open(tmp_file, 'w') line = pre_data.readline() while line != '': line = line.replace('-', ' -') #print "line=", line tmp_data.write(line) line = pre_data.readline() tmp_data.close() pre_data.close() data = pd.read_csv(tmp_file, delim_whitespace=True, header=None) if JR == 0: # data.columns = [ 'er_specimen_name', 'step', 'x', 'y', 'z', 'expon', 'sample_azimuth', 'sample_dip', 'sample_bed_dip_direction', 'sample_bed_dip', 'bed_dip_dir2', 'bed_dip2', 'param1', 'param2', 'param3', 'param4', 'measurement_csd' ] cart = np.array([data['x'], data['y'], data['z']]).transpose() else: # measured on the Joides Resolution JR6 data.columns = [ 'er_specimen_name', 'step', 'negz', 'y', 'x', 'expon', 'sample_azimuth', 'sample_dip', 'sample_bed_dip_direction', 'sample_bed_dip', 'bed_dip_dir2', 'bed_dip2', 'param1', 'param2', 'param3', 'param4', 'measurement_csd' ] cart = np.array([data['x'], data['y'], -data['negz']]).transpose() dir = pmag.cart2dir(cart).transpose() data['measurement_dec'] = dir[0] data['measurement_inc'] = dir[1] data['measurement_magn_moment'] = dir[2] * ( 10.0** data['expon']) * volume # the data are in A/m - this converts to Am^2 data['measurement_magn_volume'] = dir[2] * (10.0**data['expon'] ) # A/m - data in A/m data['sample_dip'] = -data['sample_dip'] DGEOs, IGEOs = [], [] for ind in range(len(data)): dgeo, igeo = pmag.dogeo(data.iloc[ind]['measurement_dec'], data.iloc[ind]['measurement_inc'], data.iloc[ind]['sample_azimuth'], data.iloc[ind]['sample_dip']) DGEOs.append(dgeo) IGEOs.append(igeo) data['specimen_dec'] = DGEOs data['specimen_inc'] = IGEOs data['specimen_tilt'] = '1' if specnum != 0: data['er_sample_name'] = data['er_specimen_name'][:specnum] else: data['er_sample_name'] = data['er_specimen_name'] if int(samp_con) in [1, 2, 3, 4, 5, 7]: data['er_site_name'] = pmag.parse_site(data['er_sample_name'], samp_con, Z) # else: # if 'er_site_name' in ErSampRec.keys():er_site_name=ErSampRec['er_site_name'] # if 'er_location_name' in ErSampRec.keys():er_location_name=ErSampRec['er_location_name'] # Configure the er_sample table for rowNum, row in data.iterrows(): sampleFlag = 0 for sampRec in SampOuts: if sampRec['er_sample_name'] == row['er_sample_name']: sampleFlag = 1 break if sampleFlag == 0: ErSampRec['er_sample_name'] = row['er_sample_name'] ErSampRec['sample_azimuth'] = str(row['sample_azimuth']) ErSampRec['sample_dip'] = str(row['sample_dip']) ErSampRec['magic_method_codes'] = meth_code ErSampRec['er_location_name'] = er_location_name ErSampRec['er_site_name'] = row['er_site_name'] ErSampRec['er_citation_names'] = 'This study' SampOuts.append(ErSampRec.copy()) # Configure the magic_measurements table for rowNum, row in data.iterrows(): MagRec = {} # MagRec['measurement_description']='Date: '+date MagRec["er_citation_names"] = "This study" MagRec['er_location_name'] = er_location_name MagRec['er_site_name'] = row['er_site_name'] MagRec['er_sample_name'] = row['er_sample_name'] MagRec['magic_software_packages'] = version_num MagRec["treatment_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"] = 'g' MagRec["measurement_standard"] = 'u' MagRec["measurement_number"] = '1' MagRec["er_specimen_name"] = row['er_specimen_name'] MagRec["treatment_ac_field"] = '0' if row['step'] == 'NRM': meas_type = "LT-NO" elif row['step'][0:2] == 'AD': meas_type = "LT-AF-Z" treat = float(row['step'][2:]) MagRec["treatment_ac_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla elif row['step'][0] == 'TD': meas_type = "LT-T-Z" treat = float(row['step'][2:]) MagRec["treatment_temp"] = '%8.3e' % (treat + 273. ) # temp in kelvin else: # need to add IRM, and ARM options print("measurement type unknown", row['step']) return False, "measurement type unknown" MagRec["measurement_magn_moment"] = str(row['measurement_magn_moment']) MagRec["measurement_magn_volume"] = str(row['measurement_magn_volume']) MagRec["measurement_dec"] = str(row['measurement_dec']) MagRec["measurement_inc"] = str(row['measurement_inc']) MagRec['magic_method_codes'] = meas_type MagRecs.append(MagRec.copy()) pmag.magic_write(samp_file, SampOuts, 'er_samples') print("sample orientations put in ", samp_file) MagOuts = pmag.measurements_methods(MagRecs, noave) pmag.magic_write(meas_file, MagOuts, 'magic_measurements') print("results put in ", meas_file) print("exit!") return True, meas_file
def main(): """ NAME hysteresis_magic.py DESCRIPTION calculates hystereis parameters and saves them in rmag_hystereis format file makes plots if option selected SYNTAX hysteresis_magic.py [command line options] OPTIONS -h prints help message and quits -usr USER: identify user, default is "" -f: specify input file, default is agm_measurements.txt -fh: specify rmag_hysteresis.txt input file -F: specify output file, default is rmag_hysteresis.txt -P: do not make the plots -spc SPEC: specify specimen name to plot and quit -sav save all plots and quit -fmt [png,svg,eps,jpg] """ args = sys.argv PLT = 1 plots = 0 user, meas_file, rmag_out, rmag_file = "", "agm_measurements.txt", "rmag_hysteresis.txt", "" pltspec = "" dir_path = '.' fmt = 'svg' verbose = pmagplotlib.verbose version_num = pmag.get_version() if '-WD' in args: ind = args.index('-WD') dir_path = args[ind + 1] if "-h" in args: print main.__doc__ sys.exit() if "-usr" in args: ind = args.index("-usr") user = args[ind + 1] if '-f' in args: ind = args.index("-f") meas_file = args[ind + 1] if '-F' in args: ind = args.index("-F") rmag_out = args[ind + 1] if '-fh' in args: ind = args.index("-fh") rmag_file = args[ind + 1] rmag_file = dir_path + '/' + rmag_file if '-P' in args: PLT = 0 irm_init, imag_init = -1, -1 if '-sav' in args: verbose = 0 plots = 1 if '-spc' in args: ind = args.index("-spc") pltspec = args[ind + 1] verbose = 0 plots = 1 if '-fmt' in args: ind = args.index("-fmt") fmt = args[ind + 1] rmag_out = dir_path + '/' + rmag_out meas_file = dir_path + '/' + meas_file rmag_rem = dir_path + "/rmag_remanence.txt" # # meas_data, file_type = pmag.magic_read(meas_file) if file_type != 'magic_measurements': print main.__doc__ print 'bad file' sys.exit() # # initialize some variables # define figure numbers for hyst,deltaM,DdeltaM curves HystRecs, RemRecs = [], [] HDD = {} if verbose: if verbose and PLT: print "Plots may be on top of each other - use mouse to place " if PLT: HDD['hyst'], HDD['deltaM'], HDD['DdeltaM'] = 1, 2, 3 pmagplotlib.plot_init(HDD['DdeltaM'], 5, 5) pmagplotlib.plot_init(HDD['deltaM'], 5, 5) pmagplotlib.plot_init(HDD['hyst'], 5, 5) imag_init = 0 irm_init = 0 else: HDD['hyst'], HDD['deltaM'], HDD['DdeltaM'], HDD['irm'], HDD[ 'imag'] = 0, 0, 0, 0, 0 # if rmag_file != "": hyst_data, file_type = pmag.magic_read(rmag_file) # # get list of unique experiment names and specimen names # experiment_names, sids = [], [] for rec in meas_data: meths = rec['magic_method_codes'].split(':') methods = [] for meth in meths: methods.append(meth.strip()) if 'LP-HYS' in methods: if 'er_synthetic_name' in rec.keys( ) and rec['er_synthetic_name'] != "": rec['er_specimen_name'] = rec['er_synthetic_name'] if rec['magic_experiment_name'] not in experiment_names: experiment_names.append(rec['magic_experiment_name']) if rec['er_specimen_name'] not in sids: sids.append(rec['er_specimen_name']) # k = 0 locname = '' if pltspec != "": k = sids.index(pltspec) print sids[k] while k < len(sids): s = sids[k] if verbose and PLT: print s, k + 1, 'out of ', len(sids) # # B, M, Bdcd, Mdcd = [], [], [], [ ] #B,M for hysteresis, Bdcd,Mdcd for irm-dcd data Bimag, Mimag = [], [] #Bimag,Mimag for initial magnetization curves first_dcd_rec, first_rec, first_imag_rec = 1, 1, 1 for rec in meas_data: methcodes = rec['magic_method_codes'].split(':') meths = [] for meth in methcodes: meths.append(meth.strip()) if rec['er_specimen_name'] == s and "LP-HYS" in meths: B.append(float(rec['measurement_lab_field_dc'])) M.append(float(rec['measurement_magn_moment'])) if first_rec == 1: e = rec['magic_experiment_name'] HystRec = {} first_rec = 0 if "er_location_name" in rec.keys(): HystRec["er_location_name"] = rec["er_location_name"] locname = rec['er_location_name'].replace('/', '-') if "er_sample_name" in rec.keys(): HystRec["er_sample_name"] = rec["er_sample_name"] if "er_site_name" in rec.keys(): HystRec["er_site_name"] = rec["er_site_name"] if "er_synthetic_name" in rec.keys( ) and rec['er_synthetic_name'] != "": HystRec["er_synthetic_name"] = rec["er_synthetic_name"] else: HystRec["er_specimen_name"] = rec["er_specimen_name"] if rec['er_specimen_name'] == s and "LP-IRM-DCD" in meths: Bdcd.append(float(rec['treatment_dc_field'])) Mdcd.append(float(rec['measurement_magn_moment'])) if first_dcd_rec == 1: RemRec = {} irm_exp = rec['magic_experiment_name'] first_dcd_rec = 0 if "er_location_name" in rec.keys(): RemRec["er_location_name"] = rec["er_location_name"] if "er_sample_name" in rec.keys(): RemRec["er_sample_name"] = rec["er_sample_name"] if "er_site_name" in rec.keys(): RemRec["er_site_name"] = rec["er_site_name"] if "er_synthetic_name" in rec.keys( ) and rec['er_synthetic_name'] != "": RemRec["er_synthetic_name"] = rec["er_synthetic_name"] else: RemRec["er_specimen_name"] = rec["er_specimen_name"] if rec['er_specimen_name'] == s and "LP-IMAG" in meths: if first_imag_rec == 1: imag_exp = rec['magic_experiment_name'] first_imag_rec = 0 Bimag.append(float(rec['measurement_lab_field_dc'])) Mimag.append(float(rec['measurement_magn_moment'])) # # now plot the hysteresis curve # if len(B) > 0: hmeths = [] for meth in meths: hmeths.append(meth) hpars = pmagplotlib.plotHDD(HDD, B, M, e) if verbose and PLT: pmagplotlib.drawFIGS(HDD) # # get prior interpretations from hyst_data if rmag_file != "": hpars_prior = {} for rec in hyst_data: if rec['magic_experiment_names'] == e: if rec['hysteresis_bcr'] != "" and rec[ 'hysteresis_mr_moment'] != "": hpars_prior['hysteresis_mr_moment'] = rec[ 'hysteresis_mr_moment'] hpars_prior['hysteresis_ms_moment'] = rec[ 'hysteresis_ms_moment'] hpars_prior['hysteresis_bc'] = rec['hysteresis_bc'] hpars_prior['hysteresis_bcr'] = rec[ 'hysteresis_bcr'] break if verbose: pmagplotlib.plotHPARS(HDD, hpars_prior, 'ro') else: if verbose: pmagplotlib.plotHPARS(HDD, hpars, 'bs') HystRec['hysteresis_mr_moment'] = hpars['hysteresis_mr_moment'] HystRec['hysteresis_ms_moment'] = hpars['hysteresis_ms_moment'] HystRec['hysteresis_bc'] = hpars['hysteresis_bc'] HystRec['hysteresis_bcr'] = hpars['hysteresis_bcr'] HystRec['hysteresis_xhf'] = hpars['hysteresis_xhf'] HystRec['magic_experiment_names'] = e HystRec['magic_software_packages'] = version_num if hpars["magic_method_codes"] not in hmeths: hmeths.append(hpars["magic_method_codes"]) methods = "" for meth in hmeths: methods = methods + meth.strip() + ":" HystRec["magic_method_codes"] = methods[:-1] HystRec["er_citation_names"] = "This study" HystRecs.append(HystRec) # if len(Bdcd) > 0: rmeths = [] for meth in meths: rmeths.append(meth) if verbose and PLT: print 'plotting IRM' if irm_init == 0: HDD['irm'] = 5 pmagplotlib.plot_init(HDD['irm'], 5, 5) irm_init = 1 rpars = pmagplotlib.plotIRM(HDD['irm'], Bdcd, Mdcd, irm_exp) RemRec['remanence_mr_moment'] = rpars['remanence_mr_moment'] RemRec['remanence_bcr'] = rpars['remanence_bcr'] RemRec['magic_experiment_names'] = irm_exp if rpars["magic_method_codes"] not in meths: meths.append(rpars["magic_method_codes"]) methods = "" for meth in rmeths: methods = methods + meth.strip() + ":" RemRec["magic_method_codes"] = methods[:-1] RemRec["er_citation_names"] = "This study" RemRecs.append(RemRec) else: if irm_init: pmagplotlib.clearFIG(HDD['irm']) if len(Bimag) > 0: if verbose: print 'plotting initial magnetization curve' # first normalize by Ms Mnorm = [] for m in Mimag: Mnorm.append(m / float(hpars['hysteresis_ms_moment'])) if imag_init == 0: HDD['imag'] = 4 pmagplotlib.plot_init(HDD['imag'], 5, 5) imag_init = 1 pmagplotlib.plotIMAG(HDD['imag'], Bimag, Mnorm, imag_exp) else: if imag_init: pmagplotlib.clearFIG(HDD['imag']) # files = {} if plots: if pltspec != "": s = pltspec files = {} for key in HDD.keys(): files[key] = locname + '_' + s + '_' + key + '.' + fmt pmagplotlib.saveP(HDD, files) if pltspec != "": sys.exit() if verbose and PLT: pmagplotlib.drawFIGS(HDD) ans = raw_input( "S[a]ve plots, [s]pecimen name, [q]uit, <return> to continue\n " ) if ans == "a": files = {} for key in HDD.keys(): files[key] = locname + '_' + s + '_' + key + '.' + fmt pmagplotlib.saveP(HDD, files) if ans == '': k += 1 if ans == "p": del HystRecs[-1] k -= 1 if ans == 'q': print "Good bye" sys.exit() if ans == 's': keepon = 1 specimen = raw_input( 'Enter desired specimen name (or first part there of): ') while keepon == 1: try: k = sids.index(specimen) keepon = 0 except: tmplist = [] for qq in range(len(sids)): if specimen in sids[qq]: tmplist.append(sids[qq]) print specimen, " not found, but this was: " print tmplist specimen = raw_input('Select one or try again\n ') k = sids.index(specimen) else: k += 1 if len(B) == 0 and len(Bdcd) == 0: if verbose: print 'skipping this one - no hysteresis data' k += 1 if rmag_out == "" and ans == 's' and verbose: really = raw_input( " Do you want to overwrite the existing rmag_hystersis.txt file? 1/[0] " ) if really == "": print 'i thought not - goodbye' sys.exit() rmag_out = "rmag_hysteresis.txt" if len(HystRecs) > 0: pmag.magic_write(rmag_out, HystRecs, "rmag_hysteresis") if verbose: print "hysteresis parameters saved in ", rmag_out if len(RemRecs) > 0: pmag.magic_write(rmag_rem, RemRecs, "rmag_remanence") if verbose: print "remanence parameters saved in ", rmag_rem
def main(): """ NAME odp_dcs_magic.py DESCRIPTION converts ODP discrete sample format files to magic_measurements format files SYNTAX odp_dsc_magic.py [command line options] OPTIONS -h: prints the help message and quits. -F FILE: specify output measurements file, default is magic_measurements.txt -Fsp FILE: specify output er_specimens.txt file, default is er_specimens.txt -Fsa FILE: specify output er_samples.txt file for appending, default is er_samples.txt -Fsi FILE: specify output er_sites.txt file, default is er_sites.txt -dc B PHI THETA: dc lab field (in micro tesla) and phi,theta, default is none NB: use PHI, THETA = -1 -1 to signal that it changes, i.e. in anisotropy experiment -ac B : peak AF field (in mT) for ARM acquisition, default is none -A : don't average replicate measurements INPUT Put data from separate experiments (all AF, thermal, thellier, trm aquisition, Shaw, etc.) in separate directory """ # # version_num = pmag.get_version() meas_file = 'magic_measurements.txt' spec_file = 'er_specimens.txt' samp_file = 'er_samples.txt' site_file = 'er_sites.txt' ErSpecs, ErSamps, ErSites, ErLocs, ErCits = [], [], [], [], [] MagRecs = [] citation = "This study" dir_path, demag = '.', 'NRM' args = sys.argv noave = 0 if '-WD' in args: ind = args.index("-WD") dir_path = args[ind + 1] if "-h" in args: print(main.__doc__) sys.exit() if "-A" in args: noave = 1 if '-F' in args: ind = args.index("-F") meas_file = args[ind + 1] if '-Fsp' in args: ind = args.index("-Fsp") spec_file = args[ind + 1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = dir_path + '/' + args[ind + 1] ErSamps, file_type = pmag.magic_read(samp_file) else: samp_file = dir_path + '/' + samp_file if '-LP' in args: ind = args.index("-LP") codelist = args[ind + 1] codes = codelist.split(':') if "AF" in codes: demag = 'AF' if '-dc' not in args: methcode = "LT-AF-Z" if '-dc' in args: methcode = "LT-AF-I" if "T" in codes: demag = "T" if '-dc' not in args: methcode = "LT-T-Z" if '-dc' in args: methcode = "LT-T-I" if "I" in codes: methcode = "LP-IRM" if "S" in codes: demag = "S" methcode = "LP-PI-TRM:LP-PI-ALT-AFARM" trm_labfield = labfield ans = input("DC lab field for ARM step: [50uT] ") if ans == "": arm_labfield = 50e-6 else: arm_labfield = float(ans) * 1e-6 ans = input("temperature for total trm step: [600 C] ") if ans == "": trm_peakT = 600 + 273 # convert to kelvin else: trm_peakT = float(ans) + 273 # convert to kelvin if "G" in codes: methcode = "LT-AF-G" if "D" in codes: methcode = "LT-AF-D" if "TRM" in codes: demag = "T" trm = 1 if demag == "T" and "ANI" in codes: methcode = "LP-AN-TRM" if demag == "AF" and "ANI" in codes: methcode = "LP-AN-ARM" if labfield == 0: labfield = 50e-6 if peakfield == 0: peakfield = .180 spec_file = dir_path + '/' + spec_file site_file = dir_path + '/' + site_file meas_file = dir_path + '/' + meas_file filelist = os.listdir(dir_path) # read in list of files to import specimens, samples, sites = [], [], [] MagRecs, SpecRecs, SampRecs = [], [], [] for samp in ErSamps: if samp['er_sample_name'] not in samples: samples.append(samp['er_sample_name']) SampRecs.append(samp) for file in filelist: # parse each file if file[-3:].lower() == 'dsc': print('processing: ', file) MagRec, SpecRec, SampRec = {}, {}, {} treatment_type, treatment_value, user = "", "", "" inst = "ODP-SRM" input = open(dir_path + '/' + file, 'r').readlines() IDs = file.split('_') # splits on underscores pieces = IDs[0].split('-') expedition = pieces[0] location = pieces[1] if file[0] != '_': while len(pieces[2]) < 4: pieces[2] = '0' + pieces[2] # pad core to be 3 characters specimen = "" else: specimen = "test" for piece in pieces: specimen = specimen + piece + '-' specimen = specimen[:-1] alt_spec = IDs[ 1] # alternate specimen is second field in field name # set up specimen record for Er_specimens table SpecRec['er_expedition_name'] = expedition SpecRec['er_location_name'] = location SpecRec['er_site_name'] = specimen SpecRec['er_sample_name'] = specimen SpecRec['er_citation_names'] = citation for key in list(SpecRec.keys()): SampRec[key] = SpecRec[key] SampRec['sample_azimuth'] = '0' SampRec['sample_dip'] = '0' SampRec['magic_method_codes'] = 'FS-C-DRILL-IODP:SP-SS-C:SO-V' SpecRec['er_specimen_name'] = specimen SampRec['er_specimen_names'] = specimen for key in list(SpecRec.keys()): MagRec[key] = SpecRec[key] # set up measurement record - default is NRM MagRec['er_analyst_mail_names'] = user MagRec['magic_method_codes'] = 'LT-NO' MagRec['magic_software_packages'] = version_num MagRec["treatment_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["treatment_ac_field"] = 0. MagRec["treatment_dc_field"] = '0' MagRec["treatment_dc_field_phi"] = '0' MagRec["treatment_dc_field_theta"] = '0' MagRec["measurement_flag"] = 'g' # assume all data are "good" MagRec["measurement_standard"] = 'u' # assume all data are "good" MagRec["measurement_csd"] = '' # set csd to blank SpecRec['er_specimen_alternatives'] = alt_spec vol = 7e-6 # assume 7 cc samples datestamp = input[1].split() # date time is second line of file mmddyy = datestamp[0].split('/') # break into month day year date = mmddyy[2] + ':' + mmddyy[0] + ":" + mmddyy[ 1] + ':' + datestamp[1] MagRec["measurement_date"] = date for k in range(len(input)): fields = input[k].split("=") if 'treatment_type' in fields[0]: if "Alternating Frequency Demagnetization" in fields[1]: MagRec['magic_method_codes'] = 'LT-AF-Z' inst = inst + ':ODP-DTECH' # measured on shipboard AF DTECH D2000 treatment_type = "AF" if "Anhysteretic Remanent Magnetization" in fields[1]: MagRec['magic_method_codes'] = 'LT-AF-I' inst = inst + ':ODP-DTECH' # measured on shipboard AF DTECH D2000 treatment_type = "ARM" if "Isothermal Remanent Magnetization" in fields[1]: MagRec['magic_method_codes'] = 'LT-IRM' inst = inst + ':ODP-IMP' # measured on shipboard ASC IMPULSE magnetizer treatment_type = "IRM" if "treatment_value" in fields[0]: values = fields[1].split(',') value = values[0] if value != " \n": if treatment_type == "AF": treatment_value = float(value) * 1e-3 MagRec[ "treatment_ac_field"] = treatment_value # AF demag in treat mT => T elif treatment_type == "IRM": treatment_value = float(value) * 1e-3 MagRec["treatment_dc_field"] = '%8.3e' % ( treatment_value) # IRM treat mT => T if treatment_type == "ARM": treatment_value = float(value) * 1e-3 dc_value = float(values[1]) * 1e-3 MagRec[ "treatment_ac_field"] = treatment_value # AF demag in treat mT => T MagRec["treatment_dc_field"] = '%8.3e' % ( dc_value) # DC mT => T if 'user' in fields[0]: user = fields[-1] MagRec["er_analyst_mail_names"] = user if 'sample_orientation' in fields[0]: MagRec["measurement_description"] = fields[-1] MagRec[ "measurement_standard"] = 'u' # assume all data are "good" if 'sample_area' in fields[0]: vol = float( fields[1] ) * 1e-6 # takes volume (cc) and converts to m^3 if 'run_number' in fields[0]: MagRec['external_database_ids'] = fields[ 1] # run number is the LIMS measurement number MagRec['external_database_names'] = 'LIMS' if input[k][0:7] == '<MULTI>': rec = input[k + 1].split(',') # list of data for item in rec: items = item.split('=') if items[0].strip( ) == 'demag_level' and treatment_value == "": treat = float(items[1]) if treat != 0: MagRec['magic_method_codes'] = 'LT-AF-Z' inst = inst + ':ODP-SRM-AF' MagRec[ "treatment_ac_field"] = treat * 1e-3 # AF demag in treat mT => T if items[0].strip() == 'inclination_w_tray_w_bkgrd': MagRec['measurement_inc'] = items[1] if items[0].strip() == 'declination_w_tray_w_bkgrd': MagRec['measurement_dec'] = items[1] if items[0].strip() == 'intensity_w_tray_w_bkgrd': MagRec['measurement_magn_moment'] = '%8.3e' % ( float(items[1]) * vol ) # convert intensity from A/m to Am^2 using vol if items[0].strip() == 'x_stdev': MagRec['measurement_x_sd'] = items[1] if items[0].strip() == 'y_stdev': MagRec['measurement_y_sd'] = items[1] if items[0].strip() == 'z_stdev': MagRec['measurement_sd_z'] = items[1] MagRec['magic_instrument_codes'] = inst MagRec['measurement_number'] = '1' MagRec['measurement_positions'] = '' MagRecs.append(MagRec) if specimen not in specimens: specimens.append(specimen) SpecRecs.append(SpecRec) if MagRec['er_sample_name'] not in samples: samples.append(MagRec['er_sample_name']) SampRecs.append(SampRec) MagOuts = pmag.sort_diclist(MagRecs, 'treatment_ac_field') for MagRec in MagOuts: MagRec["treatment_ac_field"] = '%8.3e' % (MagRec["treatment_ac_field"] ) # convert to string pmag.magic_write(spec_file, SpecRecs, 'er_specimens') if len(SampRecs) > 0: SampOut, keys = pmag.fillkeys(SampRecs) pmag.magic_write(samp_file, SampOut, 'er_samples') print('samples stored in ', samp_file) pmag.magic_write(samp_file, SampRecs, 'er_samples') print('specimens stored in ', spec_file) Fixed = pmag.measurements_methods(MagOuts, noave) pmag.magic_write(meas_file, Fixed, 'magic_measurements') print('data stored in ', meas_file)
def main(): """ NAME huji_sample_magic.py DESCRIPTION takes tab delimited Hebrew University sample file and converts to MagIC formatted tables SYNTAX huji_sample_magic.py [command line options] OPTIONS -f FILE: specify input file -Fsa FILE: specify sample output file, default is: er_samples.txt -Fsi FILE: specify site output file, default is: er_sites.txt -Iso: import sample orientation info - default is to set sample_az/dip to 0,0 -ncn NCON: specify naming convention: default is #1 below -mcd: specify sampling method codes as a colon delimited string: [default is: FS-FD:SO-POM] FS-FD field sampling done with a drill FS-H field sampling done with hand samples FS-LOC-GPS field location done with GPS FS-LOC-MAP field location done with map SO-POM a Pomeroy orientation device was used SO-ASC an ASC orientation device was used SO-MAG orientation with magnetic compass -loc: location name, default="unknown" INPUT FORMAT Input files must be tab delimited: Samp Az Dip Dip_dir Dip Orientation convention: Lab arrow azimuth = mag_azimuth; Lab arrow dip = 90-field_dip e.g. field_dip is degrees from horizontal of drill direction Magnetic declination convention: Az is already corrected in file Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name = sample name [6] site name entered in site_name column in the orient.txt format input file -- NOT CURRENTLY SUPPORTED [7-Z] [XXX]YYY: XXX is site designation with Z characters from samples XXXYYY NB: all others you will have to either customize your self or e-mail [email protected] for help. OUTPUT output saved in er_samples.txt will overwrite any existing files """ # # initialize variables # version_num=pmag.get_version() samp_file,or_con,corr = "er_samples.txt","1","1" site_file='er_sites.txt' args=sys.argv date,lat,lon="","","" # date of sampling, latitude (pos North), longitude (pos East) bed_dip,bed_dip_dir="","" participantlist="" sites=[] # list of site names Lats,Lons=[],[] # list of latitudes and longitudes SampRecs,SiteRecs,ImageRecs,imagelist=[],[],[],[] # lists of Sample records and Site records samp_con,Z,average_bedding="1",1,"0" newbaseline,newbeddir,newbeddip="","","" meths='FS-FD:SO-POM:SO-SUN' delta_u="0" sclass,lithology,type="","","" newclass,newlith,newtype='','','' user="" or_con='3' corr=="3" DecCorr=0. location_name="unknown" ignore=1 # # if "-h" in args: print(main.__doc__) sys.exit() if "-f" in args: ind=args.index("-f") orient_file=sys.argv[ind+1] else: "Must have orientation file name" sys.exit() if "-Fsa" in args: ind=args.index("-Fsa") samp_file=sys.argv[ind+1] if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 3-Z where Z is an integer") sys.exit() else: Z=samp_con.split("-")[1] samp_con="4" print(samp_con, Z) if "-mcd" in args: ind=args.index("-mcd") meths=(sys.argv[ind+1]) if "-loc" in args: ind=args.index("-loc") location_name=(sys.argv[ind+1]) if "-Iso" in args: ignore=0 # # read in file to convert # azfile=open(orient_file,'r') AzDipDat=azfile.readlines() azfile.close() SampOut=[] SiteOut=[] for line in AzDipDat[1:]: orec=line.split() if len(orec)>1: labaz,labdip=pmag.orient(float(orec[1]),float(orec[2]),or_con) bed_dip_dir=(orec[3]) bed_dip=(orec[4]) SampRec={} SiteRec={} SampRec["er_location_name"]=location_name SampRec["er_citation_names"]="This study" SiteRec["er_location_name"]=location_name SiteRec["er_citation_names"]="This study" SiteRec["site_class"]="" SiteRec["site_lithology"]="" SiteRec["site_type"]="" SiteRec["site_definition"]="s" SiteRec["er_citation_names"]="This study" # # parse information common to all orientation methods # SampRec["er_sample_name"]=orec[0] SampRec["sample_bed_dip_direction"]=orec[3] SampRec["sample_bed_dip"]=orec[4] SiteRec["site_bed_dip_direction"]=orec[3] SiteRec["site_bed_dip"]=orec[4] if ignore==0: SampRec["sample_dip"]='%7.1f'%(labdip) SampRec["sample_azimuth"]='%7.1f'%(labaz) else: SampRec["sample_dip"]='0' SampRec["sample_azimuth"]='0' SampRec["sample_lat"]=orec[5] SampRec["sample_lon"]=orec[6] SiteRec["site_lat"]=orec[5] SiteRec["site_lon"]=orec[6] methods=meths.split(":") SampRec["magic_method_codes"]=meths site=pmag.parse_site(orec[0],samp_con,Z) # parse out the site name SampRec["er_site_name"]=site SampRec['magic_software_packages']=version_num SiteRec["er_site_name"]=site SiteRec['magic_software_packages']=version_num SampOut.append(SampRec) SiteOut.append(SiteRec) pmag.magic_write(samp_file,SampOut,"er_samples") print("Sample info saved in ", samp_file) pmag.magic_write(site_file,SiteOut,"er_sites") print("Site info saved in ", site_file)
def convert(**kwargs): version_num = pmag.get_version() user = kwargs.get('user', '') dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'measurements.txt') spec_file = kwargs.get('spec_file', 'specimens.txt') # specimen outfile samp_file = kwargs.get('samp_file', 'samples.txt') site_file = kwargs.get('site_file', 'sites.txt') # site outfile loc_file = kwargs.get('loc_file', 'locations.txt') # Loc outfile mag_file = kwargs.get('mag_file', '') #required location = kwargs.get('location', 'unknown') site = kwargs.get('site', '') samp_con = kwargs.get('samp_con', '1') specnum = int(kwargs.get('specnum', 0)) timezone = kwargs.get('timestamp', 'US/Pacific') append = kwargs.get('append', False) noave = kwargs.get('noave', False) # default False means DO average meth_code = kwargs.get('meth_code', "LP-NO") volume = float(kwargs.get('volume', 0)) if not volume: volume = 0.025**3 #default volume is a 2.5 cm cube, translated to meters cubed else: volume *= 1e-6 #convert cm^3 to m^3 if specnum!=0: specnum=-specnum if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") return False, "option [4] must be in form 4-Z where Z is an integer" else: Z=int(samp_con.split("-")[1]) samp_con="4" if "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "option [7] must be in form 7-Z where Z is an integer" else: Z=int(samp_con.split("-")[1]) samp_con="7" else: Z=1 # format variables mag_file = os.path.join(input_dir_path, mag_file) if not os.path.isfile(mag_file): print("%s is not a BGC file"%mag_file) return False, 'You must provide a BCG format file' # Open up the BGC file and read the header information print('mag_file in bgc_magic', mag_file) pre_data = open(mag_file, 'r') line = pre_data.readline() line_items = line.split(' ') specimen = line_items[2] specimen = specimen.replace('\n', '') line = pre_data.readline() line = pre_data.readline() line_items = line.split('\t') azimuth = float(line_items[1]) dip = float(line_items[2]) bed_dip = line_items[3] sample_bed_azimuth = line_items[4] lon = line_items[5] lat = line_items[6] tmp_volume = line_items[7] if tmp_volume != 0.0: volume = float(tmp_volume) * 1e-6 pre_data.close() data = pd.read_csv(mag_file, sep='\t', header=3, index_col=False) cart = np.array([data['X'], data['Y'], data['Z']]).transpose() direction = pmag.cart2dir(cart).transpose() data['dir_dec'] = direction[0] data['dir_inc'] = direction[1] data['magn_moment'] = old_div(direction[2], 1000) # the data are in EMU - this converts to Am^2 data['magn_volume'] = old_div((old_div(direction[2], 1000)), volume) # EMU - data converted to A/m # Configure the magic_measurements table MeasRecs,SpecRecs,SampRecs,SiteRecs,LocRecs=[],[],[],[],[] for rowNum, row in data.iterrows(): MeasRec,SpecRec,SampRec,SiteRec,LocRec = {},{},{},{},{} if specnum!=0: sample=specimen[:specnum] else: sample=specimen if site=='': site=pmag.parse_site(sample,samp_con,Z) if specimen!="" and specimen not in [x['specimen'] if 'specimen' in list(x.keys()) else "" for x in SpecRecs]: SpecRec['specimen'] = specimen SpecRec['sample'] = sample SpecRec['volume'] = volume SpecRec['analysts']=user SpecRec['citations'] = 'This study' SpecRecs.append(SpecRec) if sample!="" and sample not in [x['sample'] if 'sample' in list(x.keys()) else "" for x in SampRecs]: SampRec['sample'] = sample SampRec['site'] = site SampRec['azimuth'] = azimuth SampRec['dip'] = dip SampRec['bed_dip_direction'] = sample_bed_azimuth SampRec['bed_dip'] = bed_dip SampRec['method_codes'] = meth_code SampRec['analysts']=user SampRec['citations'] = 'This study' SampRecs.append(SampRec) if site!="" and site not in [x['site'] if 'site' in list(x.keys()) else "" for x in SiteRecs]: SiteRec['site'] = site SiteRec['location'] = location SiteRec['lat'] = lat SiteRec['lon'] = lon SiteRec['analysts']=user SiteRec['citations'] = 'This study' SiteRecs.append(SiteRec) if location!="" and location not in [x['location'] if 'location' in list(x.keys()) else "" for x in LocRecs]: LocRec['location']=location LocRec['analysts']=user LocRec['citations'] = 'This study' LocRec['lat_n'] = lat LocRec['lon_e'] = lon LocRec['lat_s'] = lat LocRec['lon_w'] = lon LocRecs.append(LocRec) MeasRec['description'] = 'Date: ' + str(row['Date']) + ' Time: ' + str(row['Time']) if '.' in row['Date']: datelist = row['Date'].split('.') elif '/' in row['Date']: datelist = row['Date'].split('/') elif '-' in row['Date']: datelist = row['Date'].split('-') else: print("unrecogized date formating on one of the measurement entries for specimen %s"%specimen); datelist=['','',''] if ':' in row['Time']: timelist = row['Time'].split(':') else: print("unrecogized time formating on one of the measurement entries for specimen %s"%specimen); timelist=['','',''] datelist[2]='19'+datelist[2] if len(datelist[2])<=2 else datelist[2] dt=":".join([datelist[1],datelist[0],datelist[2],timelist[0],timelist[1],timelist[2]]) local = pytz.timezone(timezone) naive = datetime.datetime.strptime(dt, "%m:%d:%Y:%H:%M:%S") local_dt = local.localize(naive, is_dst=None) utc_dt = local_dt.astimezone(pytz.utc) timestamp=utc_dt.strftime("%Y-%m-%dT%H:%M:%S")+"Z" MeasRec["timestamp"] = timestamp MeasRec["citations"] = "This study" MeasRec['software_packages'] = version_num MeasRec["treat_temp"] = '%8.3e' % (273) # room temp in kelvin MeasRec["meas_temp"] = '%8.3e' % (273) # room temp in kelvin MeasRec["quality"] = 'g' MeasRec["standard"] = 'u' MeasRec["treat_step_num"] = rowNum MeasRec["specimen"] = specimen MeasRec["treat_ac_field"] = '0' if row['DM Val'] == '0': meas_type = "LT-NO" elif int(row['DM Type']) > 0.0: meas_type = "LT-AF-Z" treat = float(row['DM Val']) MeasRec["treat_ac_field"] = '%8.3e' %(treat*1e-3) # convert from mT to tesla elif int(row['DM Type']) == -1: meas_type = "LT-T-Z" treat = float(row['DM Val']) MeasRec["treat_temp"] = '%8.3e' % (treat+273.) # temp in kelvin else: print("measurement type unknown:", row['DM Type'], " in row ", rowNum) MeasRec["magn_moment"] = str(row['magn_moment']) MeasRec["magn_volume"] = str(row['magn_volume']) MeasRec["dir_dec"] = str(row['dir_dec']) MeasRec["dir_inc"] = str(row['dir_inc']) MeasRec['method_codes'] = meas_type MeasRec['dir_csd'] = '0.0' # added due to magic.write error MeasRec['meas_n_orient'] = '1' # added due to magic.write error MeasRecs.append(MeasRec.copy()) con = nb.Contribution(output_dir_path,read_tables=[]) con.add_magic_table_from_data(dtype='specimens', data=SpecRecs) con.add_magic_table_from_data(dtype='samples', data=SampRecs) con.add_magic_table_from_data(dtype='sites', data=SiteRecs) con.add_magic_table_from_data(dtype='locations', data=LocRecs) MeasOuts=pmag.measurements_methods3(MeasRecs,noave) con.add_magic_table_from_data(dtype='measurements', data=MeasOuts) con.write_table_to_file('specimens', custom_name=spec_file, append=append) con.write_table_to_file('samples', custom_name=samp_file, append=append) con.write_table_to_file('sites', custom_name=site_file, append=append) con.write_table_to_file('locations', custom_name=loc_file, append=append) meas_file = con.write_table_to_file('measurements', custom_name=meas_file, append=append) return True, meas_file
def convert(**kwargs): """ """ #get kwargs dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'measurements.txt') mag_file = kwargs.get('mag_file') spec_file = kwargs.get('spec_file', 'specimens.txt') samp_file = kwargs.get('samp_file', 'samples.txt') site_file = kwargs.get('site_file', 'sites.txt') loc_file = kwargs.get('loc_file', 'locations.txt') lat = kwargs.get('lat', 0) lon = kwargs.get('lon', 0) specnum = int(kwargs.get('specnum', 0)) samp_con = kwargs.get('samp_con', '1') location = kwargs.get('location', 'unknown') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") version_num=pmag.get_version() if specnum!=0:specnum=-specnum if "4" in samp_con: if "-" not in samp_con: print("naming convention option [4] must be in form 4-Z where Z is an integer") return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="4" elif "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "naming convention option [7] must be in form 7-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="7" else: Z = 1 # format variables mag_file = os.path.join(input_dir_path,mag_file) meas_file = os.path.join(output_dir_path,meas_file) spec_file = os.path.join(output_dir_path,spec_file) samp_file = os.path.join(output_dir_path,samp_file) site_file = os.path.join(output_dir_path,site_file) # parse data data=open(mag_file,'r').readlines() # read in data from file comment=data[0] line=data[1].strip() line=line.replace("=","= ") # make finding orientations easier rec=line.split() # read in sample orientation, etc. specimen=rec[0] SpecRecs,SampRecs,SiteRecs,LocRecs,MeasRecs = [],[],[],[],[] SpecRec,SampRec,SiteRec,LocRec={},{},{},{} # make a sample record if specnum!=0: sample=rec[0][:specnum] else: sample=rec[0] if int(samp_con)<6: site=pmag.parse_site(sample,samp_con,Z) else: if 'site' in list(SampRec.keys()):site=ErSampREc['site'] if 'location' in list(SampRec.keys()):location=ErSampREc['location'] az_ind=rec.index('a=')+1 SampRec['sample']=sample SampRec['description']=comment SampRec['azimuth']=rec[az_ind] dip_ind=rec.index('b=')+1 dip=-float(rec[dip_ind]) SampRec['dip']='%7.1f'%(dip) strike_ind=rec.index('s=')+1 SampRec['bed_dip_direction']='%7.1f'%(float(rec[strike_ind])+90.) bd_ind=rec.index('d=')+1 SampRec['bed_dip']=rec[bd_ind] v_ind=rec.index('v=')+1 vol=rec[v_ind][:-3] date=rec[-2] time=rec[-1] SampRec['method_codes']=meth_code SampRec['site']=site SampRec['citations']='This study' SampRec['method_codes']='SO-NO' SpecRec['specimen'] = specimen SpecRec['sample'] = sample SpecRec['citations']='This study' SiteRec['site'] = site SiteRec['location'] = location SiteRec['citations']='This study' SiteRec['lat'] = lat SiteRec['lon']= lon LocRec['location'] = location LocRec['citations']='This study' LocRec['lat_n'] = lat LocRec['lat_s'] = lat LocRec['lon_e'] = lon LocRec['lon_w'] = lon SpecRecs.append(SpecRec) SampRecs.append(SampRec) SiteRecs.append(SiteRec) LocRecs.append(LocRec) for k in range(3,len(data)): # read in data line=data[k] rec=line.split() if len(rec)>1: # skip blank lines at bottom MeasRec={} MeasRec['description']='Date: '+date+' '+time MeasRec["citations"]="This study" MeasRec['software_packages']=version_num MeasRec["treat_temp"]='%8.3e' % (273) # room temp in kelvin MeasRec["meas_temp"]='%8.3e' % (273) # room temp in kelvin MeasRec["quality"]='g' MeasRec["standard"]='u' MeasRec["treat_step_num"]='1' MeasRec["specimen"]=specimen if rec[0]=='NRM': meas_type="LT-NO" elif rec[0][0]=='M' or rec[0][0]=='H': meas_type="LT-AF-Z" elif rec[0][0]=='T': meas_type="LT-T-Z" else: print("measurement type unknown") return False, "measurement type unknown" X=[float(rec[1]),float(rec[2]),float(rec[3])] Vec=pmag.cart2dir(X) MeasRec["magn_moment"]='%10.3e'% (Vec[2]) # Am^2 MeasRec["magn_volume"]=rec[4] # A/m MeasRec["dir_dec"]='%7.1f'%(Vec[0]) MeasRec["dir_inc"]='%7.1f'%(Vec[1]) MeasRec["treat_ac_field"]='0' if meas_type!='LT-NO': treat=float(rec[0][1:]) else: treat=0 if meas_type=="LT-AF-Z": MeasRec["treat_ac_field"]='%8.3e' %(treat*1e-3) # convert from mT to tesla elif meas_type=="LT-T-Z": MeasRec["treat_temp"]='%8.3e' % (treat+273.) # temp in kelvin MeasRec['method_codes']=meas_type MeasRecs.append(MeasRec) con = nb.Contribution(output_dir_path,read_tables=[]) con.add_magic_table_from_data(dtype='specimens', data=SpecRecs) con.add_magic_table_from_data(dtype='samples', data=SampRecs) con.add_magic_table_from_data(dtype='sites', data=SiteRecs) con.add_magic_table_from_data(dtype='locations', data=LocRecs) MeasOuts=pmag.measurements_methods3(MeasRecs,noave) con.add_magic_table_from_data(dtype='measurements', data=MeasOuts) con.tables['specimens'].write_magic_file(custom_name=spec_file) con.tables['samples'].write_magic_file(custom_name=samp_file) con.tables['sites'].write_magic_file(custom_name=site_file) con.tables['locations'].write_magic_file(custom_name=loc_file) con.tables['measurements'].write_magic_file(custom_name=meas_file) return True, meas_file
def main(): """ NAME thellier_magic_redo.py DESCRIPTION Calculates paleointensity parameters for thellier-thellier type data using bounds stored in the "redo" file SYNTAX thellier_magic_redo [command line options] OPTIONS -h prints help message -usr USER: identify user, default is "" -fcr CRIT, set criteria for grading -f IN: specify input file, default is magic_measurements.txt -fre REDO: specify redo file, default is "thellier_redo" -F OUT: specify output file, default is thellier_specimens.txt -leg: attaches "Recalculated from original measurements; supercedes published results. " to comment field -CR PERC TYPE: apply a blanket cooling rate correction if none supplied in the er_samples.txt file PERC should be a percentage of original (say reduce to 90%) TYPE should be one of the following: EG (for educated guess); PS (based on pilots); TRM (based on comparison of two TRMs) -ANI: perform anisotropy correction -fsa SAMPFILE: er_samples.txt file with cooling rate correction information, default is NO CORRECTION -Fcr CRout: specify pmag_specimen format file for cooling rate corrected data -fan ANIFILE: specify rmag_anisotropy format file, default is rmag_anisotropy.txt -Fac ACout: specify pmag_specimen format file for anisotropy corrected data default is AC_specimens.txt -fnl NLTFILE: specify magic_measurments format file, default is magic_measurements.txt -Fnl NLTout: specify pmag_specimen format file for non-linear trm corrected data default is NLT_specimens.txt -z use z component differenences for pTRM calculation INPUT a thellier_redo file is Specimen_name Tmin Tmax (where Tmin and Tmax are in Centigrade) """ dir_path='.' critout="" version_num=pmag.get_version() field,first_save=-1,1 spec,recnum,start,end=0,0,0,0 crfrac=0 NltRecs,PmagSpecs,AniSpecRecs,NltSpecRecs,CRSpecs=[],[],[],[],[] meas_file,pmag_file,mk_file="magic_measurements.txt","thellier_specimens.txt","thellier_redo" anis_file="rmag_anisotropy.txt" anisout,nltout="AC_specimens.txt","NLT_specimens.txt" crout="CR_specimens.txt" nlt_file="" samp_file="" comment,user="","unknown" anis,nltrm=0,0 jackknife=0 # maybe in future can do jackknife args=sys.argv Zdiff=0 if '-WD' in args: ind=args.index('-WD') dir_path=args[ind+1] if "-h" in args: print(main.__doc__) sys.exit() if "-usr" in args: ind=args.index("-usr") user=sys.argv[ind+1] if "-leg" in args: comment="Recalculated from original measurements; supercedes published results. " cool=0 if "-CR" in args: cool=1 ind=args.index("-CR") crfrac=.01*float(sys.argv[ind+1]) crtype='DA-CR-'+sys.argv[ind+2] if "-Fcr" in args: ind=args.index("-Fcr") crout=sys.argv[ind+1] if "-f" in args: ind=args.index("-f") meas_file=sys.argv[ind+1] if "-F" in args: ind=args.index("-F") pmag_file=sys.argv[ind+1] if "-fre" in args: ind=args.index("-fre") mk_file=args[ind+1] if "-fsa" in args: ind=args.index("-fsa") samp_file=dir_path+'/'+args[ind+1] Samps,file_type=pmag.magic_read(samp_file) SampCRs=pmag.get_dictitem(Samps,'cooling_rate_corr','','F') # get samples cooling rate corrections cool=1 if file_type!='er_samples': print('not a valid er_samples.txt file') sys.exit() # # if "-ANI" in args: anis=1 ind=args.index("-ANI") if "-Fac" in args: ind=args.index("-Fac") anisout=args[ind+1] if "-fan" in args: ind=args.index("-fan") anis_file=args[ind+1] # if "-NLT" in args: if "-Fnl" in args: ind=args.index("-Fnl") nltout=args[ind+1] if "-fnl" in args: ind=args.index("-fnl") nlt_file=args[ind+1] if "-z" in args: Zdiff=1 if '-fcr' in sys.argv: ind=args.index("-fcr") critout=sys.argv[ind+1] # # start reading in data: # meas_file=dir_path+"/"+meas_file mk_file=dir_path+"/"+mk_file accept=pmag.default_criteria(1)[0] # set criteria to none if critout!="": critout=dir_path+"/"+critout crit_data,file_type=pmag.magic_read(critout) if file_type!='pmag_criteria': print('bad pmag_criteria file, using no acceptance criteria') print("Acceptance criteria read in from ", critout) for critrec in crit_data: if 'sample_int_sigma_uT' in list(critrec.keys()): # accommodate Shaar's new criterion critrec['sample_int_sigma']='%10.3e'%(eval(critrec['sample_int_sigma_uT'])*1e-6) for key in list(critrec.keys()): if key not in list(accept.keys()) and critrec[key]!='': accept[key]=critrec[key] meas_data,file_type=pmag.magic_read(meas_file) if file_type != 'magic_measurements': print(file_type) print(file_type,"This is not a valid magic_measurements file ") sys.exit() try: mk_f=open(mk_file,'r') except: print("Bad redo file") sys.exit() mkspec=[] speclist=[] for line in mk_f.readlines(): tmp=line.split() mkspec.append(tmp) speclist.append(tmp[0]) if anis==1: anis_file=dir_path+"/"+anis_file anis_data,file_type=pmag.magic_read(anis_file) if file_type != 'rmag_anisotropy': print(file_type) print(file_type,"This is not a valid rmag_anisotropy file ") sys.exit() if nlt_file=="": nlt_data=pmag.get_dictitem(meas_data,'magic_method_codes','LP-TRM','has') # look for trm acquisition data in the meas_data file else: nlt_file=dir_path+"/"+nlt_file nlt_data,file_type=pmag.magic_read(nlt_file) if len(nlt_data)>0: nltrm=1 # # sort the specimen names and step through one by one # sids=pmag.get_specs(meas_data) # print('Processing ',len(speclist),' specimens - please wait ') while spec < len(speclist): s=speclist[spec] recnum=0 datablock=[] PmagSpecRec={} PmagSpecRec["er_analyst_mail_names"]=user PmagSpecRec["er_citation_names"]="This study" PmagSpecRec["magic_software_packages"]=version_num methcodes,inst_code=[],"" # # find the data from the meas_data file for this specimen # datablock=pmag.get_dictitem(meas_data,'er_specimen_name',s,'T') datablock=pmag.get_dictitem(datablock,'magic_method_codes','LP-PI-TRM','has') #pick out the thellier experiment data if len(datablock)>0: for rec in datablock: if "magic_instrument_codes" not in list(rec.keys()): rec["magic_instrument_codes"]="unknown" # # collect info for the PmagSpecRec dictionary # rec=datablock[0] PmagSpecRec["er_specimen_name"]=s PmagSpecRec["er_sample_name"]=rec["er_sample_name"] PmagSpecRec["er_site_name"]=rec["er_site_name"] PmagSpecRec["er_location_name"]=rec["er_location_name"] PmagSpecRec["measurement_step_unit"]="K" PmagSpecRec["specimen_correction"]='u' if "er_expedition_name" in list(rec.keys()):PmagSpecRec["er_expedition_name"]=rec["er_expedition_name"] if "magic_instrument_codes" not in list(rec.keys()): PmagSpecRec["magic_instrument_codes"]="unknown" else: PmagSpecRec["magic_instrument_codes"]=rec["magic_instrument_codes"] if "magic_experiment_name" not in list(rec.keys()): rec["magic_experiment_name"]="" else: PmagSpecRec["magic_experiment_names"]=rec["magic_experiment_name"] meths=rec["magic_experiment_name"].split(":") for meth in meths: if meth.strip() not in methcodes and "LP-" in meth:methcodes.append(meth.strip()) # # sort out the data into first_Z, first_I, ptrm_check, ptrm_tail # araiblock,field=pmag.sortarai(datablock,s,Zdiff) first_Z=araiblock[0] first_I=araiblock[1] ptrm_check=araiblock[2] ptrm_tail=araiblock[3] if len(first_I)<3 or len(first_Z)<4: spec+=1 print('skipping specimen ', s) else: # # get start, end # for redospec in mkspec: if redospec[0]==s: b,e=float(redospec[1]),float(redospec[2]) break if e > float(first_Z[-1][0]):e=float(first_Z[-1][0]) for recnum in range(len(first_Z)): if first_Z[recnum][0]==b:start=recnum if first_Z[recnum][0]==e:end=recnum nsteps=end-start if nsteps>2: zijdblock,units=pmag.find_dmag_rec(s,meas_data) pars,errcode=pmag.PintPars(datablock,araiblock,zijdblock,start,end,accept) if 'specimen_scat' in list(pars.keys()): PmagSpecRec['specimen_scat']=pars['specimen_scat'] if 'specimen_frac' in list(pars.keys()): PmagSpecRec['specimen_frac']='%5.3f'%(pars['specimen_frac']) if 'specimen_gmax' in list(pars.keys()): PmagSpecRec['specimen_gmax']='%5.3f'%(pars['specimen_gmax']) pars['measurement_step_unit']=units pars["specimen_lab_field_dc"]=field pars["specimen_int"]=-1*field*pars["specimen_b"] PmagSpecRec["measurement_step_min"]='%8.3e' % (pars["measurement_step_min"]) PmagSpecRec["measurement_step_max"]='%8.3e' % (pars["measurement_step_max"]) PmagSpecRec["specimen_int_n"]='%i'%(pars["specimen_int_n"]) PmagSpecRec["specimen_lab_field_dc"]='%8.3e'%(pars["specimen_lab_field_dc"]) PmagSpecRec["specimen_int"]='%9.4e '%(pars["specimen_int"]) PmagSpecRec["specimen_b"]='%5.3f '%(pars["specimen_b"]) PmagSpecRec["specimen_q"]='%5.1f '%(pars["specimen_q"]) PmagSpecRec["specimen_f"]='%5.3f '%(pars["specimen_f"]) PmagSpecRec["specimen_fvds"]='%5.3f'%(pars["specimen_fvds"]) PmagSpecRec["specimen_b_beta"]='%5.3f'%(pars["specimen_b_beta"]) PmagSpecRec["specimen_int_mad"]='%7.1f'%(pars["specimen_int_mad"]) PmagSpecRec["specimen_gamma"]='%7.1f'%(pars["specimen_gamma"]) if pars["magic_method_codes"]!="" and pars["magic_method_codes"] not in methcodes: methcodes.append(pars["magic_method_codes"]) PmagSpecRec["specimen_dec"]='%7.1f'%(pars["specimen_dec"]) PmagSpecRec["specimen_inc"]='%7.1f'%(pars["specimen_inc"]) PmagSpecRec["specimen_tilt_correction"]='-1' PmagSpecRec["specimen_direction_type"]='l' PmagSpecRec["direction_type"]='l' # this is redudant, but helpful - won't be imported PmagSpecRec["specimen_dang"]='%7.1f '%(pars["specimen_dang"]) PmagSpecRec["specimen_drats"]='%7.1f '%(pars["specimen_drats"]) PmagSpecRec["specimen_drat"]='%7.1f '%(pars["specimen_drat"]) PmagSpecRec["specimen_int_ptrm_n"]='%i '%(pars["specimen_int_ptrm_n"]) PmagSpecRec["specimen_rsc"]='%6.4f '%(pars["specimen_rsc"]) PmagSpecRec["specimen_md"]='%i '%(int(pars["specimen_md"])) if PmagSpecRec["specimen_md"]=='-1':PmagSpecRec["specimen_md"]="" PmagSpecRec["specimen_b_sigma"]='%5.3f '%(pars["specimen_b_sigma"]) if "IE-TT" not in methcodes:methcodes.append("IE-TT") methods="" for meth in methcodes: methods=methods+meth+":" PmagSpecRec["magic_method_codes"]=methods.strip(':') PmagSpecRec["magic_software_packages"]=version_num PmagSpecRec["specimen_description"]=comment if critout!="": kill=pmag.grade(PmagSpecRec,accept,'specimen_int') if len(kill)>0: Grade='F' # fails else: Grade='A' # passes PmagSpecRec["specimen_grade"]=Grade else: PmagSpecRec["specimen_grade"]="" # not graded if nltrm==0 and anis==0 and cool!=0: # apply cooling rate correction SCR=pmag.get_dictitem(SampCRs,'er_sample_name',PmagSpecRec['er_sample_name'],'T') # get this samples, cooling rate correction CrSpecRec=pmag.cooling_rate(PmagSpecRec,SCR,crfrac,crtype) if CrSpecRec['er_specimen_name']!='none':CrSpecs.append(CrSpecRec) PmagSpecs.append(PmagSpecRec) NltSpecRec="" # # check on non-linear TRM correction # if nltrm==1: # # find the data from the nlt_data list for this specimen # TRMs,Bs=[],[] NltSpecRec="" NltRecs=pmag.get_dictitem(nlt_data,'er_specimen_name',PmagSpecRec['er_specimen_name'],'has') # fish out all the NLT data for this specimen if len(NltRecs) > 2: for NltRec in NltRecs: Bs.append(float(NltRec['treatment_dc_field'])) TRMs.append(float(NltRec['measurement_magn_moment'])) NLTpars=nlt.NLtrm(Bs,TRMs,float(PmagSpecRec['specimen_int']),float(PmagSpecRec['specimen_lab_field_dc']),0) if NLTpars['banc']>0: NltSpecRec={} for key in list(PmagSpecRec.keys()): NltSpecRec[key]=PmagSpecRec[key] NltSpecRec['specimen_int']='%9.4e'%(NLTpars['banc']) NltSpecRec['magic_method_codes']=PmagSpecRec["magic_method_codes"]+":DA-NL" NltSpecRec["specimen_correction"]='c' NltSpecRec['specimen_grade']=PmagSpecRec['specimen_grade'] NltSpecRec["magic_software_packages"]=version_num print(NltSpecRec['er_specimen_name'], ' Banc= ',float(NLTpars['banc'])*1e6) if anis==0 and cool!=0: SCR=pmag.get_dictitem(SampCRs,'er_sample_name',NltSpecRec['er_sample_name'],'T') # get this samples, cooling rate correction CrSpecRec=pmag.cooling_rate(NltSpecRec,SCR,crfrac,crtype) if CrSpecRec['er_specimen_name']!='none':CrSpecs.append(CrSpecRec) NltSpecRecs.append(NltSpecRec) # # check on anisotropy correction if anis==1: if NltSpecRec!="": Spc=NltSpecRec else: # find uncorrected data Spc=PmagSpecRec AniSpecs=pmag.get_dictitem(anis_data,'er_specimen_name',PmagSpecRec['er_specimen_name'],'T') if len(AniSpecs)>0: AniSpec=AniSpecs[0] AniSpecRec=pmag.doaniscorr(Spc,AniSpec) AniSpecRec['specimen_grade']=PmagSpecRec['specimen_grade'] AniSpecRec["magic_instrument_codes"]=PmagSpecRec['magic_instrument_codes'] AniSpecRec["specimen_correction"]='c' AniSpecRec["magic_software_packages"]=version_num if cool!=0: SCR=pmag.get_dictitem(SampCRs,'er_sample_name',AniSpecRec['er_sample_name'],'T') # get this samples, cooling rate correction CrSpecRec=pmag.cooling_rate(AniSpecRec,SCR,crfrac,crtype) if CrSpecRec['er_specimen_name']!='none':CrSpecs.append(CrSpecRec) AniSpecRecs.append(AniSpecRec) elif anis==1: AniSpecs=pmag.get_dictitem(anis_data,'er_specimen_name',PmagSpecRec['er_specimen_name'],'T') if len(AniSpecs)>0: AniSpec=AniSpecs[0] AniSpecRec=pmag.doaniscorr(PmagSpecRec,AniSpec) AniSpecRec['specimen_grade']=PmagSpecRec['specimen_grade'] AniSpecRec["magic_instrument_codes"]=PmagSpecRec["magic_instrument_codes"] AniSpecRec["specimen_correction"]='c' AniSpecRec["magic_software_packages"]=version_num if crfrac!=0: CrSpecRec={} for key in list(AniSpecRec.keys()):CrSpecRec[key]=AniSpecRec[key] inten=frac*float(CrSpecRec['specimen_int']) CrSpecRec["specimen_int"]='%9.4e '%(inten) # adjust specimen intensity by cooling rate correction CrSpecRec['magic_method_codes'] = CrSpecRec['magic_method_codes']+':DA-CR-'+crtype CRSpecs.append(CrSpecRec) AniSpecRecs.append(AniSpecRec) spec +=1 else: print("skipping ",s) spec+=1 pmag_file=dir_path+'/'+pmag_file pmag.magic_write(pmag_file,PmagSpecs,'pmag_specimens') print('uncorrected thellier data saved in: ',pmag_file) if anis==1 and len(AniSpecRecs)>0: anisout=dir_path+'/'+anisout pmag.magic_write(anisout,AniSpecRecs,'pmag_specimens') print('anisotropy corrected data saved in: ',anisout) if nltrm==1 and len(NltSpecRecs)>0: nltout=dir_path+'/'+nltout pmag.magic_write(nltout,NltSpecRecs,'pmag_specimens') print('non-linear TRM corrected data saved in: ',nltout) if crfrac!=0: crout=dir_path+'/'+crout pmag.magic_write(crout,CRSpecs,'pmag_specimens') print('cooling rate corrected data saved in: ',crout)
def main(): """ NAME hysteresis_magic.py DESCRIPTION calculates hystereis parameters and saves them in 3.0 specimen format file makes plots if option selected SYNTAX hysteresis_magic.py [command line options] OPTIONS -h prints help message and quits -f: specify input file, default is agm_measurements.txt -F: specify specimens.txt output file -P: do not make the plots -spc SPEC: specify specimen name to plot and quit -sav save all plots and quit -fmt [png,svg,eps,jpg] """ args=sys.argv PLT=1 plots=0 fmt=pmag.get_named_arg_from_sys('-fmt','svg') dir_path=pmag.get_named_arg_from_sys('-WD','.') dir_path=os.path.realpath(dir_path) verbose=pmagplotlib.verbose version_num=pmag.get_version() user=pmag.get_named_arg_from_sys('-usr','') if "-h" in args: print(main.__doc__) sys.exit() meas_file=pmag.get_named_arg_from_sys('-f','agm_measurements.txt') spec_file=pmag.get_named_arg_from_sys('-F','specimens.txt') if '-P' in args: PLT=0 irm_init,imag_init=-1,-1 if '-sav' in args: verbose=0 plots=1 pltspec=pmag.get_named_arg_from_sys('-spc',0) if pltspec: #pltspec= args[ind+1] verbose=0 plots=1 spec_file=dir_path+'/'+spec_file meas_file=dir_path+'/'+meas_file SpecRecs=[] # # meas_data,file_type=pmag.magic_read(meas_file) if file_type!='measurements': print(main.__doc__) print('bad file') sys.exit() # # initialize some variables # define figure numbers for hyst,deltaM,DdeltaM curves HystRecs,RemRecs=[],[] HDD={} if verbose: if verbose and PLT:print("Plots may be on top of each other - use mouse to place ") if PLT: HDD['hyst'],HDD['deltaM'],HDD['DdeltaM']=1,2,3 pmagplotlib.plot_init(HDD['DdeltaM'],5,5) pmagplotlib.plot_init(HDD['deltaM'],5,5) pmagplotlib.plot_init(HDD['hyst'],5,5) imag_init=0 irm_init=0 else: HDD['hyst'],HDD['deltaM'],HDD['DdeltaM'],HDD['irm'],HDD['imag']=0,0,0,0,0 # if spec_file: prior_data,file_type=pmag.magic_read(spec_file) # # get list of unique experiment names and specimen names # experiment_names,sids=[],[] hys_data=pmag.get_dictitem(meas_data,'method_codes','LP-HYS','has') dcd_data=pmag.get_dictitem(meas_data,'method_codes','LP-IRM-DCD','has') imag_data=pmag.get_dictitem(meas_data,'method_codes','LP-IMAG','has') for rec in hys_data: if rec['experiment'] not in experiment_names:experiment_names.append(rec['experiment']) if rec['specimen'] not in sids:sids.append(rec['specimen']) # k=0 if pltspec: k=sids.index(pltspec) print(sids[k]) while k < len(sids): specimen=sids[k] HystRec={'specimen':specimen,'experiment':""} # initialize a new specimen hysteresis record if verbose and PLT:print(specimen, k+1 , 'out of ',len(sids)) # # B,M,Bdcd,Mdcd=[],[],[],[] #B,M for hysteresis, Bdcd,Mdcd for irm-dcd data Bimag,Mimag=[],[] #Bimag,Mimag for initial magnetization curves spec_data=pmag.get_dictitem(hys_data,'specimen',specimen,'T') # fish out all the LP-HYS data for this specimen if len(spec_data)>0: meths=spec_data[0]['method_codes'].split(':') e=spec_data[0]['experiment'] HystRec['experiment']=spec_data[0]['experiment'] for rec in spec_data: B.append(float(rec['meas_field_dc'])) M.append(float(rec['magn_moment'])) spec_data=pmag.get_dictitem(dcd_data,'specimen',specimen,'T') # fish out all the data for this specimen if len(spec_data)>0: HystRec['experiment']=HystRec['experiment']+':'+spec_data[0]['experiment'] irm_exp=spec_data[0]['experiment'] for rec in spec_data: Bdcd.append(float(rec['treat_dc_field'])) Mdcd.append(float(rec['magn_moment'])) spec_data=pmag.get_dictitem(imag_data,'specimen',specimen,'T') # fish out all the data for this specimen if len(spec_data)>0: imag_exp=spec_data[0]['experiment'] for rec in spec_data: Bimag.append(float(rec['meas_field_dc'])) Mimag.append(float(rec['magn_moment'])) # # now plot the hysteresis curve # if len(B)>0: hmeths=[] for meth in meths: hmeths.append(meth) hpars=pmagplotlib.plotHDD(HDD,B,M,e) if verbose and PLT:pmagplotlib.drawFIGS(HDD) # if verbose:pmagplotlib.plotHPARS(HDD,hpars,'bs') HystRec['hyst_mr_moment']=hpars['hysteresis_mr_moment'] HystRec['hyst_ms_moment']=hpars['hysteresis_ms_moment'] HystRec['hyst_bc']=hpars['hysteresis_bc'] HystRec['hyst_bcr']=hpars['hysteresis_bcr'] HystRec['susc_h']=hpars['hysteresis_xhf'] HystRec['experiments']=e HystRec['software_packages']=version_num if hpars["magic_method_codes"] not in hmeths:hmeths.append(hpars["magic_method_codes"]) methods="" for meth in hmeths: methods=methods+meth.strip()+":" HystRec["method_codes"]=methods[:-1] HystRec["citations"]="This study" # if len(Bdcd)>0: rmeths=[] for meth in meths: rmeths.append(meth) if verbose and PLT:print('plotting IRM') if irm_init==0: HDD['irm']=5 pmagplotlib.plot_init(HDD['irm'],5,5) irm_init=1 rpars=pmagplotlib.plotIRM(HDD['irm'],Bdcd,Mdcd,irm_exp) HystRec['rem_mr_moment']=rpars['remanence_mr_moment'] HystRec['rem_bcr']=rpars['remanence_bcr'] HystRec['experiments']=specimen+':'+irm_exp if rpars["magic_method_codes"] not in meths:meths.append(rpars["magic_method_codes"]) methods="" for meth in rmeths: methods=methods+meth.strip()+":" HystRec["method_codes"]=HystRec['method_codes']+':'+methods[:-1] HystRec["citations"]="This study" else: if irm_init:pmagplotlib.clearFIG(HDD['irm']) if len(Bimag)>0: if verbose and PLT:print('plotting initial magnetization curve') # first normalize by Ms Mnorm=[] for m in Mimag: Mnorm.append(old_div(m,float(hpars['hysteresis_ms_moment']))) if imag_init==0: HDD['imag']=4 pmagplotlib.plot_init(HDD['imag'],5,5) imag_init=1 pmagplotlib.plotIMAG(HDD['imag'],Bimag,Mnorm,imag_exp) else: if imag_init:pmagplotlib.clearFIG(HDD['imag']) if len(list(HystRec.keys()))>0:HystRecs.append(HystRec) # files={} if plots: if pltspec:s=pltspec files={} for key in list(HDD.keys()): files[key]=s+'_'+key+'.'+fmt pmagplotlib.saveP(HDD,files) if pltspec:sys.exit() if verbose and PLT: pmagplotlib.drawFIGS(HDD) ans=input("S[a]ve plots, [s]pecimen name, [q]uit, <return> to continue\n ") if ans=="a": files={} for key in list(HDD.keys()): files[key]=specimen+'_'+key+'.'+fmt pmagplotlib.saveP(HDD,files) if ans=='':k+=1 if ans=="p": del HystRecs[-1] k-=1 if ans=='q': print("Good bye") sys.exit() if ans=='s': keepon=1 specimen=input('Enter desired specimen name (or first part there of): ') while keepon==1: try: k =sids.index(specimen) keepon=0 except: tmplist=[] for qq in range(len(sids)): if specimen in sids[qq]:tmplist.append(sids[qq]) print(specimen," not found, but this was: ") print(tmplist) specimen=input('Select one or try again\n ') k =sids.index(specimen) else: k+=1 if len(B)==0 and len(Bdcd)==0: if verbose:print('skipping this one - no hysteresis data') k+=1 if len(HystRecs)>0: # go through prior_data, clean out prior results and save combined file as spec_file SpecRecs,keys=[],list(HystRecs[0].keys()) if len(prior_data)>0: prior_keys=list(prior_data[0].keys()) else: prior_keys=[] for rec in prior_data: for key in keys: if key not in list(rec.keys()):rec[key]="" if 'LP-HYS' not in rec['method_codes']: SpecRecs.append(rec) for rec in HystRecs: for key in prior_keys: if key not in list(rec.keys()):rec[key]="" prior=pmag.get_dictitem(prior_data,'specimen',rec['specimen'],'T') if len(prior)>0 and 'sample' in list(prior[0].keys()): rec['sample']=prior[0]['sample'] # pull sample name from prior specimens table SpecRecs.append(rec) pmag.magic_write(spec_file,SpecRecs,"specimens") if verbose:print("hysteresis parameters saved in ",spec_file)
def main(): """ NAME umich_magic.py DESCRIPTION converts UMICH .mag format files to magic_measurements format files SYNTAX umich_magic.py [command line options] OPTIONS -h: prints the help message and quits. -usr USER: identify user, default is "" -f FILE: specify .mag format input file, required -fsa SAMPFILE : specify er_samples.txt file relating samples, site and locations names,default is none -F FILE: specify output file, default is magic_measurements.txt -spc NUM : specify number of characters to designate a specimen, default = 0 -loc LOCNAME : specify location/study name, must have either LOCNAME or SAMPFILE or be a synthetic -ncn NCON: specify naming convention: default is #1 below -A: don't average replicate measurements Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. Format of UMICH .mag files: Spec Treat CSD Intensity Declination Inclination metadata string Spec: specimen name Treat: treatment step XXX T in Centigrade XXX AF in mT Intensity assumed to be total moment in 10^3 Am^2 (emu) Declination: Declination in specimen coordinate system Inclination: Declination in specimen coordinate system metatdata string: mm/dd/yy;hh:mm;[dC,mT];xx.xx;UNITS;USER;INST;NMEAS hh in 24 hours. dC or mT units of treatment XXX (see Treat above) for thermal or AF respectively xx.xxx DC field UNITS of DC field (microT, mT) INST: instrument code, number of axes, number of positions (e.g., G34 is 2G, three axes, measured in four positions) NMEAS: number of measurements in a single position (1,3,200...) """ # initialize some stuff dir_path='.' infile_type="mag" noave=0 methcode,inst="","" phi,theta,peakfield,labfield=0,0,0,0 pTRM,MD,samp_con,Z=0,0,'1',1 missing=1 demag="N" er_location_name="" citation='This study' args=sys.argv methcode="LP-NO" samp_file,ErSamps='',[] specnum=0 # # get command line arguments # meas_file="magic_measurements.txt" user="" if '-WD' in args: ind=args.index("-WD") dir_path=args[ind+1] if "-h" in args: print main.__doc__ sys.exit() if "-usr" in args: ind=args.index("-usr") user=args[ind+1] if '-F' in args: ind=args.index("-F") meas_file=dir_path+'/'+args[ind+1] if '-f' in args: ind=args.index("-f") magfile=dir_path+'/'+args[ind+1] try: input=open(magfile,'rU') except: print "bad mag file name" sys.exit() else: print "mag_file field is required option" print main.__doc__ sys.exit() if "-spc" in args: ind=args.index("-spc") specnum=int(args[ind+1]) if specnum!=0:specnum=-specnum if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-fsa" in args: ind=args.index("-fsa") samp_file=dir_path+'/'+args[ind+1] Samps,file_type=pmag.magic_read(samp_file) if "-A" in args: noave=1 if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "4" in samp_con: if "-" not in samp_con: print "option [4] must be in form 4-Z where Z is an integer" sys.exit() else: Z=samp_con.split("-")[1] samp_con="4" samp_con=sys.argv[ind+1] if "7" in samp_con: if "-" not in samp_con: print "option [7] must be in form 7-Z where Z is an integer" sys.exit() else: Z=samp_con.split("-")[1] samp_con="7" MagRecs,specs=[],[] version_num=pmag.get_version() if infile_type=="mag": for line in input.readlines(): instcode="" if len(line)>2: MagRec={} MagRec['er_location_name']=er_location_name MagRec['magic_software_packages']=version_num MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["treatment_ac_field"]='0' MagRec["treatment_dc_field"]='0' MagRec["treatment_dc_field_phi"]='0' MagRec["treatment_dc_field_theta"]='0' meas_type="LT-NO" rec=line.split() labfield=0 code1=rec[6].split(';') date=code1[0].split('/') # break date into mon/day/year yy=int(date[2]) if yy <90: yyyy=str(2000+yy) else: yyyy=str(1900+yy) mm=int(date[0]) if mm<10: mm="0"+str(mm) else: mm=str(mm) dd=int(date[1]) if dd<10: dd="0"+str(dd) else: dd=str(dd) time=code1[1].split(':') hh=int(time[0]) if hh<10: hh="0"+str(hh) else: hh=str(hh) min=int(time[1]) if min<10: min= "0"+str(min) else: min=str(min) MagRec["measurement_date"]=yyyy+":"+mm+":"+dd+":"+hh+":"+min+":00.00" MagRec["measurement_time_zone"]='' instcode='' if len(code1)>1: MagRec["measurement_positions"]=code1[6][2] else: MagRec["measurement_positions"]=code1[7] # takes care of awkward format with bubba and flo being different if user=="":user=code1[5] if code1[2][-1]=='C': demag="T" if code1[2]=='mT': demag="AF" treat=rec[1].split('.') if len(treat)==1:treat.append('0') if demag=='T' and treat!=0: meas_type="LT-T-Z" MagRec["treatment_temp"]='%8.3e' % (float(treat[0])+273.) # temp in kelvin if demag=="AF": meas_type="LT-AF-Z" MagRec["treatment_ac_field"]='%8.3e' % (float(treat[0])*1e-3) # Af field in T MagRec["treatment_dc_field"]='0' MagRec["er_specimen_name"]=rec[0] if rec[0] not in specs:specs.append(rec[0]) # get a list of specimen names experiment=rec[0]+":" MagRec["er_site_name"]="" if specnum!=0: MagRec["er_sample_name"]=rec[0][:specnum] else: MagRec["er_sample_name"]=rec[0] if "-fsa" in args: for samp in Samps: if samp["er_sample_name"] == MagRec["er_sample_name"]: MagRec["er_location_name"]=samp["er_location_name"] MagRec["er_site_name"]=samp["er_site_name"] break elif int(samp_con)!=6: site=pmag.parse_site(MagRec['er_sample_name'],samp_con,Z) MagRec["er_site_name"]=site if MagRec['er_site_name']=="": print 'No site name found for: ',MagRec['er_specimen_name'],MagRec['er_sample_name'] if MagRec["er_location_name"]=="": print 'no location name for: ',MagRec["er_specimen_name"] if rec[1]==".00":rec[1]="0.00" MagRec["measurement_csd"]=rec[2] MagRec["measurement_magn_moment"]='%10.3e'% (float(rec[3])*1e-3) # moment in Am^2 (from emu) MagRec["measurement_dec"]=rec[4] MagRec["measurement_inc"]=rec[5] MagRec["magic_instrument_codes"]=instcode MagRec["er_analyst_mail_names"]=user MagRec["er_citation_names"]=citation MagRec["magic_method_codes"]=meas_type MagRec["measurement_flag"]='g' MagRec["er_specimen_name"]=rec[0] MagRec["measurement_number"]='1' MagRecs.append(MagRec) MagOuts=[] for spec in specs: # gather all demag types for this specimen SpecRecs,meths,measnum=[],[],1 for rec in MagRecs: if rec['er_specimen_name']==spec: rec['measurement_number']=str(measnum) measnum+=1 if rec['magic_method_codes'] not in meths:meths.append(rec['magic_method_codes']) SpecRecs.append(rec) expname=spec if "LT-AF-Z" in meths:expname=expname+ ':LP-DIR-AF' if "LT-T-Z" in meths:expname=expname+ ':LP-DIR-T' for rec in SpecRecs: rec['magic_experiment_name']=expname MagOuts.append(rec) pmag.magic_write(meas_file,MagOuts,'magic_measurements') print "results put in ",meas_file
def main(): """ NAME microwave_magic.py DESCRIPTION plots microwave paleointensity data, allowing interactive setting of bounds. Saves and reads interpretations from a pmag_specimen formatted table, default: microwave_specimens.txt SYNTAX microwave_magic.py [command line options] OPTIONS -h prints help message and quits -f MEAS, set magic_measurements input file -fsp PRIOR, set pmag_specimen prior interpretations file -fcr CRIT, set criteria file for grading. -fmt [svg,png,jpg], format for images - default is svg -sav, saves plots with out review (default format) -spc SPEC, plots single specimen SPEC, saves plot with specified format with optional -b bounds adn quits -b BEG END: sets bounds for calculation BEG: starting step for slope calculation END: ending step for slope calculation DEFAULTS MEAS: magic_measurements.txt CRIT: NONE PRIOR: microwave_specimens.txt OUTPUT figures: ALL: numbers refer to temperature steps in command line window 1) Arai plot: closed circles are zero-field first/infield open circles are infield first/zero-field triangles are pTRM checks squares are pTRM tail checks VDS is vector difference sum diamonds are bounds for interpretation 2) Zijderveld plot: closed (open) symbols are X-Y (X-Z) planes X rotated to NRM direction 3) (De/Re)Magnetization diagram: circles are NRM remaining squares are pTRM gained command line window: list is: temperature step numbers, power (J), Dec, Inc, Int (units of magic_measuements) list of possible commands: type letter followed by return to select option saving of plots creates .svg format files with specimen_name, plot type as name """ # # initializations # meas_file, critout, inspec = "magic_measurements.txt", "", "microwave_specimens.txt" inlt = 0 version_num = pmag.get_version() Tinit, DCZ, field, first_save = 0, 0, -1, 1 user, comment = "", '' ans, specimen, recnum, start, end = 0, 0, 0, 0, 0 plots, pmag_out, samp_file, style = 0, "", "", "svg" fmt = '.' + style # # default acceptance criteria # accept_keys = [ 'specimen_int_ptrm_n', 'specimen_md', 'specimen_fvds', 'specimen_b_beta', 'specimen_dang', 'specimen_drats', 'specimen_Z' ] accept = {} accept['specimen_int_ptrm_n'] = 2 accept['specimen_md'] = 10 accept['specimen_fvds'] = 0.35 accept['specimen_b_beta'] = .1 accept['specimen_int_mad'] = 7 accept['specimen_dang'] = 10 accept['specimen_drats'] = 10 accept['specimen_Z'] = 10 # # parse command line options # spc, BEG, END = "", "", "" if '-h' in sys.argv: print main.__doc__ sys.exit() if '-f' in sys.argv: ind = sys.argv.index('-f') meas_file = sys.argv[ind + 1] if '-fsp' in sys.argv: ind = sys.argv.index('-fsp') inspec = sys.argv[ind + 1] if '-fcr' in sys.argv: ind = sys.argv.index('-fcr') critout = sys.argv[ind + 1] if '-fmt' in sys.argv: ind = sys.argv.index('-fmt') fmt = '.' + sys.argv[ind + 1] if '-spc' in sys.argv: ind = sys.argv.index('-spc') spc = sys.argv[ind + 1] if '-b' in sys.argv: ind = sys.argv.index('-b') BEG = int(sys.argv[ind + 1]) END = int(sys.argv[ind + 2]) if critout != "": crit_data, file_type = pmag.magic_read(critout) if pmagplotlib.verbose: print "Acceptance criteria read in from ", critout accept = {} accept['specimen_int_ptrm_n'] = 2.0 for critrec in crit_data: if critrec["pmag_criteria_code"] == "IE-SPEC": for key in accept_keys: if key not in critrec.keys(): accept[key] = -1 else: accept[key] = float(critrec[key]) try: open(inspec, 'rU') PriorRecs, file_type = pmag.magic_read(inspec) if file_type != 'pmag_specimens': print file_type print file_type, inspec, " is not a valid pmag_specimens file " sys.exit() for rec in PriorRecs: if 'magic_software_packages' not in rec.keys(): rec['magic_software_packages'] = "" except IOError: PriorRecs = [] if pmagplotlib.verbose: print "starting new specimen interpretation file: ", inspec meas_data, file_type = pmag.magic_read(meas_file) if file_type != 'magic_measurements': print file_type print file_type, "This is not a valid magic_measurements file " sys.exit() backup = 0 # define figure numbers for arai, zijderveld and # de-,re-magization diagrams AZD = {} AZD['deremag'], AZD['zijd'], AZD['arai'], AZD['eqarea'] = 1, 2, 3, 4 pmagplotlib.plot_init(AZD['arai'], 4, 4) pmagplotlib.plot_init(AZD['zijd'], 4, 4) pmagplotlib.plot_init(AZD['deremag'], 4, 4) pmagplotlib.plot_init(AZD['eqarea'], 4, 4) # # # # get list of unique specimen names # CurrRec = [] sids = pmag.get_specs(meas_data) # get plots for specimen s - default is just to step through arai diagrams # if spc != "": specimen = sids.index(spc) while specimen < len(sids): methcodes = [] if pmagplotlib.verbose and spc != "": print sids[specimen], specimen + 1, 'of ', len(sids) MeasRecs = [] s = sids[specimen] datablock, trmblock = [], [] PmagSpecRec = {} PmagSpecRec["er_analyst_mail_names"] = user PmagSpecRec["specimen_correction"] = 'u' # # find the data from the meas_data file for this specimen # for rec in meas_data: if rec["er_specimen_name"] == s: MeasRecs.append(rec) methods = rec["magic_method_codes"].split(":") meths = [] for meth in methods: meths.append(meth.strip()) # take off annoying spaces methods = "" for meth in meths: if meth.strip() not in methcodes and "LP-" in meth: methcodes.append(meth.strip()) methods = methods + meth + ":" methods = methods[:-1] rec["magic_method_codes"] = methods if "LP-PI-M" in meths: datablock.append(rec) if "LP-MRM" in meths: trmblock.append(rec) if len(trmblock) > 2 and inspec != "": if Tinit == 0: Tinit = 1 AZD['MRM'] = 4 pmagplotlib.plot_init(AZD['MRM'], 4, 4) elif Tinit == 1: pmagplotlib.clearFIG(AZD['MRM']) if len(datablock) < 4: if backup == 0: specimen += 1 if pmagplotlib.verbose: print 'skipping specimen - moving forward ', s else: specimen -= 1 if pmagplotlib.verbose: print 'skipping specimen - moving backward ', s # # collect info for the PmagSpecRec dictionary # else: rec = datablock[0] PmagSpecRec["er_citation_names"] = "This study" PmagSpecRec["er_specimen_name"] = s PmagSpecRec["er_sample_name"] = rec["er_sample_name"] PmagSpecRec["er_site_name"] = rec["er_site_name"] PmagSpecRec["er_location_name"] = rec["er_location_name"] if "magic_instrument_codes" not in rec.keys(): rec["magic_instrument_codes"] = "" PmagSpecRec["magic_instrument_codes"] = rec[ "magic_instrument_codes"] PmagSpecRec["measurement_step_unit"] = "J" if "magic_experiment_name" not in rec.keys(): rec["magic_experiment_name"] = "" else: PmagSpecRec["magic_experiment_names"] = rec[ "magic_experiment_name"] meths = rec["magic_method_codes"].split(':') # sort data into types if "LP-PI-M-D" in meths: # this is a double heating experiment exp_type = "LP-PI-M-D" elif "LP-PI-M-S" in meths: exp_type = "LP-PI-M-S" else: print "experiment type not supported yet " break araiblock, field = pmag.sortmwarai(datablock, exp_type) first_Z = araiblock[0] first_I = araiblock[1] GammaChecks = araiblock[-3] ThetaChecks = araiblock[-2] DeltaChecks = araiblock[-1] if len(first_Z) < 3: if backup == 0: specimen += 1 if pmagplotlib.verbose: print 'skipping specimen - moving forward ', s else: specimen -= 1 if pmagplotlib.verbose: print 'skipping specimen - moving backward ', s else: backup = 0 zijdblock, units = pmag.find_dmag_rec(s, meas_data) if exp_type == "LP-PI-M-D": recnum = 0 print "ZStep Watts Dec Inc Int" for plotrec in zijdblock: if pmagplotlib.verbose: print '%i %i %7.1f %7.1f %8.3e ' % ( recnum, plotrec[0], plotrec[1], plotrec[2], plotrec[3]) recnum += 1 recnum = 1 if GammaChecks != "": print "IStep Watts Gamma" for gamma in GammaChecks: if pmagplotlib.verbose: print '%i %i %7.1f ' % (recnum, gamma[0], gamma[1]) recnum += 1 if exp_type == "LP-PI-M-S": if pmagplotlib.verbose: print "IStep Watts Theta" kk = 0 for theta in ThetaChecks: kk += 1 print '%i %i %7.1f ' % (kk, theta[0], theta[1]) if pmagplotlib.verbose: print "Watts Delta" for delta in DeltaChecks: print '%i %7.1f ' % (delta[0], delta[1]) pmagplotlib.plotAZ(AZD, araiblock, zijdblock, s, units[0]) if inspec != "": if pmagplotlib.verbose: print 'Looking up saved interpretation....' found = 0 for k in range(len(PriorRecs)): try: if PriorRecs[k]["er_specimen_name"] == s: found = 1 CurrRec.append(PriorRecs[k]) for j in range(len(araiblock[0])): if float(araiblock[0][j][0]) == float( PriorRecs[k] ["measurement_step_min"]): start = j if float(araiblock[0][j][0]) == float( PriorRecs[k] ["measurement_step_max"]): end = j pars, errcode = pmag.PintPars( araiblock, zijdblock, start, end) pars['measurement_step_unit'] = "J" del PriorRecs[ k] # put in CurrRec, take out of PriorRecs if errcode != 1: pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * field * pars[ "specimen_b"] pars["er_specimen_name"] = s if pmagplotlib.verbose: print 'Saved interpretation: ' pars = pmag.scoreit( pars, PmagSpecRec, accept, '', 0) pmagplotlib.plotB(AZD, araiblock, zijdblock, pars) if len(trmblock) > 2: blab = field best = pars["specimen_int"] Bs, TRMs = [], [] for trec in trmblock: Bs.append( float( trec['treatment_dc_field']) ) TRMs.append( float(trec[ 'measurement_magn_moment']) ) NLpars = nlt.NLtrm( Bs, TRMs, best, blab, 0 ) # calculate best fit parameters through TRM acquisition data, and get new banc Mp, Bp = [], [] for k in range(int(max(Bs) * 1e6)): Bp.append(float(k) * 1e-6) npred = nlt.TRM( Bp[-1], NLpars['xopt'][0], NLpars['xopt'][1] ) # predicted NRM for this field Mp.append(npred) pmagplotlib.plotTRM( AZD['MRM'], Bs, TRMs, Bp, Mp, NLpars, trec['magic_experiment_name']) print npred print 'Banc= ', float( NLpars['banc']) * 1e6 if pmagplotlib.verbose: print 'Banc= ', float( NLpars['banc']) * 1e6 pmagplotlib.drawFIGS(AZD) else: print 'error on specimen ', s except: pass if pmagplotlib.verbose and found == 0: print ' None found :( ' if spc != "": if BEG != "": pars, errcode = pmag.PintPars(araiblock, zijdblock, BEG, END) pars['measurement_step_unit'] = "J" pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * field * pars["specimen_b"] pars["er_specimen_name"] = s pars['specimen_grade'] = '' # ungraded pmagplotlib.plotB(AZD, araiblock, zijdblock, pars) if len(trmblock) > 2: if inlt == 0: donlt() inlt = 1 blab = field best = pars["specimen_int"] Bs, TRMs = [], [] for trec in trmblock: Bs.append(float(trec['treatment_dc_field'])) TRMs.append( float(trec['measurement_magn_moment'])) NLpars = nlt.NLtrm( Bs, TRMs, best, blab, 0 ) # calculate best fit parameters through TRM acquisition data, and get new banc # Mp, Bp = [], [] for k in range(int(max(Bs) * 1e6)): Bp.append(float(k) * 1e-6) npred = nlt.TRM( Bp[-1], NLpars['xopt'][0], NLpars['xopt'] [1]) # predicted NRM for this field files = {} for key in AZD.keys(): files[key] = s + '_' + key + fmt pmagplotlib.saveP(AZD, files) sys.exit() if plots == 0: ans = 'b' while ans != "": print """ s[a]ve plot, set [b]ounds for calculation, [d]elete current interpretation, [p]revious, [s]ample, [q]uit: """ ans = raw_input('Return for next specimen \n') if ans == "": specimen += 1 if ans == "d": save_redo(PriorRecs, inspec) CurrRec = [] pmagplotlib.plotAZ(AZD, araiblock, zijdblock, s, units[0]) pmagplotlib.drawFIGS(AZD) if ans == 'a': files = {} for key in AZD.keys(): files[key] = s + '_' + key + fmt pmagplotlib.saveP(AZD, files) ans = "" if ans == 'q': print "Good bye" sys.exit() if ans == 'p': specimen = specimen - 1 backup = 1 ans = "" if ans == 's': keepon = 1 spec = raw_input( 'Enter desired specimen name (or first part there of): ' ) while keepon == 1: try: specimen = sids.index(spec) keepon = 0 except: tmplist = [] for qq in range(len(sids)): if spec in sids[qq]: tmplist.append(sids[qq]) print specimen, " not found, but this was: " print tmplist spec = raw_input( 'Select one or try again\n ') ans = "" if ans == 'b': if end == 0 or end >= len(araiblock[0]): end = len(araiblock[0]) - 1 GoOn = 0 while GoOn == 0: print 'Enter index of first point for calculation: ', '[', start, ']' answer = raw_input('return to keep default ') if answer != "": start = int(answer) print 'Enter index of last point for calculation: ', '[', end, ']' answer = raw_input('return to keep default ') if answer != "": end = int(answer) if start >= 0 and start < len(araiblock[ 0]) - 2 and end > 0 and end < len( araiblock[0]) and start < end: GoOn = 1 else: print "Bad endpoints - try again! " start, end = 0, len(araiblock) s = sids[specimen] pars, errcode = pmag.PintPars( araiblock, zijdblock, start, end) pars['measurement_step_unit'] = "J" pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * field * pars[ "specimen_b"] pars["er_specimen_name"] = s pars = pmag.scoreit(pars, PmagSpecRec, accept, '', 0) PmagSpecRec["measurement_step_min"] = '%8.3e' % ( pars["measurement_step_min"]) PmagSpecRec["measurement_step_max"] = '%8.3e' % ( pars["measurement_step_max"]) PmagSpecRec["measurement_step_unit"] = "J" PmagSpecRec["specimen_int_n"] = '%i' % ( pars["specimen_int_n"]) PmagSpecRec["specimen_lab_field_dc"] = '%8.3e' % ( pars["specimen_lab_field_dc"]) PmagSpecRec["specimen_int"] = '%8.3e ' % ( pars["specimen_int"]) PmagSpecRec["specimen_b"] = '%5.3f ' % ( pars["specimen_b"]) PmagSpecRec["specimen_q"] = '%5.1f ' % ( pars["specimen_q"]) PmagSpecRec["specimen_f"] = '%5.3f ' % ( pars["specimen_f"]) PmagSpecRec["specimen_fvds"] = '%5.3f' % ( pars["specimen_fvds"]) PmagSpecRec["specimen_b_beta"] = '%5.3f' % ( pars["specimen_b_beta"]) PmagSpecRec["specimen_int_mad"] = '%7.1f' % ( pars["specimen_int_mad"]) PmagSpecRec["specimen_Z"] = '%7.1f' % ( pars["specimen_Z"]) if pars["method_codes"] != "": tmpcodes = pars["method_codes"].split(":") for t in tmpcodes: if t.strip() not in methcodes: methcodes.append(t.strip()) PmagSpecRec["specimen_dec"] = '%7.1f' % ( pars["specimen_dec"]) PmagSpecRec["specimen_inc"] = '%7.1f' % ( pars["specimen_inc"]) PmagSpecRec["specimen_tilt_correction"] = '-1' PmagSpecRec["specimen_direction_type"] = 'l' PmagSpecRec[ "direction_type"] = 'l' # this is redudant, but helpful - won't be imported PmagSpecRec["specimen_dang"] = '%7.1f ' % ( pars["specimen_dang"]) PmagSpecRec["specimen_drats"] = '%7.1f ' % ( pars["specimen_drats"]) PmagSpecRec["specimen_int_ptrm_n"] = '%i ' % ( pars["specimen_int_ptrm_n"]) PmagSpecRec["specimen_rsc"] = '%6.4f ' % ( pars["specimen_rsc"]) PmagSpecRec["specimen_md"] = '%i ' % (int( pars["specimen_md"])) if PmagSpecRec["specimen_md"] == '-1': PmagSpecRec["specimen_md"] = "" PmagSpecRec["specimen_b_sigma"] = '%5.3f ' % ( pars["specimen_b_sigma"]) if "IE-TT" not in methcodes: methcodes.append("IE-TT") methods = "" for meth in methcodes: methods = methods + meth + ":" PmagSpecRec["magic_method_codes"] = methods[:-1] PmagSpecRec["specimen_description"] = comment PmagSpecRec[ "magic_software_packages"] = version_num pmagplotlib.plotAZ(AZD, araiblock, zijdblock, s, units[0]) pmagplotlib.plotB(AZD, araiblock, zijdblock, pars) if len(trmblock) > 2: blab = field best = pars["specimen_int"] Bs, TRMs = [], [] for trec in trmblock: Bs.append(float( trec['treatment_dc_field'])) TRMs.append( float(trec['measurement_magn_moment'])) NLpars = nlt.NLtrm( Bs, TRMs, best, blab, 0 ) # calculate best fit parameters through TRM acquisition data, and get new banc Mp, Bp = [], [] for k in range(int(max(Bs) * 1e6)): Bp.append(float(k) * 1e-6) npred = nlt.TRM( Bp[-1], NLpars['xopt'][0], NLpars['xopt'] [1]) # predicted NRM for this field Mp.append(npred) pmagplotlib.plotTRM( AZD['MRM'], Bs, TRMs, Bp, Mp, NLpars, trec['magic_experiment_name']) print 'Banc= ', float(NLpars['banc']) * 1e6 pmagplotlib.drawFIGS(AZD) pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * field * pars[ "specimen_b"] saveit = raw_input( "Save this interpretation? [y]/n \n") if saveit != 'n': specimen += 1 PriorRecs.append( PmagSpecRec) # put back an interpretation save_redo(PriorRecs, inspec) ans = "" else: specimen += 1 if fmt != ".pmag": basename = s + '_microwave' + fmt files = {} for key in AZD.keys(): files[key] = s + '_' + key + fmt if pmagplotlib.isServer: black = '#000000' purple = '#800080' titles = {} titles['deremag'] = 'DeReMag Plot' titles['zijd'] = 'Zijderveld Plot' titles['arai'] = 'Arai Plot' AZD = pmagplotlib.addBorders( AZD, titles, black, purple) pmagplotlib.saveP(AZD, files) # pmagplotlib.combineFigs(s,files,3) if len(CurrRec) > 0: for rec in CurrRec: PriorRecs.append(rec) CurrRec = [] if plots != 1: ans = raw_input(" Save last plot? 1/[0] ") if ans == "1": if fmt != ".pmag": files = {} for key in AZD.keys(): files[key] = s + '_' + key + fmt pmagplotlib.saveP(AZD, files) if len(CurrRec) > 0: PriorRecs.append(CurrRec) # put back an interpretation if len(PriorRecs) > 0: save_redo(PriorRecs, inspec) print 'Updated interpretations saved in ', inspec if pmagplotlib.verbose: print "Good bye"
def main(): """ NAME atrm_magic.py DESCRIPTION Converts ATRM data to best-fit tensor (6 elements plus sigma) Original program ARMcrunch written to accomodate ARM anisotropy data collected from 6 axial directions (+X,+Y,+Z,-X,-Y,-Z) using the off-axis remanence terms to construct the tensor. A better way to do the anisotropy of ARMs is to use 9,12 or 15 measurements in the Hext rotational scheme. SYNTAX atrm_magic.py [-h][command line options] OPTIONS -h prints help message and quits -usr USER: identify user, default is "" -f FILE: specify input file, default is atrm_measurements.txt -Fa FILE: specify anisotropy output file, default is trm_anisotropy.txt -Fr FILE: specify results output file, default is atrm_results.txt INPUT Input for the present program is a TRM acquisition data with an optional baseline. The order of the measurements is: Decs=[0,90,0,180,270,0,0,90,0] Incs=[0,0,90,0,0,-90,0,0,90] The last two measurements are optional """ # initialize some parameters args = sys.argv user = "" meas_file = "atrm_measurements.txt" rmag_anis = "trm_anisotropy.txt" rmag_res = "atrm_results.txt" dir_path = '.' # # get name of file from command line # if '-WD' in args: ind = args.index('-WD') dir_path = args[ind + 1] if "-h" in args: print(main.__doc__) sys.exit() if "-usr" in args: ind = args.index("-usr") user = sys.argv[ind + 1] if "-f" in args: ind = args.index("-f") meas_file = sys.argv[ind + 1] if "-Fa" in args: ind = args.index("-Fa") rmag_anis = args[ind + 1] if "-Fr" in args: ind = args.index("-Fr") rmag_res = args[ind + 1] meas_file = dir_path + '/' + meas_file rmag_anis = dir_path + '/' + rmag_anis rmag_res = dir_path + '/' + rmag_res # read in data meas_data, file_type = pmag.magic_read(meas_file) meas_data = pmag.get_dictitem(meas_data, 'magic_method_codes', 'LP-AN-TRM', 'has') if file_type != 'magic_measurements': print(file_type) print(file_type, "This is not a valid magic_measurements file ") sys.exit() # # # get sorted list of unique specimen names ssort = [] for rec in meas_data: spec = rec["er_specimen_name"] if spec not in ssort: ssort.append(spec) sids = sorted(ssort) # # # work on each specimen # specimen, npos = 0, 6 RmagSpecRecs, RmagResRecs = [], [] while specimen < len(sids): nmeas = 0 s = sids[specimen] RmagSpecRec = {} RmagResRec = {} BX, X = [], [] method_codes = [] Spec0 = "" # # find the data from the meas_data file for this sample # and get dec, inc, int and convert to x,y,z # data = pmag.get_dictitem(meas_data, 'er_specimen_name', s, 'T') # fish out data for this specimen name if len(data) > 5: RmagSpecRec["rmag_anisotropy_name"] = data[0]["er_specimen_name"] RmagSpecRec["er_location_name"] = data[0]["er_location_name"] RmagSpecRec["er_specimen_name"] = data[0]["er_specimen_name"] RmagSpecRec["er_sample_name"] = data[0]["er_sample_name"] RmagSpecRec["er_site_name"] = data[0]["er_site_name"] RmagSpecRec["magic_experiment_names"] = RmagSpecRec[ "rmag_anisotropy_name"] + ":ATRM" RmagSpecRec["er_citation_names"] = "This study" RmagResRec[ "rmag_result_name"] = data[0]["er_specimen_name"] + ":ATRM" RmagResRec["er_location_names"] = data[0]["er_location_name"] RmagResRec["er_specimen_names"] = data[0]["er_specimen_name"] RmagResRec["er_sample_names"] = data[0]["er_sample_name"] RmagResRec["er_site_names"] = data[0]["er_site_name"] RmagResRec["magic_experiment_names"] = RmagSpecRec[ "rmag_anisotropy_name"] + ":ATRM" RmagResRec["er_citation_names"] = "This study" RmagSpecRec["anisotropy_type"] = "ATRM" if "magic_instrument_codes" in list(data[0].keys()): RmagSpecRec["magic_instrument_codes"] = data[0][ "magic_instrument_codes"] else: RmagSpecRec["magic_instrument_codes"] = "" RmagSpecRec[ "anisotropy_description"] = "Hext statistics adapted to ATRM" for rec in data: meths = rec['magic_method_codes'].strip().split(':') Dir = [] Dir.append(float(rec["measurement_dec"])) Dir.append(float(rec["measurement_inc"])) Dir.append(float(rec["measurement_magn_moment"])) if "LT-T-Z" in meths: BX.append(pmag.dir2cart(Dir)) # append baseline steps elif "LT-T-I" in meths: X.append(pmag.dir2cart(Dir)) nmeas += 1 # if len(BX) == 1: for i in range(len(X) - 1): BX.append(BX[0]) # assume first 0 field step as baseline elif len(BX) == 0: # assume baseline is zero for i in range(len(X)): BX.append([0., 0., 0.]) # assume baseline of 0 elif len(BX) != len( X ): # if BX isn't just one measurement or one in between every infield step, just assume it is zero print('something odd about the baselines - just assuming zero') for i in range(len(X)): BX.append([0., 0., 0.]) # assume baseline of 0 if nmeas < 6: # must have at least 6 measurements right now - print('skipping specimen ', s, ' too few measurements') specimen += 1 else: B, H, tmpH = pmag.designATRM( npos) # B matrix made from design matrix for positions # # subtract optional baseline and put in a work array # work = numpy.zeros((nmeas, 3), 'f') for i in range(nmeas): for j in range(3): work[i][j] = X[i][j] - BX[i][ j] # subtract baseline, if available # # calculate tensor elements # first put ARM components in w vector # w = numpy.zeros((npos * 3), 'f') index = 0 for i in range(npos): for j in range(3): w[index] = work[i][j] index += 1 s = numpy.zeros((6), 'f') # initialize the s matrix for i in range(6): for j in range(len(w)): s[i] += B[i][j] * w[j] trace = s[0] + s[1] + s[2] # normalize by the trace for i in range(6): s[i] = old_div(s[i], trace) a = pmag.s2a(s) #------------------------------------------------------------ # Calculating dels is different than in the Kappabridge # routine. Use trace normalized tensor (a) and the applied # unit field directions (tmpH) to generate model X,Y,Z # components. Then compare these with the measured values. #------------------------------------------------------------ S = 0. comp = numpy.zeros((npos * 3), 'f') for i in range(npos): for j in range(3): index = i * 3 + j compare = a[j][0] * tmpH[i][0] + a[j][1] * tmpH[i][1] + a[ j][2] * tmpH[i][2] comp[index] = compare for i in range(npos * 3): d = old_div(w[i], trace) - comp[i] # del values S += d * d nf = float(npos * 3. - 6.) # number of degrees of freedom if S > 0: sigma = numpy.sqrt(old_div(S, nf)) else: sigma = 0 hpars = pmag.dohext(nf, sigma, s) # # prepare for output # RmagSpecRec["anisotropy_s1"] = '%8.6f' % (s[0]) RmagSpecRec["anisotropy_s2"] = '%8.6f' % (s[1]) RmagSpecRec["anisotropy_s3"] = '%8.6f' % (s[2]) RmagSpecRec["anisotropy_s4"] = '%8.6f' % (s[3]) RmagSpecRec["anisotropy_s5"] = '%8.6f' % (s[4]) RmagSpecRec["anisotropy_s6"] = '%8.6f' % (s[5]) RmagSpecRec["anisotropy_mean"] = '%8.3e' % (old_div(trace, 3)) RmagSpecRec["anisotropy_sigma"] = '%8.6f' % (sigma) RmagSpecRec["anisotropy_unit"] = "Am^2" RmagSpecRec["anisotropy_n"] = '%i' % (npos) RmagSpecRec["anisotropy_tilt_correction"] = '-1' RmagSpecRec["anisotropy_F"] = '%7.1f ' % ( hpars["F"] ) # used by thellier_gui - must be taken out for uploading RmagSpecRec["anisotropy_F_crit"] = hpars[ "F_crit"] # used by thellier_gui - must be taken out for uploading RmagResRec["anisotropy_t1"] = '%8.6f ' % (hpars["t1"]) RmagResRec["anisotropy_t2"] = '%8.6f ' % (hpars["t2"]) RmagResRec["anisotropy_t3"] = '%8.6f ' % (hpars["t3"]) RmagResRec["anisotropy_v1_dec"] = '%7.1f ' % (hpars["v1_dec"]) RmagResRec["anisotropy_v2_dec"] = '%7.1f ' % (hpars["v2_dec"]) RmagResRec["anisotropy_v3_dec"] = '%7.1f ' % (hpars["v3_dec"]) RmagResRec["anisotropy_v1_inc"] = '%7.1f ' % (hpars["v1_inc"]) RmagResRec["anisotropy_v2_inc"] = '%7.1f ' % (hpars["v2_inc"]) RmagResRec["anisotropy_v3_inc"] = '%7.1f ' % (hpars["v3_inc"]) RmagResRec["anisotropy_ftest"] = '%7.1f ' % (hpars["F"]) RmagResRec["anisotropy_ftest12"] = '%7.1f ' % (hpars["F12"]) RmagResRec["anisotropy_ftest23"] = '%7.1f ' % (hpars["F23"]) RmagResRec["result_description"] = 'Critical F: ' + hpars[ "F_crit"] + ';Critical F12/F13: ' + hpars["F12_crit"] if hpars["e12"] > hpars["e13"]: RmagResRec["anisotropy_v1_zeta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v1_zeta_dec"] = '%7.1f ' % ( hpars['v2_dec']) RmagResRec["anisotropy_v1_zeta_inc"] = '%7.1f ' % ( hpars['v2_inc']) RmagResRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v1_eta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v1_eta_dec"] = '%7.1f ' % ( hpars['v3_dec']) RmagResRec["anisotropy_v1_eta_inc"] = '%7.1f ' % ( hpars['v3_inc']) RmagResRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v3_eta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v3_eta_inc"] = '%7.1f ' % ( hpars['v1_inc']) else: RmagResRec["anisotropy_v1_zeta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v1_zeta_dec"] = '%7.1f ' % ( hpars['v3_dec']) RmagResRec["anisotropy_v1_zeta_inc"] = '%7.1f ' % ( hpars['v3_inc']) RmagResRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v1_eta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v1_eta_dec"] = '%7.1f ' % ( hpars['v2_dec']) RmagResRec["anisotropy_v1_eta_inc"] = '%7.1f ' % ( hpars['v2_inc']) RmagResRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v2_eta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v2_eta_inc"] = '%7.1f ' % ( hpars['v1_inc']) if hpars["e23"] > hpars['e12']: RmagResRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( hpars['e23']) RmagResRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( hpars['v3_dec']) RmagResRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( hpars['v3_inc']) RmagResRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( hpars['e23']) RmagResRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( hpars['v2_dec']) RmagResRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( hpars['v2_inc']) RmagResRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v3_eta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v3_eta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v2_eta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v2_eta_inc"] = '%7.1f ' % ( hpars['v1_inc']) else: RmagResRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( hpars['e23']) RmagResRec["anisotropy_v3_eta_dec"] = '%7.1f ' % ( hpars['v2_dec']) RmagResRec["anisotropy_v3_eta_inc"] = '%7.1f ' % ( hpars['v2_inc']) RmagResRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( hpars['e23']) RmagResRec["anisotropy_v2_eta_dec"] = '%7.1f ' % ( hpars['v3_dec']) RmagResRec["anisotropy_v2_eta_inc"] = '%7.1f ' % ( hpars['v3_inc']) RmagResRec["tilt_correction"] = '-1' RmagResRec["anisotropy_type"] = 'ATRM' RmagResRec["magic_method_codes"] = 'LP-AN-TRM:AE-H' RmagSpecRec["magic_method_codes"] = 'LP-AN-TRM:AE-H' RmagResRec["magic_software_packages"] = pmag.get_version() RmagSpecRec["magic_software_packages"] = pmag.get_version() RmagSpecRecs.append(RmagSpecRec) RmagResRecs.append(RmagResRec) specimen += 1 pmag.magic_write(rmag_anis, RmagSpecRecs, 'rmag_anisotropy') print("specimen tensor elements stored in ", rmag_anis) pmag.magic_write(rmag_res, RmagResRecs, 'rmag_results') print("specimen statistics and eigenparameters stored in ", rmag_res)
def main(): """ NAME thellier_magic_redo.py DESCRIPTION Calculates paleointensity parameters for thellier-thellier type data using bounds stored in the "redo" file SYNTAX thellier_magic_redo [command line options] OPTIONS -h prints help message -usr USER: identify user, default is "" -fcr CRIT, set criteria for grading -f IN: specify input file, default is magic_measurements.txt -fre REDO: specify redo file, default is "thellier_redo" -F OUT: specify output file, default is thellier_specimens.txt -leg: attaches "Recalculated from original measurements; supercedes published results. " to comment field -CR PERC TYPE: apply a blanket cooling rate correction if none supplied in the er_samples.txt file PERC should be a percentage of original (say reduce to 90%) TYPE should be one of the following: EG (for educated guess); PS (based on pilots); TRM (based on comparison of two TRMs) -ANI: perform anisotropy correction -fsa SAMPFILE: er_samples.txt file with cooling rate correction information, default is NO CORRECTION -Fcr CRout: specify pmag_specimen format file for cooling rate corrected data -fan ANIFILE: specify rmag_anisotropy format file, default is rmag_anisotropy.txt -Fac ACout: specify pmag_specimen format file for anisotropy corrected data default is AC_specimens.txt -fnl NLTFILE: specify magic_measurments format file, default is magic_measurements.txt -Fnl NLTout: specify pmag_specimen format file for non-linear trm corrected data default is NLT_specimens.txt -z use z component differenences for pTRM calculation INPUT a thellier_redo file is Specimen_name Tmin Tmax (where Tmin and Tmax are in Centigrade) """ dir_path = '.' critout = "" version_num = pmag.get_version() field, first_save = -1, 1 spec, recnum, start, end = 0, 0, 0, 0 crfrac = 0 NltRecs, PmagSpecs, AniSpecRecs, NltSpecRecs, CRSpecs = [], [], [], [], [] meas_file, pmag_file, mk_file = "magic_measurements.txt", "thellier_specimens.txt", "thellier_redo" anis_file = "rmag_anisotropy.txt" anisout, nltout = "AC_specimens.txt", "NLT_specimens.txt" crout = "CR_specimens.txt" nlt_file = "" samp_file = "" comment, user = "", "unknown" anis, nltrm = 0, 0 jackknife = 0 # maybe in future can do jackknife args = sys.argv Zdiff = 0 if '-WD' in args: ind = args.index('-WD') dir_path = args[ind + 1] if "-h" in args: print main.__doc__ sys.exit() if "-usr" in args: ind = args.index("-usr") user = sys.argv[ind + 1] if "-leg" in args: comment = "Recalculated from original measurements; supercedes published results. " cool = 0 if "-CR" in args: cool = 1 ind = args.index("-CR") crfrac = .01 * float(sys.argv[ind + 1]) crtype = 'DA-CR-' + sys.argv[ind + 2] if "-Fcr" in args: ind = args.index("-Fcr") crout = sys.argv[ind + 1] if "-f" in args: ind = args.index("-f") meas_file = sys.argv[ind + 1] if "-F" in args: ind = args.index("-F") pmag_file = sys.argv[ind + 1] if "-fre" in args: ind = args.index("-fre") mk_file = args[ind + 1] if "-fsa" in args: ind = args.index("-fsa") samp_file = dir_path + '/' + args[ind + 1] Samps, file_type = pmag.magic_read(samp_file) SampCRs = pmag.get_dictitem( Samps, 'cooling_rate_corr', '', 'F') # get samples cooling rate corrections cool = 1 if file_type != 'er_samples': print 'not a valid er_samples.txt file' sys.exit() # # if "-ANI" in args: anis = 1 ind = args.index("-ANI") if "-Fac" in args: ind = args.index("-Fac") anisout = args[ind + 1] if "-fan" in args: ind = args.index("-fan") anis_file = args[ind + 1] # if "-NLT" in args: if "-Fnl" in args: ind = args.index("-Fnl") nltout = args[ind + 1] if "-fnl" in args: ind = args.index("-fnl") nlt_file = args[ind + 1] if "-z" in args: Zdiff = 1 if '-fcr' in sys.argv: ind = args.index("-fcr") critout = sys.argv[ind + 1] # # start reading in data: # meas_file = dir_path + "/" + meas_file mk_file = dir_path + "/" + mk_file accept = pmag.default_criteria(1)[0] # set criteria to none if critout != "": critout = dir_path + "/" + critout crit_data, file_type = pmag.magic_read(critout) if file_type != 'pmag_criteria': print 'bad pmag_criteria file, using no acceptance criteria' print "Acceptance criteria read in from ", critout for critrec in crit_data: if 'sample_int_sigma_uT' in critrec.keys( ): # accommodate Shaar's new criterion critrec['sample_int_sigma'] = '%10.3e' % ( eval(critrec['sample_int_sigma_uT']) * 1e-6) for key in critrec.keys(): if key not in accept.keys() and critrec[key] != '': accept[key] = critrec[key] meas_data, file_type = pmag.magic_read(meas_file) if file_type != 'magic_measurements': print file_type print file_type, "This is not a valid magic_measurements file " sys.exit() try: mk_f = open(mk_file, 'rU') except: print "Bad redo file" sys.exit() mkspec = [] speclist = [] for line in mk_f.readlines(): tmp = line.split() mkspec.append(tmp) speclist.append(tmp[0]) if anis == 1: anis_file = dir_path + "/" + anis_file anis_data, file_type = pmag.magic_read(anis_file) if file_type != 'rmag_anisotropy': print file_type print file_type, "This is not a valid rmag_anisotropy file " sys.exit() if nlt_file == "": nlt_data = pmag.get_dictitem( meas_data, 'magic_method_codes', 'LP-TRM', 'has') # look for trm acquisition data in the meas_data file else: nlt_file = dir_path + "/" + nlt_file nlt_data, file_type = pmag.magic_read(nlt_file) if len(nlt_data) > 0: nltrm = 1 # # sort the specimen names and step through one by one # sids = pmag.get_specs(meas_data) # print 'Processing ', len(speclist), ' specimens - please wait ' while spec < len(speclist): s = speclist[spec] recnum = 0 datablock = [] PmagSpecRec = {} PmagSpecRec["er_analyst_mail_names"] = user PmagSpecRec["er_citation_names"] = "This study" PmagSpecRec["magic_software_packages"] = version_num methcodes, inst_code = [], "" # # find the data from the meas_data file for this specimen # datablock = pmag.get_dictitem(meas_data, 'er_specimen_name', s, 'T') datablock = pmag.get_dictitem( datablock, 'magic_method_codes', 'LP-PI-TRM', 'has') #pick out the thellier experiment data if len(datablock) > 0: for rec in datablock: if "magic_instrument_codes" not in rec.keys(): rec["magic_instrument_codes"] = "unknown" # # collect info for the PmagSpecRec dictionary # rec = datablock[0] PmagSpecRec["er_specimen_name"] = s PmagSpecRec["er_sample_name"] = rec["er_sample_name"] PmagSpecRec["er_site_name"] = rec["er_site_name"] PmagSpecRec["er_location_name"] = rec["er_location_name"] PmagSpecRec["measurement_step_unit"] = "K" PmagSpecRec["specimen_correction"] = 'u' if "er_expedition_name" in rec.keys(): PmagSpecRec["er_expedition_name"] = rec["er_expedition_name"] if "magic_instrument_codes" not in rec.keys(): PmagSpecRec["magic_instrument_codes"] = "unknown" else: PmagSpecRec["magic_instrument_codes"] = rec[ "magic_instrument_codes"] if "magic_experiment_name" not in rec.keys(): rec["magic_experiment_name"] = "" else: PmagSpecRec["magic_experiment_names"] = rec[ "magic_experiment_name"] meths = rec["magic_experiment_name"].split(":") for meth in meths: if meth.strip() not in methcodes and "LP-" in meth: methcodes.append(meth.strip()) # # sort out the data into first_Z, first_I, ptrm_check, ptrm_tail # araiblock, field = pmag.sortarai(datablock, s, Zdiff) first_Z = araiblock[0] first_I = araiblock[1] ptrm_check = araiblock[2] ptrm_tail = araiblock[3] if len(first_I) < 3 or len(first_Z) < 4: spec += 1 print 'skipping specimen ', s else: # # get start, end # for redospec in mkspec: if redospec[0] == s: b, e = float(redospec[1]), float(redospec[2]) break if e > float(first_Z[-1][0]): e = float(first_Z[-1][0]) for recnum in range(len(first_Z)): if first_Z[recnum][0] == b: start = recnum if first_Z[recnum][0] == e: end = recnum nsteps = end - start if nsteps > 2: zijdblock, units = pmag.find_dmag_rec(s, meas_data) pars, errcode = pmag.PintPars(datablock, araiblock, zijdblock, start, end, accept) if 'specimen_scat' in pars.keys(): PmagSpecRec['specimen_scat'] = pars['specimen_scat'] if 'specimen_frac' in pars.keys(): PmagSpecRec['specimen_frac'] = '%5.3f' % ( pars['specimen_frac']) if 'specimen_gmax' in pars.keys(): PmagSpecRec['specimen_gmax'] = '%5.3f' % ( pars['specimen_gmax']) pars['measurement_step_unit'] = units pars["specimen_lab_field_dc"] = field pars["specimen_int"] = -1 * field * pars["specimen_b"] PmagSpecRec["measurement_step_min"] = '%8.3e' % ( pars["measurement_step_min"]) PmagSpecRec["measurement_step_max"] = '%8.3e' % ( pars["measurement_step_max"]) PmagSpecRec["specimen_int_n"] = '%i' % ( pars["specimen_int_n"]) PmagSpecRec["specimen_lab_field_dc"] = '%8.3e' % ( pars["specimen_lab_field_dc"]) PmagSpecRec["specimen_int"] = '%9.4e ' % ( pars["specimen_int"]) PmagSpecRec["specimen_b"] = '%5.3f ' % (pars["specimen_b"]) PmagSpecRec["specimen_q"] = '%5.1f ' % (pars["specimen_q"]) PmagSpecRec["specimen_f"] = '%5.3f ' % (pars["specimen_f"]) PmagSpecRec["specimen_fvds"] = '%5.3f' % ( pars["specimen_fvds"]) PmagSpecRec["specimen_b_beta"] = '%5.3f' % ( pars["specimen_b_beta"]) PmagSpecRec["specimen_int_mad"] = '%7.1f' % ( pars["specimen_int_mad"]) PmagSpecRec["specimen_Z"] = '%7.1f' % (pars["specimen_Z"]) PmagSpecRec["specimen_gamma"] = '%7.1f' % ( pars["specimen_gamma"]) if pars["method_codes"] != "" and pars[ "method_codes"] not in methcodes: methcodes.append(pars["method_codes"]) PmagSpecRec["specimen_dec"] = '%7.1f' % ( pars["specimen_dec"]) PmagSpecRec["specimen_inc"] = '%7.1f' % ( pars["specimen_inc"]) PmagSpecRec["specimen_tilt_correction"] = '-1' PmagSpecRec["specimen_direction_type"] = 'l' PmagSpecRec[ "direction_type"] = 'l' # this is redudant, but helpful - won't be imported PmagSpecRec["specimen_dang"] = '%7.1f ' % ( pars["specimen_dang"]) PmagSpecRec["specimen_drats"] = '%7.1f ' % ( pars["specimen_drats"]) PmagSpecRec["specimen_drat"] = '%7.1f ' % ( pars["specimen_drat"]) PmagSpecRec["specimen_int_ptrm_n"] = '%i ' % ( pars["specimen_int_ptrm_n"]) PmagSpecRec["specimen_rsc"] = '%6.4f ' % ( pars["specimen_rsc"]) PmagSpecRec["specimen_md"] = '%i ' % (int( pars["specimen_md"])) if PmagSpecRec["specimen_md"] == '-1': PmagSpecRec["specimen_md"] = "" PmagSpecRec["specimen_b_sigma"] = '%5.3f ' % ( pars["specimen_b_sigma"]) if "IE-TT" not in methcodes: methcodes.append("IE-TT") methods = "" for meth in methcodes: methods = methods + meth + ":" PmagSpecRec["magic_method_codes"] = methods.strip(':') PmagSpecRec["magic_software_packages"] = version_num PmagSpecRec["specimen_description"] = comment if critout != "": kill = pmag.grade(PmagSpecRec, accept, 'specimen_int') if len(kill) > 0: Grade = 'F' # fails else: Grade = 'A' # passes PmagSpecRec["specimen_grade"] = Grade else: PmagSpecRec["specimen_grade"] = "" # not graded if nltrm == 0 and anis == 0 and cool != 0: # apply cooling rate correction SCR = pmag.get_dictitem( SampCRs, 'er_sample_name', PmagSpecRec['er_sample_name'], 'T') # get this samples, cooling rate correction CrSpecRec = pmag.cooling_rate(PmagSpecRec, SCR, crfrac, crtype) if CrSpecRec['er_specimen_name'] != 'none': CrSpecs.append(CrSpecRec) PmagSpecs.append(PmagSpecRec) NltSpecRec = "" # # check on non-linear TRM correction # if nltrm == 1: # # find the data from the nlt_data list for this specimen # TRMs, Bs = [], [] NltSpecRec = "" NltRecs = pmag.get_dictitem( nlt_data, 'er_specimen_name', PmagSpecRec['er_specimen_name'], 'has' ) # fish out all the NLT data for this specimen if len(NltRecs) > 2: for NltRec in NltRecs: Bs.append(float(NltRec['treatment_dc_field'])) TRMs.append( float(NltRec['measurement_magn_moment'])) NLTpars = nlt.NLtrm( Bs, TRMs, float(PmagSpecRec['specimen_int']), float(PmagSpecRec['specimen_lab_field_dc']), 0) if NLTpars['banc'] > 0: NltSpecRec = {} for key in PmagSpecRec.keys(): NltSpecRec[key] = PmagSpecRec[key] NltSpecRec['specimen_int'] = '%9.4e' % ( NLTpars['banc']) NltSpecRec['magic_method_codes'] = PmagSpecRec[ "magic_method_codes"] + ":DA-NL" NltSpecRec["specimen_correction"] = 'c' NltSpecRec['specimen_grade'] = PmagSpecRec[ 'specimen_grade'] NltSpecRec[ "magic_software_packages"] = version_num print NltSpecRec[ 'er_specimen_name'], ' Banc= ', float( NLTpars['banc']) * 1e6 if anis == 0 and cool != 0: SCR = pmag.get_dictitem( SampCRs, 'er_sample_name', NltSpecRec['er_sample_name'], 'T' ) # get this samples, cooling rate correction CrSpecRec = pmag.cooling_rate( NltSpecRec, SCR, crfrac, crtype) if CrSpecRec['er_specimen_name'] != 'none': CrSpecs.append(CrSpecRec) NltSpecRecs.append(NltSpecRec) # # check on anisotropy correction if anis == 1: if NltSpecRec != "": Spc = NltSpecRec else: # find uncorrected data Spc = PmagSpecRec AniSpecs = pmag.get_dictitem( anis_data, 'er_specimen_name', PmagSpecRec['er_specimen_name'], 'T') if len(AniSpecs) > 0: AniSpec = AniSpecs[0] AniSpecRec = pmag.doaniscorr(Spc, AniSpec) AniSpecRec['specimen_grade'] = PmagSpecRec[ 'specimen_grade'] AniSpecRec[ "magic_instrument_codes"] = PmagSpecRec[ 'magic_instrument_codes'] AniSpecRec["specimen_correction"] = 'c' AniSpecRec[ "magic_software_packages"] = version_num if cool != 0: SCR = pmag.get_dictitem( SampCRs, 'er_sample_name', AniSpecRec['er_sample_name'], 'T' ) # get this samples, cooling rate correction CrSpecRec = pmag.cooling_rate( AniSpecRec, SCR, crfrac, crtype) if CrSpecRec['er_specimen_name'] != 'none': CrSpecs.append(CrSpecRec) AniSpecRecs.append(AniSpecRec) elif anis == 1: AniSpecs = pmag.get_dictitem( anis_data, 'er_specimen_name', PmagSpecRec['er_specimen_name'], 'T') if len(AniSpecs) > 0: AniSpec = AniSpecs[0] AniSpecRec = pmag.doaniscorr(PmagSpecRec, AniSpec) AniSpecRec['specimen_grade'] = PmagSpecRec[ 'specimen_grade'] AniSpecRec["magic_instrument_codes"] = PmagSpecRec[ "magic_instrument_codes"] AniSpecRec["specimen_correction"] = 'c' AniSpecRec["magic_software_packages"] = version_num if crfrac != 0: CrSpecRec = {} for key in AniSpecRec.keys(): CrSpecRec[key] = AniSpecRec[key] inten = frac * float(CrSpecRec['specimen_int']) CrSpecRec["specimen_int"] = '%9.4e ' % ( inten ) # adjust specimen intensity by cooling rate correction CrSpecRec['magic_method_codes'] = CrSpecRec[ 'magic_method_codes'] + ':DA-CR-' + crtype CRSpecs.append(CrSpecRec) AniSpecRecs.append(AniSpecRec) spec += 1 else: print "skipping ", s spec += 1 pmag_file = dir_path + '/' + pmag_file pmag.magic_write(pmag_file, PmagSpecs, 'pmag_specimens') print 'uncorrected thellier data saved in: ', pmag_file if anis == 1 and len(AniSpecRecs) > 0: anisout = dir_path + '/' + anisout pmag.magic_write(anisout, AniSpecRecs, 'pmag_specimens') print 'anisotropy corrected data saved in: ', anisout if nltrm == 1 and len(NltSpecRecs) > 0: nltout = dir_path + '/' + nltout pmag.magic_write(nltout, NltSpecRecs, 'pmag_specimens') print 'non-linear TRM corrected data saved in: ', nltout if crfrac != 0: crout = dir_path + '/' + crout pmag.magic_write(crout, CRSpecs, 'pmag_specimens') print 'cooling rate corrected data saved in: ', crout
def main(): """ NAME hysteresis_magic.py DESCRIPTION calculates hystereis parameters and saves them in rmag_hystereis format file makes plots if option selected SYNTAX hysteresis_magic.py [command line options] OPTIONS -h prints help message and quits -usr USER: identify user, default is "" -f: specify input file, default is agm_measurements.txt -fh: specify rmag_hysteresis.txt input file -F: specify output file, default is rmag_hysteresis.txt -P: do not make the plots -spc SPEC: specify specimen name to plot and quit -sav save all plots and quit -fmt [png,svg,eps,jpg] """ args=sys.argv PLT=1 plots=0 user,meas_file,rmag_out,rmag_file="","agm_measurements.txt","rmag_hysteresis.txt","" pltspec="" dir_path='.' fmt='svg' verbose=pmagplotlib.verbose version_num=pmag.get_version() if '-WD' in args: ind=args.index('-WD') dir_path=args[ind+1] if "-h" in args: print(main.__doc__) sys.exit() if "-usr" in args: ind=args.index("-usr") user=args[ind+1] if '-f' in args: ind=args.index("-f") meas_file=args[ind+1] if '-F' in args: ind=args.index("-F") rmag_out=args[ind+1] if '-fh' in args: ind=args.index("-fh") rmag_file=args[ind+1] rmag_file=dir_path+'/'+rmag_file if '-P' in args: PLT=0 irm_init,imag_init=-1,-1 if '-sav' in args: verbose=0 plots=1 if '-spc' in args: ind=args.index("-spc") pltspec= args[ind+1] verbose=0 plots=1 if '-fmt' in args: ind=args.index("-fmt") fmt=args[ind+1] rmag_out=dir_path+'/'+rmag_out meas_file=dir_path+'/'+meas_file rmag_rem=dir_path+"/rmag_remanence.txt" # # meas_data,file_type=pmag.magic_read(meas_file) if file_type!='magic_measurements': print(main.__doc__) print('bad file') sys.exit() # # initialize some variables # define figure numbers for hyst,deltaM,DdeltaM curves HystRecs,RemRecs=[],[] HDD={} if verbose: if verbose and PLT:print("Plots may be on top of each other - use mouse to place ") if PLT: HDD['hyst'],HDD['deltaM'],HDD['DdeltaM']=1,2,3 pmagplotlib.plot_init(HDD['DdeltaM'],5,5) pmagplotlib.plot_init(HDD['deltaM'],5,5) pmagplotlib.plot_init(HDD['hyst'],5,5) imag_init=0 irm_init=0 else: HDD['hyst'],HDD['deltaM'],HDD['DdeltaM'],HDD['irm'],HDD['imag']=0,0,0,0,0 # if rmag_file!="":hyst_data,file_type=pmag.magic_read(rmag_file) # # get list of unique experiment names and specimen names # experiment_names,sids=[],[] for rec in meas_data: meths=rec['magic_method_codes'].split(':') methods=[] for meth in meths: methods.append(meth.strip()) if 'LP-HYS' in methods: if 'er_synthetic_name' in list(rec.keys()) and rec['er_synthetic_name']!="": rec['er_specimen_name']=rec['er_synthetic_name'] if rec['magic_experiment_name'] not in experiment_names:experiment_names.append(rec['magic_experiment_name']) if rec['er_specimen_name'] not in sids:sids.append(rec['er_specimen_name']) # k=0 locname='' if pltspec!="": k=sids.index(pltspec) print(sids[k]) while k < len(sids): s=sids[k] if verbose and PLT:print(s, k+1 , 'out of ',len(sids)) # # B,M,Bdcd,Mdcd=[],[],[],[] #B,M for hysteresis, Bdcd,Mdcd for irm-dcd data Bimag,Mimag=[],[] #Bimag,Mimag for initial magnetization curves first_dcd_rec,first_rec,first_imag_rec=1,1,1 for rec in meas_data: methcodes=rec['magic_method_codes'].split(':') meths=[] for meth in methcodes: meths.append(meth.strip()) if rec['er_specimen_name']==s and "LP-HYS" in meths: B.append(float(rec['measurement_lab_field_dc'])) M.append(float(rec['measurement_magn_moment'])) if first_rec==1: e=rec['magic_experiment_name'] HystRec={} first_rec=0 if "er_location_name" in list(rec.keys()): HystRec["er_location_name"]=rec["er_location_name"] locname=rec['er_location_name'].replace('/','-') if "er_sample_name" in list(rec.keys()):HystRec["er_sample_name"]=rec["er_sample_name"] if "er_site_name" in list(rec.keys()):HystRec["er_site_name"]=rec["er_site_name"] if "er_synthetic_name" in list(rec.keys()) and rec['er_synthetic_name']!="": HystRec["er_synthetic_name"]=rec["er_synthetic_name"] else: HystRec["er_specimen_name"]=rec["er_specimen_name"] if rec['er_specimen_name']==s and "LP-IRM-DCD" in meths: Bdcd.append(float(rec['treatment_dc_field'])) Mdcd.append(float(rec['measurement_magn_moment'])) if first_dcd_rec==1: RemRec={} irm_exp=rec['magic_experiment_name'] first_dcd_rec=0 if "er_location_name" in list(rec.keys()):RemRec["er_location_name"]=rec["er_location_name"] if "er_sample_name" in list(rec.keys()):RemRec["er_sample_name"]=rec["er_sample_name"] if "er_site_name" in list(rec.keys()):RemRec["er_site_name"]=rec["er_site_name"] if "er_synthetic_name" in list(rec.keys()) and rec['er_synthetic_name']!="": RemRec["er_synthetic_name"]=rec["er_synthetic_name"] else: RemRec["er_specimen_name"]=rec["er_specimen_name"] if rec['er_specimen_name']==s and "LP-IMAG" in meths: if first_imag_rec==1: imag_exp=rec['magic_experiment_name'] first_imag_rec=0 Bimag.append(float(rec['measurement_lab_field_dc'])) Mimag.append(float(rec['measurement_magn_moment'])) # # now plot the hysteresis curve # if len(B)>0: hmeths=[] for meth in meths: hmeths.append(meth) hpars=pmagplotlib.plotHDD(HDD,B,M,e) if verbose and PLT:pmagplotlib.drawFIGS(HDD) # # get prior interpretations from hyst_data if rmag_file!="": hpars_prior={} for rec in hyst_data: if rec['magic_experiment_names']==e: if rec['hysteresis_bcr'] !="" and rec['hysteresis_mr_moment']!="": hpars_prior['hysteresis_mr_moment']=rec['hysteresis_mr_moment'] hpars_prior['hysteresis_ms_moment']=rec['hysteresis_ms_moment'] hpars_prior['hysteresis_bc']=rec['hysteresis_bc'] hpars_prior['hysteresis_bcr']=rec['hysteresis_bcr'] break if verbose:pmagplotlib.plotHPARS(HDD,hpars_prior,'ro') else: if verbose:pmagplotlib.plotHPARS(HDD,hpars,'bs') HystRec['hysteresis_mr_moment']=hpars['hysteresis_mr_moment'] HystRec['hysteresis_ms_moment']=hpars['hysteresis_ms_moment'] HystRec['hysteresis_bc']=hpars['hysteresis_bc'] HystRec['hysteresis_bcr']=hpars['hysteresis_bcr'] HystRec['hysteresis_xhf']=hpars['hysteresis_xhf'] HystRec['magic_experiment_names']=e HystRec['magic_software_packages']=version_num if hpars["magic_method_codes"] not in hmeths:hmeths.append(hpars["magic_method_codes"]) methods="" for meth in hmeths: methods=methods+meth.strip()+":" HystRec["magic_method_codes"]=methods[:-1] HystRec["er_citation_names"]="This study" HystRecs.append(HystRec) # if len(Bdcd)>0: rmeths=[] for meth in meths: rmeths.append(meth) if verbose and PLT:print('plotting IRM') if irm_init==0: HDD['irm']=5 pmagplotlib.plot_init(HDD['irm'],5,5) irm_init=1 rpars=pmagplotlib.plotIRM(HDD['irm'],Bdcd,Mdcd,irm_exp) RemRec['remanence_mr_moment']=rpars['remanence_mr_moment'] RemRec['remanence_bcr']=rpars['remanence_bcr'] RemRec['magic_experiment_names']=irm_exp if rpars["magic_method_codes"] not in meths:meths.append(rpars["magic_method_codes"]) methods="" for meth in rmeths: methods=methods+meth.strip()+":" RemRec["magic_method_codes"]=methods[:-1] RemRec["er_citation_names"]="This study" RemRecs.append(RemRec) else: if irm_init:pmagplotlib.clearFIG(HDD['irm']) if len(Bimag)>0: if verbose:print('plotting initial magnetization curve') # first normalize by Ms Mnorm=[] for m in Mimag: Mnorm.append(old_div(m,float(hpars['hysteresis_ms_moment']))) if imag_init==0: HDD['imag']=4 pmagplotlib.plot_init(HDD['imag'],5,5) imag_init=1 pmagplotlib.plotIMAG(HDD['imag'],Bimag,Mnorm,imag_exp) else: if imag_init:pmagplotlib.clearFIG(HDD['imag']) # files={} if plots: if pltspec!="":s=pltspec files={} for key in list(HDD.keys()): files[key]=locname+'_'+s+'_'+key+'.'+fmt pmagplotlib.saveP(HDD,files) if pltspec!="":sys.exit() if verbose and PLT: pmagplotlib.drawFIGS(HDD) ans=input("S[a]ve plots, [s]pecimen name, [q]uit, <return> to continue\n ") if ans=="a": files={} for key in list(HDD.keys()): files[key]=locname+'_'+s+'_'+key+'.'+fmt pmagplotlib.saveP(HDD,files) if ans=='':k+=1 if ans=="p": del HystRecs[-1] k-=1 if ans=='q': print("Good bye") sys.exit() if ans=='s': keepon=1 specimen=input('Enter desired specimen name (or first part there of): ') while keepon==1: try: k =sids.index(specimen) keepon=0 except: tmplist=[] for qq in range(len(sids)): if specimen in sids[qq]:tmplist.append(sids[qq]) print(specimen," not found, but this was: ") print(tmplist) specimen=input('Select one or try again\n ') k =sids.index(specimen) else: k+=1 if len(B)==0 and len(Bdcd)==0: if verbose:print('skipping this one - no hysteresis data') k+=1 if rmag_out=="" and ans=='s' and verbose: really=input(" Do you want to overwrite the existing rmag_hystersis.txt file? 1/[0] ") if really=="": print('i thought not - goodbye') sys.exit() rmag_out="rmag_hysteresis.txt" if len(HystRecs)>0: pmag.magic_write(rmag_out,HystRecs,"rmag_hysteresis") if verbose:print("hysteresis parameters saved in ",rmag_out) if len(RemRecs)>0: pmag.magic_write(rmag_rem,RemRecs,"rmag_remanence") if verbose:print("remanence parameters saved in ",rmag_rem)
def main(command_line=True, **kwargs): """ NAME pmd_magic.py DESCRIPTION converts PMD (Enkin) format files to magic_measurements format files SYNTAX pmd_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -Fsa: specify er_samples format file for appending, default is new er_samples.txt -spc NUM : specify number of characters to designate a specimen, default = 1 -loc LOCNAME : specify location/study name -A: don't average replicate measurements -ncn NCON: specify naming convention -mcd [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. INPUT PMD format files """ # initialize some stuff noave = 0 inst = "" samp_con, Z = '1', "" missing = 1 demag = "N" er_location_name = "unknown" citation = 'This study' args = sys.argv meth_code = "LP-NO" specnum = -1 MagRecs = [] version_num = pmag.get_version() Samps = [] # keeps track of sample orientations DIspec = [] MagFiles = [] user = "" mag_file = "" dir_path = '.' ErSamps = [] SampOuts = [] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path = sys.argv[ind + 1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind + 1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print main.__doc__ return False if '-F' in args: ind = args.index("-F") meas_file = args[ind + 1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind + 1] #try: # open(samp_file,'rU') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file = args[ind + 1] if "-spc" in args: ind = args.index("-spc") specnum = int(args[ind + 1]) if "-ncn" in args: ind = args.index("-ncn") samp_con = sys.argv[ind + 1] if "-loc" in args: ind = args.index("-loc") er_location_name = args[ind + 1] if "-A" in args: noave = 1 if "-mcd" in args: ind = args.index("-mcd") meth_code = args[ind + 1] if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') samp_file = kwargs.get('samp_file', 'er_samples.txt') specnum = kwargs.get('specnum', 0) samp_con = kwargs.get('samp_con', '1') er_location_name = kwargs.get('er_location_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") print samp_con # format variables mag_file = input_dir_path + "/" + mag_file meas_file = output_dir_path + "/" + meas_file samp_file = output_dir_path + "/" + samp_file if specnum != 0: specnum = -specnum if "4" in samp_con: if "-" not in samp_con: print "naming convention option [4] must be in form 4-Z where Z is an integer" return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: Z = samp_con.split("-")[1] samp_con = "4" if "7" in samp_con: if "-" not in samp_con: print "option [7] must be in form 7-Z where Z is an integer" return False, "naming convention option [7] must be in form 7-Z where Z is an integer" else: Z = samp_con.split("-")[1] samp_con = "7" # parse data data = open(mag_file, 'rU').readlines() # read in data from file comment = data[0] line = data[1].strip() line = line.replace("=", "= ") # make finding orientations easier rec = line.split() # read in sample orientation, etc. er_specimen_name = rec[0] ErSampRec, ErSiteRec = {}, {} # make a sample record if specnum != 0: er_sample_name = rec[0][:specnum] else: er_sample_name = rec[0] if len(ErSamps) > 0: # need to copy existing for samp in ErSamps: if samp['er_sample_name'] == er_sample_name: ErSampRec = samp # we'll ammend this one else: SampOuts.append(samp) # keep all the others if int(samp_con) < 6: er_site_name = pmag.parse_site(er_sample_name, samp_con, Z) else: if 'er_site_name' in ErSampRec.keys(): er_site_name = ErSampREc['er_site_name'] if 'er_location_name' in ErSampRec.keys(): er_location_name = ErSampREc['er_location_name'] az_ind = rec.index('a=') + 1 ErSampRec['er_sample_name'] = er_sample_name ErSampRec['er_sample_description'] = comment ErSampRec['sample_azimuth'] = rec[az_ind] dip_ind = rec.index('b=') + 1 dip = -float(rec[dip_ind]) ErSampRec['sample_dip'] = '%7.1f' % (dip) strike_ind = rec.index('s=') + 1 ErSampRec['sample_bed_dip_direction'] = '%7.1f' % (float(rec[strike_ind]) + 90.) bd_ind = rec.index('d=') + 1 ErSampRec['sample_bed_dip'] = rec[bd_ind] v_ind = rec.index('v=') + 1 vol = rec[v_ind][:-3] date = rec[-2] time = rec[-1] ErSampRec['magic_method_codes'] = meth_code if 'er_location_name' not in ErSampRec.keys(): ErSampRec['er_location_name'] = er_location_name if 'er_site_name' not in ErSampRec.keys(): ErSampRec['er_site_name'] = er_site_name if 'er_citation_names' not in ErSampRec.keys(): ErSampRec['er_citation_names'] = 'This study' if 'magic_method_codes' not in ErSampRec.keys(): ErSampRec['magic_method_codes'] = 'SO-NO' SampOuts.append(ErSampRec) for k in range(3, len(data)): # read in data line = data[k] rec = line.split() if len(rec) > 1: # skip blank lines at bottom MagRec = {} MagRec['measurement_description'] = 'Date: ' + date + ' ' + time MagRec["er_citation_names"] = "This study" MagRec['er_location_name'] = er_location_name MagRec['er_site_name'] = er_site_name MagRec['er_sample_name'] = er_sample_name MagRec['magic_software_packages'] = version_num MagRec["treatment_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"] = 'g' MagRec["measurement_standard"] = 'u' MagRec["measurement_number"] = '1' MagRec["er_specimen_name"] = er_specimen_name if rec[0] == 'NRM': meas_type = "LT-NO" elif rec[0][0] == 'M' or rec[0][0] == 'H': meas_type = "LT-AF-Z" elif rec[0][0] == 'T': meas_type = "LT-T-Z" else: print "measurement type unknown" return False, "measurement type unknown" X = [float(rec[1]), float(rec[2]), float(rec[3])] Vec = pmag.cart2dir(X) MagRec["measurement_magn_moment"] = '%10.3e' % (Vec[2]) # Am^2 MagRec["measurement_magn_volume"] = rec[4] # A/m MagRec["measurement_dec"] = '%7.1f' % (Vec[0]) MagRec["measurement_inc"] = '%7.1f' % (Vec[1]) MagRec["treatment_ac_field"] = '0' if meas_type != 'LT-NO': treat = float(rec[0][1:]) else: treat = 0 if meas_type == "LT-AF-Z": MagRec["treatment_ac_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla elif meas_type == "LT-T-Z": MagRec["treatment_temp"] = '%8.3e' % (treat + 273. ) # temp in kelvin MagRec['magic_method_codes'] = meas_type MagRecs.append(MagRec) MagOuts = pmag.measurements_methods(MagRecs, noave) pmag.magic_write(meas_file, MagOuts, 'magic_measurements') print "results put in ", meas_file pmag.magic_write(samp_file, SampOuts, 'er_samples') print "sample orientations put in ", samp_file return True, meas_file
def main(): """ NAME aniso_magic.py DESCRIPTION plots anisotropy data with either bootstrap or hext ellipses SYNTAX aniso_magic.py [-h] [command line options] OPTIONS -h plots help message and quits -usr USER: set the user name -f AFILE, specify rmag_anisotropy formatted file for input -F RFILE, specify rmag_results formatted file for output -x Hext [1963] and bootstrap -B DON'T do bootstrap, do Hext -par Tauxe [1998] parametric bootstrap -v plot bootstrap eigenvectors instead of ellipses -sit plot by site instead of entire file -crd [s,g,t] coordinate system, default is specimen (g=geographic, t=tilt corrected) -P don't make any plots - just make rmag_results table -sav don't make the rmag_results table - just save all the plots -fmt [svg, jpg, eps] format for output images, pdf default -gtc DEC INC dec,inc of pole to great circle [down(up) in green (cyan) -d Vi DEC INC; Vi (1,2,3) to compare to direction DEC INC -n N; specifies the number of bootstraps - default is 1000 DEFAULTS AFILE: rmag_anisotropy.txt RFILE: rmag_results.txt plot bootstrap ellipses of Constable & Tauxe [1987] NOTES minor axis: circles major axis: triangles principal axis: squares directions are plotted on the lower hemisphere for bootstrapped eigenvector components: Xs: blue, Ys: red, Zs: black """ # dir_path = "." version_num = pmag.get_version() verbose = pmagplotlib.verbose args = sys.argv ipar, ihext, ivec, iboot, imeas, isite, iplot, vec = 0, 0, 0, 1, 1, 0, 1, 0 hpars, bpars, PDir = [], [], [] CS, crd = '-1', 's' nb = 1000 fmt = 'pdf' ResRecs = [] orlist = [] outfile, comp, Dir, gtcirc, PDir = 'rmag_results.txt', 0, [], 0, [] infile = 'rmag_anisotropy.txt' if "-h" in args: print(main.__doc__) sys.exit() if '-WD' in args: ind = args.index('-WD') dir_path = args[ind+1] if '-n' in args: ind = args.index('-n') nb = int(args[ind+1]) if '-usr' in args: ind = args.index('-usr') user = args[ind+1] else: user = "" if '-B' in args: iboot, ihext = 0, 1 if '-par' in args: ipar = 1 if '-x' in args: ihext = 1 if '-v' in args: ivec = 1 if '-sit' in args: isite = 1 if '-P' in args: iplot = 0 if '-f' in args: ind = args.index('-f') infile = args[ind+1] if '-F' in args: ind = args.index('-F') outfile = args[ind+1] if '-crd' in sys.argv: ind = sys.argv.index('-crd') crd = sys.argv[ind+1] if crd == 'g': CS = '0' if crd == 't': CS = '100' if '-fmt' in args: ind = args.index('-fmt') fmt = args[ind+1] if '-sav' in args: plots = 1 verbose = 0 else: plots = 0 if '-gtc' in args: ind = args.index('-gtc') d, i = float(args[ind+1]), float(args[ind+2]) PDir.append(d) PDir.append(i) if '-d' in args: comp = 1 ind = args.index('-d') vec = int(args[ind+1])-1 Dir = [float(args[ind+2]), float(args[ind+3])] # # set up plots # if infile[0] != '/': infile = dir_path+'/'+infile if outfile[0] != '/': outfile = dir_path+'/'+outfile ANIS = {} initcdf, inittcdf = 0, 0 ANIS['data'], ANIS['conf'] = 1, 2 if iboot == 1: ANIS['tcdf'] = 3 if iplot == 1: inittcdf = 1 pmagplotlib.plot_init(ANIS['tcdf'], 5, 5) if comp == 1 and iplot == 1: initcdf = 1 ANIS['vxcdf'], ANIS['vycdf'], ANIS['vzcdf'] = 4, 5, 6 pmagplotlib.plot_init(ANIS['vxcdf'], 5, 5) pmagplotlib.plot_init(ANIS['vycdf'], 5, 5) pmagplotlib.plot_init(ANIS['vzcdf'], 5, 5) if iplot == 1: pmagplotlib.plot_init(ANIS['conf'], 5, 5) pmagplotlib.plot_init(ANIS['data'], 5, 5) # read in the data data, ifiletype = pmag.magic_read(infile) for rec in data: # find all the orientation systems if 'anisotropy_tilt_correction' not in rec.keys(): rec['anisotropy_tilt_correction'] = '-1' if rec['anisotropy_tilt_correction'] not in orlist: orlist.append(rec['anisotropy_tilt_correction']) if CS not in orlist: if len(orlist) > 0: CS = orlist[0] else: CS = '-1' if CS == '-1': crd = 's' if CS == '0': crd = 'g' if CS == '100': crd = 't' if verbose: print("desired coordinate system not available, using available: ", crd) if isite == 1: sitelist = [] for rec in data: if rec['er_site_name'] not in sitelist: sitelist.append(rec['er_site_name']) sitelist.sort() plt = len(sitelist) else: plt = 1 k = 0 while k < plt: site = "" sdata, Ss = [], [] # list of S format data Locs, Sites, Samples, Specimens, Cits = [], [], [], [], [] if isite == 0: sdata = data else: site = sitelist[k] for rec in data: if rec['er_site_name'] == site: sdata.append(rec) anitypes = [] csrecs = pmag.get_dictitem( sdata, 'anisotropy_tilt_correction', CS, 'T') for rec in csrecs: if rec['anisotropy_type'] not in anitypes: anitypes.append(rec['anisotropy_type']) if rec['er_location_name'] not in Locs: Locs.append(rec['er_location_name']) if rec['er_site_name'] not in Sites: Sites.append(rec['er_site_name']) if rec['er_sample_name'] not in Samples: Samples.append(rec['er_sample_name']) if rec['er_specimen_name'] not in Specimens: Specimens.append(rec['er_specimen_name']) if rec['er_citation_names'] not in Cits: Cits.append(rec['er_citation_names']) s = [] s.append(float(rec["anisotropy_s1"])) s.append(float(rec["anisotropy_s2"])) s.append(float(rec["anisotropy_s3"])) s.append(float(rec["anisotropy_s4"])) s.append(float(rec["anisotropy_s5"])) s.append(float(rec["anisotropy_s6"])) if s[0] <= 1.0: Ss.append(s) # protect against crap # tau,Vdirs=pmag.doseigs(s) ResRec = {} ResRec['er_location_names'] = rec['er_location_name'] ResRec['er_citation_names'] = rec['er_citation_names'] ResRec['er_site_names'] = rec['er_site_name'] ResRec['er_sample_names'] = rec['er_sample_name'] ResRec['er_specimen_names'] = rec['er_specimen_name'] ResRec['rmag_result_name'] = rec['er_specimen_name'] + \ ":"+rec['anisotropy_type'] ResRec["er_analyst_mail_names"] = user ResRec["tilt_correction"] = CS ResRec["anisotropy_type"] = rec['anisotropy_type'] if "anisotropy_n" not in rec.keys(): rec["anisotropy_n"] = "6" if "anisotropy_sigma" not in rec.keys(): rec["anisotropy_sigma"] = "0" fpars = pmag.dohext( int(rec["anisotropy_n"])-6, float(rec["anisotropy_sigma"]), s) ResRec["anisotropy_v1_dec"] = '%7.1f' % (fpars['v1_dec']) ResRec["anisotropy_v2_dec"] = '%7.1f' % (fpars['v2_dec']) ResRec["anisotropy_v3_dec"] = '%7.1f' % (fpars['v3_dec']) ResRec["anisotropy_v1_inc"] = '%7.1f' % (fpars['v1_inc']) ResRec["anisotropy_v2_inc"] = '%7.1f' % (fpars['v2_inc']) ResRec["anisotropy_v3_inc"] = '%7.1f' % (fpars['v3_inc']) ResRec["anisotropy_t1"] = '%10.8f' % (fpars['t1']) ResRec["anisotropy_t2"] = '%10.8f' % (fpars['t2']) ResRec["anisotropy_t3"] = '%10.8f' % (fpars['t3']) ResRec["anisotropy_ftest"] = '%10.3f' % (fpars['F']) ResRec["anisotropy_ftest12"] = '%10.3f' % (fpars['F12']) ResRec["anisotropy_ftest23"] = '%10.3f' % (fpars['F23']) ResRec["result_description"] = 'F_crit: ' + \ fpars['F_crit']+'; F12,F23_crit: '+fpars['F12_crit'] ResRec['anisotropy_type'] = pmag.makelist(anitypes) ResRecs.append(ResRec) if len(Ss) > 1: if pmagplotlib.isServer: title = "LO:_"+ResRec['er_location_names'] + \ '_SI:_'+site+'_SA:__SP:__CO:_'+crd else: title = ResRec['er_location_names'] if site: title += "_{}".format(site) title += '_{}'.format(crd) ResRec['er_location_names'] = pmag.makelist(Locs) bpars, hpars = pmagplotlib.plot_anis( ANIS, Ss, iboot, ihext, ivec, ipar, title, iplot, comp, vec, Dir, nb) if len(PDir) > 0: pmagplotlib.plot_circ(ANIS['data'], PDir, 90., 'g') pmagplotlib.plot_circ(ANIS['conf'], PDir, 90., 'g') if verbose and plots == 0: pmagplotlib.draw_figs(ANIS) ResRec['er_location_names'] = pmag.makelist(Locs) if plots == 1: save(ANIS, fmt, title) ResRec = {} ResRec['er_citation_names'] = pmag.makelist(Cits) ResRec['er_location_names'] = pmag.makelist(Locs) ResRec['er_site_names'] = pmag.makelist(Sites) ResRec['er_sample_names'] = pmag.makelist(Samples) ResRec['er_specimen_names'] = pmag.makelist(Specimens) ResRec['rmag_result_name'] = pmag.makelist( Sites)+":"+pmag.makelist(anitypes) ResRec['anisotropy_type'] = pmag.makelist(anitypes) ResRec["er_analyst_mail_names"] = user ResRec["tilt_correction"] = CS if isite == "0": ResRec['result_description'] = "Study average using coordinate system: " + CS if isite == "1": ResRec['result_description'] = "Site average using coordinate system: " + CS if hpars != [] and ihext == 1: HextRec = {} for key in ResRec.keys(): HextRec[key] = ResRec[key] # copy over stuff HextRec["anisotropy_v1_dec"] = '%7.1f' % (hpars["v1_dec"]) HextRec["anisotropy_v2_dec"] = '%7.1f' % (hpars["v2_dec"]) HextRec["anisotropy_v3_dec"] = '%7.1f' % (hpars["v3_dec"]) HextRec["anisotropy_v1_inc"] = '%7.1f' % (hpars["v1_inc"]) HextRec["anisotropy_v2_inc"] = '%7.1f' % (hpars["v2_inc"]) HextRec["anisotropy_v3_inc"] = '%7.1f' % (hpars["v3_inc"]) HextRec["anisotropy_t1"] = '%10.8f' % (hpars["t1"]) HextRec["anisotropy_t2"] = '%10.8f' % (hpars["t2"]) HextRec["anisotropy_t3"] = '%10.8f' % (hpars["t3"]) HextRec["anisotropy_hext_F"] = '%7.1f ' % (hpars["F"]) HextRec["anisotropy_hext_F12"] = '%7.1f ' % (hpars["F12"]) HextRec["anisotropy_hext_F23"] = '%7.1f ' % (hpars["F23"]) HextRec["anisotropy_v1_eta_semi_angle"] = '%7.1f ' % ( hpars["e12"]) HextRec["anisotropy_v1_eta_dec"] = '%7.1f ' % (hpars["v2_dec"]) HextRec["anisotropy_v1_eta_inc"] = '%7.1f ' % (hpars["v2_inc"]) HextRec["anisotropy_v1_zeta_semi_angle"] = '%7.1f ' % ( hpars["e13"]) HextRec["anisotropy_v1_zeta_dec"] = '%7.1f ' % ( hpars["v3_dec"]) HextRec["anisotropy_v1_zeta_inc"] = '%7.1f ' % ( hpars["v3_inc"]) HextRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( hpars["e12"]) HextRec["anisotropy_v2_eta_dec"] = '%7.1f ' % (hpars["v1_dec"]) HextRec["anisotropy_v2_eta_inc"] = '%7.1f ' % (hpars["v1_inc"]) HextRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( hpars["e23"]) HextRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( hpars["v3_dec"]) HextRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( hpars["v3_inc"]) HextRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( hpars["e12"]) HextRec["anisotropy_v3_eta_dec"] = '%7.1f ' % (hpars["v1_dec"]) HextRec["anisotropy_v3_eta_inc"] = '%7.1f ' % (hpars["v1_inc"]) HextRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( hpars["e23"]) HextRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( hpars["v2_dec"]) HextRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( hpars["v2_inc"]) HextRec["magic_method_codes"] = 'LP-AN:AE-H' if verbose: print("Hext Statistics: ") print( " tau_i, V_i_D, V_i_I, V_i_zeta, V_i_zeta_D, V_i_zeta_I, V_i_eta, V_i_eta_D, V_i_eta_I") print(HextRec["anisotropy_t1"], HextRec["anisotropy_v1_dec"], HextRec["anisotropy_v1_inc"], HextRec["anisotropy_v1_eta_semi_angle"], HextRec["anisotropy_v1_eta_dec"], HextRec["anisotropy_v1_eta_inc"], HextRec["anisotropy_v1_zeta_semi_angle"], HextRec["anisotropy_v1_zeta_dec"], HextRec["anisotropy_v1_zeta_inc"]) print(HextRec["anisotropy_t2"], HextRec["anisotropy_v2_dec"], HextRec["anisotropy_v2_inc"], HextRec["anisotropy_v2_eta_semi_angle"], HextRec["anisotropy_v2_eta_dec"], HextRec["anisotropy_v2_eta_inc"], HextRec["anisotropy_v2_zeta_semi_angle"], HextRec["anisotropy_v2_zeta_dec"], HextRec["anisotropy_v2_zeta_inc"]) print(HextRec["anisotropy_t3"], HextRec["anisotropy_v3_dec"], HextRec["anisotropy_v3_inc"], HextRec["anisotropy_v3_eta_semi_angle"], HextRec["anisotropy_v3_eta_dec"], HextRec["anisotropy_v3_eta_inc"], HextRec["anisotropy_v3_zeta_semi_angle"], HextRec["anisotropy_v3_zeta_dec"], HextRec["anisotropy_v3_zeta_inc"]) HextRec['magic_software_packages'] = version_num ResRecs.append(HextRec) if bpars != []: BootRec = {} for key in ResRec.keys(): BootRec[key] = ResRec[key] # copy over stuff BootRec["anisotropy_v1_dec"] = '%7.1f' % (bpars["v1_dec"]) BootRec["anisotropy_v2_dec"] = '%7.1f' % (bpars["v2_dec"]) BootRec["anisotropy_v3_dec"] = '%7.1f' % (bpars["v3_dec"]) BootRec["anisotropy_v1_inc"] = '%7.1f' % (bpars["v1_inc"]) BootRec["anisotropy_v2_inc"] = '%7.1f' % (bpars["v2_inc"]) BootRec["anisotropy_v3_inc"] = '%7.1f' % (bpars["v3_inc"]) BootRec["anisotropy_t1"] = '%10.8f' % (bpars["t1"]) BootRec["anisotropy_t2"] = '%10.8f' % (bpars["t2"]) BootRec["anisotropy_t3"] = '%10.8f' % (bpars["t3"]) BootRec["anisotropy_v1_eta_inc"] = '%7.1f ' % ( bpars["v1_eta_inc"]) BootRec["anisotropy_v1_eta_dec"] = '%7.1f ' % ( bpars["v1_eta_dec"]) BootRec["anisotropy_v1_eta_semi_angle"] = '%7.1f ' % ( bpars["v1_eta"]) BootRec["anisotropy_v1_zeta_inc"] = '%7.1f ' % ( bpars["v1_zeta_inc"]) BootRec["anisotropy_v1_zeta_dec"] = '%7.1f ' % ( bpars["v1_zeta_dec"]) BootRec["anisotropy_v1_zeta_semi_angle"] = '%7.1f ' % ( bpars["v1_zeta"]) BootRec["anisotropy_v2_eta_inc"] = '%7.1f ' % ( bpars["v2_eta_inc"]) BootRec["anisotropy_v2_eta_dec"] = '%7.1f ' % ( bpars["v2_eta_dec"]) BootRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( bpars["v2_eta"]) BootRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( bpars["v2_zeta_inc"]) BootRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( bpars["v2_zeta_dec"]) BootRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( bpars["v2_zeta"]) BootRec["anisotropy_v3_eta_inc"] = '%7.1f ' % ( bpars["v3_eta_inc"]) BootRec["anisotropy_v3_eta_dec"] = '%7.1f ' % ( bpars["v3_eta_dec"]) BootRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( bpars["v3_eta"]) BootRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( bpars["v3_zeta_inc"]) BootRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( bpars["v3_zeta_dec"]) BootRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( bpars["v3_zeta"]) BootRec["anisotropy_hext_F"] = '' BootRec["anisotropy_hext_F12"] = '' BootRec["anisotropy_hext_F23"] = '' # regular bootstrap BootRec["magic_method_codes"] = 'LP-AN:AE-H:AE-BS' if ipar == 1: # parametric bootstrap BootRec["magic_method_codes"] = 'LP-AN:AE-H:AE-BS-P' if verbose: print("Boostrap Statistics: ") print( " tau_i, V_i_D, V_i_I, V_i_zeta, V_i_zeta_D, V_i_zeta_I, V_i_eta, V_i_eta_D, V_i_eta_I") print(BootRec["anisotropy_t1"], BootRec["anisotropy_v1_dec"], BootRec["anisotropy_v1_inc"], BootRec["anisotropy_v1_eta_semi_angle"], BootRec["anisotropy_v1_eta_dec"], BootRec["anisotropy_v1_eta_inc"], BootRec["anisotropy_v1_zeta_semi_angle"], BootRec["anisotropy_v1_zeta_dec"], BootRec["anisotropy_v1_zeta_inc"]) print(BootRec["anisotropy_t2"], BootRec["anisotropy_v2_dec"], BootRec["anisotropy_v2_inc"], BootRec["anisotropy_v2_eta_semi_angle"], BootRec["anisotropy_v2_eta_dec"], BootRec["anisotropy_v2_eta_inc"], BootRec["anisotropy_v2_zeta_semi_angle"], BootRec["anisotropy_v2_zeta_dec"], BootRec["anisotropy_v2_zeta_inc"]) print(BootRec["anisotropy_t3"], BootRec["anisotropy_v3_dec"], BootRec["anisotropy_v3_inc"], BootRec["anisotropy_v3_eta_semi_angle"], BootRec["anisotropy_v3_eta_dec"], BootRec["anisotropy_v3_eta_inc"], BootRec["anisotropy_v3_zeta_semi_angle"], BootRec["anisotropy_v3_zeta_dec"], BootRec["anisotropy_v3_zeta_inc"]) BootRec['magic_software_packages'] = version_num ResRecs.append(BootRec) k += 1 goon = 1 while goon == 1 and iplot == 1 and verbose: if iboot == 1: print("compare with [d]irection ") print( " plot [g]reat circle, change [c]oord. system, change [e]llipse calculation, s[a]ve plots, [q]uit ") if isite == 1: print(" [p]revious, [s]ite, [q]uit, <return> for next ") ans = input("") if ans == "q": sys.exit() if ans == "e": iboot, ipar, ihext, ivec = 1, 0, 0, 0 e = input("Do Hext Statistics 1/[0]: ") if e == "1": ihext = 1 e = input("Suppress bootstrap 1/[0]: ") if e == "1": iboot = 0 if iboot == 1: e = input("Parametric bootstrap 1/[0]: ") if e == "1": ipar = 1 e = input("Plot bootstrap eigenvectors: 1/[0]: ") if e == "1": ivec = 1 if iplot == 1: if inittcdf == 0: ANIS['tcdf'] = 3 pmagplotlib.plot_init(ANIS['tcdf'], 5, 5) inittcdf = 1 bpars, hpars = pmagplotlib.plot_anis( ANIS, Ss, iboot, ihext, ivec, ipar, title, iplot, comp, vec, Dir, nb) if verbose and plots == 0: pmagplotlib.draw_figs(ANIS) if ans == "c": print("Current Coordinate system is: ") if CS == '-1': print(" Specimen") if CS == '0': print(" Geographic") if CS == '100': print(" Tilt corrected") key = input( " Enter desired coordinate system: [s]pecimen, [g]eographic, [t]ilt corrected ") if key == 's': CS = '-1' if key == 'g': CS = '0' if key == 't': CS = '100' if CS not in orlist: if len(orlist) > 0: CS = orlist[0] else: CS = '-1' if CS == '-1': crd = 's' if CS == '0': crd = 'g' if CS == '100': crd = 't' print( "desired coordinate system not available, using available: ", crd) k -= 1 goon = 0 if ans == "": if isite == 1: goon = 0 else: print("Good bye ") sys.exit() if ans == 'd': if initcdf == 0: initcdf = 1 ANIS['vxcdf'], ANIS['vycdf'], ANIS['vzcdf'] = 4, 5, 6 pmagplotlib.plot_init(ANIS['vxcdf'], 5, 5) pmagplotlib.plot_init(ANIS['vycdf'], 5, 5) pmagplotlib.plot_init(ANIS['vzcdf'], 5, 5) Dir, comp = [], 1 print(""" Input: Vi D I to compare eigenvector Vi with direction D/I where Vi=1: principal Vi=2: major Vi=3: minor D= declination of comparison direction I= inclination of comparison direction""") con = 1 while con == 1: try: vdi = input("Vi D I: ").split() vec = int(vdi[0])-1 Dir = [float(vdi[1]), float(vdi[2])] con = 0 except IndexError: print(" Incorrect entry, try again ") bpars, hpars = pmagplotlib.plot_anis( ANIS, Ss, iboot, ihext, ivec, ipar, title, iplot, comp, vec, Dir, nb) Dir, comp = [], 0 if ans == 'g': con, cnt = 1, 0 while con == 1: try: print( " Input: input pole to great circle ( D I) to plot a great circle: ") di = input(" D I: ").split() PDir.append(float(di[0])) PDir.append(float(di[1])) con = 0 except: cnt += 1 if cnt < 10: print( " enter the dec and inc of the pole on one line ") else: print( "ummm - you are doing something wrong - i give up") sys.exit() pmagplotlib.plot_circ(ANIS['data'], PDir, 90., 'g') pmagplotlib.plot_circ(ANIS['conf'], PDir, 90., 'g') if verbose and plots == 0: pmagplotlib.draw_figs(ANIS) if ans == "p": k -= 2 goon = 0 if ans == "q": k = plt goon = 0 if ans == "s": keepon = 1 site = input(" print site or part of site desired: ") while keepon == 1: try: k = sitelist.index(site) keepon = 0 except: tmplist = [] for qq in range(len(sitelist)): if site in sitelist[qq]: tmplist.append(sitelist[qq]) print(site, " not found, but this was: ") print(tmplist) site = input('Select one or try again\n ') k = sitelist.index(site) goon, ans = 0, "" if ans == "a": locs = pmag.makelist(Locs) if pmagplotlib.isServer: # use server plot naming convention title = "LO:_"+locs+'_SI:__'+'_SA:__SP:__CO:_'+crd else: # use more readable plot naming convention title = "{}_{}".format(locs, crd) save(ANIS, fmt, title) goon = 0 else: if verbose: print('skipping plot - not enough data points') k += 1 # put rmag_results stuff here if len(ResRecs) > 0: ResOut, keylist = pmag.fillkeys(ResRecs) pmag.magic_write(outfile, ResOut, 'rmag_results') if verbose: print(" Good bye ")
def main(command_line=True, **kwargs): """ NAME jr6_jr6_magic.py DESCRIPTION converts JR6 .jr6 format files to magic_measurements format files SYNTAX jr6_jr6_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -Fsa: specify er_samples format file for appending, default is new er_samples.txt (Not working yet) -spc NUM : specify number of characters to designate a specimen, default = 1 -loc LOCNAME : specify location/study name -A: don't average replicate measurements -ncn NCON: specify sample naming convention (6 and 7 not yet implemented) -mcd [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented -JR IODP samples measured on the JOIDES RESOLUTION -v NUM : specify the volume in cc of the sample, default 2.5^3cc Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. INPUT JR6 .jr6 format file """ # initialize some stuff noave=0 #volume=2.5**3 #default volume is a 2.5cm cube volume = 2.5 * 1e-6 #default volume is a 2.5 cm cube, translated to meters cubed inst="" samp_con,Z='1',"" missing=1 demag="N" er_location_name="unknown" citation='This study' args=sys.argv meth_code="LP-NO" specnum=1 version_num=pmag.get_version() Samps=[] # keeps track of sample orientations user="" mag_file="" dir_path='.' MagRecs=[] ErSamps=[] SampOuts=[] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' tmp_file= "fixed.jr6" meth_code,JR="",0 # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path=sys.argv[ind+1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind+1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print main.__doc__ return False if '-F' in args: ind=args.index("-F") meas_file = args[ind+1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind+1] #try: # open(samp_file,'rU') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file= args[ind+1] if "-spc" in args: ind = args.index("-spc") specnum = int(args[ind+1]) if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-A" in args: noave=1 if "-mcd" in args: ind=args.index("-mcd") meth_code=args[ind+1] if "-JR" in args: meth_code=meth_code+":FS-C-DRILL-IODP:SP-SS-C:SO-V" meth_code=meth_code.strip(":") JR=1 samp_con='5' if "-v" in args: ind=args.index("-v") volume=float(args[ind+1])*1e-6 # enter volume in cc, convert to m^3 if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') samp_file = kwargs.get('samp_file', 'er_samples.txt') specnum = kwargs.get('specnum', 1) samp_con = kwargs.get('samp_con', '1') er_location_name = kwargs.get('er_location_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") volume = float(kwargs.get('volume', 0)) if not volume: volume = 2.5 * 1e-6 #default volume is a 2.5 cm cube, translated to meters cubed else: #convert cm^3 to m^3 volume *= 1e-6 JR = kwargs.get('JR', 0) if JR: if meth_code == "LP-NO": meth_code = "" meth_code=meth_code+":FS-C-DRILL-IODP:SP-SS-C:SO-V" meth_code=meth_code.strip(":") samp_con='5' # format variables mag_file = input_dir_path+"/" + mag_file meas_file = output_dir_path+"/" + meas_file samp_file = output_dir_path+"/" + samp_file tmp_file = output_dir_path+"/" + tmp_file if specnum!=0: specnum=-specnum if "4" in samp_con: if "-" not in samp_con: print "option [4] must be in form 4-Z where Z is an integer" return False, "option [4] must be in form 4-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="4" if "7" in samp_con: if "-" not in samp_con: print "option [7] must be in form 7-Z where Z is an integer" return False, "option [7] must be in form 7-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="7" ErSampRec,ErSiteRec={},{} # parse data # fix .jr6 file so that there are spaces between all the columns. pre_data=open(mag_file, 'rU') tmp_data=open(tmp_file, 'w') line=pre_data.readline() while line !='': line=line.replace('-',' -') #print "line=", line tmp_data.write(line) line=pre_data.readline() tmp_data.close() pre_data.close() data=pd.read_csv(tmp_file, delim_whitespace=True,header=None) if JR==0: # data.columns=['er_specimen_name','step','x','y','z','expon','sample_azimuth','sample_dip', 'sample_bed_dip_direction','sample_bed_dip','bed_dip_dir2','bed_dip2','param1','param2','param3','param4','measurement_csd'] cart=np.array([data['x'],data['y'],data['z']]).transpose() else: # measured on the Joides Resolution JR6 data.columns=['er_specimen_name','step','negz','y','x','expon','sample_azimuth','sample_dip', 'sample_bed_dip_direction','sample_bed_dip','bed_dip_dir2','bed_dip2','param1','param2','param3','param4','measurement_csd'] cart=np.array([data['x'],data['y'],-data['negz']]).transpose() dir= pmag.cart2dir(cart).transpose() data['measurement_dec']=dir[0] data['measurement_inc']=dir[1] data['measurement_magn_moment']=dir[2]*(10.0**data['expon'])*volume # the data are in A/m - this converts to Am^2 data['measurement_magn_volume']=dir[2]*(10.0**data['expon']) # A/m - data in A/m data['sample_dip']=-data['sample_dip'] DGEOs,IGEOs=[],[] for ind in range(len(data)): dgeo,igeo=pmag.dogeo(data.ix[ind]['measurement_dec'],data.ix[ind]['measurement_inc'],data.ix[ind]['sample_azimuth'],data.ix[ind]['sample_dip']) DGEOs.append(dgeo) IGEOs.append(igeo) data['specimen_dec']=DGEOs data['specimen_inc']=IGEOs data['specimen_tilt']='1' if specnum!=0: data['er_sample_name']=data['er_specimen_name'][:specnum] else: data['er_sample_name']=data['er_specimen_name'] if int(samp_con) in [1, 2, 3, 4, 5, 7]: data['er_site_name']=pmag.parse_site(data['er_sample_name'],samp_con,Z) # else: # if 'er_site_name' in ErSampRec.keys():er_site_name=ErSampRec['er_site_name'] # if 'er_location_name' in ErSampRec.keys():er_location_name=ErSampRec['er_location_name'] # Configure the er_sample table for rowNum, row in data.iterrows(): sampleFlag=0 for sampRec in SampOuts: if sampRec['er_sample_name'] == row['er_sample_name']: sampleFlag=1 break if sampleFlag == 0: ErSampRec['er_sample_name']=row['er_sample_name'] ErSampRec['sample_azimuth']=str(row['sample_azimuth']) ErSampRec['sample_dip']=str(row['sample_dip']) ErSampRec['magic_method_codes']=meth_code ErSampRec['er_location_name']=er_location_name ErSampRec['er_site_name']=row['er_site_name'] ErSampRec['er_citation_names']='This study' SampOuts.append(ErSampRec.copy()) # Configure the magic_measurements table for rowNum, row in data.iterrows(): MagRec={} # MagRec['measurement_description']='Date: '+date MagRec["er_citation_names"]="This study" MagRec['er_location_name']=er_location_name MagRec['er_site_name']=row['er_site_name'] MagRec['er_sample_name']=row['er_sample_name'] MagRec['magic_software_packages']=version_num MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"]='g' MagRec["measurement_standard"]='u' MagRec["measurement_number"]='1' MagRec["er_specimen_name"]=row['er_specimen_name'] MagRec["treatment_ac_field"]='0' if row['step'] == 'NRM': meas_type="LT-NO" elif row['step'][0:2] == 'AD': meas_type="LT-AF-Z" treat=float(row['step'][2:]) MagRec["treatment_ac_field"]='%8.3e' %(treat*1e-3) # convert from mT to tesla elif row['step'][0] == 'TD': meas_type="LT-T-Z" treat=float(row['step'][2:]) MagRec["treatment_temp"]='%8.3e' % (treat+273.) # temp in kelvin else: # need to add IRM, and ARM options print "measurement type unknown", row['step'] return False, "measurement type unknown" MagRec["measurement_magn_moment"]=str(row['measurement_magn_moment']) MagRec["measurement_magn_volume"]=str(row['measurement_magn_volume']) MagRec["measurement_dec"]=str(row['measurement_dec']) MagRec["measurement_inc"]=str(row['measurement_inc']) MagRec['magic_method_codes']=meas_type MagRecs.append(MagRec.copy()) pmag.magic_write(samp_file,SampOuts,'er_samples') print "sample orientations put in ",samp_file MagOuts=pmag.measurements_methods(MagRecs,noave) pmag.magic_write(meas_file,MagOuts,'magic_measurements') print "results put in ",meas_file print "exit!" return True, meas_file
def main(): """ NAME mst_magic.py DESCRIPTION converts MsT data (T,M) to magic_measurements format files SYNTAX mst_magic.py [command line options] OPTIONS -h: prints the help message and quits. -usr USER: identify user, default is "" -f FILE: specify T,M format input file, required -fsa SFILE: name with sample, site, location information -F FILE: specify output file, default is MsT_measurements.txt -dc H: specify applied field during measurement, default is 0.5 T -syn : This is a synthetic specimen and has no sample/site/location information -spn SPEC: specimen name -spc NUM : specify number of characters to designate a specimen, default = 0 -loc LOCNAME : specify location/study name, must have either LOCNAME or SAMPFILE or be a synthetic -ncn NCON: specify naming convention: default is #1 below Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. INPUT files: T M: T is in Centigrade and M is uncalibrated magnitude """ # initialize some stuff samp_con,Z="1","0" dir_path='.' citation='This study' args=sys.argv specnum,measnum=0,1 # # get command line arguments # user="" if '-WD' in args: ind=args.index("-WD") dir_path=args[ind+1] meas_file=dir_path+"/MsT_measurements.txt" if "-h" in args: print main.__doc__ sys.exit() if "-usr" in args: ind=args.index("-usr") user=args[ind+1] labfield='0.5' if "-dc" in args: ind=args.index("-dc") labfield=args[ind+1] if '-F' in args: ind=args.index("-F") meas_file=dir_path+'/'+args[ind+1] if "-fsa" in args: ind=args.index("-fsa") samp_file=dir_path+'/'+args[ind+1] Samps,file_type=pmag.magic_read(samp_file) if '-f' in args: ind=args.index("-f") infile=dir_path+'/'+args[ind+1] try: input=open(infile,'rU') except: print "bad mag file name" sys.exit() else: print main.__doc__ print "-f is required option" sys.exit() if "-spc" in args: ind=args.index("-spc") specnum=int(args[ind+1]) if specnum!=0:specnum=-specnum er_location_name,syn,specimen_name='unknown',0,'unknown' if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-spn" in args: ind=args.index("-spn") specimen_name=args[ind+1] else: print main.__doc__ print "-spn is required option" sys.exit() if "-syn" in args: syn=1 if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "4" in samp_con: if "-" not in samp_con: print "option [4] must be in form 4-Z where Z is an integer" sys.exit() else: Z=samp_con.split("-")[1] samp_con="4" samp_con=sys.argv[ind+1] if "7" in samp_con: if "-" not in samp_con: print "option [7] must be in form 7-Z where Z is an integer" sys.exit() else: Z=samp_con.split("-")[1] samp_con="7" MagRecs,specs=[],[] version_num=pmag.get_version() data=input.readlines() T0=float(data[0].split()[0]) for line in data: instcode="" if len(line)>1: MagRec={} if syn==0: MagRec['er_location_name']=er_location_name MagRec['magic_software_packages']=version_num MagRec["treatment_dc_field"]=labfield rec=line.split() T=float(rec[0]) MagRec["measurment_temp"]='%8.3e' % (float(rec[0])+273.) # temp in kelvin if T>T0: MagRec["magic_method_codes"]='LP-MW-I' elif T<T0: MagRec["magic_method_codes"]='LP-MC-I' T0=T else: print 'skipping repeated temperature step' MagRec["magic_method_codes"]='' T0=T MagRec["measurement_magnitude"]='%10.3e'% (float(rec[1])) # uncalibrated magnitude if syn==0: MagRec["er_specimen_name"]=specimen_name MagRec["er_site_name"]="" if specnum!=0: MagRec["er_sample_name"]=specimen_name[:specnum] else: MagRec["er_sample_name"]=specimen_name if "-fsa" in args: for samp in Samps: if samp["er_sample_name"] == MagRec["er_sample_name"]: MagRec["er_location_name"]=samp["er_location_name"] MagRec["er_site_name"]=samp["er_site_name"] break elif int(samp_con)!=6: site=pmag.parse_site(MagRec['er_sample_name'],samp_con,Z) MagRec["er_site_name"]=site if MagRec['er_site_name']=="": print 'No site name found for: ',MagRec['er_specimen_name'],MagRec['er_sample_name'] if MagRec["er_location_name"]=="": print 'no location name for: ',MagRec["er_specimen_name"] else: MagRec["er_synthetic_name"]=specimen_name MagRec["er_location_name"]="" MagRec["er_sample_name"]="" MagRec["er_site_name"]="" MagRec["er_specimen_name"]="" MagRec["magic_instrument_codes"]=instcode MagRec["er_analyst_mail_names"]=user MagRec["er_citation_names"]=citation MagRec["measurement_flag"]='g' MagRec["measurement_number"]=str(measnum) measnum+=1 MagRecs.append(MagRec) for rec in MagRecs: # sort out the measurements by experiment type rec['magic_experiment_name']=specimen_name if rec['magic_method_codes']=='LP-MW-I': rec["magic_experiment_name"]=specimen_name+':LP-MW-I:Curie' elif rec['magic_method_codes']=='LP-MC-I': rec["magic_experiment_name"]=specimen_name+':LP-MC-I' pmag.magic_write(meas_file,MagRecs,'magic_measurements') print "results put in ",meas_file
def main(): """ NAME agm_magic.py DESCRIPTION converts Micromag agm files to magic format SYNTAX agm_magic.py [-h] [command line options] OPTIONS -usr USER: identify user, default is "" - put in quotation marks! -bak: this is a IRM backfield curve -f FILE, specify input file, required -fsa SAMPFILE, specify er_samples.txt file relating samples, site and locations names,default is none -F MFILE, specify magic measurements formatted output file, default is agm_measurements.txt -spn SPEC, specimen name, default is base of input file name, e.g. SPECNAME.agm -spc NUM, specify number of characters to designate a specimen, default = 0 -Fsp SPECFILE : name of er_specimens.txt file for appending data to [default: er_specimens.txt] -ncn NCON,: specify naming convention: default is #1 below -syn SYN, synthetic specimen name -loc LOCNAME : specify location/study name, should have either LOCNAME or SAMPFILE (unless synthetic) -ins INST : specify which instrument was used (e.g, SIO-Maud), default is "" -u units: [cgs,SI], default is cgs Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY [8] specimen is a synthetic - it has no sample, site, location information NB: all others you will have to customize your self or e-mail [email protected] for help. OUTPUT MagIC format files: magic_measurements, er_specimens, er_sample, er_site """ citation='This study' MeasRecs=[] units='cgs' meth="LP-HYS" version_num=pmag.get_version() args=sys.argv fmt='old' er_sample_name,er_site_name,er_location_name="","","" inst="" er_location_name="unknown" er_synthetic_name="" user="" er_site_name="" dir_path='.' dm=3 if "-WD" in args: ind=args.index("-WD") dir_path=args[ind+1] if "-ID" in args: ind = args.index("-ID") input_dir_path = args[ind+1] else: input_dir_path = dir_path output_dir_path = dir_path specfile = output_dir_path+'/er_specimens.txt' output = output_dir_path+"/agm_measurements.txt" if "-h" in args: print(main.__doc__) sys.exit() if "-bak" in args: meth="LP-IRM-DCD" output = output_dir_path+"/irm_measurements.txt" if "-new" in args: fmt='new' if "-usr" in args: ind=args.index("-usr") user=args[ind+1] if '-F' in args: ind=args.index("-F") output = output_dir_path+'/'+args[ind+1] if '-f' in args: ind=args.index("-f") agm_file= input_dir_path+'/'+args[ind+1] er_specimen_name=args[ind+1].split('.')[0] else: print("agm_file field is required option") print(main.__doc__) sys.exit() if '-Fsp' in args: ind=args.index("-Fsp") specfile= output_dir_path+'/'+args[ind+1] specnum,samp_con,Z=0,'1',1 if "-spc" in args: ind=args.index("-spc") specnum=int(args[ind+1]) if specnum!=0:specnum=-specnum if "-spn" in args: ind=args.index("-spn") er_specimen_name=args[ind+1] #elif "-syn" not in args: # print "you must specify a specimen name" # sys.exit() if "-syn" in args: ind=args.index("-syn") er_synthetic_name=args[ind+1] er_specimen_name="" if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-fsa" in args: ind=args.index("-fsa") sampfile = input_dir_path+'/'+args[ind+1] Samps,file_type=pmag.magic_read(sampfile) print('sample_file successfully read in') if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") sys.exit() else: Z=samp_con.split("-")[1] samp_con="4" if "7" in samp_con: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") sys.exit() else: Z=samp_con.split("-")[1] samp_con="7" if "-ins" in args: ind=args.index("-ins") inst=args[ind+1] if "-u" in args: ind=args.index("-u") units=args[ind+1] dm = pmag.get_named_arg_from_sys("-DM", 2) ErSpecRecs,filetype=pmag.magic_read(specfile) ErSpecRec,MeasRec={},{} ErSpecRec['er_citation_names']="This study" ErSpecRec['er_specimen_name']=er_specimen_name ErSpecRec['er_synthetic_name']=er_synthetic_name if specnum!=0: ErSpecRec["er_sample_name"]=er_specimen_name[:specnum] else: ErSpecRec["er_sample_name"]=er_specimen_name if "-fsa" in args and er_synthetic_name=="": for samp in Samps: if samp["er_sample_name"] == ErSpecRec["er_sample_name"]: ErSpecRec["er_location_name"]=samp["er_location_name"] ErSpecRec["er_site_name"]=samp["er_site_name"] break elif int(samp_con)!=6 and int(samp_con)!=8: site=pmag.parse_site(ErSpecRec['er_sample_name'],samp_con,Z) ErSpecRec["er_site_name"]=site ErSpecRec["er_location_name"]=er_location_name ErSpecRec['er_scientist_mail_names']=user.strip() insert=1 for rec in ErSpecRecs: if rec['er_specimen_name']==er_specimen_name: insert=0 break if insert==1: ErSpecRecs.append(ErSpecRec) ErSpecRecs,keylist=pmag.fillkeys(ErSpecRecs) pmag.magic_write(specfile,ErSpecRecs,'er_specimens') print("specimen name put in ",specfile) f=open(agm_file,'r') Data=f.readlines() if "ASCII" not in Data[0]:fmt='new' measnum,start=1,"" if fmt=='new': # new Micromag formatted file end=2 for skip in range(len(Data)): line=Data[skip] rec=line.split() if 'Units' in line:units=rec[-1] if "Raw" in rec: start=skip+2 if "Field" in rec and "Moment" in rec and start=="": start=skip+2 break else: start = 2 end=1 for i in range(start,len(Data)-end): # skip header stuff MeasRec={} for key in list(ErSpecRec.keys()): MeasRec[key]=ErSpecRec[key] MeasRec['magic_instrument_codes']=inst MeasRec['magic_method_codes']=meth if 'er_synthetic_name' in list(MeasRec.keys()) and MeasRec['er_synthetic_name']!="": MeasRec['magic_experiment_name']=er_synthetic_name+':'+meth else: MeasRec['magic_experiment_name']=er_specimen_name+':'+meth line=Data[i] rec=line.split(',') # data comma delimited if rec[0]!='\n': if units=='cgs': field =float(rec[0])*1e-4 # convert from oe to tesla else: field =float(rec[0]) # field in tesla if meth=="LP-HYS": MeasRec['measurement_lab_field_dc']='%10.3e'%(field) MeasRec['treatment_dc_field']='' else: MeasRec['measurement_lab_field_dc']='' MeasRec['treatment_dc_field']='%10.3e'%(field) if units=='cgs': MeasRec['measurement_magn_moment']='%10.3e'%(float(rec[1])*1e-3) # convert from emu to Am^2 else: MeasRec['measurement_magn_moment']='%10.3e'%(float(rec[1])) # Am^2 MeasRec['treatment_temp']='273' # temp in kelvin MeasRec['measurement_temp']='273' # temp in kelvin MeasRec['measurement_flag']='g' MeasRec['measurement_standard']='u' MeasRec['measurement_number']='%i'%(measnum) measnum+=1 MeasRec['magic_software_packages']=version_num MeasRecs.append(MeasRec) # now we have to relabel LP-HYS method codes. initial loop is LP-IMT, minor loops are LP-M - do this in measurements_methods function if meth=='LP-HYS': recnum=0 while float(MeasRecs[recnum]['measurement_lab_field_dc'])<float(MeasRecs[recnum+1]['measurement_lab_field_dc']) and recnum+1<len(MeasRecs): # this is LP-IMAG MeasRecs[recnum]['magic_method_codes']='LP-IMAG' MeasRecs[recnum]['magic_experiment_name']=MeasRecs[recnum]['er_specimen_name']+":"+'LP-IMAG' recnum+=1 # if int(dm)==2: pmag.magic_write(output,MeasRecs,'magic_measurements') else: print ('MagIC 3 is not supported yet') sys.exit() pmag.magic_write(output,MeasRecs,'measurements') print("results put in ", output)
def main(): """ NAME thellier_magic.py DESCRIPTION plots Thellier-Thellier, allowing interactive setting of bounds and customizing of selection criteria. Saves and reads interpretations from a pmag_specimen formatted table, default: thellier_specimens.txt SYNTAX thellier_magic.py [command line options] OPTIONS -h prints help message and quits -f MEAS, set magic_measurements input file -fsp PRIOR, set pmag_specimen prior interpretations file -fan ANIS, set rmag_anisotropy file for doing the anisotropy corrections -fcr CRIT, set criteria file for grading. -fmt [svg,png,jpg], format for images - default is svg -sav, saves plots with out review (default format) -spc SPEC, plots single specimen SPEC, saves plot with specified format with optional -b bounds adn quits -b BEG END: sets bounds for calculation BEG: starting step for slope calculation END: ending step for slope calculation -z use only z component difference for pTRM calculation DEFAULTS MEAS: magic_measurements.txt REDO: thellier_redo CRIT: NONE PRIOR: NONE OUTPUT figures: ALL: numbers refer to temperature steps in command line window 1) Arai plot: closed circles are zero-field first/infield open circles are infield first/zero-field triangles are pTRM checks squares are pTRM tail checks VDS is vector difference sum diamonds are bounds for interpretation 2) Zijderveld plot: closed (open) symbols are X-Y (X-Z) planes X rotated to NRM direction 3) (De/Re)Magnetization diagram: circles are NRM remaining squares are pTRM gained 4) equal area projections: green triangles are pTRM gained direction red (purple) circles are lower(upper) hemisphere of ZI step directions blue (cyan) squares are lower(upper) hemisphere IZ step directions 5) Optional: TRM acquisition 6) Optional: TDS normalization command line window: list is: temperature step numbers, temperatures (C), Dec, Inc, Int (units of magic_measuements) list of possible commands: type letter followed by return to select option saving of plots creates .svg format files with specimen_name, plot type as name """ # # initializations # meas_file,critout,inspec="magic_measurements.txt","","thellier_specimens.txt" first=1 inlt=0 version_num=pmag.get_version() TDinit,Tinit,field,first_save=0,0,-1,1 user,comment,AniSpec,locname="",'',"","" ans,specimen,recnum,start,end=0,0,0,0,0 plots,pmag_out,samp_file,style=0,"","","svg" verbose=pmagplotlib.verbose fmt='.'+style # # default acceptance criteria # accept=pmag.default_criteria(0)[0] # set the default criteria # # parse command line options # Zdiff,anis=0,0 spc,BEG,END="","","" if '-h' in sys.argv: print main.__doc__ sys.exit() if '-f' in sys.argv: ind=sys.argv.index('-f') meas_file=sys.argv[ind+1] if '-fsp' in sys.argv: ind=sys.argv.index('-fsp') inspec=sys.argv[ind+1] if '-fan' in sys.argv: ind=sys.argv.index('-fan') anisfile=sys.argv[ind+1] anis=1 anis_data,file_type=pmag.magic_read(anisfile) if verbose: print "Anisotropy data read in from ", anisfile if '-fmt' in sys.argv: ind=sys.argv.index('-fmt') fmt='.'+sys.argv[ind+1] if '-dpi' in sys.argv: ind=sys.argv.index('-dpi') dpi='.'+sys.argv[ind+1] else: dpi=100 if '-sav' in sys.argv: plots=1 verbose=0 if '-z' in sys.argv: Zdiff=1 if '-spc' in sys.argv: ind=sys.argv.index('-spc') spc=sys.argv[ind+1] if '-b' in sys.argv: ind=sys.argv.index('-b') BEG=int(sys.argv[ind+1]) END=int(sys.argv[ind+2]) if '-fcr' in sys.argv: ind=sys.argv.index('-fcr') critout=sys.argv[ind+1] crit_data,file_type=pmag.magic_read(critout) if file_type!='pmag_criteria': if verbose: print 'bad pmag_criteria file, using no acceptance criteria' accept=pmag.default_criteria(1)[0] else: if verbose: print "Acceptance criteria read in from ", critout accept={'pmag_criteria_code':'ACCEPTANCE','er_citation_names':'This study'} for critrec in crit_data: if 'sample_int_sigma_uT' in critrec.keys(): # accommodate Shaar's new criterion critrec['sample_int_sigma']='%10.3e'%(eval(critrec['sample_int_sigma_uT'])*1e-6) for key in critrec.keys(): if key not in accept.keys() and critrec[key]!='': accept[key]=critrec[key] try: open(inspec,'rU') PriorRecs,file_type=pmag.magic_read(inspec) if file_type != 'pmag_specimens': print file_type print file_type,inspec," is not a valid pmag_specimens file " sys.exit() for rec in PriorRecs: if 'magic_software_packages' not in rec.keys():rec['magic_software_packages']="" except IOError: PriorRecs=[] if verbose:print "starting new specimen interpretation file: ",inspec meas_data,file_type=pmag.magic_read(meas_file) if file_type != 'magic_measurements': print file_type print file_type,"This is not a valid magic_measurements file " sys.exit() backup=0 # define figure numbers for arai, zijderveld and # de-,re-magization diagrams AZD={} AZD['deremag'], AZD['zijd'],AZD['arai'],AZD['eqarea']=1,2,3,4 pmagplotlib.plot_init(AZD['arai'],5,5) pmagplotlib.plot_init(AZD['zijd'],5,5) pmagplotlib.plot_init(AZD['deremag'],5,5) pmagplotlib.plot_init(AZD['eqarea'],5,5) # # # # get list of unique specimen names # CurrRec=[] sids=pmag.get_specs(meas_data) # get plots for specimen s - default is just to step through arai diagrams # if spc!="": specimen =sids.index(spc) while specimen < len(sids): methcodes=[] if verbose: print sids[specimen],specimen+1, 'of ', len(sids) MeasRecs=[] s=sids[specimen] datablock,trmblock,tdsrecs=[],[],[] PmagSpecRec={} if first==0: for key in keys:PmagSpecRec[key]="" # make sure all new records have same set of keys PmagSpecRec["er_analyst_mail_names"]=user PmagSpecRec["specimen_correction"]='u' # # find the data from the meas_data file for this specimen # for rec in meas_data: if rec["er_specimen_name"]==s: MeasRecs.append(rec) if "magic_method_codes" not in rec.keys(): rec["magic_method_codes"]="" methods=rec["magic_method_codes"].split(":") meths=[] for meth in methods: meths.append(meth.strip()) # take off annoying spaces methods="" for meth in meths: if meth.strip() not in methcodes and "LP-" in meth:methcodes.append(meth.strip()) methods=methods+meth+":" methods=methods[:-1] rec["magic_method_codes"]=methods if "LP-PI-TRM" in meths: datablock.append(rec) if "LP-TRM" in meths: trmblock.append(rec) if "LP-TRM-TD" in meths: tdsrecs.append(rec) if len(trmblock)>2 and inspec!="": if Tinit==0: Tinit=1 AZD['TRM']=5 pmagplotlib.plot_init(AZD['TRM'],5,5) elif Tinit==1: # clear the TRM figure if not needed pmagplotlib.clearFIG(AZD['TRM']) if len(tdsrecs)>2: if TDinit==0: TDinit=1 AZD['TDS']=6 pmagplotlib.plot_init(AZD['TDS'],5,5) elif TDinit==1: # clear the TDS figure if not needed pmagplotlib.clearFIG(AZD['TDS']) if len(datablock) <4: if backup==0: specimen+=1 if verbose: print 'skipping specimen - moving forward ', s else: specimen-=1 if verbose: print 'skipping specimen - moving backward ', s # # collect info for the PmagSpecRec dictionary # else: rec=datablock[0] PmagSpecRec["er_citation_names"]="This study" PmagSpecRec["er_specimen_name"]=s PmagSpecRec["er_sample_name"]=rec["er_sample_name"] PmagSpecRec["er_site_name"]=rec["er_site_name"] PmagSpecRec["er_location_name"]=rec["er_location_name"] locname=rec['er_location_name'].replace('/','-') if "er_expedition_name" in rec.keys():PmagSpecRec["er_expedition_name"]=rec["er_expedition_name"] if "magic_instrument_codes" not in rec.keys():rec["magic_instrument_codes"]="" PmagSpecRec["magic_instrument_codes"]=rec["magic_instrument_codes"] PmagSpecRec["measurement_step_unit"]="K" if "magic_experiment_name" not in rec.keys(): rec["magic_experiment_name"]="" else: PmagSpecRec["magic_experiment_names"]=rec["magic_experiment_name"] meths=rec["magic_method_codes"].split() # sort data into types araiblock,field=pmag.sortarai(datablock,s,Zdiff) first_Z=araiblock[0] GammaChecks=araiblock[5] if len(first_Z)<3: if backup==0: specimen+=1 if verbose: print 'skipping specimen - moving forward ', s else: specimen-=1 if verbose: print 'skipping specimen - moving backward ', s else: backup=0 zijdblock,units=pmag.find_dmag_rec(s,meas_data) recnum=0 if verbose: print "index step Dec Inc Int Gamma" for plotrec in zijdblock: if GammaChecks!="": gamma="" for g in GammaChecks: if g[0]==plotrec[0]-273: gamma=g[1] break if gamma!="": print '%i %i %7.1f %7.1f %8.3e %7.1f' % (recnum,plotrec[0]-273,plotrec[1],plotrec[2],plotrec[3],gamma) else: print '%i %i %7.1f %7.1f %8.3e ' % (recnum,plotrec[0]-273,plotrec[1],plotrec[2],plotrec[3]) recnum += 1 pmagplotlib.plotAZ(AZD,araiblock,zijdblock,s,units[0]) if verbose:pmagplotlib.drawFIGS(AZD) if len(tdsrecs)>2: # a TDS experiment tdsblock=[] # make a list for the TDS data Mkeys=['measurement_magnitude','measurement_magn_moment','measurement_magn_volume','measuruement_magn_mass'] mkey,k="",0 while mkey=="" and k<len(Mkeys)-1: # find which type of intensity key= Mkeys[k] if key in tdsrecs[0].keys() and tdsrecs[0][key]!="": mkey=key k+=1 if mkey=="":break # get outta here Tnorm="" for tdrec in tdsrecs: meths=tdrec['magic_method_codes'].split(":") for meth in meths: meth.replace(" ","") # strip off potential nasty spaces if 'LT-T-I' in meths and Tnorm=="": # found first total TRM Tnorm=float(tdrec[mkey]) # normalize by total TRM tdsblock.append([273,zijdblock[0][3]/Tnorm,1.]) # put in the zero step if 'LT-T-Z' in meths and Tnorm!="": # found a LP-TRM-TD demag step, now need complementary LT-T-Z from zijdblock step=float(tdrec['treatment_temp']) Tint="" if mkey!="": Tint=float(tdrec[mkey]) if Tint!="": for zrec in zijdblock: if zrec[0]==step: # found matching tdsblock.append([step,zrec[3]/Tnorm,Tint/Tnorm]) break if len(tdsblock)>2: pmagplotlib.plotTDS(AZD['TDS'],tdsblock,s+':LP-PI-TDS:') if verbose:pmagplotlib(drawFIGS(AZD)) else: print "Something wrong here" if anis==1: # look up anisotropy data for this specimen AniSpec="" for aspec in anis_data: if aspec["er_specimen_name"]==PmagSpecRec["er_specimen_name"]: AniSpec=aspec if verbose: print 'Found anisotropy record...' break if inspec !="": if verbose: print 'Looking up saved interpretation....' found = 0 for k in range(len(PriorRecs)): try: if PriorRecs[k]["er_specimen_name"]==s: found =1 CurrRec.append(PriorRecs[k]) for j in range(len(zijdblock)): if float(zijdblock[j][0])==float(PriorRecs[k]["measurement_step_min"]):start=j if float(zijdblock[j][0])==float(PriorRecs[k]["measurement_step_max"]):end=j pars,errcode=pmag.PintPars(datablock,araiblock,zijdblock,start,end,accept) pars['measurement_step_unit']="K" pars['experiment_type']='LP-PI-TRM' del PriorRecs[k] # put in CurrRec, take out of PriorRecs if errcode!=1: pars["specimen_lab_field_dc"]=field pars["specimen_int"]=-1*field*pars["specimen_b"] pars["er_specimen_name"]=s if verbose: print 'Saved interpretation: ' pars,kill=pmag.scoreit(pars,PmagSpecRec,accept,'',verbose) pmagplotlib.plotB(AZD,araiblock,zijdblock,pars) if verbose:pmagplotlib.drawFIGS(AZD) if len(trmblock)>2: blab=field best=pars["specimen_int"] Bs,TRMs=[],[] for trec in trmblock: Bs.append(float(trec['treatment_dc_field'])) TRMs.append(float(trec['measurement_magn_moment'])) NLpars=nlt.NLtrm(Bs,TRMs,best,blab,0) # calculate best fit parameters through TRM acquisition data, and get new banc Mp,Bp=[],[] for k in range(int(max(Bs)*1e6)): Bp.append(float(k)*1e-6) npred=nlt.TRM(Bp[-1],NLpars['xopt'][0],NLpars['xopt'][1]) # predicted NRM for this field Mp.append(npred) pmagplotlib.plotTRM(AZD['TRM'],Bs,TRMs,Bp,Mp,NLpars,trec['magic_experiment_name']) PmagSpecRec['specimen_int']=NLpars['banc'] if verbose: print 'Banc= ',float(NLpars['banc'])*1e6 pmagplotlib.drawFIGS(AZD) mpars=pmag.domean(araiblock[1],start,end,'DE-BFL') if verbose: print 'pTRM direction= ','%7.1f'%(mpars['specimen_dec']),' %7.1f'%(mpars['specimen_inc']),' MAD:','%7.1f'%(mpars['specimen_mad']) if AniSpec!="": CpTRM=pmag.Dir_anis_corr([mpars['specimen_dec'],mpars['specimen_inc']],AniSpec) AniSpecRec=pmag.doaniscorr(PmagSpecRec,AniSpec) if verbose: print 'Anisotropy corrected TRM direction= ','%7.1f'%(CpTRM[0]),' %7.1f'%(CpTRM[1]) print 'Anisotropy corrected intensity= ',float(AniSpecRec['specimen_int'])*1e6 else: print 'error on specimen ',s except: pass if verbose and found==0: print ' None found :( ' if spc!="": if BEG!="": pars,errcode=pmag.PintPars(datablock,araiblock,zijdblock,BEG,END,accept) pars['measurement_step_unit']="K" pars["specimen_lab_field_dc"]=field pars["specimen_int"]=-1*field*pars["specimen_b"] pars["er_specimen_name"]=s pars['specimen_grade']='' # ungraded pmagplotlib.plotB(AZD,araiblock,zijdblock,pars) if verbose:pmagplotlib.drawFIGS(AZD) if len(trmblock)>2: if inlt==0: inlt=1 blab=field best=pars["specimen_int"] Bs,TRMs=[],[] for trec in trmblock: Bs.append(float(trec['treatment_dc_field'])) TRMs.append(float(trec['measurement_magn_moment'])) NLpars=nlt.NLtrm(Bs,TRMs,best,blab,0) # calculate best fit parameters through TRM acquisition data, and get new banc # Mp,Bp=[],[] for k in range(int(max(Bs)*1e6)): Bp.append(float(k)*1e-6) npred=nlt.TRM(Bp[-1],NLpars['xopt'][0],NLpars['xopt'][1]) # predicted NRM for this field files={} for key in AZD.keys(): files[key]=s+'_'+key+fmt pmagplotlib.saveP(AZD,files,dpi=dpi) sys.exit() if verbose: ans='b' while ans != "": print """ s[a]ve plot, set [b]ounds for calculation, [d]elete current interpretation, [p]revious, [s]ample, [q]uit: """ ans=raw_input('Return for next specimen \n') if ans=="": specimen +=1 if ans=="d": save_redo(PriorRecs,inspec) CurrRec=[] pmagplotlib.plotAZ(AZD,araiblock,zijdblock,s,units[0]) if verbose:pmagplotlib.drawFIGS(AZD) if ans=='a': files={} for key in AZD.keys(): files[key]="LO:_"+locname+'_SI:_'+PmagSpecRec['er_site_name']+'_SA:_'+PmagSpecRec['er_sample_name']+'_SP:_'+s+'_CO:_s_TY:_'+key+fmt pmagplotlib.saveP(AZD,files) ans="" if ans=='q': print "Good bye" sys.exit() if ans=='p': specimen =specimen -1 backup = 1 ans="" if ans=='s': keepon=1 spec=raw_input('Enter desired specimen name (or first part there of): ') while keepon==1: try: specimen =sids.index(spec) keepon=0 except: tmplist=[] for qq in range(len(sids)): if spec in sids[qq]:tmplist.append(sids[qq]) print specimen," not found, but this was: " print tmplist spec=raw_input('Select one or try again\n ') ans="" if ans=='b': if end==0 or end >=len(zijdblock):end=len(zijdblock)-1 GoOn=0 while GoOn==0: answer=raw_input('Enter index of first point for calculation: ['+str(start)+'] ') try: start=int(answer) answer=raw_input('Enter index of last point for calculation: ['+str(end)+'] ') end=int(answer) if start >=0 and start <len(zijdblock)-2 and end >0 and end <len(zijdblock) or start>=end: GoOn=1 else: print "Bad endpoints - try again! " start,end=0,len(zijdblock) except ValueError: print "Bad endpoints - try again! " start,end=0,len(zijdblock) s=sids[specimen] pars,errcode=pmag.PintPars(datablock,araiblock,zijdblock,start,end,accept) pars['measurement_step_unit']="K" pars["specimen_lab_field_dc"]=field pars["specimen_int"]=-1*field*pars["specimen_b"] pars["er_specimen_name"]=s pars,kill=pmag.scoreit(pars,PmagSpecRec,accept,'',0) PmagSpecRec['specimen_scat']=pars['specimen_scat'] PmagSpecRec['specimen_frac']='%5.3f'%(pars['specimen_frac']) PmagSpecRec['specimen_gmax']='%5.3f'%(pars['specimen_gmax']) PmagSpecRec["measurement_step_min"]='%8.3e' % (pars["measurement_step_min"]) PmagSpecRec["measurement_step_max"]='%8.3e' % (pars["measurement_step_max"]) PmagSpecRec["measurement_step_unit"]="K" PmagSpecRec["specimen_int_n"]='%i'%(pars["specimen_int_n"]) PmagSpecRec["specimen_lab_field_dc"]='%8.3e'%(pars["specimen_lab_field_dc"]) PmagSpecRec["specimen_int"]='%9.4e '%(pars["specimen_int"]) PmagSpecRec["specimen_b"]='%5.3f '%(pars["specimen_b"]) PmagSpecRec["specimen_q"]='%5.1f '%(pars["specimen_q"]) PmagSpecRec["specimen_f"]='%5.3f '%(pars["specimen_f"]) PmagSpecRec["specimen_fvds"]='%5.3f'%(pars["specimen_fvds"]) PmagSpecRec["specimen_b_beta"]='%5.3f'%(pars["specimen_b_beta"]) PmagSpecRec["specimen_int_mad"]='%7.1f'%(pars["specimen_int_mad"]) PmagSpecRec["specimen_Z"]='%7.1f'%(pars["specimen_Z"]) PmagSpecRec["specimen_gamma"]='%7.1f'%(pars["specimen_gamma"]) PmagSpecRec["specimen_grade"]=pars["specimen_grade"] if pars["method_codes"]!="": tmpcodes=pars["method_codes"].split(":") for t in tmpcodes: if t.strip() not in methcodes:methcodes.append(t.strip()) PmagSpecRec["specimen_dec"]='%7.1f'%(pars["specimen_dec"]) PmagSpecRec["specimen_inc"]='%7.1f'%(pars["specimen_inc"]) PmagSpecRec["specimen_tilt_correction"]='-1' PmagSpecRec["specimen_direction_type"]='l' PmagSpecRec["direction_type"]='l' # this is redundant, but helpful - won't be imported PmagSpecRec["specimen_int_dang"]='%7.1f '%(pars["specimen_int_dang"]) PmagSpecRec["specimen_drats"]='%7.1f '%(pars["specimen_drats"]) PmagSpecRec["specimen_drat"]='%7.1f '%(pars["specimen_drat"]) PmagSpecRec["specimen_int_ptrm_n"]='%i '%(pars["specimen_int_ptrm_n"]) PmagSpecRec["specimen_rsc"]='%6.4f '%(pars["specimen_rsc"]) PmagSpecRec["specimen_md"]='%i '%(int(pars["specimen_md"])) if PmagSpecRec["specimen_md"]=='-1':PmagSpecRec["specimen_md"]="" PmagSpecRec["specimen_b_sigma"]='%5.3f '%(pars["specimen_b_sigma"]) if "IE-TT" not in methcodes:methcodes.append("IE-TT") methods="" for meth in methcodes: methods=methods+meth+":" PmagSpecRec["magic_method_codes"]=methods[:-1] PmagSpecRec["specimen_description"]=comment PmagSpecRec["magic_software_packages"]=version_num pmagplotlib.plotAZ(AZD,araiblock,zijdblock,s,units[0]) pmagplotlib.plotB(AZD,araiblock,zijdblock,pars) if verbose:pmagplotlib.drawFIGS(AZD) if len(trmblock)>2: blab=field best=pars["specimen_int"] Bs,TRMs=[],[] for trec in trmblock: Bs.append(float(trec['treatment_dc_field'])) TRMs.append(float(trec['measurement_magn_moment'])) NLpars=nlt.NLtrm(Bs,TRMs,best,blab,0) # calculate best fit parameters through TRM acquisition data, and get new banc Mp,Bp=[],[] for k in range(int(max(Bs)*1e6)): Bp.append(float(k)*1e-6) npred=nlt.TRM(Bp[-1],NLpars['xopt'][0],NLpars['xopt'][1]) # predicted NRM for this field Mp.append(npred) pmagplotlib.plotTRM(AZD['TRM'],Bs,TRMs,Bp,Mp,NLpars,trec['magic_experiment_name']) if verbose: print 'Non-linear TRM corrected intensity= ',float(NLpars['banc'])*1e6 if verbose:pmagplotlib.drawFIGS(AZD) pars["specimen_lab_field_dc"]=field pars["specimen_int"]=-1*field*pars["specimen_b"] pars,kill=pmag.scoreit(pars,PmagSpecRec,accept,'',verbose) saveit=raw_input("Save this interpretation? [y]/n \n") if saveit!='n': PriorRecs.append(PmagSpecRec) # put back an interpretation specimen+=1 save_redo(PriorRecs,inspec) ans="" elif plots==1: specimen+=1 if fmt != ".pmag": files={} for key in AZD.keys(): files[key]="LO:_"+locname+'_SI:_'+PmagSpecRec['er_site_name']+'_SA:_'+PmagSpecRec['er_sample_name']+'_SP:_'+s+'_CO:_s_TY:_'+key+'_'+fmt if pmagplotlib.isServer: black = '#000000' purple = '#800080' titles={} titles['deremag']='DeReMag Plot' titles['zijd']='Zijderveld Plot' titles['arai']='Arai Plot' AZD = pmagplotlib.addBorders(AZD,titles,black,purple) pmagplotlib.saveP(AZD,files,dpi=dpi) # pmagplotlib.combineFigs(s,files,3) else: # save in pmag format script="grep "+s+" output.mag | thellier -mfsi" script=script+' %8.4e'%(field) min='%i'%((pars["measurement_step_min"]-273)) Max='%i'%((pars["measurement_step_max"]-273)) script=script+" "+min+" "+Max script=script+" |plotxy;cat mypost >>thellier.ps\n" pltf.write(script) pmag.domagicmag(outf,MeasRecs) if len(CurrRec)>0: for rec in CurrRec: PriorRecs.append(rec) CurrRec=[] if plots!=1 and verbose: ans=raw_input(" Save last plot? 1/[0] ") if ans=="1": if fmt != ".pmag": files={} for key in AZD.keys(): files[key]=s+'_'+key+fmt pmagplotlib.saveP(AZD,files,dpi=dpi) else: print "\n Good bye\n" sys.exit() if len(CurrRec)>0:PriorRecs.append(CurrRec) # put back an interpretation if len(PriorRecs)>0: save_redo(PriorRecs,inspec) print 'Updated interpretations saved in ',inspec if verbose: print "Good bye"
def main(command_line=True, **kwargs): """ NAME pmd_magic.py DESCRIPTION converts PMD (Enkin) format files to magic_measurements format files SYNTAX pmd_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -Fsa: specify er_samples format file for appending, default is new er_samples.txt -spc NUM : specify number of characters to designate a specimen, default = 1 -loc LOCNAME : specify location/study name -A: don't average replicate measurements -ncn NCON: specify naming convention -mcd [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name same as sample [6] site is entered under a separate column -- NOT CURRENTLY SUPPORTED [7-Z] [XXXX]YYY: XXXX is site designation with Z characters with sample name XXXXYYYY NB: all others you will have to customize your self or e-mail [email protected] for help. INPUT PMD format files """ # initialize some stuff noave=0 inst="" samp_con,Z='1',"" missing=1 demag="N" er_location_name="unknown" citation='This study' args=sys.argv meth_code="LP-NO" specnum=-1 MagRecs=[] version_num=pmag.get_version() Samps=[] # keeps track of sample orientations DIspec=[] MagFiles=[] user="" mag_file="" dir_path='.' ErSamps=[] SampOuts=[] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path=sys.argv[ind+1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind+1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print main.__doc__ return False if '-F' in args: ind=args.index("-F") meas_file = args[ind+1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind+1] #try: # open(samp_file,'rU') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file= args[ind+1] if "-spc" in args: ind = args.index("-spc") specnum = int(args[ind+1]) if "-ncn" in args: ind=args.index("-ncn") samp_con=sys.argv[ind+1] if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-A" in args: noave=1 if "-mcd" in args: ind=args.index("-mcd") meth_code=args[ind+1] if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') samp_file = kwargs.get('samp_file', 'er_samples.txt') specnum = kwargs.get('specnum', 0) samp_con = kwargs.get('samp_con', '1') er_location_name = kwargs.get('er_location_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") print samp_con # format variables mag_file = input_dir_path+"/" + mag_file meas_file = output_dir_path+"/" + meas_file samp_file = output_dir_path+"/" + samp_file if specnum!=0:specnum=-specnum if "4" in samp_con: if "-" not in samp_con: print "naming convention option [4] must be in form 4-Z where Z is an integer" return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="4" if "7" in samp_con: if "-" not in samp_con: print "option [7] must be in form 7-Z where Z is an integer" return False, "naming convention option [7] must be in form 7-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="7" # parse data data=open(mag_file,'rU').readlines() # read in data from file comment=data[0] line=data[1].strip() line=line.replace("=","= ") # make finding orientations easier rec=line.split() # read in sample orientation, etc. er_specimen_name=rec[0] ErSampRec,ErSiteRec={},{} # make a sample record if specnum!=0: er_sample_name=rec[0][:specnum] else: er_sample_name=rec[0] if len(ErSamps)>0: # need to copy existing for samp in ErSamps: if samp['er_sample_name']==er_sample_name: ErSampRec=samp # we'll ammend this one else: SampOuts.append(samp) # keep all the others if int(samp_con)<6: er_site_name=pmag.parse_site(er_sample_name,samp_con,Z) else: if 'er_site_name' in ErSampRec.keys():er_site_name=ErSampREc['er_site_name'] if 'er_location_name' in ErSampRec.keys():er_location_name=ErSampREc['er_location_name'] az_ind=rec.index('a=')+1 ErSampRec['er_sample_name']=er_sample_name ErSampRec['er_sample_description']=comment ErSampRec['sample_azimuth']=rec[az_ind] dip_ind=rec.index('b=')+1 dip=-float(rec[dip_ind]) ErSampRec['sample_dip']='%7.1f'%(dip) strike_ind=rec.index('s=')+1 ErSampRec['sample_bed_dip_direction']='%7.1f'%(float(rec[strike_ind])+90.) bd_ind=rec.index('d=')+1 ErSampRec['sample_bed_dip']=rec[bd_ind] v_ind=rec.index('v=')+1 vol=rec[v_ind][:-3] date=rec[-2] time=rec[-1] ErSampRec['magic_method_codes']=meth_code if 'er_location_name' not in ErSampRec.keys():ErSampRec['er_location_name']=er_location_name if 'er_site_name' not in ErSampRec.keys():ErSampRec['er_site_name']=er_site_name if 'er_citation_names' not in ErSampRec.keys():ErSampRec['er_citation_names']='This study' if 'magic_method_codes' not in ErSampRec.keys():ErSampRec['magic_method_codes']='SO-NO' SampOuts.append(ErSampRec) for k in range(3,len(data)): # read in data line=data[k] rec=line.split() if len(rec)>1: # skip blank lines at bottom MagRec={} MagRec['measurement_description']='Date: '+date+' '+time MagRec["er_citation_names"]="This study" MagRec['er_location_name']=er_location_name MagRec['er_site_name']=er_site_name MagRec['er_sample_name']=er_sample_name MagRec['magic_software_packages']=version_num MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"]='g' MagRec["measurement_standard"]='u' MagRec["measurement_number"]='1' MagRec["er_specimen_name"]=er_specimen_name if rec[0]=='NRM': meas_type="LT-NO" elif rec[0][0]=='M' or rec[0][0]=='H': meas_type="LT-AF-Z" elif rec[0][0]=='T': meas_type="LT-T-Z" else: print "measurement type unknown" return False, "measurement type unknown" X=[float(rec[1]),float(rec[2]),float(rec[3])] Vec=pmag.cart2dir(X) MagRec["measurement_magn_moment"]='%10.3e'% (Vec[2]) # Am^2 MagRec["measurement_magn_volume"]=rec[4] # A/m MagRec["measurement_dec"]='%7.1f'%(Vec[0]) MagRec["measurement_inc"]='%7.1f'%(Vec[1]) MagRec["treatment_ac_field"]='0' if meas_type!='LT-NO': treat=float(rec[0][1:]) else: treat=0 if meas_type=="LT-AF-Z": MagRec["treatment_ac_field"]='%8.3e' %(treat*1e-3) # convert from mT to tesla elif meas_type=="LT-T-Z": MagRec["treatment_temp"]='%8.3e' % (treat+273.) # temp in kelvin MagRec['magic_method_codes']=meas_type MagRecs.append(MagRec) MagOuts=pmag.measurements_methods(MagRecs,noave) pmag.magic_write(meas_file,MagOuts,'magic_measurements') print "results put in ",meas_file pmag.magic_write(samp_file,SampOuts,'er_samples') print "sample orientations put in ",samp_file return True, meas_file
def main(command_line=True, **kwargs): """ NAME old_iodp_jr6_magic.py DESCRIPTION converts shipboard .jr6 format files to magic_measurements format files SYNTAX old_iodp_jr6_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -fsa FILE: specify er_samples.txt file for sample name lookup , default is 'er_samples.txt' -loc HOLE : specify hole name (U1456A) -A: don't average replicate measurements INPUT JR6 .jr6 format file """ def fix_separation(filename, new_filename): old_file = open(filename, 'rU') data = old_file.readlines() new_data = [] for line in data: new_line = line.replace('-', ' -') new_line = new_line.replace(' ', ' ') new_data.append(new_line) new_file = open(new_filename, 'w') for s in new_data: new_file.write(s) old_file.close() new_file.close() return new_filename def old_fix_separation(filename, new_filename): old_file = open(filename, 'rU') data = old_file.readlines() new_data = [] for line in data: new_line = [] for i in line.split(): if '-' in i[1:]: lead_char = '-' if i[0] == '-' else '' if lead_char: v = i[1:].split('-') else: v = i.split('-') new_line.append(lead_char + v[0]) new_line.append('-' + v[1]) else: new_line.append(i) new_line = (' '.join(new_line)) + '\n' new_data.append(new_line) new_file = open(new_filename, 'w') for s in new_data: new_file.write(s) new_file.close() old_file.close() return new_filename # initialize some stuff noave=0 volume=2.5**3 #default volume is a 2.5cm cube inst="" samp_con,Z='5',"" missing=1 demag="N" er_location_name="unknown" citation='This study' args=sys.argv meth_code="LP-NO" version_num=pmag.get_version() dir_path='.' MagRecs=[] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' mag_file = '' # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path=sys.argv[ind+1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind+1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print main.__doc__ return False if '-F' in args: ind=args.index("-F") meas_file = args[ind+1] if '-fsa' in args: ind = args.index("-fsa") samp_file = args[ind+1] if samp_file[0]!='/': samp_file = os.path.join(input_dir_path, samp_file) try: open(samp_file,'rU') ErSamps,file_type=pmag.magic_read(samp_file) except: print samp_file,' not found: ' print ' download csv file and import to MagIC with iodp_samples_magic.py' if '-f' in args: ind = args.index("-f") mag_file= args[ind+1] if "-loc" in args: ind=args.index("-loc") er_location_name=args[ind+1] if "-A" in args: noave=1 if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file', '') samp_file = kwargs.get('samp_file', 'er_samples.txt') specnum = kwargs.get('specnum', 1) samp_con = kwargs.get('samp_con', '1') if len(str(samp_con)) > 1: samp_con, Z = samp_con.split('-') else: Z = '' er_location_name = kwargs.get('er_location_name', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") # format variables meth_code=meth_code+":FS-C-DRILL-IODP:SP-SS-C:SO-V" meth_code=meth_code.strip(":") if mag_file: mag_file = os.path.join(input_dir_path, mag_file) samp_file = os.path.join(input_dir_path, samp_file) meas_file = os.path.join(output_dir_path, meas_file) # validate variables if not mag_file: print "You must provide an IODP_jr6 format file" return False, "You must provide an IODP_jr6 format file" if not os.path.exists(mag_file): print 'The input file you provided: {} does not exist.\nMake sure you have specified the correct filename AND correct input directory name.'.format(os.path.join(input_dir_path, mag_file)) return False, 'The input file you provided: {} does not exist.\nMake sure you have specified the correct filename AND correct input directory name.'.format(magfile) if not os.path.exists(samp_file): print 'samp_file', samp_file print "Your input directory:\n{}\nmust contain an er_samples.txt file, or you must explicitly provide one".format(input_dir_path) return False, "Your input directory:\n{}\nmust contain an er_samples.txt file, or you must explicitly provide one".format(input_dir_path) # parse data temp = os.path.join(output_dir_path, 'temp.txt') fix_separation(mag_file, temp) #os.rename('temp.txt', mag_file) #data = open(mag_file, 'rU').readlines() data=pd.read_csv(temp, delim_whitespace=True,header=None) os.remove(temp) samples,filetype = pmag.magic_read(samp_file) data.columns=['specname','step','negz','y','x','expon','sample_azimuth','sample_dip','sample_bed_dip_direction','sample_bed_dip','bed_dip_dir2','bed_dip2','param1','param2','param3','param4','measurement_csd'] cart=np.array([data['x'],data['y'],-data['negz']]).transpose() dir= pmag.cart2dir(cart).transpose() data['measurement_dec']=dir[0] data['measurement_inc']=dir[1] data['measurement_magn_volume']=dir[2]*(10.0**data['expon']) # A/m - data in A/m data['measurement_flag']='g' data['measurement_standard']='u' data['measurement_number']='1' data['measurement_temp']='273' data['er_location_name']=er_location_name for rowNum, row in data.iterrows(): MagRec={} spec_text_id=row['specname'].split('_')[1] SampRecs=pmag.get_dictitem(samples,'er_sample_alternatives',spec_text_id,'has') # retrieve sample record for this specimen if len(SampRecs)>0: # found one MagRec['er_specimen_name']=SampRecs[0]['er_sample_name'] MagRec['er_sample_name']=MagRec['er_specimen_name'] MagRec['er_site_name']=MagRec['er_specimen_name'] MagRec["er_citation_names"]="This study" MagRec['er_location_name']=er_location_name MagRec['magic_software_packages']=version_num MagRec["treatment_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_temp"]='%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"]='g' MagRec["measurement_standard"]='u' MagRec["measurement_number"]='1' MagRec["treatment_ac_field"]='0' volume=float(SampRecs[0]['sample_volume']) moment=row['measurement_magn_volume'] * volume MagRec["measurement_magn_moment"]=str(moment) MagRec["measurement_magn_volume"]=str(row['measurement_magn_volume']) MagRec["measurement_dec"]='%7.1f'%(row['measurement_dec']) MagRec["measurement_inc"]='%7.1f'%(row['measurement_inc']) if row['step'] == 'NRM': meas_type="LT-NO" elif row['step'][0:2] == 'AD': meas_type="LT-AF-Z" treat=float(row['step'][2:]) MagRec["treatment_ac_field"]='%8.3e' %(treat*1e-3) # convert from mT to tesla elif row['step'][0] == 'TD': meas_type="LT-T-Z" treat=float(row['step'][2:]) MagRec["treatment_temp"]='%8.3e' % (treat+273.) # temp in kelvin elif row['step'][0:3]=='ARM': # meas_type="LT-AF-I" treat=float(row['step'][3:]) MagRec["treatment_ac_field"]='%8.3e' %(treat*1e-3) # convert from mT to tesla MagRec["treatment_dc_field"]='%8.3e' %(50e-6) # assume 50uT DC field MagRec["measurement_description"]='Assumed DC field - actual unknown' elif row['step'][0:3]=='IRM': # meas_type="LT-IRM" treat=float(row['step'][3:]) MagRec["treatment_dc_field"]='%8.3e' %(treat*1e-3) # convert from mT to tesla else: print 'unknown treatment type for ',row return False, 'unknown treatment type for ',row MagRec['magic_method_codes']=meas_type MagRecs.append(MagRec.copy()) else: print 'sample name not found: ',row['specname'] MagOuts=pmag.measurements_methods(MagRecs,noave) file_created, error_message = pmag.magic_write(meas_file,MagOuts,'magic_measurements') if file_created: return True, meas_file else: return False, 'Results not written to file'
def main(): """ NAME quick_hyst.py DESCRIPTION makes plots of hysteresis data SYNTAX quick_hyst.py [command line options] OPTIONS -h prints help message and quits -usr USER: identify user, default is "" -f: specify input file, default is magic_measurements.txt -spc SPEC: specify specimen name to plot and quit -sav save all plots and quit -fmt [png,svg,eps,jpg] """ args = sys.argv PLT = 1 plots = 0 user, meas_file = "", "magic_measurements.txt" pltspec = "" dir_path = '.' fmt = 'png' verbose = pmagplotlib.verbose version_num = pmag.get_version() if '-WD' in args: ind = args.index('-WD') dir_path = args[ind+1] if "-h" in args: print(main.__doc__) sys.exit() if "-usr" in args: ind = args.index("-usr") user = args[ind+1] if '-f' in args: ind = args.index("-f") meas_file = args[ind+1] if '-sav' in args: verbose = 0 plots = 1 if '-spc' in args: ind = args.index("-spc") pltspec = args[ind+1] verbose = 0 plots = 1 if '-fmt' in args: ind = args.index("-fmt") fmt = args[ind+1] meas_file = dir_path+'/'+meas_file # # meas_data, file_type = pmag.magic_read(meas_file) if file_type != 'magic_measurements': print(main.__doc__) print('bad file') sys.exit() # # initialize some variables # define figure numbers for hyst,deltaM,DdeltaM curves HystRecs, RemRecs = [], [] HDD = {} HDD['hyst'] = 1 pmagplotlib.plot_init(HDD['hyst'], 5, 5) # # get list of unique experiment names and specimen names # experiment_names, sids = [], [] hyst_data = pmag.get_dictitem( meas_data, 'magic_method_codes', 'LP-HYS', 'has') # get all hysteresis data for rec in hyst_data: if 'er_synthetic_name' in rec.keys() and rec['er_synthetic_name'] != "": rec['er_specimen_name'] = rec['er_synthetic_name'] if rec['magic_experiment_name'] not in experiment_names: experiment_names.append(rec['magic_experiment_name']) if rec['er_specimen_name'] not in sids: sids.append(rec['er_specimen_name']) if 'measurement_temp' not in rec.keys(): # assume room T measurement unless otherwise specified rec['measurement_temp'] = '300' # k = 0 if pltspec != "": k = sids.index(pltspec) intlist = ['measurement_magnitude', 'measurement_magn_moment', 'measurement_magn_volume', 'measurement_magn_mass'] while k < len(sids): locname, site, sample, synth = '', '', '', '' s = sids[k] hmeths = [] if verbose: print(s, k+1, 'out of ', len(sids)) # # B, M = [], [] # B,M for hysteresis, Bdcd,Mdcd for irm-dcd data # get all measurements for this specimen spec = pmag.get_dictitem(hyst_data, 'er_specimen_name', s, 'T') if 'er_location_name' in spec[0].keys(): locname = spec[0]['er_location_name'] if 'er_site_name' in spec[0].keys(): site = spec[0]['er_site_name'] if 'er_sample_name' in spec[0].keys(): sample = spec[0]['er_sample_name'] if 'er_synthetic_name' in spec[0].keys(): synth = spec[0]['er_synthetic_name'] for m in intlist: # get all non-blank data for this specimen meas_data = pmag.get_dictitem(spec, m, '', 'F') if len(meas_data) > 0: break c = ['k-', 'b-', 'c-', 'g-', 'm-', 'r-', 'y-'] cnum = 0 if len(meas_data) > 0: Temps = [] xlab, ylab, title = '', '', '' for rec in meas_data: if rec['measurement_temp'] not in Temps: Temps.append(rec['measurement_temp']) for t in Temps: print('working on t: ', t) t_data = pmag.get_dictitem( meas_data, 'measurement_temp', t, 'T') B, M = [], [] for rec in t_data: B.append(float(rec['measurement_lab_field_dc'])) M.append(float(rec[m])) # now plot the hysteresis curve(s) # if len(B) > 0: B = numpy.array(B) M = numpy.array(M) if t == Temps[-1]: xlab = 'Field (T)' ylab = m title = 'Hysteresis: '+s if t == Temps[0]: pmagplotlib.clearFIG(HDD['hyst']) pmagplotlib.plot_xy( HDD['hyst'], B, M, sym=c[cnum], xlab=xlab, ylab=ylab, title=title) pmagplotlib.plot_xy(HDD['hyst'], [ 1.1*B.min(), 1.1*B.max()], [0, 0], sym='k-', xlab=xlab, ylab=ylab, title=title) pmagplotlib.plot_xy(HDD['hyst'], [0, 0], [ 1.1*M.min(), 1.1*M.max()], sym='k-', xlab=xlab, ylab=ylab, title=title) if verbose: pmagplotlib.draw_figs(HDD) cnum += 1 if cnum == len(c): cnum = 0 # files = {} if plots: if pltspec != "": s = pltspec files = {} for key in HDD.keys(): if pmagplotlib.isServer: # use server plot naming convention if synth == '': filename = "LO:_"+locname+'_SI:_'+site + \ '_SA:_'+sample+'_SP:_'+s+'_TY:_'+key+'_.'+fmt else: filename = 'SY:_'+synth+'_TY:_'+key+'_.'+fmt files[key] = filename else: # use more readable plot naming convention if synth == '': filename = '' for item in [locname, site, sample, s, key]: if item: item = item.replace(' ', '_') filename += item + '_' if filename.endswith('_'): filename = filename[:-1] filename += ".{}".format(fmt) else: filename = synth+'_'+key+'.fmt' files[key] = filename pmagplotlib.save_plots(HDD, files) if pltspec != "": sys.exit() if verbose: pmagplotlib.draw_figs(HDD) ans = raw_input( "S[a]ve plots, [s]pecimen name, [q]uit, <return> to continue\n ") if ans == "a": files = {} for key in HDD.keys(): if pmagplotlib.isServer: print('server') files[key] = "LO:_"+locname+'_SI:_'+site + \ '_SA:_'+sample+'_SP:_'+s+'_TY:_'+key+'_.'+fmt else: print('not server') filename = '' for item in [locname, site, sample, s, key]: if item: item = item.replace(' ', '_') filename += item + '_' if filename.endswith('_'): filename = filename[:-1] filename += ".{}".format(fmt) files[key] = filename print('files', files) pmagplotlib.save_plots(HDD, files) if ans == '': k += 1 if ans == "p": del HystRecs[-1] k -= 1 if ans == 'q': print("Good bye") sys.exit() if ans == 's': keepon = 1 specimen = raw_input( 'Enter desired specimen name (or first part there of): ') while keepon == 1: try: k = sids.index(specimen) keepon = 0 except: tmplist = [] for qq in range(len(sids)): if specimen in sids[qq]: tmplist.append(sids[qq]) print(specimen, " not found, but this was: ") print(tmplist) specimen = raw_input('Select one or try again\n ') k = sids.index(specimen) else: k += 1 if len(B) == 0: if verbose: print('skipping this one - no hysteresis data') k += 1
def convert(**kwargs): version_num = pmag.get_version() dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path user = kwargs.get('user', '') meas_file = kwargs.get('meas_file', 'measurements.txt') # outfile spec_file = kwargs.get('spec_file', 'specimens.txt') # specimen outfile samp_file = kwargs.get('samp_file', 'samples.txt') # sample outfile site_file = kwargs.get('site_file', 'sites.txt') # site outfile loc_file = kwargs.get('loc_file', 'locations.txt') # location outfile mag_file = kwargs.get('mag_file') specnum = kwargs.get('specnum', 1) samp_con = kwargs.get('samp_con', '1') location = kwargs.get('location', 'unknown') lat = kwargs.get('lat', '') lon = kwargs.get('lon', '') noave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") volume = float(kwargs.get('volume', 2.5)) * 1e-6 timezone = kwargs.get('timestamp', 'UTC') # format variables mag_file = os.path.join(input_dir_path, mag_file) if specnum != 0: specnum = -int(specnum) if samp_con.startswith("4"): if "-" not in samp_con: print("option [4] must be in form 4-Z where Z is an integer") return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: Z = samp_con.split("-")[1] samp_con = "4" elif samp_con.startswith("7"): if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "naming convention option [7] must be in form 7-Z where Z is an integer" else: Z = samp_con.split("-")[1] samp_con = "7" else: Z = 1 #create data holders MeasRecs, SpecRecs, SampRecs, SiteRecs, LocRecs = [], [], [], [], [] # parse data data = open(mag_file, 'r') line = data.readline() line = data.readline() line = data.readline() while line != '': parsedLine = line.split() if len(parsedLine) >= 4: sampleName = parsedLine[0] demagLevel = parsedLine[2] date = parsedLine[3] + ":0:0:0" line = data.readline() line = data.readline() line = data.readline() line = data.readline() parsedLine = line.split() specimenAngleDec = parsedLine[1] specimenAngleInc = parsedLine[2] while parsedLine[0] != 'MEAN': line = data.readline() parsedLine = line.split() if len(parsedLine) == 0: parsedLine = ["Hello"] Mx = parsedLine[1] My = parsedLine[2] Mz = parsedLine[3] line = data.readline() line = data.readline() parsedLine = line.split() splitExp = parsedLine[2].split('A') intensityVolStr = parsedLine[1] + splitExp[0] intensityVol = float(intensityVolStr) # check and see if Prec is too big and messes with the parcing. precisionStr = '' if len(parsedLine) == 6: #normal line precisionStr = parsedLine[5][0:-1] else: precisionStr = parsedLine[4][0:-1] precisionPer = float(precisionStr) precision = intensityVol * precisionPer / 100 while parsedLine[0] != 'SPEC.': line = data.readline() parsedLine = line.split() if len(parsedLine) == 0: parsedLine = ["Hello"] specimenDec = parsedLine[2] specimenInc = parsedLine[3] line = data.readline() line = data.readline() parsedLine = line.split() geographicDec = parsedLine[1] geographicInc = parsedLine[2] # Add data to various MagIC data tables. specimen = sampleName if specnum != 0: sample = specimen[:specnum] else: sample = specimen site = pmag.parse_site(sample, samp_con, Z) MeasRec, SpecRec, SampRec, SiteRec, LocRec = {}, {}, {}, {}, {} if specimen != "" and specimen not in [ x['specimen'] if 'specimen' in list(x.keys()) else "" for x in SpecRecs ]: SpecRec['specimen'] = specimen SpecRec['sample'] = sample SpecRec["citations"] = "This study" SpecRec["analysts"] = user SpecRec['volume'] = volume SpecRecs.append(SpecRec) if sample != "" and sample not in [ x['sample'] if 'sample' in list(x.keys()) else "" for x in SampRecs ]: SampRec['sample'] = sample SampRec['site'] = site SampRec["citations"] = "This study" SampRec["analysts"] = user SampRec['azimuth'] = specimenAngleDec sample_dip = str(float(specimenAngleInc) - 90.0) #convert to magic orientation SampRec['dip'] = sample_dip SampRec['method_codes'] = meth_code SampRecs.append(SampRec) if site != "" and site not in [ x['site'] if 'site' in list(x.keys()) else "" for x in SiteRecs ]: SiteRec['site'] = site SiteRec['location'] = location SiteRec["citations"] = "This study" SiteRec["analysts"] = user SiteRec['lat'] = lat SiteRec['lon'] = lon SiteRecs.append(SiteRec) if location != "" and location not in [ x['location'] if 'location' in list(x.keys()) else "" for x in LocRecs ]: LocRec['location'] = location LocRec["citations"] = "This study" LocRec["analysts"] = user LocRec['lat_n'] = lat LocRec['lon_e'] = lon LocRec['lat_s'] = lat LocRec['lon_w'] = lon LocRecs.append(LocRec) local = pytz.timezone(timezone) naive = datetime.datetime.strptime(date, "%m-%d-%Y:%H:%M:%S") local_dt = local.localize(naive, is_dst=None) utc_dt = local_dt.astimezone(pytz.utc) timestamp = utc_dt.strftime("%Y-%m-%dT%H:%M:%S") + "Z" MeasRec["specimen"] = specimen MeasRec["timestamp"] = timestamp MeasRec['description'] = '' MeasRec["citations"] = "This study" MeasRec['software_packages'] = version_num MeasRec["treat_temp"] = '%8.3e' % (273) # room temp in kelvin MeasRec["meas_temp"] = '%8.3e' % (273) # room temp in kelvin MeasRec["quality"] = 'g' MeasRec["standard"] = 'u' MeasRec["treat_step_num"] = '1' MeasRec["treat_ac_field"] = '0' if demagLevel == 'NRM': meas_type = "LT-NO" elif demagLevel[0] == 'A': meas_type = "LT-AF-Z" treat = float(demagLevel[1:]) MeasRec["treat_ac_field"] = '%8.3e' % ( treat * 1e-3) # convert from mT to tesla elif demagLevel[0] == 'T': meas_type = "LT-T-Z" treat = float(demagLevel[1:]) MeasRec["treat_temp"] = '%8.3e' % (treat + 273. ) # temp in kelvin else: print("measurement type unknown", demag_level) return False, "measurement type unknown" MeasRec["magn_moment"] = str(intensityVol * volume) # Am^2 MeasRec["magn_volume"] = intensityVolStr # A/m MeasRec["dir_dec"] = specimenDec MeasRec["dir_inc"] = specimenInc MeasRec['method_codes'] = meas_type MeasRecs.append(MeasRec) #read lines till end of record line = data.readline() line = data.readline() line = data.readline() line = data.readline() line = data.readline() # read all the rest of the special characters. Some data files not consistantly formatted. while (len(line) <= 3 and line != ''): line = data.readline() #end of data while loop data.close() con = nb.Contribution(output_dir_path, read_tables=[]) con.add_magic_table_from_data(dtype='specimens', data=SpecRecs) con.add_magic_table_from_data(dtype='samples', data=SampRecs) con.add_magic_table_from_data(dtype='sites', data=SiteRecs) con.add_magic_table_from_data(dtype='locations', data=LocRecs) MeasOuts = pmag.measurements_methods3(MeasRecs, noave) con.add_magic_table_from_data(dtype='measurements', data=MeasOuts) con.tables['specimens'].write_magic_file(custom_name=spec_file) con.tables['samples'].write_magic_file(custom_name=samp_file) con.tables['sites'].write_magic_file(custom_name=site_file) con.tables['locations'].write_magic_file(custom_name=loc_file) con.tables['measurements'].write_magic_file(custom_name=meas_file) return True, meas_file
def main(): """ NAME aarm_magic.py DESCRIPTION Converts AARM data to best-fit tensor (6 elements plus sigma) Original program ARMcrunch written to accomodate ARM anisotropy data collected from 6 axial directions (+X,+Y,+Z,-X,-Y,-Z) using the off-axis remanence terms to construct the tensor. A better way to do the anisotropy of ARMs is to use 9,12 or 15 measurements in the Hext rotational scheme. SYNTAX aarm_magic.py [-h][command line options] OPTIONS -h prints help message and quits -usr USER: identify user, default is "" -f FILE: specify input file, default is aarm_measurements.txt -crd [s,g,t] specify coordinate system, requires er_samples.txt file -fsa FILE: specify er_samples.txt file, default is er_samples.txt -Fa FILE: specify anisotropy output file, default is arm_anisotropy.txt -Fr FILE: specify results output file, default is aarm_results.txt INPUT Input for the present program is a series of baseline, ARM pairs. The baseline should be the AF demagnetized state (3 axis demag is preferable) for the following ARM acquisition. The order of the measurements is: positions 1,2,3, 6,7,8, 11,12,13 (for 9 positions) positions 1,2,3,4, 6,7,8,9, 11,12,13,14 (for 12 positions) positions 1-15 (for 15 positions) """ # initialize some parameters args = sys.argv user = "" meas_file = "aarm_measurements.txt" samp_file = "er_samples.txt" rmag_anis = "arm_anisotropy.txt" rmag_res = "aarm_results.txt" dir_path = '.' # # get name of file from command line # if '-WD' in args: ind = args.index('-WD') dir_path = args[ind + 1] if "-h" in args: print main.__doc__ sys.exit() if "-usr" in args: ind = args.index("-usr") user = sys.argv[ind + 1] if "-f" in args: ind = args.index("-f") meas_file = sys.argv[ind + 1] coord = '-1' if "-crd" in sys.argv: ind = sys.argv.index("-crd") coord = sys.argv[ind + 1] if coord == 's': coord = '-1' if coord == 'g': coord = '0' if coord == 't': coord = '100' if "-fsa" in args: ind = args.index("-fsa") samp_file = sys.argv[ind + 1] if "-Fa" in args: ind = args.index("-Fa") rmag_anis = args[ind + 1] if "-Fr" in args: ind = args.index("-Fr") rmag_res = args[ind + 1] meas_file = dir_path + '/' + meas_file samp_file = dir_path + '/' + samp_file rmag_anis = dir_path + '/' + rmag_anis rmag_res = dir_path + '/' + rmag_res # read in data meas_data, file_type = pmag.magic_read(meas_file) meas_data = pmag.get_dictitem(meas_data, 'magic_method_codes', 'LP-AN-ARM', 'has') if file_type != 'magic_measurements': print file_type print file_type, "This is not a valid magic_measurements file " sys.exit() if coord != '-1': # need to read in sample data samp_data, file_type = pmag.magic_read(samp_file) if file_type != 'er_samples': print file_type print file_type, "This is not a valid er_samples file " print "Only specimen coordinates will be calculated" coord = '-1' # # sort the specimen names # ssort = [] for rec in meas_data: spec = rec["er_specimen_name"] if spec not in ssort: ssort.append(spec) if len(ssort) > 1: sids = sorted(ssort) else: sids = ssort # # work on each specimen # specimen = 0 RmagSpecRecs, RmagResRecs = [], [] while specimen < len(sids): s = sids[specimen] data = [] RmagSpecRec = {} RmagResRec = {} method_codes = [] # # find the data from the meas_data file for this sample # data = pmag.get_dictitem(meas_data, 'er_specimen_name', s, 'T') # # find out the number of measurements (9, 12 or 15) # npos = len(data) / 2 if npos == 9: # # get dec, inc, int and convert to x,y,z # B, H, tmpH = pmag.designAARM( npos) # B matrix made from design matrix for positions X = [] for rec in data: Dir = [] Dir.append(float(rec["measurement_dec"])) Dir.append(float(rec["measurement_inc"])) Dir.append(float(rec["measurement_magn_moment"])) X.append(pmag.dir2cart(Dir)) # # subtract baseline and put in a work array # work = numpy.zeros((npos, 3), 'f') for i in range(npos): for j in range(3): work[i][j] = X[2 * i + 1][j] - X[2 * i][j] # # calculate tensor elements # first put ARM components in w vector # w = numpy.zeros((npos * 3), 'f') index = 0 for i in range(npos): for j in range(3): w[index] = work[i][j] index += 1 s = numpy.zeros((6), 'f') # initialize the s matrix for i in range(6): for j in range(len(w)): s[i] += B[i][j] * w[j] trace = s[0] + s[1] + s[2] # normalize by the trace for i in range(6): s[i] = s[i] / trace a = pmag.s2a(s) #------------------------------------------------------------ # Calculating dels is different than in the Kappabridge # routine. Use trace normalized tensor (a) and the applied # unit field directions (tmpH) to generate model X,Y,Z # components. Then compare these with the measured values. #------------------------------------------------------------ S = 0. comp = numpy.zeros((npos * 3), 'f') for i in range(npos): for j in range(3): index = i * 3 + j compare = a[j][0] * tmpH[i][0] + a[j][1] * tmpH[i][1] + a[ j][2] * tmpH[i][2] comp[index] = compare for i in range(npos * 3): d = w[i] / trace - comp[i] # del values S += d * d nf = float(npos * 3 - 6) # number of degrees of freedom if S > 0: sigma = numpy.sqrt(S / nf) else: sigma = 0 RmagSpecRec["rmag_anisotropy_name"] = data[0]["er_specimen_name"] RmagSpecRec["er_location_name"] = data[0]["er_location_name"] RmagSpecRec["er_specimen_name"] = data[0]["er_specimen_name"] RmagSpecRec["er_sample_name"] = data[0]["er_sample_name"] RmagSpecRec["er_site_name"] = data[0]["er_site_name"] RmagSpecRec["magic_experiment_names"] = RmagSpecRec[ "rmag_anisotropy_name"] + ":AARM" RmagSpecRec["er_citation_names"] = "This study" RmagResRec[ "rmag_result_name"] = data[0]["er_specimen_name"] + ":AARM" RmagResRec["er_location_names"] = data[0]["er_location_name"] RmagResRec["er_specimen_names"] = data[0]["er_specimen_name"] RmagResRec["er_sample_names"] = data[0]["er_sample_name"] RmagResRec["er_site_names"] = data[0]["er_site_name"] RmagResRec["magic_experiment_names"] = RmagSpecRec[ "rmag_anisotropy_name"] + ":AARM" RmagResRec["er_citation_names"] = "This study" if "magic_instrument_codes" in data[0].keys(): RmagSpecRec["magic_instrument_codes"] = data[0][ "magic_instrument_codes"] else: RmagSpecRec["magic_instrument_codes"] = "" RmagSpecRec["anisotropy_type"] = "AARM" RmagSpecRec[ "anisotropy_description"] = "Hext statistics adapted to AARM" if coord != '-1': # need to rotate s # set orientation priorities SO_methods = [] for rec in samp_data: if "magic_method_codes" not in rec: rec['magic_method_codes'] = 'SO-NO' if "magic_method_codes" in rec: methlist = rec["magic_method_codes"] for meth in methlist.split(":"): if "SO" in meth and "SO-POM" not in meth.strip(): if meth.strip() not in SO_methods: SO_methods.append(meth.strip()) SO_priorities = pmag.set_priorities(SO_methods, 0) # continue here redo, p = 1, 0 if len(SO_methods) <= 1: az_type = SO_methods[0] orient = pmag.find_samp_rec(RmagSpecRec["er_sample_name"], samp_data, az_type) if orient["sample_azimuth"] != "": method_codes.append(az_type) redo = 0 while redo == 1: if p >= len(SO_priorities): print "no orientation data for ", s orient["sample_azimuth"] = "" orient["sample_dip"] = "" method_codes.append("SO-NO") redo = 0 else: az_type = SO_methods[SO_methods.index( SO_priorities[p])] orient = pmag.find_samp_rec( PmagSpecRec["er_sample_name"], samp_data, az_type) if orient["sample_azimuth"] != "": method_codes.append(az_type) redo = 0 p += 1 az, pl = orient['sample_azimuth'], orient['sample_dip'] s = pmag.dosgeo(s, az, pl) # rotate to geographic coordinates if coord == '100': sampe_bed_dir, sample_bed_dip = orient[ 'sample_bed_dip_direction'], orient['sample_bed_dip'] s = pmag.dostilt( s, bed_dir, bed_dip) # rotate to geographic coordinates hpars = pmag.dohext(nf, sigma, s) # # prepare for output # RmagSpecRec["anisotropy_s1"] = '%8.6f' % (s[0]) RmagSpecRec["anisotropy_s2"] = '%8.6f' % (s[1]) RmagSpecRec["anisotropy_s3"] = '%8.6f' % (s[2]) RmagSpecRec["anisotropy_s4"] = '%8.6f' % (s[3]) RmagSpecRec["anisotropy_s5"] = '%8.6f' % (s[4]) RmagSpecRec["anisotropy_s6"] = '%8.6f' % (s[5]) RmagSpecRec["anisotropy_mean"] = '%8.3e' % (trace / 3) RmagSpecRec["anisotropy_sigma"] = '%8.6f' % (sigma) RmagSpecRec["anisotropy_unit"] = "Am^2" RmagSpecRec["anisotropy_n"] = '%i' % (npos) RmagSpecRec["anisotropy_tilt_correction"] = coord RmagSpecRec["anisotropy_F"] = '%7.1f ' % ( hpars["F"] ) # used by thellier_gui - must be taken out for uploading RmagSpecRec["anisotropy_F_crit"] = hpars[ "F_crit"] # used by thellier_gui - must be taken out for uploading RmagResRec["anisotropy_t1"] = '%8.6f ' % (hpars["t1"]) RmagResRec["anisotropy_t2"] = '%8.6f ' % (hpars["t2"]) RmagResRec["anisotropy_t3"] = '%8.6f ' % (hpars["t3"]) RmagResRec["anisotropy_v1_dec"] = '%7.1f ' % (hpars["v1_dec"]) RmagResRec["anisotropy_v2_dec"] = '%7.1f ' % (hpars["v2_dec"]) RmagResRec["anisotropy_v3_dec"] = '%7.1f ' % (hpars["v3_dec"]) RmagResRec["anisotropy_v1_inc"] = '%7.1f ' % (hpars["v1_inc"]) RmagResRec["anisotropy_v2_inc"] = '%7.1f ' % (hpars["v2_inc"]) RmagResRec["anisotropy_v3_inc"] = '%7.1f ' % (hpars["v3_inc"]) RmagResRec["anisotropy_ftest"] = '%7.1f ' % (hpars["F"]) RmagResRec["anisotropy_ftest12"] = '%7.1f ' % (hpars["F12"]) RmagResRec["anisotropy_ftest23"] = '%7.1f ' % (hpars["F23"]) RmagResRec["result_description"] = 'Critical F: ' + hpars[ "F_crit"] + ';Critical F12/F13: ' + hpars["F12_crit"] if hpars["e12"] > hpars["e13"]: RmagResRec["anisotropy_v1_zeta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v1_zeta_dec"] = '%7.1f ' % ( hpars['v2_dec']) RmagResRec["anisotropy_v1_zeta_inc"] = '%7.1f ' % ( hpars['v2_inc']) RmagResRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v1_eta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v1_eta_dec"] = '%7.1f ' % ( hpars['v3_dec']) RmagResRec["anisotropy_v1_eta_inc"] = '%7.1f ' % ( hpars['v3_inc']) RmagResRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v3_eta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v3_eta_inc"] = '%7.1f ' % ( hpars['v1_inc']) else: RmagResRec["anisotropy_v1_zeta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v1_zeta_dec"] = '%7.1f ' % ( hpars['v3_dec']) RmagResRec["anisotropy_v1_zeta_inc"] = '%7.1f ' % ( hpars['v3_inc']) RmagResRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v1_eta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v1_eta_dec"] = '%7.1f ' % ( hpars['v2_dec']) RmagResRec["anisotropy_v1_eta_inc"] = '%7.1f ' % ( hpars['v2_inc']) RmagResRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v2_eta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v2_eta_inc"] = '%7.1f ' % ( hpars['v1_inc']) if hpars["e23"] > hpars['e12']: RmagResRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( hpars['e23']) RmagResRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( hpars['v3_dec']) RmagResRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( hpars['v3_inc']) RmagResRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( hpars['e23']) RmagResRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( hpars['v2_dec']) RmagResRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( hpars['v2_inc']) RmagResRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v3_eta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v3_eta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v2_eta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v2_eta_inc"] = '%7.1f ' % ( hpars['v1_inc']) else: RmagResRec["anisotropy_v2_zeta_semi_angle"] = '%7.1f ' % ( hpars['e12']) RmagResRec["anisotropy_v2_zeta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v2_zeta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v3_eta_semi_angle"] = '%7.1f ' % ( hpars['e23']) RmagResRec["anisotropy_v3_eta_dec"] = '%7.1f ' % ( hpars['v2_dec']) RmagResRec["anisotropy_v3_eta_inc"] = '%7.1f ' % ( hpars['v2_inc']) RmagResRec["anisotropy_v3_zeta_semi_angle"] = '%7.1f ' % ( hpars['e13']) RmagResRec["anisotropy_v3_zeta_dec"] = '%7.1f ' % ( hpars['v1_dec']) RmagResRec["anisotropy_v3_zeta_inc"] = '%7.1f ' % ( hpars['v1_inc']) RmagResRec["anisotropy_v2_eta_semi_angle"] = '%7.1f ' % ( hpars['e23']) RmagResRec["anisotropy_v2_eta_dec"] = '%7.1f ' % ( hpars['v3_dec']) RmagResRec["anisotropy_v2_eta_inc"] = '%7.1f ' % ( hpars['v3_inc']) RmagResRec["tilt_correction"] = '-1' RmagResRec["anisotropy_type"] = 'AARM' RmagResRec["magic_method_codes"] = 'LP-AN-ARM:AE-H' RmagSpecRec["magic_method_codes"] = 'LP-AN-ARM:AE-H' RmagResRec["magic_software_packages"] = pmag.get_version() RmagSpecRec["magic_software_packages"] = pmag.get_version() specimen += 1 RmagSpecRecs.append(RmagSpecRec) RmagResRecs.append(RmagResRec) else: print 'skipping specimen ', s, ' only 9 positions supported', '; this has ', npos specimen += 1 if rmag_anis == "": rmag_anis = "rmag_anisotropy.txt" pmag.magic_write(rmag_anis, RmagSpecRecs, 'rmag_anisotropy') print "specimen tensor elements stored in ", rmag_anis if rmag_res == "": rmag_res = "rmag_results.txt" pmag.magic_write(rmag_res, RmagResRecs, 'rmag_results') print "specimen statistics and eigenparameters stored in ", rmag_res
def main(command_line=True, **kwargs): """ NAME iodp_dscr_magic.py DESCRIPTION converts ODP LIMS discrete sample format files to magic_measurements format files SYNTAX iodp_descr_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input .csv file, default is all in directory -F FILE: specify output measurements file, default is magic_measurements.txt -A : don't average replicate measurements INPUTS IODP discrete sample .csv file format exported from LIMS database """ # # initialize defaults version_num = pmag.get_version() meas_file = 'magic_measurements.txt' csv_file = '' MagRecs, Specs = [], [] citation = "This study" dir_path, demag = '.', 'NRM' args = sys.argv noave = 0 # get command line args if command_line: if '-WD' in args: ind = args.index("-WD") dir_path = args[ind + 1] if '-ID' in args: ind = args.index('-ID') input_dir_path = args[ind + 1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print(main.__doc__) return False if "-A" in args: noave = 1 if '-f' in args: ind = args.index("-f") csv_file = args[ind + 1] if '-F' in args: ind = args.index("-F") meas_file = args[ind + 1] if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path # rename dir_path after input_dir_path is set noave = kwargs.get('noave', 0) # default (0) is DO average csv_file = kwargs.get('csv_file', '') meas_file = kwargs.get('meas_file', 'magic_measurements.txt') # format variables meas_file = os.path.join(output_dir_path, meas_file) if csv_file == "": filelist = os.listdir( input_dir_path) # read in list of files to import else: csv_file = os.path.join(input_dir_path, csv_file) filelist = [csv_file] # parsing the data file_found = False for fname in filelist: # parse each file if fname[-3:].lower() == 'csv': file_found = True print('processing: ', fname) with open(fname, 'r') as finput: data = list(finput.readlines()) keys = data[0].replace('\n', '').split(',') # splits on underscores interval_key = "Offset (cm)" demag_key = "Demag level (mT)" offline_demag_key = "Treatment Value (mT or °C)" offline_treatment_type = "Treatment type" run_key = "Test No." if "Inclination background + tray corrected (deg)" in keys: inc_key = "Inclination background + tray corrected (deg)" if "Inclination background & tray corrected (deg)" in keys: inc_key = "Inclination background & tray corrected (deg)" if "Declination background + tray corrected (deg)" in keys: dec_key = "Declination background + tray corrected (deg)" if "Declination background & tray corrected (deg)" in keys: dec_key = "Declination background & tray corrected (deg)" if "Intensity background + tray corrected (A/m)" in keys: int_key = "Intensity background + tray corrected (A/m)" if "Intensity background & tray corrected (A/m)" in keys: int_key = "Intensity background & tray corrected (A/m)" type = "Type" sect_key = "Sect" half_key = "A/W" # need to add volume_key to LORE format! if "Sample volume (cm^3)" in keys: volume_key = "Sample volume (cm^3)" if "Sample volume (cc)" in keys: volume_key = "Sample volume (cc)" if "Sample volume (cm³)" in keys: volume_key = "Sample volume (cm³)" for line in data[1:]: InRec = {} for k in range(len(keys)): InRec[keys[k]] = line.split(',')[k] inst = "IODP-SRM" MagRec = {} expedition = InRec['Exp'] location = InRec['Site'] + InRec['Hole'] offsets = InRec[interval_key].split( '.' ) # maintain consistency with er_samples convention of using top interval if len(offsets) == 1: offset = int(offsets[0]) else: offset = int(offsets[0]) - 1 #interval=str(offset+1)# maintain consistency with er_samples convention of using top interval interval = str( offset ) # maintain consistency with er_samples convention of using top interval specimen = expedition + '-' + location + '-' + InRec[ 'Core'] + InRec[type] + "-" + InRec[ sect_key] + '_' + InRec[half_key] + '_' + interval if specimen not in Specs: Specs.append(specimen) MagRec['er_expedition_name'] = expedition MagRec['er_location_name'] = location MagRec['er_site_name'] = specimen MagRec['er_citation_names'] = citation MagRec['er_specimen_name'] = specimen MagRec['er_sample_name'] = specimen MagRec['er_site_name'] = specimen # set up measurement record - default is NRM MagRec['magic_software_packages'] = version_num MagRec["treatment_temp"] = '%8.3e' % (273 ) # room temp in kelvin MagRec["measurement_temp"] = '%8.3e' % ( 273) # room temp in kelvin MagRec["treatment_ac_field"] = '0' MagRec["treatment_dc_field"] = '0' MagRec["treatment_dc_field_phi"] = '0' MagRec["treatment_dc_field_theta"] = '0' MagRec["measurement_flag"] = 'g' # assume all data are "good" MagRec[ "measurement_standard"] = 'u' # assume all data are "good" MagRec["measurement_csd"] = '0' # assume all data are "good" volume = InRec[volume_key] MagRec["magic_method_codes"] = 'LT-NO' sort_by = 'treatment_ac_field' # set default to AF demag if InRec[demag_key] != "0": MagRec['magic_method_codes'] = 'LT-AF-Z' inst = inst + ':IODP-SRM-AF' # measured on shipboard in-line 2G AF treatment_value = float( InRec[demag_key].strip('"')) * 1e-3 # convert mT => T if sort_by == "treatment_ac_field": MagRec[ "treatment_ac_field"] = treatment_value # AF demag in treat mT => T else: MagRec["treatment_ac_field"] = str( treatment_value) # AF demag in treat mT => T elif offline_treatment_type in list( InRec.keys()) and InRec[offline_treatment_type] != "": if "Lowrie" in InRec['Comments']: MagRec['magic_method_codes'] = 'LP-IRM-3D' treatment_value = float(InRec[offline_demag_key].strip( '"')) + 273. # convert C => K MagRec["treatment_temp"] = treatment_value MagRec["treatment_ac_field"] = "0" sort_by = 'treatment_temp' elif 'Isothermal' in InRec[offline_treatment_type]: MagRec['magic_method_codes'] = 'LT-IRM' treatment_value = float(InRec[offline_demag_key].strip( '"')) * 1e-3 # convert mT => T MagRec["treatment_dc_field"] = treatment_value MagRec["treatment_ac_field"] = "0" sort_by = 'treatment_dc_field' MagRec[ "measurement_standard"] = 'u' # assume all data are "good" vol = float(volume) * 1e-6 # convert from cc to m^3 if run_key in list(InRec.keys()): run_number = InRec[run_key] MagRec['external_database_ids'] = run_number MagRec['external_database_names'] = 'LIMS' else: MagRec['external_database_ids'] = "" MagRec['external_database_names'] = '' MagRec[ 'measurement_description'] = 'sample orientation: ' + InRec[ 'Sample orientation'] MagRec['measurement_inc'] = InRec[inc_key].strip('"') MagRec['measurement_dec'] = InRec[dec_key].strip('"') intens = InRec[int_key].strip('"') MagRec['measurement_magn_moment'] = '%8.3e' % ( float(intens) * vol ) # convert intensity from A/m to Am^2 using vol MagRec['magic_instrument_codes'] = inst MagRec['measurement_number'] = '1' MagRec['measurement_positions'] = '' MagRecs.append(MagRec) if not file_found: print("No .csv files were found") return False, "No .csv files were found" MagOuts = [] for spec in Specs: Speclist = pmag.get_dictitem(MagRecs, 'er_specimen_name', spec, 'T') Meassorted = sorted(Speclist, key=lambda x, y=None: int( round(float(x[sort_by]) - float(y[sort_by]))) if y != None else 0) for rec in Meassorted: for key in list(rec.keys()): rec[key] = str(rec[key]) MagOuts.append(rec) Fixed = pmag.measurements_methods(MagOuts, noave) Out, keys = pmag.fillkeys(Fixed) if pmag.magic_write(meas_file, Out, 'magic_measurements'): print('data stored in ', meas_file) return True, meas_file else: print('no data found. bad magfile?') return False, 'no data found. bad magfile?'
def main(command_line=True, **kwargs): """ NAME utrecht_magic.py DESCRIPTION converts Utrecht magnetometer data files to magic_measurements files SYNTAX utrecht_magic.py [command line options] OPTIONS -h: prints the help message and quits. -f FILE: specify input file, or -F FILE: specify output file, default is magic_measurements.txt -Fsa: specify er_samples format file for appending, default is new er_samples.txt (Not working yet) -loc LOCNAME : specify location/study name -site SITENAME : specify site name -lat latitude of samples -lon longitude of samples -A: don't average replicate measurements -mcd [SO-MAG,SO-SUN,SO-SIGHT...] supply how these samples were oriented INPUT Utrecht magnetometer data file """ # initialize some stuff sample_lat = 0.0 sample_lon = 0.0 noave = 0 er_location_name = "unknown" er_site_name = "unknown" args = sys.argv meth_code = "LP-NO" version_num = pmag.get_version() mag_file = "" dir_path = '.' MagRecs = [] SampOuts = [] samp_file = 'er_samples.txt' meas_file = 'magic_measurements.txt' meth_code = "" # # get command line arguments # if command_line: if '-WD' in sys.argv: ind = sys.argv.index('-WD') dir_path = sys.argv[ind + 1] if '-ID' in sys.argv: ind = sys.argv.index('-ID') input_dir_path = sys.argv[ind + 1] else: input_dir_path = dir_path output_dir_path = dir_path if "-h" in args: print main.__doc__ return False if '-F' in args: ind = args.index("-F") meas_file = args[ind + 1] if '-Fsa' in args: ind = args.index("-Fsa") samp_file = args[ind + 1] #try: # open(samp_file,'rU') # ErSamps,file_type=pmag.magic_read(samp_file) # print 'sample information will be appended to ', samp_file #except: # print samp_file,' not found: sample information will be stored in new er_samples.txt file' # samp_file = output_dir_path+'/er_samples.txt' if '-f' in args: ind = args.index("-f") mag_file = args[ind + 1] if "-loc" in args: ind = args.index("-loc") er_location_name = args[ind + 1] if "-lat" in args: ind = args.index("-lat") sample_lat = args[ind + 1] if "-lon" in args: ind = args.index("-lon") sample_lon = args[ind + 1] if "-site" in args: ind = args.index("-site") er_site_name = args[ind + 1] if "-A" in args: noave = 1 if "-mcd" in args: ind = args.index("-mcd") meth_code = args[ind + 1] #samp_con='5' if not command_line: dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'magic_measurements.txt') mag_file = kwargs.get('mag_file') samp_file = kwargs.get('samp_file', 'er_samples.txt') er_location_name = kwargs.get('er_location_name', '') er_site_name = kwargs.get('er_site_name', '') sample_lat = kwargs.get('sample_lat', '') sample_lon = kwargs.get('sample_lon', '') #oave = kwargs.get('noave', 0) # default (0) means DO average meth_code = kwargs.get('meth_code', "LP-NO") # format variables if not mag_file: return False, 'You must provide a Utrecht formated file' mag_file = os.path.join(input_dir_path, mag_file) meas_file = os.path.join(output_dir_path, meas_file) samp_file = os.path.join(output_dir_path, samp_file) ErSampRec = {} # parse data # Open up the Utrecht file and read the header information print 'mag_file in utrecht_file', mag_file data = open(mag_file, 'rU') line = data.readline() line_items = line.split(',') operator = line_items[0] operator = operator.replace("\"", "") machine = line_items[1] machine = machine.replace("\"", "") machine = machine.rstrip('\n') print "operator=", operator print "machine=", machine line = data.readline() while line != '"END"': line_items = line.split(',') sample_name = line_items[0] sample_name = sample_name.replace("\"", "") print "sample_name=", sample_name free_string = line_items[1] free_string = free_string.replace("\"", "") print "free_string=", free_string dec = line_items[2] print "dec=", dec inc = line_items[3] print "inc=", inc volume = float(line_items[4]) volume = volume * 1e-6 # enter volume in cm^3, convert to m^3 print "volume=", volume bed_plane = line_items[5] print "bed_plane=", bed_plane bed_tilt = line_items[6] print "bed_tilt=", bed_tilt # Configure et er_samples table ErSampRec['er_sample_name'] = sample_name ErSampRec['sample_azimuth'] = dec ErSampRec['sample_dip'] = inc ErSampRec['sample_bed_dip_direction'] = bed_plane ErSampRec['sample_bed_tilt'] = bed_tilt ErSampRec['sample_lat'] = sample_lat ErSampRec['sample_lon'] = sample_lon ErSampRec['magic_method_codes'] = meth_code ErSampRec['er_location_name'] = er_location_name ErSampRec['er_site_name'] = er_site_name ErSampRec['er_citation_names'] = 'This study' SampOuts.append(ErSampRec.copy()) line = data.readline() line = line.rstrip("\n") items = line.split(",") # exit() while line != '9999': print line step = items[0] step = step.split('.') step_value = step[0] step_type = "" if len(step) == 2: step_type = step[1] A = float(items[1]) B = float(items[2]) C = float(items[3]) # convert to MagIC coordinates Z = -A X = -B Y = C cart = np.array([X, Y, Z]).transpose() direction = pmag.cart2dir(cart).transpose() measurement_dec = direction[0] measurement_inc = direction[1] measurement_magn_moment = direction[ 2] * 1.0e-12 # the data are in pico-Am^2 - this converts to Am^2 measurement_magn_volume = direction[ 2] * 1.0e-12 / volume # data volume normalized - converted to A/m print "measurement_magn_moment=", measurement_magn_moment print "measurement_magn_volume=", measurement_magn_volume error = items[4] date = items[5] date = date.strip('"') date = date.split("-") print date time = items[6] time = time.strip('"') time = time.split(":") print time date_time = date[0] + ":" + date[1] + ":" + date[2] + ":" + time[ 0] + ":" + time[1] + ":" + "0.0" print date_time MagRec = {} MagRec["er_analyst_mail_names"] = operator MagRec["magic_instrument_codes"] = "Utrecht_" + machine MagRec["measurement_description"] = "free string = " + free_string MagRec["measurement_date"] = date_time MagRec["er_citation_names"] = "This study" MagRec['er_location_name'] = er_location_name MagRec['er_site_name'] = er_site_name MagRec['er_sample_name'] = sample_name MagRec['magic_software_packages'] = version_num MagRec["measurement_temp"] = '%8.3e' % (273) # room temp in kelvin MagRec["measurement_flag"] = 'g' MagRec["measurement_standard"] = 'u' MagRec[ "magic_experiment_name"] = er_location_name + er_site_name + sample_name MagRec[ "measurement_number"] = er_location_name + er_site_name + sample_name + items[ 0] MagRec["er_specimen_name"] = sample_name # MagRec["treatment_ac_field"] = '0' MagRec["treatment_temp"] = '%8.3e' % (float(step_value) + 273. ) # temp in kelvin meas_type = "LP-DIR-T" if step_value == '0': meas_type = "LT-NO" print "step_type=", step_type if step_type == '0': if meas_type == "": meas_type = "LT-T-Z" else: meas_type = meas_type + ":" + "LT-T-Z" elif step_type == '1': if meas_type == "": meas_type = "LT-T-I" else: meas_type = meas_type + ":" + "LT-T-I" elif step_type == '2': if meas_type == "": meas_type = "LT-PTRM-I" else: meas_type = meas_type + ":" + "LT-PTRM-I" elif step_type == '3': if meas_type == "": meas_type = "LT-PTRM-Z" else: meas_type = meas_type + ":" + "LT-PTRM-Z" print "meas_type=", meas_type MagRec['magic_method_codes'] = meas_type MagRec["measurement_magn_moment"] = measurement_magn_moment MagRec["measurement_magn_volume"] = measurement_magn_volume MagRec["measurement_dec"] = measurement_dec MagRec["measurement_inc"] = measurement_inc MagRec['measurement_csd'] = error # MagRec['measurement_positions'] = '1' MagRecs.append(MagRec.copy()) line = data.readline() line = line.rstrip("\n") items = line.split(",") line = data.readline() line = line.rstrip("\n") items = line.split(",") # write out the data to MagIC data files pmag.magic_write(samp_file, SampOuts, 'er_samples') print "sample orientations put in ", samp_file # MagOuts = pmag.measurements_methods(MagRecs, noave) # pmag.magic_write(meas_file, MagOuts, 'magic_measurements') pmag.magic_write(meas_file, MagRecs, 'magic_measurements') print "results put in ", meas_file print "exit!" return True, meas_file
def convert(**kwargs): # initialize defaults version_num = pmag.get_version() dir_path = kwargs.get('dir_path', '.') input_dir_path = kwargs.get('input_dir_path', dir_path) output_dir_path = dir_path # rename dir_path after input_dir_path is set noave = kwargs.get('noave', False) # default is DO average csv_file = kwargs.get('csv_file', '') meas_file = kwargs.get('meas_file', 'measurements.txt') spec_file = kwargs.get('spec_file', 'specimens.txt') samp_file = kwargs.get('samp_file', 'samples.txt') site_file = kwargs.get('site_file', 'sites.txt') loc_file = kwargs.get('loc_file', 'locations.txt') lat = kwargs.get('lat', '') lon = kwargs.get('lon', '') volume = kwargs.get('volume', 2.5** 3) * 1e-6 #default volume is a 2.5cm cube # format variables if csv_file == "": filelist = os.listdir( input_dir_path) # read in list of files to import else: csv_file = os.path.join(input_dir_path, csv_file) filelist = [csv_file] # parsing the data file_found, citations = False, "This Study" MeasRecs, SpecRecs, SampRecs, SiteRecs, LocRecs = [], [], [], [], [] for fin in filelist: # parse each file if fin[-3:].lower() == 'csv': file_found = True print('processing: ', fin) indata = open(fin, 'r').readlines() keys = indata[0].replace('\n', '').split(',') # splits on underscores keys = [k.strip('"') for k in keys] interval_key = "Offset (cm)" if "Treatment Value (mT or \xc2\xb0C)" in keys: demag_key = "Treatment Value (mT or \xc2\xb0C)" elif "Treatment Value" in keys: demag_key = "Treatment Value" elif "Treatment Value (mT or °C)" in keys: demag_key = "Treatment Value (mT or °C)" elif "Demag level (mT)" in keys: demag_key = "Demag level (mT)" else: print("couldn't find demag level") if "Treatment type" in keys: treatment_type = "Treatment type" elif "Treatment Type" in keys: treatment_type = "Treatment Type" else: treatment_type = "" run_key = "Test No." if "Inclination background + tray corrected (deg)" in keys: inc_key = "Inclination background + tray corrected (deg)" elif "Inclination background & tray corrected (deg)" in keys: inc_key = "Inclination background & tray corrected (deg)" elif "Inclination background & tray corrected (deg)" in keys: inc_key = "Inclination background & tray corrected (deg)" elif "Inclination background & drift corrected (deg)" in keys: inc_key = "Inclination background & drift corrected (deg)" else: print("couldn't find inclination") if "Declination background + tray corrected (deg)" in keys: dec_key = "Declination background + tray corrected (deg)" elif "Declination background & tray corrected (deg)" in keys: dec_key = "Declination background & tray corrected (deg)" elif "Declination background & tray corrected (deg)" in keys: dec_key = "Declination background & tray corrected (deg)" elif "Declination background & drift corrected (deg)" in keys: dec_key = "Declination background & drift corrected (deg)" else: print("couldn't find declination") if "Intensity background + tray corrected (A/m)" in keys: int_key = "Intensity background + tray corrected (A/m)" elif "Intensity background & tray corrected (A/m)" in keys: int_key = "Intensity background & tray corrected (A/m)" elif "Intensity background & tray corrected (A/m)" in keys: int_key = "Intensity background & tray corrected (A/m)" elif "Intensity background & drift corrected (A/m)" in keys: int_key = "Intensity background & drift corrected (A/m)" else: print("couldn't find magnetic moment") type_val = "Type" sect_key = "Sect" half_key = "A/W" # need to add volume_key to LORE format! if "Sample volume (cm^3)" in keys: volume_key = "Sample volume (cm^3)" elif "Sample volume (cc)" in keys: volume_key = "Sample volume (cc)" elif "Sample volume (cm³)" in keys: volume_key = "Sample volume (cm³)" elif "Sample volume (cm\xc2\xb3)" in keys: volume_key = "Sample volume (cm\xc2\xb3)" else: volume_key = "" for line in indata[1:]: InRec = {} MeasRec, SpecRec, SampRec, SiteRec, LocRec = {}, {}, {}, {}, {} for k in range(len(keys)): InRec[keys[k]] = line.split(',')[k].strip('"') inst = "IODP-SRM" expedition = InRec['Exp'] location = InRec['Site'] + InRec['Hole'] offsets = InRec[interval_key].split( '.' ) # maintain consistency with er_samples convention of using top interval if len(offsets) == 1: offset = int(offsets[0]) else: offset = int(offsets[0]) - 1 #interval=str(offset+1)# maintain consistency with er_samples convention of using top interval interval = str( offset ) # maintain consistency with er_samples convention of using top interval specimen = expedition + '-' + location + '-' + InRec[ 'Core'] + InRec[type_val] + "-" + InRec[ sect_key] + '-' + InRec[half_key] + '-' + str( InRec[interval_key]) sample = expedition + '-' + location + '-' + InRec[ 'Core'] + InRec[type_val] site = expedition + '-' + location if volume_key in list(InRec.keys()): volume = InRec[volume_key] if not InRec[dec_key].strip( """ " ' """) or not InRec[inc_key].strip(""" " ' """): print("No dec or inc found for specimen %s, skipping" % specimen) if specimen != "" and specimen not in [ x['specimen'] if 'specimen' in list(x.keys()) else "" for x in SpecRecs ]: SpecRec['specimen'] = specimen SpecRec['sample'] = sample SpecRec['volume'] = volume SpecRec['citations'] = citations SpecRecs.append(SpecRec) if sample != "" and sample not in [ x['sample'] if 'sample' in list(x.keys()) else "" for x in SampRecs ]: SampRec['sample'] = sample SampRec['site'] = site SampRec['citations'] = citations SampRec['azimuth'] = '0' SampRec['dip'] = '0' SampRec['method_codes'] = 'FS-C-DRILL-IODP:SO-V' SampRecs.append(SampRec) if site != "" and site not in [ x['site'] if 'site' in list(x.keys()) else "" for x in SiteRecs ]: SiteRec['site'] = site SiteRec['location'] = location SiteRec['citations'] = citations SiteRec['lat'] = lat SiteRec['lon'] = lon SiteRecs.append(SiteRec) if location != "" and location not in [ x['location'] if 'location' in list(x.keys()) else "" for x in LocRecs ]: LocRec['location'] = location LocRec['citations'] = citations LocRec['expedition_name'] = expedition LocRec['lat_n'] = lat LocRec['lon_e'] = lon LocRec['lat_s'] = lat LocRec['lon_w'] = lon LocRecs.append(LocRec) MeasRec['specimen'] = specimen # set up measurement record - default is NRM MeasRec['software_packages'] = version_num MeasRec["treat_temp"] = '%8.3e' % (273) # room temp in kelvin MeasRec["meas_temp"] = '%8.3e' % (273) # room temp in kelvin MeasRec["treat_ac_field"] = '0' MeasRec["treat_dc_field"] = '0' MeasRec["treat_dc_field_phi"] = '0' MeasRec["treat_dc_field_theta"] = '0' MeasRec["quality"] = 'g' # assume all data are "good" MeasRec["standard"] = 'u' # assume all data are "good" MeasRec["dir_csd"] = '0' # assume all data are "good" MeasRec["method_codes"] = 'LT-NO' sort_by = 'treat_ac_field' # set default to AF demag if treatment_type in list( InRec.keys()) and InRec[treatment_type] != "": if "AF" in InRec[treatment_type].upper(): MeasRec['method_codes'] = 'LT-AF-Z' inst = inst + ':IODP-SRM-AF' # measured on shipboard in-line 2G AF treatment_value = float(InRec[demag_key].strip( '"')) * 1e-3 # convert mT => T MeasRec["treat_ac_field"] = str( treatment_value) # AF demag in treat mT => T elif "T" in InRec[treatment_type].upper(): MeasRec['method_codes'] = 'LT-T-Z' inst = inst + ':IODP-TDS' # measured on shipboard Schonstedt thermal demagnetizer treatment_value = float(InRec[demag_key].strip( '"')) + 273 # convert C => K MeasRec["treat_temp"] = str(treatment_value) elif "Lowrie" in InRec['Comments']: MeasRec['method_codes'] = 'LP-IRM-3D' treatment_value = float(InRec[demag_key].strip( '"')) + 273. # convert C => K MeasRec["treat_temp"] = str(treatment_value) MeasRec["treat_ac_field"] = "0" sort_by = 'treat_temp' elif 'Isothermal' in InRec[treatment_type]: MeasRec['method_codes'] = 'LT-IRM' treatment_value = float(InRec[demag_key].strip( '"')) * 1e-3 # convert mT => T MeasRec["treat_dc_field"] = str(treatment_value) MeasRec["treat_ac_field"] = "0" sort_by = 'treat_dc_field' elif InRec[demag_key] != "0" and InRec[ demag_key] != "": #Assume AF if there is no Treatment typ info MeasRec['method_codes'] = 'LT-AF-Z' inst = inst + ':IODP-SRM-AF' # measured on shipboard in-line 2G AF treatment_value = float( InRec[demag_key].strip('"')) * 1e-3 # convert mT => T MeasRec[ "treat_ac_field"] = treatment_value # AF demag in treat mT => T MeasRec["standard"] = 'u' # assume all data are "good" vol = float(volume) if run_key in list(InRec.keys()): run_number = InRec[run_key] MeasRec['external_database_ids'] = {'LIMS': run_number} else: MeasRec['external_database_ids'] = "" MeasRec['description'] = 'sample orientation: ' + InRec[ 'Sample orientation'] MeasRec['dir_inc'] = InRec[inc_key].strip('"') MeasRec['dir_dec'] = InRec[dec_key].strip('"') intens = InRec[int_key].strip('"') MeasRec['magn_moment'] = '%8.3e' % ( float(intens) * vol ) # convert intensity from A/m to Am^2 using vol MeasRec['instrument_codes'] = inst MeasRec['treat_step_num'] = '1' MeasRec['meas_n_orient'] = '' MeasRecs.append(MeasRec) if not file_found: print("No .csv files were found") return False, "No .csv files were found" con = nb.Contribution(output_dir_path, read_tables=[]) con.add_magic_table_from_data(dtype='specimens', data=SpecRecs) con.add_magic_table_from_data(dtype='samples', data=SampRecs) con.add_magic_table_from_data(dtype='sites', data=SiteRecs) con.add_magic_table_from_data(dtype='locations', data=LocRecs) MeasSort = sorted( MeasRecs, lambda x, y=None: int(round(float(x[sort_by]) - float(y[sort_by]))) if y != None else 0) MeasFixed = pmag.measurements_methods3(MeasSort, noave) MeasOuts, keys = pmag.fillkeys(MeasFixed) con.add_magic_table_from_data(dtype='measurements', data=MeasOuts) con.tables['specimens'].write_magic_file(custom_name=spec_file) con.tables['samples'].write_magic_file(custom_name=samp_file) con.tables['sites'].write_magic_file(custom_name=site_file) con.tables['locations'].write_magic_file(custom_name=loc_file) con.tables['measurements'].write_magic_file(custom_name=meas_file) return True, meas_file
def main(): """ NAME zeq_magic.py DESCRIPTION reads in magic_measurements formatted file, makes plots of remanence decay during demagnetization experiments. Reads in prior interpretations saved in a pmag_specimens formatted file [and allows re-interpretations of best-fit lines and planes and saves (revised or new) interpretations in a pmag_specimens file. interpretations are saved in the coordinate system used. Also allows judicious editting of measurements to eliminate "bad" measurements. These are marked as such in the magic_measurements input file. they are NOT deleted, just ignored. ] Bracketed part not yet implemented SYNTAX zeq_magic.py [command line options] OPTIONS -h prints help message and quits -f MEASFILE: sets measurements format input file, default: measurements.txt -fsp SPECFILE: sets specimens format file with prior interpreations, default: specimens.txt -fsa SAMPFILE: sets samples format file sample=>site information, default: samples.txt -fsi SITEFILE: sets sites format file with site=>location informationprior interpreations, default: samples.txt -Fp PLTFILE: sets filename for saved plot, default is name_type.fmt (where type is zijd, eqarea or decay curve) -crd [s,g,t]: sets coordinate system, g=geographic, t=tilt adjusted, default: specimen coordinate system -spc SPEC plots single specimen SPEC, saves plot with specified format with optional -dir settings and quits -dir [L,P,F][beg][end]: sets calculation type for principal component analysis, default is none beg: starting step for PCA calculation end: ending step for PCA calculation [L,P,F]: calculation type for line, plane or fisher mean must be used with -spc option -fmt FMT: set format of saved plot [png,svg,jpg] -A: suppresses averaging of replicate measurements, default is to average -sav: saves all plots without review SCREEN OUTPUT: Specimen, N, a95, StepMin, StepMax, Dec, Inc, calculation type """ # initialize some variables doave, e, b = 1, 0, 0 # average replicates, initial end and beginning step intlist = ['magn_moment', 'magn_volume', 'magn_mass', 'magnitude'] plots, coord = 0, 's' noorient = 0 version_num = pmag.get_version() verbose = pmagplotlib.verbose calculation_type, fmt = "", "svg" user, spec_keys, locname = "", [], '' geo, tilt, ask = 0, 0, 0 PriorRecs = [] # empty list for prior interpretations backup = 0 specimen = "" # can skip everything and just plot one specimen with bounds e,b if '-h' in sys.argv: print(main.__doc__) sys.exit() dir_path = pmag.get_named_arg_from_sys("-WD", default_val=os.getcwd()) meas_file = pmag.get_named_arg_from_sys("-f", default_val="measurements.txt") spec_file = pmag.get_named_arg_from_sys("-fsp", default_val="specimens.txt") samp_file = pmag.get_named_arg_from_sys("-fsa", default_val="samples.txt") site_file = pmag.get_named_arg_from_sys("-fsi", default_val="sites.txt") #meas_file = os.path.join(dir_path, meas_file) #spec_file = os.path.join(dir_path, spec_file) #samp_file = os.path.join(dir_path, samp_file) #site_file = os.path.join(dir_path, site_file) plot_file = pmag.get_named_arg_from_sys("-Fp", default_val="") crd = pmag.get_named_arg_from_sys("-crd", default_val="s") if crd == "s": coord = "-1" elif crd == "t": coord = "100" else: coord = "0" fmt = pmag.get_named_arg_from_sys("-fmt", "svg") specimen = pmag.get_named_arg_from_sys("-spc", default_val="") beg_pca, end_pca = "", "" if '-dir' in sys.argv: ind = sys.argv.index('-dir') direction_type = sys.argv[ind + 1] beg_pca = int(sys.argv[ind + 2]) end_pca = int(sys.argv[ind + 3]) if direction_type == 'L': calculation_type = 'DE-BFL' if direction_type == 'P': calculation_type = 'DE-BFP' if direction_type == 'F': calculation_type = 'DE-FM' if '-A' in sys.argv: doave = 0 if '-sav' in sys.argv: plots, verbose = 1, 0 # first_save = 1 fnames = { 'measurements': meas_file, 'specimens': spec_file, 'samples': samp_file, 'sites': site_file } contribution = nb.Contribution( dir_path, custom_filenames=fnames, read_tables=['measurements', 'specimens', 'samples', 'sites']) # # import specimens specimen_cols = [ 'analysts', 'aniso_ftest', 'aniso_ftest12', 'aniso_ftest23', 'aniso_s', 'aniso_s_mean', 'aniso_s_n_measurements', 'aniso_s_sigma', 'aniso_s_unit', 'aniso_tilt_correction', 'aniso_type', 'aniso_v1', 'aniso_v2', 'aniso_v3', 'citations', 'description', 'dir_alpha95', 'dir_comp', 'dir_dec', 'dir_inc', 'dir_mad_free', 'dir_n_measurements', 'dir_tilt_correction', 'experiments', 'geologic_classes', 'geologic_types', 'hyst_bc', 'hyst_bcr', 'hyst_mr_moment', 'hyst_ms_moment', 'int_abs', 'int_b', 'int_b_beta', 'int_b_sigma', 'int_corr', 'int_dang', 'int_drats', 'int_f', 'int_fvds', 'int_gamma', 'int_mad_free', 'int_md', 'int_n_measurements', 'int_n_ptrm', 'int_q', 'int_rsc', 'int_treat_dc_field', 'lithologies', 'meas_step_max', 'meas_step_min', 'meas_step_unit', 'method_codes', 'sample', 'software_packages', 'specimen' ] if 'specimens' in contribution.tables: # contribution.propagate_name_down('sample','measurements') spec_container = contribution.tables['specimens'] prior_spec_data = spec_container.get_records_for_code( 'LP-DIR', strict_match=False ) # look up all prior directional interpretations # # tie sample names to measurement data # else: spec_container, prior_spec_data = None, [] # # import samples for orientation info # if 'samples' in contribution.tables: # contribution.propagate_name_down('site','measurements') contribution.propagate_cols( col_names=['azimuth', 'dip', 'orientation_flag'], target_df_name='measurements', source_df_name='samples') # # define figure numbers for equal area, zijderveld, # and intensity vs. demagnetiztion step respectively # ZED = {} ZED['eqarea'], ZED['zijd'], ZED['demag'] = 1, 2, 3 pmagplotlib.plot_init(ZED['eqarea'], 6, 6) pmagplotlib.plot_init(ZED['zijd'], 6, 6) pmagplotlib.plot_init(ZED['demag'], 6, 6) # save_pca=0 angle, direction_type, setangle = "", "", 0 # create measurement dataframe # meas_container = contribution.tables['measurements'] meas_data = meas_container.df # meas_data = meas_data[meas_data['method_codes'].str.contains( 'LT-NO|LT-AF-Z|LT-T-Z|LT-M-Z') == True] # fish out steps for plotting meas_data = meas_data[meas_data['method_codes'].str.contains( 'AN|ARM|LP-TRM|LP-PI-ARM') == False] # strip out unwanted experiments intensity_types = [ col_name for col_name in meas_data.columns if col_name in intlist ] # plot first intensity method found - normalized to initial value anyway - # doesn't matter which used int_key = intensity_types[0] # get all the non-null intensity records of the same type meas_data = meas_data[meas_data[int_key].notnull()] if 'flag' not in meas_data.columns: meas_data['flag'] = 'g' # set the default flag to good # need to treat LP-NO specially for af data, treatment should be zero, # otherwise 273. meas_data['treatment'] = meas_data['treat_ac_field'].where( cond=meas_data['treat_ac_field'] != '0', other=meas_data['treat_temp']) meas_data['ZI'] = 1 # initialize these to one meas_data['instrument_codes'] = "" # initialize these to blank # for unusual case of microwave power.... if 'treat_mw_power' in meas_data.columns: meas_data.loc[ meas_data.treat_mw_power != 0, 'treatment'] = meas_data.treat_mw_power * meas_data.treat_mw_time # # get list of unique specimen names from measurement data # # this is a list of all the specimen names specimen_names = meas_data.specimen.unique() specimen_names = specimen_names.tolist() specimen_names.sort() # # set up new DataFrame for this sessions specimen interpretations # data_container = nb.MagicDataFrame(dtype='specimens', columns=specimen_cols) # this is for interpretations from this session current_spec_data = data_container.df locname = 'LookItUp' if specimen == "": k = 0 else: k = specimen_names.index(specimen) # let's look at the data now while k < len(specimen_names): # set the current specimen for plotting this_specimen = specimen_names[k] if verbose and this_specimen != "": print(this_specimen, k + 1, 'out of ', len(specimen_names)) if setangle == 0: angle = "" this_specimen_measurements = meas_data[ meas_data['specimen'].str.contains( this_specimen) == True] # fish out this specimen this_specimen_measurements = this_specimen_measurements[ this_specimen_measurements['flag'].str.contains( 'g') == True] # fish out this specimen if len(this_specimen_measurements) != 0: # if there are measurements # # set up datablock [[treatment,dec, inc, int, direction_type],[....]] # # # figure out the method codes # units, methods, title = "", "", this_specimen # this is a list of all the specimen method codes` meas_meths = this_specimen_measurements.method_codes.unique() tr = pd.to_numeric(this_specimen_measurements.treatment).tolist() if set(tr) == set([0]): k += 1 continue for m in meas_meths: if 'LT-AF-Z' in m: units = 'T' # units include tesla tr[0] = 0 if 'LT-T-Z' in m: units = units + ":K" # units include kelvin if 'LT-M-Z' in m: units = units + ':J' # units include joules tr[0] = 0 units = units.strip(':') # strip off extra colons if 'LP-' in m: methods = methods + ":" + m decs = pd.to_numeric(this_specimen_measurements.dir_dec).tolist() incs = pd.to_numeric(this_specimen_measurements.dir_inc).tolist() # # fix the coordinate system # if coord != '-1': # need to transform coordinates to geographic azimuths = pd.to_numeric(this_specimen_measurements.azimuth ).tolist() # get the azimuths # get the azimuths dips = pd.to_numeric(this_specimen_measurements.dip).tolist() dirs = [decs, incs, azimuths, dips] # this transposes the columns and rows of the list of lists dirs_geo = np.array(list(map(list, list(zip(*dirs))))) decs, incs = pmag.dogeo_V(dirs_geo) if coord == '100': # need to do tilt correction too bed_dip_dirs = pd.to_numeric( this_specimen_measurements.bed_dip_dir).tolist( ) # get the azimuths bed_dips = pd.to_numeric(this_specimen_measurements.bed_dip ).tolist() # get the azimuths dirs = [decs, incs, bed_dip_dirs, bed_dips] # this transposes the columns and rows of the list of lists dirs_tilt = np.array(list(map(list, list(zip(*dirs))))) decs, incs = pmag.dotilt_V(dirs_tilt) title = title + '_t' else: title = title + '_g' if angle == "": angle = decs[0] ints = pd.to_numeric(this_specimen_measurements[int_key]).tolist() ZI = this_specimen_measurements.ZI.tolist() flags = this_specimen_measurements.flag.tolist() codes = this_specimen_measurements.instrument_codes.tolist() datalist = [tr, decs, incs, ints, ZI, flags, codes] # this transposes the columns and rows of the list of lists datablock = list(map(list, list(zip(*datalist)))) pmagplotlib.plotZED(ZED, datablock, angle, title, units) if verbose: pmagplotlib.drawFIGS(ZED) # # collect info for current_specimen_interpretation dictionary # if beg_pca == "" and len(prior_spec_data) != 0: # # find prior interpretation # prior_specimen_interpretations = prior_spec_data[ prior_spec_data['specimen'].str.contains( this_specimen) == True] beg_pcas = pd.to_numeric(prior_specimen_interpretations. meas_step_min.values).tolist() end_pcas = pd.to_numeric(prior_specimen_interpretations. meas_step_max.values).tolist() spec_methods = prior_specimen_interpretations.method_codes.tolist( ) # step through all prior interpretations and plot them for ind in range(len(beg_pcas)): spec_meths = spec_methods[ind].split(':') for m in spec_meths: if 'DE-BFL' in m: calculation_type = 'DE-BFL' # best fit line if 'DE-BFP' in m: calculation_type = 'DE-BFP' # best fit plane if 'DE-FM' in m: calculation_type = 'DE-FM' # fisher mean if 'DE-BFL-A' in m: calculation_type = 'DE-BFL-A' # anchored best fit line start, end = tr.index(beg_pcas[ind]), tr.index( end_pcas[ind] ) # getting the starting and ending points # calculate direction/plane mpars = pmag.domean(datablock, start, end, calculation_type) if mpars["specimen_direction_type"] != "Error": # put it on the plot pmagplotlib.plotDir(ZED, mpars, datablock, angle) if verbose: pmagplotlib.drawFIGS(ZED) else: start, end = int(beg_pca), int(end_pca) # calculate direction/plane mpars = pmag.domean(datablock, start, end, calculation_type) if mpars["specimen_direction_type"] != "Error": # put it on the plot pmagplotlib.plotDir(ZED, mpars, datablock, angle) if verbose: pmagplotlib.drawFIGS(ZED) if plots == 1 or specimen != "": if plot_file == "": basename = title else: basename = plot_file files = {} for key in list(ZED.keys()): files[key] = basename + '_' + key + '.' + fmt pmagplotlib.saveP(ZED, files) if specimen != "": sys.exit() if verbose: recnum = 0 for plotrec in datablock: if units == 'T': print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum, plotrec[0] * 1e3, " mT", plotrec[3], plotrec[1], plotrec[2], plotrec[6])) if units == "K": print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum, plotrec[0] - 273, ' C', plotrec[3], plotrec[1], plotrec[2], plotrec[6])) if units == "J": print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum, plotrec[0], ' J', plotrec[3], plotrec[1], plotrec[2], plotrec[6])) if 'K' in units and 'T' in units: if plotrec[0] >= 1.: print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum, plotrec[0] - 273, ' C', plotrec[3], plotrec[1], plotrec[2], plotrec[6])) if plotrec[0] < 1.: print('%s: %i %7.1f %s %8.3e %7.1f %7.1f %s' % (plotrec[5], recnum, plotrec[0] * 1e3, " mT", plotrec[3], plotrec[1], plotrec[2], plotrec[6])) recnum += 1 # we have a current interpretation elif mpars["specimen_direction_type"] != "Error": # # create a new specimen record for the interpreation for this # specimen this_specimen_interpretation = { col: "" for col in specimen_cols } # this_specimen_interpretation["analysts"]=user this_specimen_interpretation['software_packages'] = version_num this_specimen_interpretation['specimen'] = this_specimen this_specimen_interpretation["method_codes"] = calculation_type this_specimen_interpretation["meas_step_unit"] = units this_specimen_interpretation["meas_step_min"] = tr[start] this_specimen_interpretation["meas_step_max"] = tr[end] this_specimen_interpretation["dir_dec"] = '%7.1f' % ( mpars['specimen_dec']) this_specimen_interpretation["dir_inc"] = '%7.1f' % ( mpars['specimen_inc']) this_specimen_interpretation["dir_dang"] = '%7.1f' % ( mpars['specimen_dang']) this_specimen_interpretation["dir_n_measurements"] = '%i' % ( mpars['specimen_n']) this_specimen_interpretation["dir_tilt_correction"] = coord methods = methods.replace(" ", "") if "T" in units: methods = methods + ":LP-DIR-AF" if "K" in units: methods = methods + ":LP-DIR-T" if "J" in units: methods = methods + ":LP-DIR-M" this_specimen_interpretation["method_codes"] = methods.strip( ':') this_specimen_interpretation[ "experiments"] = this_specimen_measurements.experiment.unique( )[0] # # print some stuff # if calculation_type != 'DE-FM': this_specimen_interpretation["dir_mad_free"] = '%7.1f' % ( mpars['specimen_mad']) this_specimen_interpretation["dir_alpha95"] = '' if verbose: if units == 'K': print( '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation[ "dir_n_measurements"]), float(this_specimen_interpretation[ "dir_mad_free"]), float( this_specimen_interpretation["dir_dang"]), float(this_specimen_interpretation[ "meas_step_min"]) - 273, float(this_specimen_interpretation[ "meas_step_max"]) - 273, float( this_specimen_interpretation["dir_dec"]), float( this_specimen_interpretation["dir_inc"]), calculation_type)) elif units == 'T': print( '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation[ "dir_n_measurements"]), float(this_specimen_interpretation[ "dir_mad_free"]), float( this_specimen_interpretation["dir_dang"]), float(this_specimen_interpretation[ "meas_step_min"]) * 1e3, float(this_specimen_interpretation[ "meas_step_max"]) * 1e3, float( this_specimen_interpretation["dir_dec"]), float( this_specimen_interpretation["dir_inc"]), calculation_type)) elif 'T' in units and 'K' in units: if float(this_specimen_interpretation[ 'meas_step_min']) < 1.0: min = float(this_specimen_interpretation[ 'meas_step_min']) * 1e3 else: min = float(this_specimen_interpretation[ 'meas_step_min']) - 273 if float(this_specimen_interpretation[ 'meas_step_max']) < 1.0: max = float(this_specimen_interpretation[ 'meas_step_max']) * 1e3 else: max = float(this_specimen_interpretation[ 'meas_step_max']) - 273 print( '%s %i %7.1f %i %i %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation[ "dir_n_measurements"]), float(this_specimen_interpretation[ "dir_mad_free"]), float( this_specimen_interpretation["dir_dang"]), min, max, float( this_specimen_interpretation["dir_dec"]), float( this_specimen_interpretation["dir_inc"]), calculation_type)) else: print( '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation[ "dir_n_measurements"]), float(this_specimen_interpretation[ "dir_mad_free"]), float( this_specimen_interpretation["dir_dang"]), float(this_specimen_interpretation[ "meas_step_min"]), float(this_specimen_interpretation[ "meas_step_max"]), float( this_specimen_interpretation["dir_dec"]), float( this_specimen_interpretation["dir_inc"]), calculation_type)) else: this_specimen_interpretation["dir_alpha95"] = '%7.1f' % ( mpars['specimen_alpha95']) this_specimen_interpretation["dir_mad_free"] = '' if verbose: if 'K' in units: print( '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation[ "dir_n_measurments"]), float(this_specimen_interpretation[ "dir_mad_free"]), float( this_specimen_interpretation["dir_dang"]), float(this_specimen_interpretation[ "meas_step_min"]) - 273, float(this_specimen_interpretation[ "meas_step_max"]) - 273, float( this_specimen_interpretation["dir_dec"]), float( this_specimen_interpretation["dir_inc"]), calculation_type)) elif 'T' in units: print( '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation[ "dir_n_measurements"]), float(this_specimen_interpretation[ "dir_alpha95"]), float( this_specimen_interpretation["dir_dang"]), float(this_specimen_interpretation[ "meas_step_min"]) * 1e3, float(this_specimen_interpretation[ "meas_step_max"]) * 1e3, float( this_specimen_interpretation["dir_dec"]), float( this_specimen_interpretation["dir_inc"]), calculation_type)) elif 'T' in units and 'K' in units: if float(this_specimen_interpretation[ 'meas_step_min']) < 1.0: min = float(this_specimen_interpretation[ 'meas_step_min']) * 1e3 else: min = float(this_specimen_interpretation[ 'meas_step_min']) - 273 if float(this_specimen_interpretation[ 'meas_step_max']) < 1.0: max = float(this_specimen_interpretation[ 'meas_step_max']) * 1e3 else: max = float(this_specimen_interpretation[ 'meas_step_max']) - 273 print('%s %i %7.1f %i %i %7.1f %7.1f %s \n' % ( this_specimen_interpretation["specimen"], int(this_specimen_interpretation[ "dir_n_measurements"]), float( this_specimen_interpretation["dir_alpha95"] ), min, max, float(this_specimen_interpretation["dir_dec"]), float(this_specimen_interpretation["dir_inc"]), calculation_type)) else: print( '%s %i %7.1f %7.1f %7.1f %7.1f %7.1f %s \n' % (this_specimen_interpretation["specimen"], int(this_specimen_interpretation[ "dir_n_measurements"]), float(this_specimen_interpretation[ "dir_alpha95"]), float(this_specimen_interpretation[ "meas_step_min"]), float(this_specimen_interpretation[ "meas_step_max"]), float( this_specimen_interpretation["dir_dec"]), float( this_specimen_interpretation["dir_inc"]), calculation_type)) if verbose: saveit = input("Save this interpretation? [y]/n \n") # START HERE # # if len(current_spec_data)==0: # no interpretations yet for this session # print "no current interpretation" # beg_pca,end_pca="","" # calculation_type="" # get the ones that meet the current coordinate system else: print("no data") if verbose: input('Ready for next specimen ') k += 1
def convert(**kwargs): # initialize some stuff methcode="LP-NO" phi,theta,peakfield,labfield=0,0,0,0 pTRM,MD=0,0 dec=[315,225,180,135,45,90,270,270,270,90,180,180,0,0,0] inc=[0,0,0,0,0,-45,-45,0,45,45,45,-45,-90,-45,45] tdec=[0,90,0,180,270,0,0,90,0] tinc=[0,0,90,0,0,-90,0,0,90] missing=1 demag="N" citations='This study' fmt='old' Samps=[] trm=0 irm=0 #get args user = kwargs.get('user', '') dir_path = kwargs.get('dir_path', '.') output_dir_path = dir_path meas_file = kwargs.get('meas_file', 'measurements.txt') spec_file = kwargs.get('spec_file', 'specimens.txt') # specimen outfile samp_file = kwargs.get('samp_file', 'samples.txt') # sample outfile site_file = kwargs.get('site_file', 'sites.txt') # site outfile loc_file = kwargs.get('loc_file', 'locations.txt') # location outfile mag_file = kwargs.get('mag_file', '') labfield = kwargs.get('labfield', '') if labfield: labfield = float(labfield) *1e-6 else: labfield = 0 phi = kwargs.get('phi', 0) if phi: phi = float(phi) else: phi = 0 theta = kwargs.get('theta', 0) if theta: theta=float(theta) else: theta = 0 peakfield = kwargs.get('peakfield', 0) if peakfield: peakfield=float(peakfield) *1e-3 else: peakfield = 0 specnum = kwargs.get('specnum', 0) samp_con = kwargs.get('samp_con', '1') location = kwargs.get('location', 'unknown') samp_infile = kwargs.get('samp_infile', '') syn = kwargs.get('syn', 0) institution = kwargs.get('institution', '') syntype = kwargs.get('syntype', '') inst = kwargs.get('inst', '') noave = kwargs.get('noave', 0) codelist = kwargs.get('codelist', '') coil = kwargs.get('coil', '') cooling_rates = kwargs.get('cooling_rates', '') lat = kwargs.get('lat', '') lon = kwargs.get('lon', '') timezone = kwargs.get('timezone', 'UTC') # make sure all initial values are correctly set up (whether they come from the command line or a GUI) if samp_infile: Samps, file_type = pmag.magic_read(samp_infile) if coil: coil = str(coil) methcode="LP-IRM" irmunits = "V" if coil not in ["1","2","3"]: print(__doc__) print('not a valid coil specification') return False, '{} is not a valid coil specification'.format(coil) if mag_file: lines = pmag.open_file(mag_file) if not lines: print("you must provide a valid mag_file") return False, "you must provide a valid mag_file" if not mag_file: print(__doc__) print("mag_file field is required option") return False, "mag_file field is required option" if specnum!=0: specnum=-specnum if "4" == samp_con[0]: if "-" not in samp_con: print("naming convention option [4] must be in form 4-Z where Z is an integer") print('---------------') return False, "naming convention option [4] must be in form 4-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="4" if "7" == samp_con[0]: if "-" not in samp_con: print("option [7] must be in form 7-Z where Z is an integer") return False, "option [7] must be in form 7-Z where Z is an integer" else: Z=samp_con.split("-")[1] samp_con="7" else: Z = 0 if codelist: codes=codelist.split(':') if "AF" in codes: demag='AF' if'-dc' not in sys.argv: methcode="LT-AF-Z" if'-dc' in sys.argv: methcode="LT-AF-I" if "T" in codes: demag="T" if '-dc' not in sys.argv: methcode="LT-T-Z" if '-dc' in sys.argv: methcode="LT-T-I" if "I" in codes: methcode="LP-IRM" irmunits="mT" if "I3d" in codes: methcode="LT-T-Z:LP-IRM-3D" if "S" in codes: demag="S" methcode="LP-PI-TRM:LP-PI-ALT-AFARM" trm_labfield=labfield ans=input("DC lab field for ARM step: [50uT] ") if ans=="": arm_labfield=50e-6 else: arm_labfield=float(ans)*1e-6 ans=input("temperature for total trm step: [600 C] ") if ans=="": trm_peakT=600+273 # convert to kelvin else: trm_peakT=float(ans)+273 # convert to kelvin if "G" in codes: methcode="LT-AF-G" if "D" in codes: methcode="LT-AF-D" if "TRM" in codes: demag="T" trm=1 if "CR" in codes: demag="T" cooling_rate_experiment=1 if command_line: ind=sys.argv.index("CR") cooling_rates=sys.argv[ind+1] cooling_rates_list=cooling_rates.split(',') else: cooling_rates_list=str(cooling_rates).split(',') if demag=="T" and "ANI" in codes: methcode="LP-AN-TRM" if demag=="T" and "CR" in codes: methcode="LP-CR-TRM" if demag=="AF" and "ANI" in codes: methcode="LP-AN-ARM" if labfield==0: labfield=50e-6 if peakfield==0: peakfield=.180 MeasRecs,SpecRecs,SampRecs,SiteRecs,LocRecs=[],[],[],[],[] version_num=pmag.get_version() ################################## for line in lines: instcode="" if len(line)>2: MeasRec,SpecRec,SampRec,SiteRec,LocRec={},{},{},{},{} MeasRec['software_packages']=version_num MeasRec["description"]="" MeasRec["treat_temp"]='%8.3e' % (273) # room temp in kelvin MeasRec["meas_temp"]='%8.3e' % (273) # room temp in kelvin MeasRec["treat_ac_field"]='0' MeasRec["treat_dc_field"]='0' MeasRec["treat_dc_field_phi"]='0' MeasRec["treat_dc_field_theta"]='0' meas_type="LT-NO" rec=line.split() try: float(rec[0]); print("No specimen name for line #%d in the measurement file"%lines.index(line)); continue except ValueError: pass if rec[1]==".00":rec[1]="0.00" treat=rec[1].split('.') if methcode=="LP-IRM": if irmunits=='mT': labfield=float(treat[0])*1e-3 else: labfield=pmag.getfield(irmunits,coil,treat[0]) if rec[1][0]!="-": phi,theta=0.,90. else: phi,theta=0.,-90. meas_type="LT-IRM" MeasRec["treat_dc_field"]='%8.3e'%(labfield) MeasRec["treat_dc_field_phi"]='%7.1f'%(phi) MeasRec["treat_dc_field_theta"]='%7.1f'%(theta) if len(rec)>6: code1=rec[6].split(';') # break e.g., 10/15/02;7:45 indo date and time if len(code1)==2: # old format with AM/PM missing=0 code2=code1[0].split('/') # break date into mon/day/year code3=rec[7].split(';') # break e.g., AM;C34;200 into time;instr/axes/measuring pos;number of measurements yy=int(code2[2]) if yy <90: yyyy=str(2000+yy) else: yyyy=str(1900+yy) mm=int(code2[0]) if mm<10: mm="0"+str(mm) else: mm=str(mm) dd=int(code2[1]) if dd<10: dd="0"+str(dd) else: dd=str(dd) time=code1[1].split(':') hh=int(time[0]) if code3[0]=="PM":hh=hh+12 if hh<10: hh="0"+str(hh) else: hh=str(hh) min=int(time[1]) if min<10: min= "0"+str(min) else: min=str(min) dt=yyyy+":"+mm+":"+dd+":"+hh+":"+min+":00" local = pytz.timezone(timezone) naive = datetime.datetime.strptime(dt, "%Y:%m:%d:%H:%M:%S") local_dt = local.localize(naive, is_dst=None) utc_dt = local_dt.astimezone(pytz.utc) MeasRec["timestamp"]=utc_dt.strftime("%Y-%m-%dT%H:%M:%S")+"Z" if inst=="": if code3[1][0]=='C':instcode='SIO-bubba' if code3[1][0]=='G':instcode='SIO-flo' else: instcode='' MeasRec["meas_n_orient"]=code3[1][2] elif len(code1)>2: # newest format (cryo7 or later) if "LP-AN-ARM" not in methcode:labfield=0 fmt='new' date=code1[0].split('/') # break date into mon/day/year yy=int(date[2]) if yy <90: yyyy=str(2000+yy) else: yyyy=str(1900+yy) mm=int(date[0]) if mm<10: mm="0"+str(mm) else: mm=str(mm) dd=int(date[1]) if dd<10: dd="0"+str(dd) else: dd=str(dd) time=code1[1].split(':') hh=int(time[0]) if hh<10: hh="0"+str(hh) else: hh=str(hh) min=int(time[1]) if min<10: min= "0"+str(min) else: min=str(min) dt=yyyy+":"+mm+":"+dd+":"+hh+":"+min+":00" local = pytz.timezone(timezone) naive = datetime.datetime.strptime(dt, "%Y:%m:%d:%H:%M:%S") local_dt = local.localize(naive, is_dst=None) utc_dt = local_dt.astimezone(pytz.utc) MeasRec["timestamp"]=utc_dt.strftime("%Y-%m-%dT%H:%M:%S")+"Z" if inst=="": if code1[6][0]=='C': instcode='SIO-bubba' if code1[6][0]=='G': instcode='SIO-flo' else: instcode='' if len(code1)>1: MeasRec["meas_n_orient"]=code1[6][2] else: MeasRec["meas_n_orient"]=code1[7] # takes care of awkward format with bubba and flo being different if user=="":user=code1[5] if code1[2][-1]=='C': demag="T" if code1[4]=='microT' and float(code1[3])!=0. and "LP-AN-ARM" not in methcode: labfield=float(code1[3])*1e-6 if code1[2]=='mT' and methcode!="LP-IRM": demag="AF" if code1[4]=='microT' and float(code1[3])!=0.: labfield=float(code1[3])*1e-6 if code1[4]=='microT' and labfield!=0. and meas_type!="LT-IRM": phi,theta=0.,-90. if demag=="T": meas_type="LT-T-I" if demag=="AF": meas_type="LT-AF-I" MeasRec["treat_dc_field"]='%8.3e'%(labfield) MeasRec["treat_dc_field_phi"]='%7.1f'%(phi) MeasRec["treat_dc_field_theta"]='%7.1f'%(theta) if code1[4]=='' or labfield==0. and meas_type!="LT-IRM": if demag=='T':meas_type="LT-T-Z" if demag=="AF":meas_type="LT-AF-Z" MeasRec["treat_dc_field"]='0' if syn==0: specimen=rec[0] MeasRec["specimen"]=specimen if specnum!=0: sample=rec[0][:specnum] else: sample=rec[0] if samp_infile and Samps: # if samp_infile was provided AND yielded sample data samp=pmag.get_dictitem(Samps,'sample',sample,'T') if len(samp)>0: location=samp[0]["location"] site=samp[0]["site"] else: location='' site='' else: site=pmag.parse_site(sample,samp_con,Z) if location!='' and location not in [x['location'] if 'location' in list(x.keys()) else '' for x in LocRecs]: LocRec['location'] = location LocRec['lat_n'] = lat LocRec['lat_s'] = lat LocRec['lon_e'] = lon LocRec['lon_w'] = lon LocRecs.append(LocRec) if site!='' and site not in [x['site'] if 'site' in list(x.keys()) else '' for x in SiteRecs]: SiteRec['location'] = location SiteRec['site'] = site SiteRec['lat'] = lat SiteRec['lon'] = lon SiteRecs.append(SiteRec) if sample!='' and sample not in [x['sample'] if 'sample' in list(x.keys()) else '' for x in SampRecs]: SampRec['site'] = site SampRec['sample'] = sample SampRecs.append(SampRec) if specimen!='' and specimen not in [x['specimen'] if 'specimen' in list(x.keys()) else '' for x in SpecRecs]: SpecRec["specimen"]=specimen SpecRec['sample'] = sample SpecRecs.append(SpecRec) else: specimen=rec[0] MeasRec["specimen"]=specimen if specnum!=0: sample=rec[0][:specnum] else: sample=rec[0] site=pmag.parse_site(sample,samp_con,Z) if location!='' and location not in [x['location'] if 'location' in list(x.keys()) else '' for x in LocRecs]: LocRec['location'] = location LocRec['lat_n'] = lat LocRec['lat_s'] = lat LocRec['lon_e'] = lon LocRec['lon_w'] = lon LocRecs.append(LocRec) if site!='' and site not in [x['site'] if 'site' in list(x.keys()) else '' for x in SiteRecs]: SiteRec['location'] = location SiteRec['site'] = site SiteRec['lat'] = lat SiteRec['lon'] = lon SiteRecs.append(SiteRec) if sample!='' and sample not in [x['sample'] if 'sample' in list(x.keys()) else '' for x in SampRecs]: SampRec['site'] = site SampRec['sample'] = sample SampRecs.append(SampRec) if specimen!='' and specimen not in [x['specimen'] if 'specimen' in list(x.keys()) else '' for x in SpecRecs]: SpecRec["specimen"]=specimen SpecRec['sample'] = sample SpecRecs.append(SpecRec) SampRec["institution"]=institution SampRec["material_type"]=syntype if float(rec[1])==0: pass elif demag=="AF": if methcode != "LP-AN-ARM": MeasRec["treat_ac_field"]='%8.3e' %(float(rec[1])*1e-3) # peak field in tesla if meas_type=="LT-AF-Z": MeasRec["treat_dc_field"]='0' else: # AARM experiment if treat[1][0]=='0': meas_type="LT-AF-Z:LP-AN-ARM:" MeasRec["treat_ac_field"]='%8.3e' %(peakfield) # peak field in tesla MeasRec["treat_dc_field"]='%8.3e'%(0) if labfield!=0 and methcode!="LP-AN-ARM": print("Warning - inconsistency in mag file with lab field - overriding file with 0") else: meas_type="LT-AF-I:LP-AN-ARM" ipos=int(treat[0])-1 MeasRec["treat_dc_field_phi"]='%7.1f' %(dec[ipos]) MeasRec["treat_dc_field_theta"]='%7.1f'% (inc[ipos]) MeasRec["treat_dc_field"]='%8.3e'%(labfield) MeasRec["treat_ac_field"]='%8.3e' %(peakfield) # peak field in tesla elif demag=="T" and methcode == "LP-AN-TRM": MeasRec["treat_temp"]='%8.3e' % (float(treat[0])+273.) # temp in kelvin if treat[1][0]=='0': meas_type="LT-T-Z:LP-AN-TRM" MeasRec["treat_dc_field"]='%8.3e'%(0) MeasRec["treat_dc_field_phi"]='0' MeasRec["treat_dc_field_theta"]='0' else: MeasRec["treat_dc_field"]='%8.3e'%(labfield) if treat[1][0]=='7': # alteration check as final measurement meas_type="LT-PTRM-I:LP-AN-TRM" else: meas_type="LT-T-I:LP-AN-TRM" # find the direction of the lab field in two ways: # (1) using the treatment coding (XX.1=+x, XX.2=+y, XX.3=+z, XX.4=-x, XX.5=-y, XX.6=-z) ipos_code=int(treat[1][0])-1 # (2) using the magnetization DEC=float(rec[4]) INC=float(rec[5]) if INC < 45 and INC > -45: if DEC>315 or DEC<45: ipos_guess=0 if DEC>45 and DEC<135: ipos_guess=1 if DEC>135 and DEC<225: ipos_guess=3 if DEC>225 and DEC<315: ipos_guess=4 else: if INC >45: ipos_guess=2 if INC <-45: ipos_guess=5 # prefer the guess over the code ipos=ipos_guess MeasRec["treat_dc_field_phi"]='%7.1f' %(tdec[ipos]) MeasRec["treat_dc_field_theta"]='%7.1f'% (tinc[ipos]) # check it if ipos_guess!=ipos_code and treat[1][0]!='7': print("-E- ERROR: check specimen %s step %s, ATRM measurements, coding does not match the direction of the lab field!"%(rec[0],".".join(list(treat)))) elif demag=="S": # Shaw experiment if treat[1][1]=='0': if int(treat[0])!=0: MeasRec["treat_ac_field"]='%8.3e' % (float(treat[0])*1e-3) # AF field in tesla MeasRec["treat_dc_field"]='0' meas_type="LT-AF-Z" # first AF else: meas_type="LT-NO" MeasRec["treat_ac_field"]='0' MeasRec["treat_dc_field"]='0' elif treat[1][1]=='1': if int(treat[0])==0: MeasRec["treat_ac_field"]='%8.3e' %(peakfield) # peak field in tesla MeasRec["treat_dc_field"]='%8.3e'%(arm_labfield) MeasRec["treat_dc_field_phi"]='%7.1f'%(phi) MeasRec["treat_dc_field_theta"]='%7.1f'%(theta) meas_type="LT-AF-I" else: MeasRec["treat_ac_field"]='%8.3e' % ( float(treat[0])*1e-3) # AF field in tesla MeasRec["treat_dc_field"]='0' meas_type="LT-AF-Z" elif treat[1][1]=='2': if int(treat[0])==0: MeasRec["treat_ac_field"]='0' MeasRec["treat_dc_field"]='%8.3e'%(trm_labfield) MeasRec["treat_dc_field_phi"]='%7.1f'%(phi) MeasRec["treat_dc_field_theta"]='%7.1f'%(theta) MeasRec["treat_temp"]='%8.3e' % (trm_peakT) meas_type="LT-T-I" else: MeasRec["treat_ac_field"]='%8.3e' % ( float(treat[0])*1e-3) # AF field in tesla MeasRec["treat_dc_field"]='0' meas_type="LT-AF-Z" elif treat[1][1]=='3': if int(treat[0])==0: MeasRec["treat_ac_field"]='%8.3e' %(peakfield) # peak field in tesla MeasRec["treat_dc_field"]='%8.3e'%(arm_labfield) MeasRec["treat_dc_field_phi"]='%7.1f'%(phi) MeasRec["treat_dc_field_theta"]='%7.1f'%(theta) meas_type="LT-AF-I" else: MeasRec["treat_ac_field"]='%8.3e' % ( float(treat[0])*1e-3) # AF field in tesla MeasRec["treat_dc_field"]='0' meas_type="LT-AF-Z" # Cooling rate experient # added by rshaar elif demag=="T" and methcode == "LP-CR-TRM": MeasRec["treat_temp"]='%8.3e' % (float(treat[0])+273.) # temp in kelvin if treat[1][0]=='0': meas_type="LT-T-Z:LP-CR-TRM" MeasRec["treat_dc_field"]='%8.3e'%(0) MeasRec["treat_dc_field_phi"]='0' MeasRec["treat_dc_field_theta"]='0' else: MeasRec["treat_dc_field"]='%8.3e'%(labfield) if treat[1][0]=='7': # alteration check as final measurement meas_type="LT-PTRM-I:LP-CR-TRM" else: meas_type="LT-T-I:LP-CR-TRM" MeasRec["treat_dc_field_phi"]='%7.1f' % (phi) # labfield phi MeasRec["treat_dc_field_theta"]='%7.1f' % (theta) # labfield theta indx=int(treat[1][0])-1 # alteration check matjed as 0.7 in the measurement file if indx==6: cooling_time= cooling_rates_list[-1] else: cooling_time=cooling_rates_list[indx] MeasRec["description"]="cooling_rate"+":"+cooling_time+":"+"K/min" elif demag!='N': if len(treat)==1:treat.append('0') MeasRec["treat_temp"]='%8.3e' % (float(treat[0])+273.) # temp in kelvin if trm==0: # demag=T and not trmaq if treat[1][0]=='0': meas_type="LT-T-Z" else: MeasRec["treat_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MeasRec["treat_dc_field_phi"]='%7.1f' % (phi) # labfield phi MeasRec["treat_dc_field_theta"]='%7.1f' % (theta) # labfield theta if treat[1][0]=='1':meas_type="LT-T-I" # in-field thermal step if treat[1][0]=='2': meas_type="LT-PTRM-I" # pTRM check pTRM=1 if treat[1][0]=='3': MeasRec["treat_dc_field"]='0' # this is a zero field step meas_type="LT-PTRM-MD" # pTRM tail check else: labfield=float(treat[1])*1e-6 MeasRec["treat_dc_field"]='%8.3e' % (labfield) # labfield in tesla (convert from microT) MeasRec["treat_dc_field_phi"]='%7.1f' % (phi) # labfield phi MeasRec["treat_dc_field_theta"]='%7.1f' % (theta) # labfield theta meas_type="LT-T-I:LP-TRM" # trm acquisition experiment MeasRec["dir_csd"]=rec[2] MeasRec["magn_moment"]='%10.3e'% (float(rec[3])*1e-3) # moment in Am^2 (from emu) MeasRec["dir_dec"]=rec[4] MeasRec["dir_inc"]=rec[5] MeasRec["instrument_codes"]=instcode MeasRec["analysts"]=user MeasRec["citations"]=citations if "LP-IRM-3D" in methcode : meas_type=methcode #MeasRec["method_codes"]=methcode.strip(':') MeasRec["method_codes"]=meas_type MeasRec["quality"]='g' if 'std' in rec[0]: MeasRec["standard"]='s' else: MeasRec["standard"]='u' MeasRec["treat_step_num"]='1' #print MeasRec['treat_temp'] MeasRecs.append(MeasRec) con = nb.Contribution(output_dir_path,read_tables=[]) # create MagIC tables con.add_magic_table_from_data(dtype='specimens', data=SpecRecs) con.add_magic_table_from_data(dtype='samples', data=SampRecs) con.add_magic_table_from_data(dtype='sites', data=SiteRecs) con.add_magic_table_from_data(dtype='locations', data=LocRecs) MeasOuts=pmag.measurements_methods3(MeasRecs,noave) con.add_magic_table_from_data(dtype='measurements', data=MeasOuts) # write MagIC tables to file con.tables['specimens'].write_magic_file(custom_name=spec_file) con.tables['samples'].write_magic_file(custom_name=samp_file) con.tables['sites'].write_magic_file(custom_name=site_file) con.tables['locations'].write_magic_file(custom_name=loc_file) con.tables['measurements'].write_magic_file(custom_name=meas_file) return True, meas_file
def main(): """ NAME huji_sample_magic.py DESCRIPTION takes tab delimited Hebrew University sample file and converts to MagIC formatted tables SYNTAX huji_sample_magic.py [command line options] OPTIONS -f FILE: specify input file -Fsa FILE: specify sample output file, default is: er_samples.txt -Fsi FILE: specify site output file, default is: er_sites.txt -Iso: import sample orientation info - default is to set sample_az/dip to 0,0 -ncn NCON: specify naming convention: default is #1 below -mcd: specify sampling method codes as a colon delimited string: [default is: FS-FD:SO-POM] FS-FD field sampling done with a drill FS-H field sampling done with hand samples FS-LOC-GPS field location done with GPS FS-LOC-MAP field location done with map SO-POM a Pomeroy orientation device was used SO-ASC an ASC orientation device was used SO-MAG orientation with magnetic compass -loc: location name, default="unknown" INPUT FORMAT Input files must be tab delimited: Samp Az Dip Dip_dir Dip Orientation convention: Lab arrow azimuth = mag_azimuth; Lab arrow dip = 90-field_dip e.g. field_dip is degrees from horizontal of drill direction Magnetic declination convention: Az is already corrected in file Sample naming convention: [1] XXXXY: where XXXX is an arbitrary length site designation and Y is the single character sample designation. e.g., TG001a is the first sample from site TG001. [default] [2] XXXX-YY: YY sample from site XXXX (XXX, YY of arbitary length) [3] XXXX.YY: YY sample from site XXXX (XXX, YY of arbitary length) [4-Z] XXXX[YYY]: YYY is sample designation with Z characters from site XXX [5] site name = sample name [6] site name entered in site_name column in the orient.txt format input file -- NOT CURRENTLY SUPPORTED [7-Z] [XXX]YYY: XXX is site designation with Z characters from samples XXXYYY NB: all others you will have to either customize your self or e-mail [email protected] for help. OUTPUT output saved in er_samples.txt will overwrite any existing files """ # # initialize variables # version_num = pmag.get_version() samp_file, or_con, corr = "er_samples.txt", "1", "1" site_file = 'er_sites.txt' args = sys.argv date, lat, lon = "", "", "" # date of sampling, latitude (pos North), longitude (pos East) bed_dip, bed_dip_dir = "", "" participantlist = "" sites = [] # list of site names Lats, Lons = [], [] # list of latitudes and longitudes SampRecs, SiteRecs, ImageRecs, imagelist = [], [], [], [ ] # lists of Sample records and Site records samp_con, Z, average_bedding = "1", 1, "0" newbaseline, newbeddir, newbeddip = "", "", "" meths = 'FS-FD:SO-POM:SO-SUN' delta_u = "0" sclass, lithology, type = "", "", "" newclass, newlith, newtype = '', '', '' user = "" or_con = '3' corr == "3" DecCorr = 0. location_name = "unknown" ignore = 1 # # if "-h" in args: print(main.__doc__) sys.exit() if "-f" in args: ind = args.index("-f") orient_file = sys.argv[ind + 1] else: "Must have orientation file name" sys.exit() if "-Fsa" in args: ind = args.index("-Fsa") samp_file = sys.argv[ind + 1] if "-ncn" in args: ind = args.index("-ncn") samp_con = sys.argv[ind + 1] if "4" in samp_con: if "-" not in samp_con: print("option [4] must be in form 3-Z where Z is an integer") sys.exit() else: Z = samp_con.split("-")[1] samp_con = "4" print(samp_con, Z) if "-mcd" in args: ind = args.index("-mcd") meths = (sys.argv[ind + 1]) if "-loc" in args: ind = args.index("-loc") location_name = (sys.argv[ind + 1]) if "-Iso" in args: ignore = 0 # # read in file to convert # azfile = open(orient_file, 'r') AzDipDat = azfile.readlines() azfile.close() SampOut = [] SiteOut = [] for line in AzDipDat[1:]: orec = line.split() if len(orec) > 1: labaz, labdip = pmag.orient(float(orec[1]), float(orec[2]), or_con) bed_dip_dir = (orec[3]) bed_dip = (orec[4]) SampRec = {} SiteRec = {} SampRec["er_location_name"] = location_name SampRec["er_citation_names"] = "This study" SiteRec["er_location_name"] = location_name SiteRec["er_citation_names"] = "This study" SiteRec["site_class"] = "" SiteRec["site_lithology"] = "" SiteRec["site_type"] = "" SiteRec["site_definition"] = "s" SiteRec["er_citation_names"] = "This study" # # parse information common to all orientation methods # SampRec["er_sample_name"] = orec[0] SampRec["sample_bed_dip_direction"] = orec[3] SampRec["sample_bed_dip"] = orec[4] SiteRec["site_bed_dip_direction"] = orec[3] SiteRec["site_bed_dip"] = orec[4] if ignore == 0: SampRec["sample_dip"] = '%7.1f' % (labdip) SampRec["sample_azimuth"] = '%7.1f' % (labaz) else: SampRec["sample_dip"] = '0' SampRec["sample_azimuth"] = '0' SampRec["sample_lat"] = orec[5] SampRec["sample_lon"] = orec[6] SiteRec["site_lat"] = orec[5] SiteRec["site_lon"] = orec[6] methods = meths.split(":") SampRec["magic_method_codes"] = meths site = pmag.parse_site(orec[0], samp_con, Z) # parse out the site name SampRec["er_site_name"] = site SampRec['magic_software_packages'] = version_num SiteRec["er_site_name"] = site SiteRec['magic_software_packages'] = version_num SampOut.append(SampRec) SiteOut.append(SiteRec) pmag.magic_write(samp_file, SampOut, "er_samples") print("Sample info saved in ", samp_file) pmag.magic_write(site_file, SiteOut, "er_sites") print("Site info saved in ", site_file)
def main(): """ NAME sites_locations.py DESCRIPTION reads in er_sites.txt file and finds all locations and bounds of locations outputs er_locations.txt file SYNTAX sites_locations.py [command line options] OPTIONS -h prints help message and quits -f: specimen input er_sites format file, default is "er_sites.txt" -F: locations table: default is "er_locations.txt" """ # set defaults site_file = "er_sites.txt" loc_file = "er_locations.txt" Names, user = [], "unknown" Done = [] version_num = pmag.get_version() args = sys.argv dir_path = '.' # get command line stuff if '-WD' in args: ind = args.index("-WD") dir_path = args[ind + 1] if "-h" in args: print(main.__doc__) sys.exit() if '-f' in args: ind = args.index("-f") site_file = args[ind + 1] if '-F' in args: ind = args.index("-F") loc_file = args[ind + 1] # site_file = dir_path + '/' + site_file loc_file = dir_path + '/' + loc_file Sites, file_type = pmag.magic_read(site_file) if file_type != 'er_sites': print(file_type) print(file_type, "This is not a valid er_sites file ") sys.exit() # read in site data # LocNames, Locations = [], [] for site in Sites: if site['er_location_name'] not in LocNames: # new location name LocNames.append(site['er_location_name']) sites_locs = pmag.get_dictitem(Sites, 'er_location_name', site['er_location_name'], 'T') # get all sites for this loc lats = pmag.get_dictkey(sites_locs, 'site_lat', 'f') # get all the latitudes as floats lons = pmag.get_dictkey(sites_locs, 'site_lon', 'f') # get all the longitudes as floats LocRec = { 'er_citation_names': 'This study', 'er_location_name': site['er_location_name'], 'location_type': '' } LocRec['location_begin_lat'] = str(min(lats)) LocRec['location_end_lat'] = str(max(lats)) LocRec['location_begin_lon'] = str(min(lons)) LocRec['location_end_lon'] = str(max(lons)) Locations.append(LocRec) if len(Locations) > 0: pmag.magic_write(loc_file, Locations, "er_locations") print("Locations written to: ", loc_file)