def simulations_GGP(lat,GGPmodel,Nsim,plot=True): """ Gerenates four arrays that are directions (dec, inc), x and y equal area coordinates of rotated directions (x,y), rotated directions (dec,inc), x and y equal area coordinates of rotated directions input - lat latitude you want generate the directions list - GGPmodel: dictionary like GGP_QC96_GAD = {"g10" : -30, "g20" : 0.0, "g30" : 0.0, "sig10" : 3.0, "sig11": 3.0, "sig20" : 1.3 , "sig21" : 4.3, "sig22" : 1.3, "alpha": 27.7, "beta": 1.0, "name":'QC96_GAD'} - Nsim number of simulations you want output: lista_sim, lista_xy, lista_r, lista_xyr """ dec_r=180 pol=-GGPmodel['g10']/abs(GGPmodel['g10']) if pol<0: dec_r=0 lista_sim = dii_fromGGPmodels(Nsim,lat,GGPmodel) m = psv.m_TAF(GGPmodel, lat) Binc = np.rad2deg(np.arctan(m[2]/abs(m[0]))) lista_r = np.zeros(np.shape(lista_sim)) for j in range(len(lista_sim)): lista_r[j,0],lista_r[j,1] = pmag.dotilt(lista_sim[j,0],lista_sim[j,1],dec_r,(90-Binc)) lista_xyr = np.zeros([len(lista_sim),2]) lista_xy = np.zeros([len(lista_sim),2]) for j in range(len(lista_sim)): lista_xyr[j,0:2] = pmag.dimap(lista_r[j,0],lista_r[j,1]) lista_xy[j,0:2] = pmag.dimap(lista_sim[j,0],lista_sim[j,1]) if plot==True: plot_syn_directions(lista_sim, lista_xy, lista_r, lista_xyr,GGPmodel['name'],lat) return lista_sim, lista_xy, lista_r, lista_xyr
def main(): """ NAME di_tilt.py DESCRIPTION rotates geographic coordinate dec, inc data to stratigraphic coordinates using the dip and dip direction (strike+90, dip if dip to right of strike) INPUT FORMAT declination inclination dip_direction dip SYNTAX di_tilt.py [-h][-i][-f FILE] [< filename ] OPTIONS -h prints help message and quits -i for interactive data entry -f FILE command line entry of file name -F OFILE, specify output file, default is standard output OUTPUT: declination inclination """ if '-h' in sys.argv: print main.__doc__ sys.exit() if '-F' in sys.argv: ind = sys.argv.index('-F') ofile = sys.argv[ind + 1] out = open(ofile, 'w') print ofile, ' opened for output' else: ofile = "" if '-i' in sys.argv: # interactive flag while 1: try: Dec = float(raw_input("Declination: <cntl-D> to quit ")) except: print "\n Good-bye\n" sys.exit() Inc = float(raw_input("Inclination: ")) Dip_dir = float(raw_input("Dip direction: ")) Dip = float(raw_input("Dip: ")) print '%7.1f %7.1f' % (pmag.dotilt(Dec, Inc, Dip_dir, Dip)) elif '-f' in sys.argv: ind = sys.argv.index('-f') file = sys.argv[ind + 1] data = numpy.loadtxt(file) else: data = numpy.loadtxt( sys.stdin, dtype=numpy.float) # read in the data from the datafile D, I = pmag.dotilt_V(data) for k in range(len(D)): if ofile == "": print '%7.1f %7.1f' % (D[k], I[k]) else: out.write('%7.1f %7.1f\n' % (D[k], I[k]))
def main(): """ NAME di_tilt.py DESCRIPTION rotates geographic coordinate dec, inc data to stratigraphic coordinates using the dip and dip direction (strike+90, dip if dip to right of strike) INPUT FORMAT declination inclination dip_direction dip SYNTAX di_tilt.py [-h][-i][-f FILE] [< filename ] OPTIONS -h prints help message and quits -i for interactive data entry -f FILE command line entry of file name -F OFILE, specify output file, default is standard output OUTPUT: declination inclination """ if "-h" in sys.argv: print main.__doc__ sys.exit() if "-F" in sys.argv: ind = sys.argv.index("-F") ofile = sys.argv[ind + 1] out = open(ofile, "w") print ofile, " opened for output" else: ofile = "" if "-i" in sys.argv: # interactive flag while 1: try: Dec = float(raw_input("Declination: <cntl-D> to quit ")) except: print "\n Good-bye\n" sys.exit() Inc = float(raw_input("Inclination: ")) Dip_dir = float(raw_input("Dip direction: ")) Dip = float(raw_input("Dip: ")) print "%7.1f %7.1f" % (pmag.dotilt(Dec, Inc, Dip_dir, Dip)) elif "-f" in sys.argv: ind = sys.argv.index("-f") file = sys.argv[ind + 1] data = numpy.loadtxt(file) else: data = numpy.loadtxt(sys.stdin, dtype=numpy.float) # read in the data from the datafile D, I = pmag.dotilt_V(data) for k in range(len(D)): if ofile == "": print "%7.1f %7.1f" % (D[k], I[k]) else: out.write("%7.1f %7.1f\n" % (D[k], I[k]))
def main(): """ NAME fishqq.py DESCRIPTION makes qq plot from dec,inc input data INPUT FORMAT takes dec/inc pairs in space delimited file SYNTAX fishqq.py [command line options] OPTIONS -h help message -f FILE, specify file on command line -F FILE, specify output file for statistics -sav save and quit [saves as input file name plus fmt extension] -fmt specify format for output [png, eps, svg, pdf] OUTPUT: Dec Inc N Mu Mu_crit Me Me_crit Y/N where direction is the principal component and Y/N is Fisherian or not separate lines for each mode with N >=10 (N and R) """ fmt,plot='svg',0 outfile="" if '-h' in sys.argv: # check if help is needed print(main.__doc__) sys.exit() # graceful quit elif '-f' in sys.argv: # ask for filename ind=sys.argv.index('-f') file=sys.argv[ind+1] f=open(file,'r') data=f.readlines() if '-F' in sys.argv: ind=sys.argv.index('-F') outfile=open(sys.argv[ind+1],'w') # open output file if '-sav' in sys.argv: plot=1 if '-fmt' in sys.argv: ind=sys.argv.index('-fmt') fmt=sys.argv[ind+1] DIs,nDIs,rDIs= [],[],[] # set up list for data for line in data: # read in the data from standard input if '\t' in line: rec=line.split('\t') # split each line on space to get records else: rec=line.split() # split each line on space to get records DIs.append([float(rec[0]),float(rec[1])]) # append data to Inc # split into two modes ppars=pmag.doprinc(DIs) # get principal directions for rec in DIs: angle=pmag.angle([rec[0],rec[1]],[ppars['dec'],ppars['inc']]) if angle>90.: rDIs.append(rec) else: nDIs.append(rec) # if len(rDIs) >=10 or len(nDIs) >=10: D1,I1=[],[] QQ={'unf1':1,'exp1':2} pmagplotlib.plot_init(QQ['unf1'],5,5) pmagplotlib.plot_init(QQ['exp1'],5,5) if len(nDIs) < 10: ppars=pmag.doprinc(rDIs) # get principal directions Drbar,Irbar=ppars['dec']-180.,-ppars['inc'] Nr=len(rDIs) for di in rDIs: d,irot=pmag.dotilt(di[0],di[1],Drbar-180.,90.-Irbar) # rotate to mean drot=d-180. if drot<0:drot=drot+360. D1.append(drot) I1.append(irot) Dtit='Mode 2 Declinations' Itit='Mode 2 Inclinations' else: ppars=pmag.doprinc(nDIs) # get principal directions Dnbar,Inbar=ppars['dec'],ppars['inc'] Nn=len(nDIs) for di in nDIs: d,irot=pmag.dotilt(di[0],di[1],Dnbar-180.,90.-Inbar) # rotate to mean drot=d-180. if drot<0:drot=drot+360. D1.append(drot) I1.append(irot) Dtit='Mode 1 Declinations' Itit='Mode 1 Inclinations' Mu_n,Mu_ncr=pmagplotlib.plot_qq_unf(QQ['unf1'],D1,Dtit) # make plot Me_n,Me_ncr=pmagplotlib.plot_qq_exp(QQ['exp1'],I1,Itit) # make plot #print Mu_n,Mu_ncr,Me_n, Me_ncr if outfile!="": # Dec Inc N Mu Mu_crit Me Me_crit Y/N if Mu_n<=Mu_ncr and Me_n<=Me_ncr: F='Y' else: F='N' outstring='%7.1f %7.1f %i %5.3f %5.3f %5.3f %5.3f %s \n'%(Dnbar,Inbar,Nn,Mu_n,Mu_ncr,Me_n,Me_ncr,F) outfile.write(outstring) else: print('you need N> 10 for at least one mode') sys.exit() if len(rDIs)>10 and len(nDIs)>10: D2,I2=[],[] QQ['unf2']=3 QQ['exp2']=4 pmagplotlib.plot_init(QQ['unf2'],5,5) pmagplotlib.plot_init(QQ['exp2'],5,5) ppars=pmag.doprinc(rDIs) # get principal directions Drbar,Irbar=ppars['dec']-180.,-ppars['inc'] Nr=len(rDIs) for di in rDIs: d,irot=pmag.dotilt(di[0],di[1],Drbar-180.,90.-Irbar) # rotate to mean drot=d-180. if drot<0:drot=drot+360. D2.append(drot) I2.append(irot) Dtit='Mode 2 Declinations' Itit='Mode 2 Inclinations' Mu_r,Mu_rcr=pmagplotlib.plot_qq_unf(QQ['unf2'],D2,Dtit) # make plot Me_r,Me_rcr=pmagplotlib.plot_qq_exp(QQ['exp2'],I2,Itit) # make plot if outfile!="": # Dec Inc N Mu Mu_crit Me Me_crit Y/N if Mu_r<=Mu_rcr and Me_r<=Me_rcr: F='Y' else: F='N' outstring='%7.1f %7.1f %i %5.3f %5.3f %5.3f %5.3f %s \n'%(Drbar,Irbar,Nr,Mu_r,Mu_rcr,Me_r,Me_rcr,F) outfile.write(outstring) files={} for key in list(QQ.keys()): files[key]=file+'_'+key+'.'+fmt if pmagplotlib.isServer: black = '#000000' purple = '#800080' titles={} titles['eq']='Equal Area Plot' EQ = pmagplotlib.add_borders(EQ,titles,black,purple) pmagplotlib.save_plots(QQ,files) elif plot==1: pmagplotlib.save_plots(QQ,files) else: pmagplotlib.draw_figs(QQ) ans=input(" S[a]ve to save plot, [q]uit without saving: ") if ans=="a": pmagplotlib.save_plots(QQ,files)
def main(): """ NAME scalc.py DESCRIPTION calculates Sb from VGP Long,VGP Lat,Directional kappa,Site latitude data SYNTAX scalc -h [command line options] [< standard input] INPUT takes space delimited files with PLong, PLat,[kappa, N_site, slat] OPTIONS -h prints help message and quits -f FILE: specify input file -c cutoff: specify VGP colatitude cutoff value -k cutoff: specify kappa cutoff -v : use the VanDammme criterion -a: use antipodes of reverse data: default is to use only normal -C: use all data without regard to polarity -b: do a bootstrap for confidence -p: do relative to principle axis NOTES if kappa, N_site, lat supplied, will consider within site scatter OUTPUT N Sb Sb_lower Sb_upper Co-lat. Cutoff """ coord, kappa, cutoff = "0", 0, 90. nb, anti, boot = 1000, 0, 0 all = 0 n = 0 v = 0 spin = 1 coord_key = 'tilt_correction' if '-h' in sys.argv: print main.__doc__ sys.exit() if '-f' in sys.argv: ind = sys.argv.index("-f") in_file = sys.argv[ind + 1] f = open(in_file, 'rU') lines = f.readlines() else: lines = sys.stdin.readlines() if '-c' in sys.argv: ind = sys.argv.index('-c') cutoff = float(sys.argv[ind + 1]) if '-k' in sys.argv: ind = sys.argv.index('-k') kappa = float(sys.argv[ind + 1]) if '-n' in sys.argv: ind = sys.argv.index('-n') n = int(sys.argv[ind + 1]) if '-a' in sys.argv: anti = 1 if '-C' in sys.argv: cutoff = 180. # no cutoff if '-b' in sys.argv: boot = 1 if '-v' in sys.argv: v = 1 if '-p' in sys.argv: spin = 0 # # # find desired vgp lat,lon, kappa,N_site data: # A, Vgps, slats, Pvgps = 180., [], [], [] for line in lines: if '\t' in line: rec = line.replace('\n', '').split( '\t') # split each line on space to get records else: rec = line.replace( '\n', '').split() # split each line on space to get records vgp = {} vgp['vgp_lon'], vgp['vgp_lat'] = rec[0], rec[1] Pvgps.append([float(rec[0]), float(rec[1])]) if anti == 1: if float(vgp['vgp_lat']) < 0: vgp['vgp_lat'] = '%7.1f' % (-1 * float(vgp['vgp_lat'])) vgp['vgp_lon'] = '%7.1f' % (float(vgp['vgp_lon']) - 180.) if len(rec) == 5: vgp['average_k'], vgp['average_nn'], vgp['average_lat'] = rec[ 2], rec[3], rec[4] slats.append(float(rec[4])) else: vgp['average_k'], vgp['average_nn'], vgp[ 'average_lat'] = "0", "0", "0" if 90. - (float(vgp['vgp_lat'])) <= cutoff and float( vgp['average_k']) >= kappa and int(vgp['average_nn']) >= n: Vgps.append(vgp) if spin == 0: # do transformation to pole ppars = pmag.doprinc(Pvgps) for vgp in Vgps: vlon, vlat = pmag.dotilt(float(vgp['vgp_lon']), float(vgp['vgp_lat']), ppars['dec'] - 180., 90. - ppars['inc']) vgp['vgp_lon'] = vlon vgp['vgp_lat'] = vlat vgp['average_k'] = "0" S_B = pmag.get_Sb(Vgps) A = cutoff if v == 1: thetamax, A = 181., 180. vVgps, cnt = [], 0 for vgp in Vgps: vVgps.append(vgp) # make a copy of Vgps while thetamax > A: thetas = [] A = 1.8 * S_B + 5 cnt += 1 for vgp in vVgps: thetas.append(90. - (float(vgp['vgp_lat']))) thetas.sort() thetamax = thetas[-1] if thetamax < A: break nVgps = [] for vgp in vVgps: if 90. - (float(vgp['vgp_lat'])) < thetamax: nVgps.append(vgp) vVgps = [] for vgp in nVgps: vVgps.append(vgp) S_B = pmag.get_Sb(vVgps) Vgps = [] for vgp in vVgps: Vgps.append(vgp) # make a new Vgp list SBs, Ns = [], [] if boot == 1: print 'please be patient... bootstrapping' for i in range(nb): # now do bootstrap BVgps = [] for k in range(len(Vgps)): ind = random.randint(0, len(Vgps) - 1) random.jumpahead(int(ind * 1000)) BVgps.append(Vgps[ind]) SBs.append(pmag.get_Sb(BVgps)) SBs.sort() low = int(.025 * nb) high = int(.975 * nb) print len(Vgps), '%7.1f %7.1f %7.1f %7.1f ' % (S_B, SBs[low], SBs[high], A) else: print len(Vgps), '%7.1f %7.1f ' % (S_B, A) if len(slats) > 2: stats = pmag.gausspars(slats) print 'mean lat = ', '%7.1f' % (stats[0])
def main(): """ NAME di_rot.py DESCRIPTION rotates set of directions to new coordinate system SYNTAX di_rot.py [command line options] OPTIONS -h prints help message and quits -f specify input file, default is standard input -F specify output file, default is standard output -D D specify Dec of new coordinate system, default is 0 -I I specify Inc of new coordinate system, default is 90 INTPUT/OUTPUT dec inc [space delimited] """ D,I=0.,90. outfile="" infile="" if '-h' in sys.argv: print main.__doc__ sys.exit() if '-f' in sys.argv: ind=sys.argv.index('-f') infile=sys.argv[ind+1] data=numpy.loadtxt(infile) else: data=numpy.loadtxt(sys.stdin,dtype=numpy.float) if '-F' in sys.argv: ind=sys.argv.index('-F') outfile=sys.argv[ind+1] out=open(outfile,'w') if '-D' in sys.argv: ind=sys.argv.index('-D') D=float(sys.argv[ind+1]) if '-I' in sys.argv: ind=sys.argv.index('-I') I=float(sys.argv[ind+1]) if len(data.shape)>1: # 2-D array N=data.shape[0] DipDir,Dip=numpy.ones(N,dtype=numpy.float).transpose()*(D-180.),numpy.ones(N,dtype=numpy.float).transpose()*(90.-I) data=data.transpose() data=numpy.array([data[0],data[1],DipDir ,Dip]).transpose() drot,irot=pmag.dotilt_V(data) drot=(drot-180.)%360. # for k in range(N): if outfile=="": print '%7.1f %7.1f ' % (drot[k],irot[k]) else: out.write('%7.1f %7.1f\n' % (drot[k],irot[k])) else: d,i=pmag.dotilt(data[0],data[1],(D-180.),90.-I) if outfile=="": print '%7.1f %7.1f ' % ((d-180.)%360.,i) else: out.write('%7.1f %7.1f\n' % ((d-180.)%360.,i))
def main(): """ NAME nrm_specimens_magic.py DESCRIPTION converts NRM data in a magic_measurements type file to geographic and tilt corrected data in a pmag_specimens type file SYNTAX nrm_specimens_magic.py [-h][command line options] OPTIONS: -h prints the help message and quits -f MFILE: specify input file -fsa SFILE: specify er_samples format file [with orientations] -F PFILE: specify output file -A do not average replicate measurements -crd [g, t]: specify coordinate system ([g]eographic or [t]ilt adjusted) NB: you must have the SFILE in this directory DEFAULTS MFILE: magic_measurements.txt PFILE: nrm_specimens.txt SFILE: er_samples.txt coord: specimen average replicate measurements?: YES """ # # define some variables # beg,end,pole,geo,tilt,askave,save=0,0,[],0,0,0,0 samp_file=1 args=sys.argv geo,tilt,orient=0,0,0 doave=1 user,comment,doave,coord="","",1,"" dir_path='.' if "-h" in args: print main.__doc__ sys.exit() if '-WD' in sys.argv: ind=sys.argv.index('-WD') dir_path=sys.argv[ind+1] meas_file=dir_path+"/magic_measurements.txt" pmag_file=dir_path+"/nrm_specimens.txt" samp_file=dir_path+"/er_samples.txt" if "-A" in args: doave=0 if "-f" in args: ind=args.index("-f") meas_file=sys.argv[ind+1] if "-F" in args: ind=args.index("-F") pmag_file=dir_path+'/'+sys.argv[ind+1] speclist=[] 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,orient=1,1 if coord=="t": tilt,orient,geo=1,1,1 # # read in data if samp_file!="": 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() else: print samp_file,' read in with ',len(samp_data),' records' else: print 'no orientations - will create file in specimen coordinates' geo,tilt,orient=0,0,0 # # 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() # if orient==1: # set orientation priorities SO_methods=[] orientation_priorities={'0':'SO-SUN','1':'SO-GPS-DIFF','2':'SO-SIGHT-BACK','3':'SO-CMD-NORTH','4':'SO-MAG'} for rec in samp_data: 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()) # # sort the sample names # sids=pmag.get_specs(meas_data) # # PmagSpecRecs=[] for s in sids: skip=0 recnum=0 PmagSpecRec={} PmagSpecRec["er_analyst_mail_names"]=user method_codes,inst_code=[],"" # find the data from the meas_data file for this sample # # collect info for the PmagSpecRec dictionary # meas_meth=[] for rec in meas_data: # copy of vital stats to PmagSpecRec from first spec record if rec["er_specimen_name"]==s: 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["er_citation_names"]="This study" PmagSpecRec["magic_instrument_codes"]="" if "magic_experiment_name" not in rec.keys(): rec["magic_experiment_name"]="" if "magic_instrument_codes" not in rec.keys(): rec["magic_instrument_codes"]="" else: PmagSpecRec["magic_experiment_names"]=rec["magic_experiment_name"] if len(rec["magic_instrument_codes"]) > len(inst_code): inst_code=rec["magic_instrument_codes"] PmagSpecRec["magic_instrument_codes"]=inst_code # copy over instruments break # # now check for correct method labels for all measurements # nrm_data=[] for meas_rec in meas_data: if meas_rec['er_specimen_name']==PmagSpecRec['er_specimen_name']: meths=meas_rec["magic_method_codes"].split(":") for meth in meths: if meth.strip() not in meas_meth:meas_meth.append(meth) if "LT-NO" in meas_meth:nrm_data.append(meas_rec) # data,units=pmag.find_dmag_rec(s,nrm_data) # datablock=data # # find replicate measurements at NRM step and average them # Specs=[] if doave==1: step_meth,avedata=pmag.vspec(data) if len(avedata) != len(datablock): method_codes.append("DE-VM") SpecRec=avedata[0] print 'averaging data ' else: SpecRec=data[0] Specs.append(SpecRec) else: for spec in data:Specs.append(spec) for SpecRec in Specs: # # do geo or stratigraphic correction now # if geo==1: # # find top priority orientation method redo,p=1,0 if len(SO_methods)<=1: az_type=SO_methods[0] orient=pmag.find_samp_rec(PmagSpecRec["er_sample_name"],samp_data,az_type) if orient["sample_azimuth"] !="": method_codes.append(az_type) redo=0 while redo==1: if p>=len(orientation_priorities): print "no orientation data for ",s skip,redo=1,0 break az_type=orientation_priorities[str(p)] orient=pmag.find_samp_rec(PmagSpecRec["er_sample_name"],samp_data,az_type) if orient["sample_azimuth"] !="": method_codes.append(az_type.strip()) redo=0 elif orient["sample_azimuth"] =="": p+=1 # # if stratigraphic selected, get stratigraphic correction # if skip==0 and orient["sample_azimuth"]!="" and orient["sample_dip"]!="": d_geo,i_geo=pmag.dogeo(SpecRec[1],SpecRec[2],orient["sample_azimuth"],orient["sample_dip"]) SpecRec[1]=d_geo SpecRec[2]=i_geo if tilt==1 and "sample_bed_dip" in orient.keys() and orient['sample_bed_dip']!="": d_tilt,i_tilt=pmag.dotilt(d_geo,i_geo,orient["sample_bed_dip_direction"],orient["sample_bed_dip"]) SpecRec[1]=d_tilt SpecRec[2]=i_tilt if skip==0: PmagSpecRec["specimen_dec"]='%7.1f ' %(SpecRec[1]) PmagSpecRec["specimen_inc"]='%7.1f ' %(SpecRec[2]) if geo==1 and tilt==0:PmagSpecRec["specimen_tilt_correction"]='0' if geo==1 and tilt==1: PmagSpecRec["specimen_tilt_correction"]='100' if geo==0 and tilt==0: PmagSpecRec["specimen_tilt_correction"]='-1' PmagSpecRec["specimen_direction_type"]='l' PmagSpecRec["magic_method_codes"]="LT-NO" if len(method_codes) != 0: methstring="" for meth in method_codes: methstring=methstring+ ":" +meth PmagSpecRec["magic_method_codes"]=methstring[1:] PmagSpecRec["specimen_description"]="NRM data" PmagSpecRecs.append(PmagSpecRec) pmag.magic_write(pmag_file,PmagSpecRecs,'pmag_specimens') print "Data saved in ",pmag_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 scalc_magic.py DESCRIPTION calculates Sb from pmag_results files SYNTAX scalc_magic -h [command line options] INPUT takes magic formatted pmag_results table pmag_result_name must start with "VGP: Site" must have average_lat if spin axis is reference OPTIONS -h prints help message and quits -f FILE: specify input results file, default is 'pmag_results.txt' -c cutoff: specify VGP colatitude cutoff value -k cutoff: specify kappa cutoff -crd [s,g,t]: specify coordinate system, default is geographic -v : use the VanDammme criterion -a: use antipodes of reverse data: default is to use only normal -C: use all data without regard to polarity -r: use reverse data only -p: do relative to principle axis -b: do bootstrap confidence bounds OUTPUT: if option -b used: N, S_B, lower and upper bounds otherwise: N, S_B, cutoff """ in_file = 'pmag_results.txt' coord, kappa, cutoff = "0", 1., 90. nb, anti, spin, v, boot = 1000, 0, 1, 0, 0 coord_key = 'tilt_correction' rev = 0 if '-h' in sys.argv: print(main.__doc__) sys.exit() if '-f' in sys.argv: ind = sys.argv.index("-f") in_file = sys.argv[ind + 1] if '-c' in sys.argv: ind = sys.argv.index('-c') cutoff = float(sys.argv[ind + 1]) if '-k' in sys.argv: ind = sys.argv.index('-k') kappa = float(sys.argv[ind + 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 '-a' in sys.argv: anti = 1 if '-C' in sys.argv: cutoff = 180. # no cutoff if '-r' in sys.argv: rev = 1 if '-p' in sys.argv: spin = 0 if '-v' in sys.argv: v = 1 if '-b' in sys.argv: boot = 1 data, file_type = pmag.magic_read(in_file) # # # find desired vgp lat,lon, kappa,N_site data: # # # A, Vgps, Pvgps = 180., [], [] VgpRecs = pmag.get_dictitem(data, 'vgp_lat', '', 'F') # get all non-blank vgp latitudes VgpRecs = pmag.get_dictitem(VgpRecs, 'vgp_lon', '', 'F') # get all non-blank vgp longitudes SiteRecs = pmag.get_dictitem(VgpRecs, 'data_type', 'i', 'T') # get VGPs (as opposed to averaged) SiteRecs = pmag.get_dictitem(SiteRecs, coord_key, coord, 'T') # get right coordinate system for rec in SiteRecs: if anti == 1: if 90. - abs(float(rec['vgp_lat'])) <= cutoff and float( rec['average_k']) >= kappa: if float(rec['vgp_lat']) < 0: rec['vgp_lat'] = '%7.1f' % (-1 * float(rec['vgp_lat'])) rec['vgp_lon'] = '%7.1f' % (float(rec['vgp_lon']) - 180.) Vgps.append(rec) Pvgps.append([float(rec['vgp_lon']), float(rec['vgp_lat'])]) elif rev == 0: # exclude normals if 90. - (float(rec['vgp_lat'])) <= cutoff and float( rec['average_k']) >= kappa: Vgps.append(rec) Pvgps.append([float(rec['vgp_lon']), float(rec['vgp_lat'])]) else: # include normals if 90. - abs(float(rec['vgp_lat'])) <= cutoff and float( rec['average_k']) >= kappa: if float(rec['vgp_lat']) < 0: rec['vgp_lat'] = '%7.1f' % (-1 * float(rec['vgp_lat'])) rec['vgp_lon'] = '%7.1f' % (float(rec['vgp_lon']) - 180.) Vgps.append(rec) Pvgps.append( [float(rec['vgp_lon']), float(rec['vgp_lat'])]) if spin == 0: # do transformation to pole ppars = pmag.doprinc(Pvgps) for vgp in Vgps: vlon, vlat = pmag.dotilt(float(vgp['vgp_lon']), float(vgp['vgp_lat']), ppars['dec'] - 180., 90. - ppars['inc']) vgp['vgp_lon'] = vlon vgp['vgp_lat'] = vlat vgp['average_k'] = "0" S_B = pmag.get_Sb(Vgps) A = cutoff if v == 1: thetamax, A = 181., 180. vVgps, cnt = [], 0 for vgp in Vgps: vVgps.append(vgp) # make a copy of Vgps while thetamax > A: thetas = [] A = 1.8 * S_B + 5 cnt += 1 for vgp in vVgps: thetas.append(90. - (float(vgp['vgp_lat']))) thetas.sort() thetamax = thetas[-1] if thetamax < A: break nVgps = [] for vgp in vVgps: if 90. - (float(vgp['vgp_lat'])) < thetamax: nVgps.append(vgp) vVgps = [] for vgp in nVgps: vVgps.append(vgp) S_B = pmag.get_Sb(vVgps) Vgps = [] for vgp in vVgps: Vgps.append(vgp) # make a new Vgp list SBs = [] if boot == 1: for i in range(nb): # now do bootstrap BVgps = [] if i % 100 == 0: print(i, ' out of ', nb) for k in range(len(Vgps)): random.seed() ind = random.randint(0, len(Vgps) - 1) BVgps.append(Vgps[ind]) SBs.append(pmag.get_Sb(BVgps)) SBs.sort() low = int(.025 * nb) high = int(.975 * nb) print(len(Vgps), '%7.1f _ %7.1f ^ %7.1f %7.1f' % (S_B, SBs[low], SBs[high], A)) else: print(len(Vgps), '%7.1f %7.1f ' % (S_B, A))
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 fishqq.py DESCRIPTION makes qq plot from dec,inc input data INPUT FORMAT takes dec/inc pairs in space delimited file SYNTAX fishqq.py [command line options] OPTIONS -h help message -f FILE, specify file on command line -F FILE, specify output file for statistics -sav save and quit [saves as input file name plus fmt extension] -fmt specify format for output [png, eps, svg, pdf] OUTPUT: Dec Inc N Mu Mu_crit Me Me_crit Y/N where direction is the principal component and Y/N is Fisherian or not separate lines for each mode with N >=10 (N and R) """ fmt,plot='svg',0 outfile="" if '-h' in sys.argv: # check if help is needed print main.__doc__ sys.exit() # graceful quit elif '-f' in sys.argv: # ask for filename ind=sys.argv.index('-f') file=sys.argv[ind+1] f=open(file,'rU') data=f.readlines() if '-F' in sys.argv: ind=sys.argv.index('-F') outfile=open(sys.argv[ind+1],'w') # open output file if '-sav' in sys.argv: plot=1 if '-fmt' in sys.argv: ind=sys.argv.index('-fmt') fmt=sys.argv[ind+1] DIs,nDIs,rDIs= [],[],[] # set up list for data for line in data: # read in the data from standard input if '\t' in line: rec=line.split('\t') # split each line on space to get records else: rec=line.split() # split each line on space to get records DIs.append([float(rec[0]),float(rec[1])]) # append data to Inc # split into two modes ppars=pmag.doprinc(DIs) # get principal directions for rec in DIs: angle=pmag.angle([rec[0],rec[1]],[ppars['dec'],ppars['inc']]) if angle>90.: rDIs.append(rec) else: nDIs.append(rec) # if len(rDIs) >=10 or len(nDIs) >=10: D1,I1=[],[] QQ={'unf1':1,'exp1':2} pmagplotlib.plot_init(QQ['unf1'],5,5) pmagplotlib.plot_init(QQ['exp1'],5,5) if len(nDIs) < 10: ppars=pmag.doprinc(rDIs) # get principal directions Drbar,Irbar=ppars['dec']-180.,-ppars['inc'] Nr=len(rDIs) for di in rDIs: d,irot=pmag.dotilt(di[0],di[1],Drbar-180.,90.-Irbar) # rotate to mean drot=d-180. if drot<0:drot=drot+360. D1.append(drot) I1.append(irot) Dtit='Mode 2 Declinations' Itit='Mode 2 Inclinations' else: ppars=pmag.doprinc(nDIs) # get principal directions Dnbar,Inbar=ppars['dec'],ppars['inc'] Nn=len(nDIs) for di in nDIs: d,irot=pmag.dotilt(di[0],di[1],Dnbar-180.,90.-Inbar) # rotate to mean drot=d-180. if drot<0:drot=drot+360. D1.append(drot) I1.append(irot) Dtit='Mode 1 Declinations' Itit='Mode 1 Inclinations' Mu_n,Mu_ncr=pmagplotlib.plotQQunf(QQ['unf1'],D1,Dtit) # make plot Me_n,Me_ncr=pmagplotlib.plotQQexp(QQ['exp1'],I1,Itit) # make plot #print Mu_n,Mu_ncr,Me_n, Me_ncr if outfile!="": # Dec Inc N Mu Mu_crit Me Me_crit Y/N if Mu_n<=Mu_ncr and Me_n<=Me_ncr: F='Y' else: F='N' outstring='%7.1f %7.1f %i %5.3f %5.3f %5.3f %5.3f %s \n'%(Dnbar,Inbar,Nn,Mu_n,Mu_ncr,Me_n,Me_ncr,F) outfile.write(outstring) else: print 'you need N> 10 for at least one mode' sys.exit() if len(rDIs)>10 and len(nDIs)>10: D2,I2=[],[] QQ['unf2']=3 QQ['exp2']=4 pmagplotlib.plot_init(QQ['unf2'],5,5) pmagplotlib.plot_init(QQ['exp2'],5,5) ppars=pmag.doprinc(rDIs) # get principal directions Drbar,Irbar=ppars['dec']-180.,-ppars['inc'] Nr=len(rDIs) for di in rDIs: d,irot=pmag.dotilt(di[0],di[1],Drbar-180.,90.-Irbar) # rotate to mean drot=d-180. if drot<0:drot=drot+360. D2.append(drot) I2.append(irot) Dtit='Mode 2 Declinations' Itit='Mode 2 Inclinations' Mu_r,Mu_rcr=pmagplotlib.plotQQunf(QQ['unf2'],D2,Dtit) # make plot Me_r,Me_rcr=pmagplotlib.plotQQexp(QQ['exp2'],I2,Itit) # make plot if outfile!="": # Dec Inc N Mu Mu_crit Me Me_crit Y/N if Mu_r<=Mu_rcr and Me_r<=Me_rcr: F='Y' else: F='N' outstring='%7.1f %7.1f %i %5.3f %5.3f %5.3f %5.3f %s \n'%(Drbar,Irbar,Nr,Mu_r,Mu_rcr,Me_r,Me_rcr,F) outfile.write(outstring) files={} for key in QQ.keys(): files[key]=file+'_'+key+'.'+fmt if pmagplotlib.isServer: black = '#000000' purple = '#800080' titles={} titles['eq']='Equal Area Plot' EQ = pmagplotlib.addBorders(EQ,titles,black,purple) pmagplotlib.saveP(QQ,files) elif plot==1: pmagplotlib.saveP(QQ,files) else: pmagplotlib.drawFIGS(QQ) ans=raw_input(" S[a]ve to save plot, [q]uit without saving: ") if ans=="a": pmagplotlib.saveP(QQ,files)
def main(): """ NAME scalc.py DESCRIPTION calculates Sb from VGP Long,VGP Lat,Directional kappa,Site latitude data SYNTAX scalc -h [command line options] [< standard input] INPUT takes space delimited files with PLong, PLat,[kappa, N_site, slat] OPTIONS -h prints help message and quits -f FILE: specify input file -c cutoff: specify VGP colatitude cutoff value -k cutoff: specify kappa cutoff -v : use the VanDammme criterion -a: use antipodes of reverse data: default is to use only normal -C: use all data without regard to polarity -b: do a bootstrap for confidence -p: do relative to principle axis NOTES if kappa, N_site, lat supplied, will consider within site scatter OUTPUT N Sb Sb_lower Sb_upper Co-lat. Cutoff """ coord,kappa,cutoff="0",0,90. nb,anti,boot=1000,0,0 all=0 n=0 v=0 spin=1 coord_key='tilt_correction' if '-h' in sys.argv: print main.__doc__ sys.exit() if '-f' in sys.argv: ind=sys.argv.index("-f") in_file=sys.argv[ind+1] f=open(in_file,'rU') lines=f.readlines() else: lines=sys.stdin.readlines() if '-c' in sys.argv: ind=sys.argv.index('-c') cutoff=float(sys.argv[ind+1]) if '-k' in sys.argv: ind=sys.argv.index('-k') kappa=float(sys.argv[ind+1]) if '-n' in sys.argv: ind=sys.argv.index('-n') n=int(sys.argv[ind+1]) if '-a' in sys.argv: anti=1 if '-C' in sys.argv: cutoff=180. # no cutoff if '-b' in sys.argv: boot=1 if '-v' in sys.argv: v=1 if '-p' in sys.argv: spin=0 # # # find desired vgp lat,lon, kappa,N_site data: # A,Vgps,slats,Pvgps=180.,[],[],[] for line in lines: if '\t' in line: rec=line.replace('\n','').split('\t') # split each line on space to get records else: rec=line.replace('\n','').split() # split each line on space to get records vgp={} vgp['vgp_lon'],vgp['vgp_lat']=rec[0],rec[1] Pvgps.append([float(rec[0]),float(rec[1])]) if anti==1: if float(vgp['vgp_lat'])<0: vgp['vgp_lat']='%7.1f'%(-1*float(vgp['vgp_lat'])) vgp['vgp_lon']='%7.1f'%(float(vgp['vgp_lon'])-180.) if len(rec)==5: vgp['average_k'],vgp['average_nn'],vgp['average_lat']=rec[2],rec[3],rec[4] slats.append(float(rec[4])) else: vgp['average_k'],vgp['average_nn'],vgp['average_lat']="0","0","0" if 90.-(float(vgp['vgp_lat']))<=cutoff and float(vgp['average_k'])>=kappa and int(vgp['average_nn'])>=n: Vgps.append(vgp) if spin==0: # do transformation to pole ppars=pmag.doprinc(Pvgps) for vgp in Vgps: vlon,vlat=pmag.dotilt(float(vgp['vgp_lon']),float(vgp['vgp_lat']),ppars['dec']-180.,90.-ppars['inc']) vgp['vgp_lon']=vlon vgp['vgp_lat']=vlat vgp['average_k']="0" S_B= pmag.get_Sb(Vgps) A=cutoff if v==1: thetamax,A=181.,180. vVgps,cnt=[],0 for vgp in Vgps:vVgps.append(vgp) # make a copy of Vgps while thetamax>A: thetas=[] A=1.8*S_B+5 cnt+=1 for vgp in vVgps:thetas.append(90.-(float(vgp['vgp_lat']))) thetas.sort() thetamax=thetas[-1] if thetamax<A:break nVgps=[] for vgp in vVgps: if 90.-(float(vgp['vgp_lat']))<thetamax:nVgps.append(vgp) vVgps=[] for vgp in nVgps:vVgps.append(vgp) S_B= pmag.get_Sb(vVgps) Vgps=[] for vgp in vVgps:Vgps.append(vgp) # make a new Vgp list SBs,Ns=[],[] if boot==1: print 'please be patient... bootstrapping' for i in range(nb): # now do bootstrap BVgps=[] for k in range(len(Vgps)): ind=random.randint(0,len(Vgps)-1) random.jumpahead(int(ind*1000)) BVgps.append(Vgps[ind]) SBs.append(pmag.get_Sb(BVgps)) SBs.sort() low=int(.025*nb) high=int(.975*nb) print len(Vgps),'%7.1f %7.1f %7.1f %7.1f '%(S_B,SBs[low],SBs[high],A) else: print len(Vgps),'%7.1f %7.1f '%(S_B,A) if len(slats)>2: stats= pmag.gausspars(slats) print 'mean lat = ','%7.1f'%(stats[0])
def main(): """ NAME scalc_magic.py DESCRIPTION calculates Sb from pmag_results files SYNTAX scalc_magic -h [command line options] INPUT takes magic formatted pmag_results table pmag_result_name must start with "VGP: Site" must have average_lat if spin axis is reference OPTIONS -h prints help message and quits -f FILE: specify input results file, default is 'pmag_results.txt' -c cutoff: specify VGP colatitude cutoff value -k cutoff: specify kappa cutoff -crd [s,g,t]: specify coordinate system, default is geographic -v : use the VanDammme criterion -a: use antipodes of reverse data: default is to use only normal -C: use all data without regard to polarity -r: use reverse data only -p: do relative to principle axis -b: do bootstrap confidence bounds OUTPUT: if option -b used: N, S_B, lower and upper bounds otherwise: N, S_B, cutoff """ in_file='pmag_results.txt' coord,kappa,cutoff="0",1.,90. nb,anti,spin,v,boot=1000,0,1,0,0 coord_key='tilt_correction' rev=0 if '-h' in sys.argv: print(main.__doc__) sys.exit() if '-f' in sys.argv: ind=sys.argv.index("-f") in_file=sys.argv[ind+1] if '-c' in sys.argv: ind=sys.argv.index('-c') cutoff=float(sys.argv[ind+1]) if '-k' in sys.argv: ind=sys.argv.index('-k') kappa=float(sys.argv[ind+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 '-a' in sys.argv: anti=1 if '-C' in sys.argv: cutoff=180. # no cutoff if '-r' in sys.argv: rev=1 if '-p' in sys.argv: spin=0 if '-v' in sys.argv: v=1 if '-b' in sys.argv: boot=1 data,file_type=pmag.magic_read(in_file) # # # find desired vgp lat,lon, kappa,N_site data: # # # A,Vgps,Pvgps=180.,[],[] VgpRecs=pmag.get_dictitem(data,'vgp_lat','','F') # get all non-blank vgp latitudes VgpRecs=pmag.get_dictitem(VgpRecs,'vgp_lon','','F') # get all non-blank vgp longitudes SiteRecs=pmag.get_dictitem(VgpRecs,'data_type','i','T') # get VGPs (as opposed to averaged) SiteRecs=pmag.get_dictitem(SiteRecs,coord_key,coord,'T') # get right coordinate system for rec in SiteRecs: if anti==1: if 90.-abs(float(rec['vgp_lat']))<=cutoff and float(rec['average_k'])>=kappa: if float(rec['vgp_lat'])<0: rec['vgp_lat']='%7.1f'%(-1*float(rec['vgp_lat'])) rec['vgp_lon']='%7.1f'%(float(rec['vgp_lon'])-180.) Vgps.append(rec) Pvgps.append([float(rec['vgp_lon']),float(rec['vgp_lat'])]) elif rev==0: # exclude normals if 90.-(float(rec['vgp_lat']))<=cutoff and float(rec['average_k'])>=kappa: Vgps.append(rec) Pvgps.append([float(rec['vgp_lon']),float(rec['vgp_lat'])]) else: # include normals if 90.-abs(float(rec['vgp_lat']))<=cutoff and float(rec['average_k'])>=kappa: if float(rec['vgp_lat'])<0: rec['vgp_lat']='%7.1f'%(-1*float(rec['vgp_lat'])) rec['vgp_lon']='%7.1f'%(float(rec['vgp_lon'])-180.) Vgps.append(rec) Pvgps.append([float(rec['vgp_lon']),float(rec['vgp_lat'])]) if spin==0: # do transformation to pole ppars=pmag.doprinc(Pvgps) for vgp in Vgps: vlon,vlat=pmag.dotilt(float(vgp['vgp_lon']),float(vgp['vgp_lat']),ppars['dec']-180.,90.-ppars['inc']) vgp['vgp_lon']=vlon vgp['vgp_lat']=vlat vgp['average_k']="0" S_B= pmag.get_Sb(Vgps) A=cutoff if v==1: thetamax,A=181.,180. vVgps,cnt=[],0 for vgp in Vgps:vVgps.append(vgp) # make a copy of Vgps while thetamax>A: thetas=[] A=1.8*S_B+5 cnt+=1 for vgp in vVgps:thetas.append(90.-(float(vgp['vgp_lat']))) thetas.sort() thetamax=thetas[-1] if thetamax<A:break nVgps=[] for vgp in vVgps: if 90.-(float(vgp['vgp_lat']))<thetamax:nVgps.append(vgp) vVgps=[] for vgp in nVgps:vVgps.append(vgp) S_B= pmag.get_Sb(vVgps) Vgps=[] for vgp in vVgps:Vgps.append(vgp) # make a new Vgp list SBs=[] if boot==1: for i in range(nb): # now do bootstrap BVgps=[] if i%100==0: print(i,' out of ',nb) for k in range(len(Vgps)): random.seed() ind=random.randint(0,len(Vgps)-1) BVgps.append(Vgps[ind]) SBs.append(pmag.get_Sb(BVgps)) SBs.sort() low=int(.025*nb) high=int(.975*nb) print(len(Vgps),'%7.1f _ %7.1f ^ %7.1f %7.1f'%(S_B,SBs[low],SBs[high],A)) else: print(len(Vgps),'%7.1f %7.1f '%(S_B,A))
def main(): """ NAME nrm_specimens_magic.py DESCRIPTION converts NRM data in a magic_measurements type file to geographic and tilt corrected data in a pmag_specimens type file SYNTAX nrm_specimens_magic.py [-h][command line options] OPTIONS: -h prints the help message and quits -f MFILE: specify input file -fsa SFILE: specify er_samples format file [with orientations] -F PFILE: specify output file -A do not average replicate measurements -crd [g, t]: specify coordinate system ([g]eographic or [t]ilt adjusted) NB: you must have the SFILE in this directory DEFAULTS MFILE: magic_measurements.txt PFILE: nrm_specimens.txt SFILE: er_samples.txt coord: specimen average replicate measurements?: YES """ # # define some variables # beg, end, pole, geo, tilt, askave, save = 0, 0, [], 0, 0, 0, 0 samp_file = 1 args = sys.argv geo, tilt, orient = 0, 0, 0 doave = 1 user, comment, doave, coord = "", "", 1, "" dir_path = "." if "-h" in args: print main.__doc__ sys.exit() if "-WD" in sys.argv: ind = sys.argv.index("-WD") dir_path = sys.argv[ind + 1] meas_file = dir_path + "/magic_measurements.txt" pmag_file = dir_path + "/nrm_specimens.txt" samp_file = dir_path + "/er_samples.txt" if "-A" in args: doave = 0 if "-f" in args: ind = args.index("-f") meas_file = sys.argv[ind + 1] if "-F" in args: ind = args.index("-F") pmag_file = dir_path + "/" + sys.argv[ind + 1] speclist = [] 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, orient = 1, 1 if coord == "t": tilt, orient, geo = 1, 1, 1 # # read in data if samp_file != "": 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() else: print samp_file, " read in with ", len(samp_data), " records" else: print "no orientations - will create file in specimen coordinates" geo, tilt, orient = 0, 0, 0 # # 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() # if orient == 1: # set orientation priorities SO_methods = [] orientation_priorities = { "0": "SO-SUN", "1": "SO-GPS-DIFF", "2": "SO-SIGHT-BACK", "3": "SO-CMD-NORTH", "4": "SO-MAG", } for rec in samp_data: 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()) # # sort the sample names # sids = pmag.get_specs(meas_data) # # PmagSpecRecs = [] for s in sids: skip = 0 recnum = 0 PmagSpecRec = {} PmagSpecRec["er_analyst_mail_names"] = user method_codes, inst_code = [], "" # find the data from the meas_data file for this sample # # collect info for the PmagSpecRec dictionary # meas_meth = [] for rec in meas_data: # copy of vital stats to PmagSpecRec from first spec record if rec["er_specimen_name"] == s: 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["er_citation_names"] = "This study" PmagSpecRec["magic_instrument_codes"] = "" if "magic_experiment_name" not in rec.keys(): rec["magic_experiment_name"] = "" if "magic_instrument_codes" not in rec.keys(): rec["magic_instrument_codes"] = "" else: PmagSpecRec["magic_experiment_names"] = rec["magic_experiment_name"] if len(rec["magic_instrument_codes"]) > len(inst_code): inst_code = rec["magic_instrument_codes"] PmagSpecRec["magic_instrument_codes"] = inst_code # copy over instruments break # # now check for correct method labels for all measurements # nrm_data = [] for meas_rec in meas_data: if meas_rec["er_specimen_name"] == PmagSpecRec["er_specimen_name"]: meths = meas_rec["magic_method_codes"].split(":") for meth in meths: if meth.strip() not in meas_meth: meas_meth.append(meth) if "LT-NO" in meas_meth: nrm_data.append(meas_rec) # data, units = pmag.find_dmag_rec(s, nrm_data) # datablock = data # # find replicate measurements at NRM step and average them # Specs = [] if doave == 1: step_meth, avedata = pmag.vspec(data) if len(avedata) != len(datablock): method_codes.append("DE-VM") SpecRec = avedata[0] print "averaging data " else: SpecRec = data[0] Specs.append(SpecRec) else: for spec in data: Specs.append(spec) for SpecRec in Specs: # # do geo or stratigraphic correction now # if geo == 1: # # find top priority orientation method redo, p = 1, 0 if len(SO_methods) <= 1: az_type = SO_methods[0] orient = pmag.find_samp_rec(PmagSpecRec["er_sample_name"], samp_data, az_type) if orient["sample_azimuth"] != "": method_codes.append(az_type) redo = 0 while redo == 1: if p >= len(orientation_priorities): print "no orientation data for ", s skip, redo = 1, 0 break az_type = orientation_priorities[str(p)] orient = pmag.find_samp_rec(PmagSpecRec["er_sample_name"], samp_data, az_type) if orient["sample_azimuth"] != "": method_codes.append(az_type.strip()) redo = 0 elif orient["sample_azimuth"] == "": p += 1 # # if stratigraphic selected, get stratigraphic correction # if skip == 0 and orient["sample_azimuth"] != "" and orient["sample_dip"] != "": d_geo, i_geo = pmag.dogeo(SpecRec[1], SpecRec[2], orient["sample_azimuth"], orient["sample_dip"]) SpecRec[1] = d_geo SpecRec[2] = i_geo if tilt == 1 and "sample_bed_dip" in orient.keys() and orient["sample_bed_dip"] != "": d_tilt, i_tilt = pmag.dotilt( d_geo, i_geo, orient["sample_bed_dip_direction"], orient["sample_bed_dip"] ) SpecRec[1] = d_tilt SpecRec[2] = i_tilt if skip == 0: PmagSpecRec["specimen_dec"] = "%7.1f " % (SpecRec[1]) PmagSpecRec["specimen_inc"] = "%7.1f " % (SpecRec[2]) if geo == 1 and tilt == 0: PmagSpecRec["specimen_tilt_correction"] = "0" if geo == 1 and tilt == 1: PmagSpecRec["specimen_tilt_correction"] = "100" if geo == 0 and tilt == 0: PmagSpecRec["specimen_tilt_correction"] = "-1" PmagSpecRec["specimen_direction_type"] = "l" PmagSpecRec["magic_method_codes"] = "LT-NO" if len(method_codes) != 0: methstring = "" for meth in method_codes: methstring = methstring + ":" + meth PmagSpecRec["magic_method_codes"] = methstring[1:] PmagSpecRec["specimen_description"] = "NRM data" PmagSpecRecs.append(PmagSpecRec) pmag.magic_write(pmag_file, PmagSpecRecs, "pmag_specimens") print "Data saved in ", pmag_file
def main(): """ NAME di_rot.py DESCRIPTION rotates set of directions to new coordinate system SYNTAX di_rot.py [command line options] OPTIONS -h prints help message and quits -f specify input file, default is standard input -F specify output file, default is standard output -D D specify Dec of new coordinate system, default is 0 -I I specify Inc of new coordinate system, default is 90 INTPUT/OUTPUT dec inc [space delimited] """ D, I = 0., 90. outfile = "" infile = "" if '-h' in sys.argv: print main.__doc__ sys.exit() if '-f' in sys.argv: ind = sys.argv.index('-f') infile = sys.argv[ind + 1] data = numpy.loadtxt(infile) else: data = numpy.loadtxt(sys.stdin, dtype=numpy.float) if '-F' in sys.argv: ind = sys.argv.index('-F') outfile = sys.argv[ind + 1] out = open(outfile, 'w') if '-D' in sys.argv: ind = sys.argv.index('-D') D = float(sys.argv[ind + 1]) if '-I' in sys.argv: ind = sys.argv.index('-I') I = float(sys.argv[ind + 1]) if len(data.shape) > 1: # 2-D array N = data.shape[0] DipDir, Dip = numpy.ones(N, dtype=numpy.float).transpose() * ( D - 180.), numpy.ones(N, dtype=numpy.float).transpose() * (90. - I) data = data.transpose() data = numpy.array([data[0], data[1], DipDir, Dip]).transpose() drot, irot = pmag.dotilt_V(data) drot = (drot - 180.) % 360. # for k in range(N): if outfile == "": print '%7.1f %7.1f ' % (drot[k], irot[k]) else: out.write('%7.1f %7.1f\n' % (drot[k], irot[k])) else: d, i = pmag.dotilt(data[0], data[1], (D - 180.), 90. - I) if outfile == "": print '%7.1f %7.1f ' % ((d - 180.) % 360., i) else: out.write('%7.1f %7.1f\n' % ((d - 180.) % 360., i))