Giter Club home page Giter Club logo

Comments (2)

PauloCarvalhoRJ avatar PauloCarvalhoRJ commented on May 25, 2024

An implementation in Python:

´import sgems 
import numpy as np 
import scipy 
import matplotlib.pyplot as plt
import pylab as py


filename = "C:/Database/Recursos/JAMARI/3D/Misc/SGeMS/Contact analysis/results.dat" #INFORME O CAMINHO DO ARQUIVO DE SAÍDA
fid = file(filename,"w")	#command to write 

distlag = 0.5 #ENTRE COM O VALOR DO PRIMEIRO LAG. Se o lag for 10, o primeiro lag calcula as distância entre amostras de domínios diferentes que sejam menores ou iguais a 10
nlags = 15 #NÚMERO DE LAGS A SER CONSIDERADO. Os lags seguintes são múltiplos do primeiro lag

gridname = "SJA Dataset - LTBX" 
x = sgems.get_property(gridname,"_X_") #store coordinate X into array x 
y = sgems.get_property(gridname,"_Y_") #store coordinate Y into array y 
z = sgems.get_property(gridname,"_Z_") #store coordinate Z into array z 
dom = sgems.get_property(gridname,"LITN") #store domain into variable dom /ENTRE COM O NOME DO CARIMBO
var = sgems.get_property(gridname,"FEPRO") #store contents into variable var /ENTRE COM O NOME DO TEOR
a = np.vstack([x,y,z,var,dom]) 
array = a.transpose()

DomUm = 3 #INFORME O CÓDIGO DO PRIMEIRO DOMÍNIO
DomDois = 4 #INFORME O CÓDIGO DO SEGUNDO DOMÍNIO


dist= [] 
sum = []
sdois = []
for i in range(len(x)): 
	for j in range(i+1,len(x),1): 
		if dom[i] <> dom[j] and var[i] > -999 and var[j] > -999: 
			distancia = ((x[i] - x[j])**2 + (y[i] - y[j])**2 + (z[i] - z[j])**2)**0.5	
			dist.append(distancia)
			sum.append(i)
			sdois.append(j)		
			

dist, sum,sdois = zip(*sorted(zip(dist,sum,sdois)))	 

lag = np.zeros(nlags)
minlag = np.zeros(nlags)
maxlag = np.zeros(nlags)
 
contum = np.zeros(nlags) 
contdois = np.zeros(nlags) 
contcont = np.zeros(nlags) 
MedUm = np.zeros(nlags)
MedDois = np.zeros(nlags)
DistMed = np.zeros(nlags)
DistRound = np.zeros(nlags)
AddDomUm = np.zeros(nlags) 
AddDomDois = np.zeros(nlags) 
SomaDist = np.zeros(nlags) 
MarkUm = np.zeros(len(var)) 
MarkDois = np.zeros(len(var))



for i in range(nlags): 
	lag[i] = ((i+1)*distlag)




for k in range (len(lag)): 
		
	

	for z in range(len(dist)):
		
			
		if dist[z] <= lag[k] and dist[z] <> -99 and MarkDois[sum[z]]==0 and MarkDois[sdois[z]]==0: #if distance equal or less the selected lag then... 
				
				if MarkUm[sum[z]] == 0 and MarkUm[sdois[z]] == 1: #primeiro caso, amostra i não está carimbada e amostra j está carimbada 
					MarkUm[sum[z]] = 1 
					contcont[k] = contcont[k] + 1 
					SomaDist[k] = SomaDist[k] + dist[z] 

					
#Amostra não carimbada está em qual domínio ? 1 ou 2 ? 
					if array[sum[z],4] == DomUm: # 'se amostra i está no domínio 1 então 
						
						AddDomUm[k] = AddDomUm[k] + array[sum[z], 3]# 'amostra i é adicionada à soma do domínio 1 
						AddDomDois[k] = AddDomDois[k]# ' soma do domínio dois permanece constante
						contum[k] = contum[k] + 1 #' contador de amostras do domínio 1 recebe mais uma unidade 
						contdois[k] = contdois[k] #' contador do domínio 2 permanece constante 
					else: # senão amostra j está no domínio dois 
						
						AddDomUm[k] = AddDomUm[k] #'soma do domínio 1 permanece constante 
						AddDomDois[k] = AddDomDois[k] + array[sum[z], 3] #' amostra i é adicionada à soma do domínio 2 
						contum[k] = contum[k] #' contador do domínio 1 permanece constante 
						contdois[k] = contdois[k] + 1 #' contador do dómínio 2 é acrescentado uma unidade 
				elif  MarkUm[sum[z]] == 1 and MarkUm[sdois[z]] == 0: 
# 'conta distancias calculadas 
					contcont[k] = contcont[k] + 1 
					SomaDist[k] = SomaDist[k] + dist[z] 
					MarkUm[sdois[z]] = 1 
