def main(): """ NAME fishrot.py DESCRIPTION generates set of Fisher distribed data from specified distribution SYNTAX fishrot.py [-h][-i][command line options] OPTIONS -h prints help message and quits -i for interactive entry -k kappa specify kappa, default is 20 -n N specify N, default is 100 -D D specify mean Dec, default is 0 -I I specify mean Inc, default is 90 where: kappa: fisher distribution concentration parameter N: number of directions desired OUTPUT dec, inc """ N,kappa,D,I=100,20.,0.,90. if len(sys.argv)!=0 and '-h' in sys.argv: print main.__doc__ sys.exit() elif '-i' in sys.argv: ans=raw_input(' Kappa: ') kappa=float(ans) ans=raw_input(' N: ') N=int(ans) ans=raw_input(' Mean Dec: ') D=float(ans) ans=raw_input(' Mean Inc: ') I=float(ans) else: 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 '-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]) for k in range(N): dec,inc= pmag.fshdev(kappa) # send kappa to fshdev drot,irot=pmag.dodirot(dec,inc,D,I) print '%7.1f %7.1f ' % (drot,irot)
def get_fish(dir): """ generate fisher distributed points according to the supplied parameters (includes dec,inc,n,k) in a pandas object. """ tempD,tempI=[],[] for k in range(int(dir.n)): dec,inc=pmag.fshdev(dir.k) drot,irot=pmag.dodirot(dec,inc,dir.dec,dir.inc) tempD.append(drot) tempI.append(irot) return np.column_stack((tempD,tempI))
def fishrot(kappa,N,D,I): #from Pmagpy """ Description: generates set of Fisher distributed data from specified distribution Input: kappa (fisher distribution concentration parameter), number of desired subsamples, Dec and Inc Output: list with N pairs of Dec, Inc. """ out_d=[] out=[] for k in range(N): dec,inc= pmag.fshdev(kappa) # send kappa to fshdev drot,irot=pmag.dodirot(dec,inc,D,I) out_d=[drot,irot] out.append(out_d) return out
def ifishrot(k=20,n=100,Dec=0,Inc=90): """ Generates Fisher distributed unit vectors from a specified distribution using the pmag.py fshdev and dodirot functions Parameters ---------- k kappa precision parameter (default is 20) n number of vectors to determine (default is 100) Dec mean declination of data set (default is 0) Inc mean inclination of data set (default is 90) """ directions=[] for data in range(n): dec,inc=pmag.fshdev(k) drot,irot=pmag.dodirot(dec,inc,Dec,Inc) directions.append([drot,irot,1.]) return directions
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.dodirot(float(vgp['vgp_lon']),float(vgp['vgp_lat']),ppars['dec'],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)): 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)
def main(): """ NAME EI.py [command line options] DESCRIPTION Finds bootstrap confidence bounds on Elongation and Inclination data SYNTAX EI.py [command line options] OPTIONS -h prints help message and quits -f FILE specifies input file -p do parametric bootstrap INPUT dec/inc pairs OUTPUT makes a plot of the E/I pair and bootstrapped confidence bounds along with the E/I trend predicted by the TK03 field model prints out: Io (mean inclination), I_lower and I_upper are 95% confidence bounds on inclination Eo (elongation), E_lower and E_upper are 95% confidence bounds on elongation Edec,Einc are the elongation direction """ par=0 if '-h' in sys.argv: print main.__doc__ sys.exit() if '-f' in sys.argv: ind=sys.argv.index('-f') file=open(sys.argv[ind+1],'rU') if '-p' in sys.argv: par=1 rseed,nb,data=10,5000,[] upper,lower=int(round(.975*nb)),int(round(.025*nb)) Es,Is=[],[] PLTS={'eq':1,'ei':2} pmagplotlib.plot_init(PLTS['eq'],5,5) pmagplotlib.plot_init(PLTS['ei'],5,5) # poly_tab= [ 3.07448925e-06, -3.49555831e-04, -1.46990847e-02, 2.90905483e+00] poly_new= [ 3.15976125e-06, -3.52459817e-04, -1.46641090e-02, 2.89538539e+00] # poly_cp88= [ 5.34558576e-06, -7.70922659e-04, 5.18529685e-03, 2.90941351e+00] # poly_qc96= [ 7.08210133e-06, -8.79536536e-04, 1.09625547e-03, 2.92513660e+00] # poly_cj98=[ 6.56675431e-06, -7.91823539e-04, -1.08211350e-03, 2.80557710e+00] # poly_tk03_g20= [ 4.96757685e-06, -6.02256097e-04, -5.96103272e-03, 2.84227449e+00] # poly_tk03_g30= [ 7.82525963e-06, -1.39781724e-03, 4.47187092e-02, 2.54637535e+00] # poly_gr99_g=[ 1.24362063e-07, -1.69383384e-04, -4.24479223e-03, 2.59257437e+00] # poly_gr99_e=[ 1.26348154e-07, 2.01691452e-04, -4.99142308e-02, 3.69461060e+00] E_EI,E_tab,E_new,E_cp88,E_cj98,E_qc96,E_tk03_g20=[],[],[],[],[],[],[] E_tk03_g30,E_gr99_g,E_gr99_e=[],[],[] I2=range(0,90,5) for inc in I2: E_new.append(EI(inc,poly_new)) # use the polynomial from Tauxe et al. (2008) pmagplotlib.plotEI(PLTS['ei'],E_new,I2,1) if '-f' in sys.argv: random.seed(rseed) for line in file.readlines(): rec=line.split() dec=float(rec[0]) inc=float(rec[1]) if par==1: if len(rec)==4: N=(int(rec[2])) # append n K=float(rec[3]) # append k rec=[dec,inc,N,K] data.append(rec) else: rec=[dec,inc] data.append(rec) pmagplotlib.plotEQ(PLTS['eq'],data,'Data') ppars=pmag.doprinc(data) n=ppars["N"] Io=ppars['inc'] Edec=ppars['Edir'][0] Einc=ppars['Edir'][1] Eo=(ppars['tau2']/ppars['tau3']) b=0 print 'doing bootstrap - be patient' while b<nb: bdata=[] for j in range(n): boot=random.randint(0,n-1) random.jumpahead(rseed) if par==1: DIs=[] D,I,N,K=data[boot][0],data[boot][1],data[boot][2],data[boot][3] for k in range(N): dec,inc=pmag.fshdev(K) drot,irot=pmag.dodirot(dec,inc,D,I) DIs.append([drot,irot]) fpars=pmag.fisher_mean(DIs) bdata.append([fpars['dec'],fpars['inc'],1.]) # replace data[boot] with parametric dec,inc else: bdata.append(data[boot]) ppars=pmag.doprinc(bdata) Is.append(ppars['inc']) Es.append(ppars['tau2']/ppars['tau3']) b+=1 if b%100==0:print b Is.sort() Es.sort() x,std=pmag.gausspars(Es) stderr=std/math.sqrt(len(data)) pmagplotlib.plotX(PLTS['ei'],Io,Eo,Is[lower],Is[upper],Es[lower],Es[upper],'b-') # pmagplotlib.plotX(PLTS['ei'],Io,Eo,Is[lower],Is[upper],Eo-stderr,Eo+stderr,'b-') print 'Io, Eo, I_lower, I_upper, E_lower, E_upper, Edec, Einc' print '%7.1f %4.2f %7.1f %7.1f %4.2f %4.2f %7.1f %7.1f' %(Io,Eo,Is[lower],Is[upper],Es[lower],Es[upper], Edec,Einc) # print '%7.1f %4.2f %7.1f %7.1f %4.2f %4.2f' %(Io,Eo,Is[lower],Is[upper],Eo-stderr,Eo+stderr) pmagplotlib.drawFIGS(PLTS) files,fmt={},'svg' for key in PLTS.keys(): files[key]=key+'.'+fmt ans=raw_input(" S[a]ve to save plot, [q]uit without saving: ") if ans=="a": pmagplotlib.saveP(PLTS,files)
def main(): """ NAME foldtest.py DESCRIPTION does a fold test (Tauxe, 2010) on data INPUT FORMAT dec inc dip_direction dip SYNTAX foldtest.py [command line options] OPTIONS -h prints help message and quits -f FILE file with input data -F FILE for confidence bounds on fold test -u ANGLE (circular standard deviation) for uncertainty on bedding poles -b MIN MAX bounds for quick search of percent untilting [default is -10 to 150%] -n NB number of bootstrap samples [default is 1000] -fmt FMT, specify format - default is svg OUTPUT PLOTS Geographic: is an equal area projection of the input data in original coordinates Stratigraphic: is an equal area projection of the input data in tilt adjusted coordinates % Untilting: The dashed (red) curves are representative plots of maximum eigenvalue (tau_1) as a function of untilting The solid line is the cumulative distribution of the % Untilting required to maximize tau for all the bootstrapped data sets. The dashed vertical lines are 95% confidence bounds on the % untilting that yields the most clustered result (maximum tau_1). Command line: prints out the bootstrapped iterations and finally the confidence bounds on optimum untilting. If the 95% conf bounds include 0, then a pre-tilt magnetization is indicated If the 95% conf bounds include 100, then a post-tilt magnetization is indicated If the 95% conf bounds exclude both 0 and 100, syn-tilt magnetization is possible as is vertical axis rotation or other pathologies Geographic: is an equal area projection of the input data in OPTIONAL OUTPUT FILE: The output file has the % untilting within the 95% confidence bounds nd the number of bootstrap samples """ kappa=0 fmt='svg' nb=1000 # number of bootstraps min,max=-10,150 if '-h' in sys.argv: # check if help is needed print main.__doc__ sys.exit() # graceful quit if '-F' in sys.argv: ind=sys.argv.index('-F') outfile=open(sys.argv[ind+1],'w') else: outfile="" if '-f' in sys.argv: ind=sys.argv.index('-f') file=sys.argv[ind+1] DIDDs=numpy.loadtxt(file) else: print main.__doc__ sys.exit() if '-fmt' in sys.argv: ind=sys.argv.index('-fmt') fmt=sys.argv[ind+1] if '-b' in sys.argv: ind=sys.argv.index('-b') min=float(sys.argv[ind+1]) max=float(sys.argv[ind+2]) if '-n' in sys.argv: ind=sys.argv.index('-n') nb=int(sys.argv[ind+1]) if '-u' in sys.argv: ind=sys.argv.index('-u') csd=float(sys.argv[ind+1]) kappa=(81./csd)**2 # # get to work # PLTS={'geo':1,'strat':2,'taus':3} # make plot dictionary pmagplotlib.plot_init(PLTS['geo'],5,5) pmagplotlib.plot_init(PLTS['strat'],5,5) pmagplotlib.plot_init(PLTS['taus'],5,5) pmagplotlib.plotEQ(PLTS['geo'],DIDDs,'Geographic') D,I=pmag.dotilt_V(DIDDs) TCs=numpy.array([D,I]).transpose() pmagplotlib.plotEQ(PLTS['strat'],TCs,'Stratigraphic') pmagplotlib.drawFIGS(PLTS) Percs=range(min,max) Cdf,Untilt=[],[] pylab.figure(num=PLTS['taus']) print 'doing ',nb,' iterations...please be patient.....' for n in range(nb): # do bootstrap data sets - plot first 25 as dashed red line if n%50==0:print n Taus=[] # set up lists for taus PDs=pmag.pseudo(DIDDs) if kappa!=0: for k in range(len(PDs)): d,i=pmag.fshdev(kappa) dipdir,dip=pmag.dodirot(d,i,PDs[k][2],PDs[k][3]) PDs[k][2]=dipdir PDs[k][3]=dip for perc in Percs: tilt=numpy.array([1.,1.,1.,0.01*perc]) D,I=pmag.dotilt_V(PDs*tilt) TCs=numpy.array([D,I]).transpose() ppars=pmag.doprinc(TCs) # get principal directions Taus.append(ppars['tau1']) if n<25:pylab.plot(Percs,Taus,'r--') Untilt.append(Percs[Taus.index(numpy.max(Taus))]) # tilt that gives maximum tau Cdf.append(float(n)/float(nb)) pylab.plot(Percs,Taus,'k') pylab.xlabel('% Untilting') pylab.ylabel('tau_1 (red), CDF (green)') Untilt.sort() # now for CDF of tilt of maximum tau pylab.plot(Untilt,Cdf,'g') lower=int(.025*nb) upper=int(.975*nb) pylab.axvline(x=Untilt[lower],ymin=0,ymax=1,linewidth=1,linestyle='--') pylab.axvline(x=Untilt[upper],ymin=0,ymax=1,linewidth=1,linestyle='--') tit= '%i - %i %s'%(Untilt[lower],Untilt[upper],'Percent Unfolding') print tit print 'range of all bootstrap samples: ', Untilt[0], ' - ', Untilt[-1] pylab.title(tit) outstring= '%i - %i; %i\n'%(Untilt[lower],Untilt[upper],nb) if outfile!="":outfile.write(outstring) pmagplotlib.drawFIGS(PLTS) ans= raw_input('S[a]ve all figures, <Return> to quit ') if ans!='a': print "Good bye" sys.exit() else: files={} for key in PLTS.keys(): files[key]=('foldtest_'+'%s'%(key.strip()[:2])+'.'+fmt) pmagplotlib.saveP(PLTS,files)
def main(): """ NAME foldtest.py DESCRIPTION does a fold test (Tauxe, 2008) on data INPUT FORMAT dec inc dip_direction dip SYNTAX foldtest.py [command line options] OPTIONS -h prints help message and quits -f FILE -u ANGLE (circular standard deviation) for uncertainty on bedding poles -b MIN MAX bounds for quick search of percent untilting [default is -10 to 150%] -n NB number of bootstrap samples [default is 1000] OUTPUT Geographic: is an equal area projection of the input data in original coordinates Stratigraphic: is an equal area projection of the input data in tilt adjusted coordinates % Untilting: The dashed (red) curves are representative plots of maximum eigenvalue (tau_1) as a function of untilting The solid line is the cumulative distribution of the % Untilting required to maximize tau for all the bootstrapped data sets. The dashed vertical lines are 95% confidence bounds on the % untilting that yields the most clustered result (maximum tau_1). Command line: prints out the bootstrapped iterations and finally the confidence bounds on optimum untilting. If the 95% conf bounds include 0, then a pre-tilt magnetization is indicated If the 95% conf bounds include 100, then a post-tilt magnetization is indicated If the 95% conf bounds exclude both 0 and 100, syn-tilt magnetization is possible as is vertical axis rotation or other pathologies """ kappa=0 nb=1000 # number of bootstraps min,max=-10,150 if '-h' in sys.argv: # check if help is needed print main.__doc__ sys.exit() # graceful quit if '-f' in sys.argv: ind=sys.argv.index('-f') file=sys.argv[ind+1] f=open(file,'rU') data=f.readlines() else: print main.__doc__ sys.exit() if '-b' in sys.argv: ind=sys.argv.index('-b') min=float(sys.argv[ind+1]) max=float(sys.argv[ind+2]) if '-n' in sys.argv: ind=sys.argv.index('-n') nb=int(sys.argv[ind+1]) if '-u' in sys.argv: ind=sys.argv.index('-u') csd=float(sys.argv[ind+1]) kappa=(81./csd)**2 # # get to work # PLTS={'geo':1,'strat':2,'taus':3} # make plot dictionary pmagplotlib.plot_init(PLTS['geo'],5,5) pmagplotlib.plot_init(PLTS['strat'],5,5) pmagplotlib.plot_init(PLTS['taus'],5,5) DIDDs= [] # set up list for dec inc dip_direction, dip for line in data: # read in the data from standard input rec=line.split() # split each line on space to get records DIDDs.append([float(rec[0]),float(rec[1]),float(rec[2]),float(rec[3])]) pmagplotlib.plotEQ(PLTS['geo'],DIDDs,'Geographic') TCs=[] for k in range(len(DIDDs)): drot,irot=pmag.dotilt(DIDDs[k][0],DIDDs[k][1],DIDDs[k][2],DIDDs[k][3]) TCs.append([drot,irot,1.]) pmagplotlib.plotEQ(PLTS['strat'],TCs,'Stratigraphic') Percs=range(min,max) Cdf,Untilt=[],[] pylab.figure(num=PLTS['taus']) print 'doing ',nb,' iterations...please be patient.....' for n in range(nb): # do bootstrap data sets - plot first 25 as dashed red line if n%50==0:print n Taus=[] # set up lists for taus PDs=pmag.pseudo(DIDDs) if kappa!=0: for k in range(len(PDs)): d,i=pmag.fshdev(kappa) dipdir,dip=pmag.dodirot(d,i,PDs[k][2],PDs[k][3]) PDs[k][2]=dipdir PDs[k][3]=dip for perc in Percs: tilt=0.01*perc TCs=[] for k in range(len(PDs)): drot,irot=pmag.dotilt(PDs[k][0],PDs[k][1],PDs[k][2],tilt*PDs[k][3]) TCs.append([drot,irot,1.]) ppars=pmag.doprinc(TCs) # get principal directions Taus.append(ppars['tau1']) if n<25:pylab.plot(Percs,Taus,'r--') Untilt.append(Percs[Taus.index(numpy.max(Taus))]) # tilt that gives maximum tau Cdf.append(float(n)/float(nb)) pylab.plot(Percs,Taus,'k') pylab.xlabel('% Untilting') pylab.ylabel('tau_1 (red), CDF (green)') Untilt.sort() # now for CDF of tilt of maximum tau pylab.plot(Untilt,Cdf,'g') lower=int(.025*nb) upper=int(.975*nb) pylab.axvline(x=Untilt[lower],ymin=0,ymax=1,linewidth=1,linestyle='--') pylab.axvline(x=Untilt[upper],ymin=0,ymax=1,linewidth=1,linestyle='--') tit= '%i - %i %s'%(Untilt[lower],Untilt[upper],'Percent Unfolding') print tit print 'range of all bootstrap samples: ', Untilt[0], ' - ', Untilt[-1] pylab.title(tit) try: raw_input('Return to save all figures, cntl-d to quit\n') except: print "Good bye" sys.exit() files={} for key in PLTS.keys(): files[key]=('fold_'+'%s'%(key.strip()[:2])+'.svg') pmagplotlib.saveP(PLTS,files)
def main(): """ NAME foldtest_magic.py DESCRIPTION does a fold test (Tauxe, 2010) on data INPUT FORMAT pmag_specimens format file, er_samples.txt format file (for bedding) SYNTAX foldtest_magic.py [command line options] OPTIONS -h prints help message and quits -f pmag_sites formatted file [default is pmag_sites.txt] -fsa er_samples formatted file [default is er_samples.txt] -exc use pmag_criteria.txt to set acceptance criteria -n NB, set number of bootstraps, default is 1000 -b MIN, MAX, set bounds for untilting, default is -10, 150 -fmt FMT, specify format - default is svg OUTPUT Geographic: is an equal area projection of the input data in original coordinates Stratigraphic: is an equal area projection of the input data in tilt adjusted coordinates % Untilting: The dashed (red) curves are representative plots of maximum eigenvalue (tau_1) as a function of untilting The solid line is the cumulative distribution of the % Untilting required to maximize tau for all the bootstrapped data sets. The dashed vertical lines are 95% confidence bounds on the % untilting that yields the most clustered result (maximum tau_1). Command line: prints out the bootstrapped iterations and finally the confidence bounds on optimum untilting. If the 95% conf bounds include 0, then a pre-tilt magnetization is indicated If the 95% conf bounds include 100, then a post-tilt magnetization is indicated If the 95% conf bounds exclude both 0 and 100, syn-tilt magnetization is possible as is vertical axis rotation or other pathologies """ kappa=0 nb=1000 # number of bootstraps min,max=-10,150 dir_path='.' infile,orfile='pmag_sites.txt','er_samples.txt' critfile='pmag_criteria.txt' fmt='svg' if '-WD' in sys.argv: ind=sys.argv.index('-WD') dir_path=sys.argv[ind+1] if '-h' in sys.argv: # check if help is needed print main.__doc__ sys.exit() # graceful quit if '-n' in sys.argv: ind=sys.argv.index('-n') nb=int(sys.argv[ind+1]) if '-fmt' in sys.argv: ind=sys.argv.index('-fmt') fmt=sys.argv[ind+1] if '-b' in sys.argv: ind=sys.argv.index('-b') min=int(sys.argv[ind+1]) max=int(sys.argv[ind+2]) if '-f' in sys.argv: ind=sys.argv.index('-f') infile=sys.argv[ind+1] if '-fsa' in sys.argv: ind=sys.argv.index('-fsa') orfile=sys.argv[ind+1] orfile=dir_path+'/'+orfile infile=dir_path+'/'+infile critfile=dir_path+'/'+critfile data,file_type=pmag.magic_read(infile) ordata,file_type=pmag.magic_read(orfile) if '-exc' in sys.argv: crits,file_type=pmag.magic_read(critfile) for crit in crits: if crit['pmag_criteria_code']=="DE-SITE": SiteCrit=crit break # get to work # PLTS={'geo':1,'strat':2,'taus':3} # make plot dictionary pmagplotlib.plot_init(PLTS['geo'],5,5) pmagplotlib.plot_init(PLTS['strat'],5,5) pmagplotlib.plot_init(PLTS['taus'],5,5) GEOrecs=pmag.get_dictitem(data,'site_tilt_correction','0','T') if len(GEOrecs)>0: # have some geographic data DIDDs= [] # set up list for dec inc dip_direction, dip for rec in GEOrecs: # parse data dip,dip_dir=0,-1 Dec=float(rec['site_dec']) Inc=float(rec['site_inc']) orecs=pmag.get_dictitem(ordata,'er_site_name',rec['er_site_name'],'T') if len(orecs)>0: if orecs[0]['sample_bed_dip_direction']!="":dip_dir=float(orecs[0]['sample_bed_dip_direction']) if orecs[0]['sample_bed_dip']!="":dip=float(orecs[0]['sample_bed_dip']) if dip!=0 and dip_dir!=-1: if '-exc' in sys.argv: keep=1 for key in SiteCrit.keys(): if 'site' in key and SiteCrit[key]!="" and rec[key]!="" and key!='site_alpha95': if float(rec[key])<float(SiteCrit[key]): keep=0 print rec['er_site_name'],key,rec[key] if key=='site_alpha95' and SiteCrit[key]!="" and rec[key]!="": if float(rec[key])>float(SiteCrit[key]): keep=0 if keep==1: DIDDs.append([Dec,Inc,dip_dir,dip]) else: DIDDs.append([Dec,Inc,dip_dir,dip]) else: print 'no geographic directional data found' sys.exit() pmagplotlib.plotEQ(PLTS['geo'],DIDDs,'Geographic') data=numpy.array(DIDDs) D,I=pmag.dotilt_V(data) TCs=numpy.array([D,I]).transpose() pmagplotlib.plotEQ(PLTS['strat'],TCs,'Stratigraphic') pmagplotlib.drawFIGS(PLTS) Percs=range(min,max) Cdf,Untilt=[],[] pylab.figure(num=PLTS['taus']) print 'doing ',nb,' iterations...please be patient.....' for n in range(nb): # do bootstrap data sets - plot first 25 as dashed red line if n%50==0:print n Taus=[] # set up lists for taus PDs=pmag.pseudo(DIDDs) if kappa!=0: for k in range(len(PDs)): d,i=pmag.fshdev(kappa) dipdir,dip=pmag.dodirot(d,i,PDs[k][2],PDs[k][3]) PDs[k][2]=dipdir PDs[k][3]=dip for perc in Percs: tilt=numpy.array([1.,1.,1.,0.01*perc]) D,I=pmag.dotilt_V(PDs*tilt) TCs=numpy.array([D,I]).transpose() ppars=pmag.doprinc(TCs) # get principal directions Taus.append(ppars['tau1']) if n<25:pylab.plot(Percs,Taus,'r--') Untilt.append(Percs[Taus.index(numpy.max(Taus))]) # tilt that gives maximum tau Cdf.append(float(n)/float(nb)) pylab.plot(Percs,Taus,'k') pylab.xlabel('% Untilting') pylab.ylabel('tau_1 (red), CDF (green)') Untilt.sort() # now for CDF of tilt of maximum tau pylab.plot(Untilt,Cdf,'g') lower=int(.025*nb) upper=int(.975*nb) pylab.axvline(x=Untilt[lower],ymin=0,ymax=1,linewidth=1,linestyle='--') pylab.axvline(x=Untilt[upper],ymin=0,ymax=1,linewidth=1,linestyle='--') tit= '%i - %i %s'%(Untilt[lower],Untilt[upper],'Percent Unfolding') print tit pylab.title(tit) pmagplotlib.drawFIGS(PLTS) ans= raw_input('S[a]ve all figures, <Return> to quit \n ') if ans!='a': print "Good bye" sys.exit() files={} for key in PLTS.keys(): files[key]=('foldtest_'+'%s'%(key.strip()[:2])+'.'+fmt) pmagplotlib.saveP(PLTS,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_n'],vgp['average_lat']=rec[2],rec[3],rec[4] slats.append(float(rec[4])) else: vgp['average_k'],vgp['average_n'],vgp['average_lat']="0","0","0" if 90.-(float(vgp['vgp_lat']))<=cutoff and float(vgp['average_k'])>=kappa and int(vgp['average_n'])>=n: Vgps.append(vgp) if spin==0: # do transformation to pole ppars=pmag.doprinc(Pvgps) for vgp in Vgps: vlon,vlat=pmag.dodirot(float(vgp['vgp_lon']),float(vgp['vgp_lat']),ppars['dec'],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: 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])