from __future__ import division import numpy as np from scipy import stats import os import collections def ConnecInd(cmap, scales, datadir): datadir = datadir + "ConnectivityMetrics/" try: os.makedirs(datadir) except: nada = 0 for scale in scales: res = dict() res = doforsubS_computeCmap(res, cmap, scale, postConec) np.save(datadir + str(scale) + ".npy", res) return def doforsubS_computeCmap(res, cmap, l, funpost): L = cmap.shape[0] Nx, Ny, Nz = cmap.shape[0], cmap.shape[1], cmap.shape[2] nblx = Nx // l # for each dimension ly = l nbly = Ny // l lz = l nblz = Nz // l if nbly == 0: # si l> Ny nbly = 1 ly = Ny if nblz == 0: lz = 1 nblz = 1 keys = funpost(np.array([]), res, 0, 0) for key in keys: res[key] = np.zeros((nblx, nbly, nblz)) for i in range(nblx): for j in range(nbly): for k in range(nblz): res = funpost( cmap[ i * l : (i + 1) * l, j * ly : (j + 1) * ly, k * l : (k + 1) * lz ], res, (i, j, k), 1, ) return res def postConec(cmap, results, ind, flag): keys = [] keys += ["PPHA"] keys += ["VOLALE"] keys += ["ZNCC"] keys += ["GAMMA"] keys += ["spanning", "npz", "npy", "npx"] keys += ["Plen", "S", "P"] keys += ["PlenX", "SX", "PX"] if flag == 0: return keys y = np.bincount(cmap.reshape(-1)) ii = np.nonzero(y)[0] cf = np.vstack((ii, y[ii])).T # numero de cluster, frecuencia if cf[0, 0] == 0: cf = cf[ 1:, : ] # me quedo solo con la distr de tamanos, elimino info cluster cero if cf.shape[0] > 0: spanning, pclusX, pclusY, pclusZ = get_perco(cmap) plen = Plen(spanning, cmap, cf) # print(pclusX,spanning) if len(pclusX) > 0 and spanning == 0: plenX = PlenX(pclusX, cmap, cf) else: plenX = plen nper = np.sum(cf[:, 1]) # num de celdas permeables nclus = cf.shape[0] # cantidad de clusters results["PPHA"][ind] = nper / np.size(cmap) # ppha results["VOLALE"][ind] = ( np.max(cf[:, 1]) / nper ) # volale #corregido va entre [0,p] results["ZNCC"][ind] = nclus # zncc results["GAMMA"][ind] = ( np.sum(cf[:, 1] ** 2) / nper ** 2 ) # gamma, recordar zintcc =gamma*nper ( results["spanning"][ind], results["npz"][ind], results["npy"][ind], results["npx"][ind], ) = (spanning, len(pclusZ), len(pclusY), len(pclusX)) results["Plen"][ind], results["S"][ind], results["P"][ind] = ( plen[0], plen[1], plen[2], ) results["PlenX"][ind], results["SX"][ind], results["PX"][ind] = ( plenX[0], plenX[1], plenX[2], ) if cf.shape[0] == 0: for key in keys: results[key][ind] = 0 return results def get_pos(cmap, cdis): Ns = cdis.shape[0] pos = dict() i = 0 for cnum in cdis[:, 0]: pos[cnum] = np.zeros((cdis[i, 1] + 1, 3)) i += 1 for i in range(cmap.shape[0]): for j in range(cmap.shape[1]): for k in range(cmap.shape[2]): if cmap[i, j, k] != 0: flag = int(pos[cmap[i, j, k]][0, 0]) + 1 pos[cmap[i, j, k]][0, 0] = flag pos[cmap[i, j, k]][flag, 0] = i pos[cmap[i, j, k]][flag, 1] = j pos[cmap[i, j, k]][flag, 2] = k return pos def Plen(spanning, cmap, cdis): pos = get_pos(cmap, cdis) # print(summary['NpcY'],summary['NpcX'],summary['PPHA']) den = 0 num = 0 nperm = np.sum(cdis[:, 1]) if spanning > 0: amax = np.argmax(cdis[:, 1]) P = cdis[amax, 1] / nperm cdis = np.delete(cdis, amax, axis=0) else: P = 0 i = 0 if cdis.shape[0] > 0: S = np.sum(cdis[:, 1]) / (cdis.shape[0]) for cnum in cdis[ :, 0 ]: # los clusters estan numerados a partir de 1, cluster cero es k- mposx, mposy, mposz = ( np.mean(pos[cnum][1:, 0]), np.mean(pos[cnum][1:, 1]), np.mean(pos[cnum][1:, 2]), ) # el 1: de sacar el flag Rs = np.mean( (pos[cnum][1:, 0] - mposx) ** 2 + (pos[cnum][1:, 1] - mposy) ** 2 + (pos[cnum][1:, 2] - mposz) ** 2 ) # Rs cuadrado ecuacion 12.9 libro Harvey Gould, Jan Tobochnik num += cdis[i, 1] ** 2 * Rs den += cdis[i, 1] ** 2 i += 1 return [np.sqrt(num / den), S, P] else: return [0, 0, P] def PlenX(pclusX, cmap, cdis): # guarda que solo se entra en esta funcion si no es spanning pero hay al menos 1 cluster percolante en X for cluster in pclusX[1:]: cmap = np.where(cmap == cluster, pclusX[0], cmap) y = np.bincount(cmap.reshape(-1)) ii = np.nonzero(y)[0] cdis = np.vstack((ii, y[ii])).T # numero de cluster, frecuencia if cdis[0, 0] == 0: cdis = cdis[ 1:, : ] # me quedo solo con la distr de tamanos, elimino info cluster cero pos = get_pos(cmap, cdis) nperm = np.sum(cdis[:, 1]) amax = np.argmax(cdis[:, 1]) P = cdis[amax, 1] / nperm cdis = np.delete(cdis, amax, axis=0) den = 0 num = 0 i = 0 if cdis.shape[0] > 0: S = np.sum(cdis[:, 1]) / (cdis.shape[0]) for cnum in cdis[ :, 0 ]: # los clusters estan numerados a partir de 1, cluster cero es k- mposx, mposy, mposz = ( np.mean(pos[cnum][1:, 0]), np.mean(pos[cnum][1:, 1]), np.mean(pos[cnum][1:, 2]), ) # el 1: de sacar el flag Rs = np.mean( (pos[cnum][1:, 0] - mposx) ** 2 + (pos[cnum][1:, 1] - mposy) ** 2 + (pos[cnum][1:, 2] - mposz) ** 2 ) # Rs cuadrado ecuacion 12.9 libro Harvey Gould, Jan Tobochnik num += cdis[i, 1] ** 2 * Rs den += cdis[i, 1] ** 2 i += 1 return [np.sqrt(num / den), S, P] else: return [0, 0, P] def get_perco(cmap): pclusX = [] # list of the percolating clusters for k in range(cmap.shape[2]): # x for j in range(cmap.shape[1]): # y if cmap[0, j, k] != 0: if cmap[0, j, k] not in pclusX: if cmap[0, j, k] in cmap[-1, :, :]: pclusX += [cmap[0, j, k]] # this is the one pclusY = [] # list of the percolating clusters for i in range(cmap.shape[0]): # Z for k in range(cmap.shape[2]): # X if cmap[i, 0, k] != 0: if cmap[i, 0, k] not in pclusY: if cmap[i, 0, k] in cmap[:, -1, :]: pclusY += [cmap[i, 0, k]] pclusZ = [] # list of the percolating clusters if cmap.shape[2] > 1: for i in range(cmap.shape[0]): # Z for j in range(cmap.shape[1]): # X if cmap[i, j, 0] != 0: if cmap[i, j, 0] not in pclusZ: if cmap[i, j, 0] in cmap[:, :, -1]: pclusZ += [cmap[i, j, 0]] spanning = 0 if len(pclusZ) == 1 and pclusZ == pclusY and pclusZ == pclusX: spanning = 1 else: spanning = 0 if len(pclusX) == 1 and pclusY == pclusX: spanning = 1 return spanning, pclusX, pclusY, pclusZ