#'Em qual domínio está amostra j? 
					if array[sdois[z], 4] == DomUm: # 'se ela está no domínio 1 
						contum[k] = contum[k] + 1 
						contdois[k] = contdois[k] 
						AddDomUm[k] = AddDomUm[k] + array[sdois[z], 3] 
						AddDomDois[k] = AddDomDois[k] 
					else:# 'senão ela está no domínio 2 
						contum[k] = contum[k] 
						contdois[k] = contdois[k] + 1 
						AddDomUm[k] = AddDomUm[k] 
						AddDomDois[k] = AddDomDois[k] + array[sdois[z], 3] 
				elif MarkUm[sum[z]]== 0 and MarkUm[sdois[z]] == 0: 
					SomaDist[k] = SomaDist[k] + dist[z]
					contcont[k] = contcont[k] + 1 
					contum[k] = contum[k] + 1 
					contdois [k]= contdois[k] + 1 
										
					MarkUm[sum[z]] = 1 
					MarkUm[sdois[z]] = 1 
					if array[sum[z],4] == DomUm: 
						AddDomUm[k] = AddDomUm[k] + array[sum[z],3] 
						AddDomDois[k] = AddDomDois[k] + array[sdois[z], 3] 
					else: 
						AddDomUm[k] = AddDomUm[k] + array[sdois[z], 3] 
						AddDomDois[k] = AddDomDois[k] + array[sum[z], 3]
				else:
					SomaDist[k] = SomaDist[k]
					contcont[k] = contcont[k]
					contum[k] = contum[k]
					contdois [k]= contdois[k]
	
	
	
	for i in range(len(MarkUm)):
		MarkDois[i] = MarkUm[i]			
			
				
	if contcont[k] == 0:
		contcont[k] = -99
		DistMed[k] = -99
		contcont[k] = -99
	else:		
		contcont[k] = contcont[k]
		DistMed[k] = SomaDist[k]/(2*contcont[k])
		DistRound[k] = round(DistMed[k],2)

	if contum[k] == 0:
		MedUm[k] = -99
	else:
		MedUm[k] = AddDomUm[k]/contum[k]

	if contdois[k] == 0:
		MedDois[k] = -99
	else:
		MedDois[k] = AddDomDois[k]/contdois[k]		
		

	

separator = "	"	#indica que o separador utilizado será espaço
for k in range(nlags):
	if contcont[k] <> -99: 
		fid.write(str(MedUm[k])+separator+str(MedDois[k])+ separator+str(DistRound[k]) + separator+str(contum[k])+separator+str(contdois[k]) + "\n")
		
fid.close()





HighestX = 0
HighestYUm = 0
HighestYDois = 0
HighestY = 0
LowestX = 0
LowestY = 0

for p in range(nlags):
	if MedUm[p] > HighestYUm:
		HighestYUm = MedUm[p]

for p in range(nlags):
	if MedDois[p] > HighestYDois:
		HighestYDois = MedDois[p]

if HighestYDois > HighestYUm:
	HighestY = HighestYDois
else:
	HighestY = HighestYUm

for k in range(nlags):
	if DistRound[k] > HighestX:
		HighestX = DistRound[k]



for k in range(nlags):
	if DistMed[k] <> -99 and MedUm[k]<>-99 and MedDois[k]<>-99:
		

		
		py.plot(-DistMed[k],MedUm[k],'k^')
		py.plot(DistMed[k],MedDois[k],'bo')


py.ylim([0,(HighestY*1.05)])
py.xlabel("Distancia do contato")
py.ylabel("FEPRO")
py.legend(("LT","BX"),loc = "lower right")




plt.show()

from gammaray.

PauloCarvalhoRJ avatar PauloCarvalhoRJ commented on May 25, 2024

Another one in Python:

import sgems

# Input parameters
gridname = 'grid'  # name of the dataset
grade_name = 'trend +X-'  # name of the property of interest
domain_name = 'lito'  # name of the property that contains the domains
tmin = -98

# inform the lag and the number of lags
lag = 1.0
nlags = 10

# inform the integer of the first and second domain
Domain_One = 1
Domain_Two = 2

X = sgems.get_property(gridname, '_X_')
Y = sgems.get_property(gridname, '_Y_')
Z = sgems.get_property(gridname, '_Z_')
Domain = sgems.get_property(gridname, domain_name)
Grade = sgems.get_property(gridname, grade_name)

# Inform output file
output_file = 'Contact_analysis.txt'


print('Starting script contact analysis')



x_graph_min = 0
x_graph_max = -20

y_graph_min = 0
y_graph_max = -20

max_dist = []
min_dist = []
for i in range(nlags):
    max_dist.append((i + 1) * lag)
    min_dist.append(i * lag)


