diff --git a/generate_images.py b/generate_images.py index 42907cf28c8652dc7524fc0a31fb270021b43535..c116a4237990f74970adaac01786990e8329ae6e 100644 --- a/generate_images.py +++ b/generate_images.py @@ -172,95 +172,112 @@ class Image(): def I0_structure_no(self, X, i, g=None): i[0] = 1. - #if (g is not None): g[:] = 1. + if (g is not None): g[:] = 1. # MG 20180806: gradient is given by texture; here it is just indicator function def I0_structure_heart_2(self, X, i, g=None): self.R = ((X[0]-self.L[0]/2)**2 + (X[1]-self.L[1]/2)**2)**(1./2) if (self.R >= self.Ri) and (self.R <= self.Re): i[0] = 1. - #if (g is not None): g[:] = 1. + if (g is not None): g[:] = 1. # MG 20180806: gradient is given by texture; here it is just indicator function else: i[0] = 0. - #if (g is not None): g[:] = 0. - #i[0] = 1. + if (g is not None): g[:] = 0. def I0_structure_heart_3(self, X, i, g=None): self.R = ((X[0]-self.L[0]/2)**2 + (X[1]-self.L[1]/2)**2)**(1./2) if (self.R >= self.Ri) and (self.R <= self.Re) and (X[2] >= self.Zmin) and (X[2] <= self.Zmax): i[0] = 1. - #if (g is not None): g[:] = 1. + if (g is not None): g[:] = 1. # MG 20180806: gradient is given by texture; here it is just indicator function else: i[0] = 0. - #if (g is not None): g[:] = 0. + if (g is not None): g[:] = 0. def I0_texture_no(self, X, i, g=None): i[0] *= 1. - #if (g is not None): g[:] *= 0. + if (g is not None): g[:] *= 0. def I0_texture_tagging_signed_X(self, X, i, g=None): i[0] *= math.sin(math.pi*X[0]/self.s) - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= (math.pi/self.s) * math.cos(math.pi*X[0]/self.s) + g[1] *= 0 + g[2] *= 0 def I0_texture_tagging_X(self, X, i, g=None): i[0] *= abs(math.sin(math.pi*X[0]/self.s)) - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= math.copysign(1, math.sin(math.pi*X[0]/self.s)) * (math.pi/self.s) * math.cos(math.pi*X[0]/self.s) + g[1] *= 0 + g[2] *= 0 def I0_texture_tagging_signed_Y(self, X, i, g=None): i[0] *= math.sin(math.pi*X[1]/self.s) - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= 0 + g[1] *= (math.pi/self.s) * math.cos(math.pi*X[1]/self.s) + g[2] *= 0 def I0_texture_tagging_Y(self, X, i, g=None): i[0] *= abs(math.sin(math.pi*X[1]/self.s)) - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= 0 + g[1] *= math.copysign(1, math.sin(math.pi*X[1]/self.s)) * (math.pi/self.s) * math.cos(math.pi*X[1]/self.s) + g[2] *= 0 def I0_texture_tagging_signed_Z(self, X, i, g=None): i[0] *= math.sin(math.pi*X[2]/self.s) - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= 0 + g[1] *= 0 + g[2] *= (math.pi/self.s) * math.cos(math.pi*X[2]/self.s) def I0_texture_tagging_Z(self, X, i, g=None): i[0] *= abs(math.sin(math.pi*X[2]/self.s)) - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= 0 + g[1] *= 0 + g[2] *= math.copysign(1, math.sin(math.pi*X[2]/self.s)) * (math.pi/self.s) * math.cos(math.pi*X[2]/self.s) def I0_texture_tagging_signed_XY(self, X, i, g=None): i[0] *= (math.sin(math.pi*X[0]/self.s) + math.sin(math.pi*X[1]/self.s))/2 - #assert (i[0] >= 0.) - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= (math.pi/self.s) * math.cos(math.pi*X[0]/self.s) / 2 + g[1] *= (math.pi/self.s) * math.cos(math.pi*X[1]/self.s) / 2 + g[2] *= 0 def I0_texture_tagging_XY(self, X, i, g=None): i[0] *= (abs(math.sin(math.pi*X[0]/self.s)) + abs(math.sin(math.pi*X[1]/self.s)))/2 - #assert (i[0] >= 0.) - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= math.copysign(1, math.sin(math.pi*X[0]/self.s)) * (math.pi/self.s) * math.cos(math.pi*X[0]/self.s) / 2 + g[1] *= math.copysign(1, math.sin(math.pi*X[1]/self.s)) * (math.pi/self.s) * math.cos(math.pi*X[1]/self.s) / 2 + g[2] *= 0 def I0_texture_tagging_signed_XYZ(self, X, i, g=None): i[0] *= (math.sin(math.pi*X[0]/self.s) + math.sin(math.pi*X[1]/self.s) + math.sin(math.pi*X[2]/self.s))/3 - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= (math.pi/self.s) * math.cos(math.pi*X[0]/self.s) / 3 + g[1] *= (math.pi/self.s) * math.cos(math.pi*X[1]/self.s) / 3 + g[2] *= (math.pi/self.s) * math.cos(math.pi*X[2]/self.s) / 3 def I0_texture_tagging_XYZ(self, X, i, g=None): i[0] *= (abs(math.sin(math.pi*X[0]/self.s)) + abs(math.sin(math.pi*X[1]/self.s)) + abs(math.sin(math.pi*X[2]/self.s)))/3 - #if (g is not None): - #assert (0), "ToDo" + if (g is not None): + g[0] *= math.copysign(1, math.sin(math.pi*X[0]/self.s)) * (math.pi/self.s) * math.cos(math.pi*X[0]/self.s) / 3 + g[1] *= math.copysign(1, math.sin(math.pi*X[1]/self.s)) * (math.pi/self.s) * math.cos(math.pi*X[1]/self.s) / 3 + g[2] *= math.copysign(1, math.sin(math.pi*X[2]/self.s)) * (math.pi/self.s) * math.cos(math.pi*X[2]/self.s) / 3 def I0_noise_no(self, i, g=None): pass def I0_noise_normal(self, i, g=None): i[0] += random.normalvariate(self.avg, self.std) - #if (g is not None): g[k] += [2*random.normalvariate(self.avg, self.std) for k in xrange(len(g))] + if (g is not None): g[k] += [2*random.normalvariate(self.avg, self.std) for k in xrange(len(g))] ################################################################################ @@ -377,19 +394,19 @@ class Mapping: def X_no(self, x, X, Finv=None): X[:] = x - #if (Finv is not None): Finv[:,:] = numpy.identity(numpy.sqrt(numpy.size(Finv))) + if (Finv is not None): Finv[:,:] = numpy.identity(numpy.sqrt(numpy.size(Finv))) def X_translation(self, x, X, Finv=None): X[:] = x - self.D - #if (Finv is not None): Finv[:,:] = numpy.identity(numpy.sqrt(numpy.size(Finv))) + if (Finv is not None): Finv[:,:] = numpy.identity(numpy.sqrt(numpy.size(Finv))) def X_rotation(self, x, X, Finv=None): X[:] = numpy.dot(self.Rinv, x - self.C) + self.C - #if (Finv is not None): Finv[:,:] = self.Rinv + if (Finv is not None): Finv[:,:] = self.Rinv def X_homogeneous(self, x, X, Finv=None): X[:] = numpy.dot(self.Finv, x) - #if (Finv is not None): Finv[:,:] = self.Finv + if (Finv is not None): Finv[:,:] = self.Finv def X_heart(self, x, X, Finv=None): #print "x = "+str(x) @@ -405,47 +422,47 @@ class Mapping: X[1] = self.RT[0] * math.sin(self.RT[1]) + self.L[1]/2 X[2] = x[2] #print "X = "+str(X) - #if (Finv is not None): - #Finv[0,0] = 1.+(self.dRe-self.dRi)/(self.Re-self.Ri) - #Finv[0,1] = 0. - #Finv[0,2] = 0. - #Finv[1,0] = (self.dTe-self.dTi)/(self.Re-self.Ri)*self.rt[0] - #Finv[1,1] = self.rt[0]/self.RT[0] - #Finv[1,2] = 0. - #Finv[2,0] = 0. - #Finv[2,1] = 0. - #Finv[2,2] = 1. - ##print "F = "+str(Finv) - #Finv[:,:] = numpy.linalg.inv(Finv) - ##print "Finv = "+str(Finv) - #self.R[0,0] = +math.cos(self.RT[1]) - #self.R[0,1] = +math.sin(self.RT[1]) - #self.R[0,2] = 0. - #self.R[1,0] = -math.sin(self.RT[1]) - #self.R[1,1] = +math.cos(self.RT[1]) - #self.R[1,2] = 0. - #self.R[2,0] = 0. - #self.R[2,1] = 0. - #self.R[2,2] = 1. - ##print "R = "+str(self.R) - #Finv[:] = numpy.dot(numpy.transpose(self.R), numpy.dot(Finv, self.R)) - ##print "Finv = "+str(Finv) + if (Finv is not None): + Finv[0,0] = 1.+(self.dRe-self.dRi)/(self.Re-self.Ri) + Finv[0,1] = 0. + Finv[0,2] = 0. + Finv[1,0] = (self.dTe-self.dTi)/(self.Re-self.Ri)*self.rt[0] + Finv[1,1] = self.rt[0]/self.RT[0] + Finv[1,2] = 0. + Finv[2,0] = 0. + Finv[2,1] = 0. + Finv[2,2] = 1. + #print "F = "+str(Finv) + Finv[:,:] = numpy.linalg.inv(Finv) + #print "Finv = "+str(Finv) + self.R[0,0] = +math.cos(self.RT[1]) + self.R[0,1] = +math.sin(self.RT[1]) + self.R[0,2] = 0. + self.R[1,0] = -math.sin(self.RT[1]) + self.R[1,1] = +math.cos(self.RT[1]) + self.R[1,2] = 0. + self.R[2,0] = 0. + self.R[2,1] = 0. + self.R[2,2] = 1. + #print "R = "+str(self.R) + Finv[:] = numpy.dot(numpy.transpose(self.R), numpy.dot(Finv, self.R)) + #print "Finv = "+str(Finv) def x_no(self, X, x, F=None): x[:] = X - #if (F is not None): F[:,:] = numpy.identity(numpy.sqrt(numpy.size(F))) + if (F is not None): F[:,:] = numpy.identity(numpy.sqrt(numpy.size(F))) def x_translation(self, X, x, F=None): x[:] = X + self.D - #if (F is not None): F[:,:] = numpy.identity(numpy.sqrt(numpy.size(F))) + if (F is not None): F[:,:] = numpy.identity(numpy.sqrt(numpy.size(F))) def x_rotation(self, X, x, F=None): x[:] = numpy.dot(self.R, X - self.C) + self.C - #if (F is not None): F[:,:] = self.R + if (F is not None): F[:,:] = self.R def x_homogeneous(self, X, x, F=None): x[:] = numpy.dot(self.F, X) - #if (F is not None): F[:,:] = self.F + if (F is not None): F[:,:] = self.F def x_heart(self, X, x, F=None): #print "X = "+str(X) @@ -461,28 +478,28 @@ class Mapping: x[1] = self.rt[0] * math.sin(self.rt[1]) + self.L[1]/2 x[2] = X[2] #print "x = "+str(x) - #if (F is not None): - #F[0,0] = 1.+(self.dRe-self.dRi)/(self.Re-self.Ri) - #F[0,1] = 0. - #F[0,2] = 0. - #F[1,0] = (self.dTe-self.dTi)/(self.Re-self.Ri)*self.rt[0] - #F[1,1] = self.rt[0]/self.RT[0] - #F[1,2] = 0. - #F[2,0] = 0. - #F[2,1] = 0. - #F[2,2] = 1. - ##print "F = "+str(F) - #self.R[0,0] = +math.cos(self.RT[1]) - #self.R[0,1] = +math.sin(self.RT[1]) - #self.R[0,2] = 0. - #self.R[1,0] = -math.sin(self.RT[1]) - #self.R[1,1] = +math.cos(self.RT[1]) - #self.R[1,2] = 0. - #self.R[2,0] = 0. - #self.R[2,1] = 0. - #self.R[2,2] = 1. - #F[:] = numpy.dot(numpy.transpose(self.R), numpy.dot(F, self.R)) - ##print "F = "+str(F) + if (F is not None): + F[0,0] = 1.+(self.dRe-self.dRi)/(self.Re-self.Ri) + F[0,1] = 0. + F[0,2] = 0. + F[1,0] = (self.dTe-self.dTi)/(self.Re-self.Ri)*self.rt[0] + F[1,1] = self.rt[0]/self.RT[0] + F[1,2] = 0. + F[2,0] = 0. + F[2,1] = 0. + F[2,2] = 1. + #print "F = "+str(F) + self.R[0,0] = +math.cos(self.RT[1]) + self.R[0,1] = +math.sin(self.RT[1]) + self.R[0,2] = 0. + self.R[1,0] = -math.sin(self.RT[1]) + self.R[1,1] = +math.cos(self.RT[1]) + self.R[1,2] = 0. + self.R[2,0] = 0. + self.R[2,1] = 0. + self.R[2,2] = 1. + F[:] = numpy.dot(numpy.transpose(self.R), numpy.dot(F, self.R)) + #print "F = "+str(F) ################################################################################ @@ -536,7 +553,7 @@ def generateImages( if (generate_image_gradient): vtk_image_gradient = myvtk.createFloatArray( name="ImageScalarsGradient", - n_components=images["n_dim"], + n_components=3, n_tuples=n_points, verbose=verbose-1) vtk_image.GetPointData().SetVectors(vtk_image_gradient) @@ -559,8 +576,8 @@ def generateImages( I = numpy.empty(1) i = numpy.empty(1) if (generate_image_gradient): - G = numpy.empty(images["n_dim"]) - g = numpy.empty(images["n_dim"]) + G = numpy.empty(3) + g = numpy.empty(3) else: G = None g = None @@ -568,6 +585,8 @@ def generateImages( mapping = Mapping(images, structure, deformation, evolution) if ("zfill" not in images.keys()): images["zfill"] = len(str(images["n_frames"])) + if ("ext" not in images.keys()): + images["ext"] = "vti" for k_frame in xrange(images["n_frames"]): t = images["T"]*float(k_frame)/(images["n_frames"]-1) if (images["n_frames"]>1) else 0. print "t = "+str(t) @@ -579,7 +598,8 @@ def generateImages( #print "x = "+str(x) I[0] = 0. #print "I = "+str(I) - #if (generate_image_gradient): G[:] = 0. + if (generate_image_gradient): + G[:] = 0. #print "G = "+str(G) if (images["n_dim"] == 1): for k_x in xrange(images["n_integration"][0]): @@ -587,9 +607,9 @@ def generateImages( mapping.X(x, X, Finv) image.I0(X, i, g) I += i - #if (generate_image_gradient): G += numpy.dot(g, Finv) + if (generate_image_gradient): G += numpy.dot(g, Finv) I /= images["n_integration"][0] - #if (generate_image_gradient): G /= images["n_integration"][0] + if (generate_image_gradient): G /= images["n_integration"][0] elif (images["n_dim"] == 2): for k_y in xrange(images["n_integration"][1]): x[1] = x0[1] - dx[1]/2 + (k_y+1./2)*dx[1]/images["n_integration"][1] @@ -603,9 +623,9 @@ def generateImages( #print "i = "+str(i) #print "g = "+str(g) I += i - #if (generate_image_gradient): G += numpy.dot(g, Finv) + if (generate_image_gradient): G += numpy.dot(g, Finv) I /= images["n_integration"][1]*images["n_integration"][0] - #if (generate_image_gradient):G /= images["n_integration"][1]*images["n_integration"][0] + if (generate_image_gradient): G /= images["n_integration"][1]*images["n_integration"][0] elif (images["n_dim"] == 3): for k_z in xrange(images["n_integration"][2]): x[2] = x0[2] - dx[2]/2 + (k_z+1./2)*dx[2]/images["n_integration"][2] @@ -616,18 +636,18 @@ def generateImages( mapping.X(x, X, Finv) image.I0(X, i, g) I += i - #if (generate_image_gradient): G += numpy.dot(g, Finv) + if (generate_image_gradient): G += numpy.dot(g, Finv) I /= images["n_integration"][2]*images["n_integration"][1]*images["n_integration"][0] - #if (generate_image_gradient): G /= images["n_integration"][2]*images["n_integration"][1]*images["n_integration"][0] + if (generate_image_gradient): G /= images["n_integration"][2]*images["n_integration"][1]*images["n_integration"][0] else: assert (0), "n_dim must be \"1\", \"2\" or \"3\". Aborting." vtk_image_scalars.SetTuple(k_point, I) - #if (generate_image_gradient): vtk_image_gradient.SetTuple(k_point, G) + if (generate_image_gradient): vtk_image_gradient.SetTuple(k_point, G) if (I[0] < global_min): global_min = I[0] if (I[0] > global_max): global_max = I[0] myvtk.writeImage( image=vtk_image, - filename=images["folder"]+"/"+images["basename"]+"_"+str(k_frame).zfill(images["zfill"])+".vtk", + filename=images["folder"]+"/"+images["basename"]+"_"+str(k_frame).zfill(images["zfill"])+"."+images["ext"], verbose=verbose-1) if (images["data_type"] in ("float")): @@ -654,7 +674,7 @@ def generateImages( shifter.SetOutputScalarTypeToFloat() for k_frame in xrange(images["n_frames"]): vtk_image = myvtk.readImage( - filename=images["folder"]+"/"+images["basename"]+"_"+str(k_frame).zfill(images["zfill"])+".vti", + filename=images["folder"]+"/"+images["basename"]+"_"+str(k_frame).zfill(images["zfill"])+"."+images["ext"], verbose=verbose-1) if (vtk.vtkVersion.GetVTKMajorVersion() >= 6): shifter.SetInputData(vtk_image) @@ -664,7 +684,7 @@ def generateImages( vtk_image = shifter.GetOutput() myvtk.writeImage( image=vtk_image, - filename=images["folder"]+"/"+images["basename"]+"_"+str(k_frame).zfill(images["zfill"])+".vti", + filename=images["folder"]+"/"+images["basename"]+"_"+str(k_frame).zfill(images["zfill"])+"."+images["ext"], verbose=verbose-1) else: assert (0), "Wrong data type. Aborting."