def select_samples_within_domain(column_to_be_extracted, column_domain, column_grade, domain, tmin):
    column_extracted = []
    EPSLON = 0.000001
    for i in range(len(column_to_be_extracted)):
        if (abs(column_domain[i] - domain) < EPSLON and column_grade[i] > tmin and column_domain[i] > tmin):
            column_extracted.append(column_to_be_extracted[i])

    return column_extracted


X_one = select_samples_within_domain(X, Domain, Grade, Domain_One, tmin)
Y_one = select_samples_within_domain(Y, Domain, Grade, Domain_One, tmin)
Z_one = select_samples_within_domain(Z, Domain, Grade, Domain_One, tmin)
Grade_one = select_samples_within_domain(Grade, Domain, Grade, Domain_One, tmin)

X_two = select_samples_within_domain(X, Domain, Grade, Domain_Two, tmin)
Y_two = select_samples_within_domain(Y, Domain, Grade, Domain_Two, tmin)
Z_two = select_samples_within_domain(Z, Domain, Grade, Domain_Two, tmin)
Grade_two = select_samples_within_domain(Grade, Domain, Grade, Domain_Two, tmin)

dist = []
index_one = []
index_two = []

for i in xrange(len(Grade_one)):

    for j in xrange(i + 1, len(Grade_two)):
        distance = ((X_one[i] - X_two[j]) ** 2 + (Y_one[i] - Y_two[j]) ** 2 + (Z_one[i] - Z_two[j]) ** 2) ** 0.5

        dist.append(distance)
        index_one.append(i)
        index_two.append(j)

matrix = zip(dist, index_one, index_two)
matrix.sort()

for i in range(len(matrix)):
    dist[i] = matrix[i][0]
    index_one[i] = matrix[i][1]
    index_two[i] = matrix[i][2]

# initialize variables
sum_one = []
count_one = []
avg_one = []
sum_two = []
count_two = []
avg_two = []
sum_dist = []
count_dist = []
avg_dist = []

for i in xrange(nlags):
    sum_one.append(0.00)
    count_one.append(0)
    avg_one.append(0.00)

    sum_two.append(0.00)
    count_two.append(0)
    avg_two.append(0.00)

    sum_dist.append(0.00)
    count_dist.append(0)
    avg_dist.append(0.00)

# initialize variable that flags whether the sample was used or not to calculate the mean
mark_one = []
for i in range(len(Grade_one)):
    mark_one.append(0)

mark_two = []
for i in range(len(Grade_two)):
    mark_two.append(0)

EPSLON = 0.0000001

for k in range(nlags):
    maximum = max_dist[k]
    minimum = min_dist[k]

    for i in range(len(dist)):

        if (dist[i] <= maximum and dist[i] > minimum):
            grade_one = Grade_one[index_one[i]]
            grade_two = Grade_two[index_two[i]]

            sum_dist[k] = sum_dist[k] + dist[i]
            count_dist[k] = count_dist[k] + 1

            # consider the sample of domain one for mean if it was not already flagged
            if (abs(mark_one[index_one[i]] - 0) < EPSLON):
                sum_one[k] = sum_one[k] + grade_one
                count_one[k] = count_one[k] + 1
                mark_one[index_one[i]] = 1

            if (abs(mark_two[index_two[i]] - 0) < EPSLON):
                
                sum_two[k] = sum_two[k] + grade_two
                count_two[k] = count_two[k] + 1
                mark_two[index_two[i]] = 1

for k in range(nlags):

    if (abs(count_one[k] - 0) < EPSLON):
        avg_one[k] = -99
    else:
        avg_one[k] = sum_one[k] / count_one[k]

    if (abs(count_two[k] - 0) < EPSLON):
        avg_two[k] = -99
    else:
        avg_two[k] = sum_two[k] / count_two[k]

    if (abs(count_dist[k] - 0) < EPSLON):
        avg_dist[k] = -99
    else:
        avg_dist[k] = sum_dist[k] / count_dist[k]

# Get X and Y points for graph domain one
x_points_one = []
y_points_one = []
for i in range(nlags):
    if (avg_one[i] > -98):
        x_points_one.append((-avg_dist[i]) / 2)
        y_points_one.append(avg_one[i])

# Get x and y points for graph domain two
x_points_two = []
y_points_two = []
for i in range(nlags):
    if (avg_two[i] > -98):
        x_points_two.append((avg_dist[i]) / 2)
        y_points_two.append(avg_two[i])

with open(output_file, 'w') as fout:
    fout.write(
        'Dist_from_contact_{}, Mean_Grade_{},  Dist_from_contact_{}, Mean_Grade_{}  \n'.format(Domain_One, Domain_One,
                                                                                               Domain_Two, Domain_Two))
    for i in range(nlags):
        fout.write('{:.4f}, {:.4f}, {:.4f}, {:.4f} \n'.format(-avg_dist[i] / 2.0, avg_one[i], avg_dist[i] / 2.0, avg_two[i]))


print('Finish script contact analysis')

from gammaray.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.