From bd826de2f539f2e48c8c01d2d7f9f34c7e97104a Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Fri, 13 May 2016 07:43:27 +0000
Subject: [PATCH] Fix in trisurf output, inhibiting print of successful reconstruction. Multiple fixes and improvements in python module. Added symlinking of tapes into the running directories and dumping tapes from snapshots into tape files.

---
 src/restore.c |  114 ++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 81 insertions(+), 33 deletions(-)

diff --git a/src/restore.c b/src/restore.c
index 74b0ef6..56e52b8 100644
--- a/src/restore.c
+++ b/src/restore.c
@@ -1,3 +1,4 @@
+/* vim: set ts=4 sts=4 sw=4 noet : */
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -12,13 +13,14 @@
 #include "triangle.h"
 #include "bond.h"
 #include "energy.h"
+#include "poly.h"
 #include "initial_distribution.h"
+#include "io.h"
 
-ts_bool parseDump(char *dumpfname) {
+ts_vesicle *parseDump(char *dumpfname) {
 	xmlDocPtr doc;
 	xmlNodePtr cur, cur1,cur2;
 	ts_vesicle *vesicle=NULL;
-
 	doc = xmlParseFile(dumpfname);
 	
 	if (doc == NULL ) {
@@ -37,6 +39,11 @@
 	
 	cur = cur->xmlChildrenNode;
 	while (cur != NULL) {
+
+		if ((!xmlStrcmp(cur->name, (const xmlChar *)"tape"))){
+			setGlobalTapeTXTfromTapeTag(doc, cur);
+		}
+
 		if ((!xmlStrcmp(cur->name, (const xmlChar *)"trisurf"))){
 			vesicle=parseTrisurfTag(doc, cur);
 		}
@@ -48,14 +55,14 @@
 					cur2=cur1->xmlChildrenNode;
 					while(cur2!=NULL){
 						if ((!xmlStrcmp(cur2->name, (const xmlChar *)"Points"))){
-							fprintf(stderr,"Found point data\n");
+							//fprintf(stderr,"Found point data\n");
 							if(vesicle!=NULL)
-								parseXMLVertexPosition(vesicle, doc, cur);
+								parseXMLVertexPosition(vesicle, doc, cur2);
 						}
 						if ((!xmlStrcmp(cur2->name, (const xmlChar *)"Cells"))){
-						fprintf(stderr,"Found cell(Bonds) data\n");
+						//fprintf(stderr,"Found cell(Bonds) data\n");
 							if(vesicle!=NULL)
-								parseXMLBonds(vesicle, doc, cur);
+								parseXMLBonds(vesicle, doc, cur2);
 						}
 						cur2=cur2->next;
 					}	
@@ -68,22 +75,32 @@
 	}
 	
 	xmlFreeDoc(doc);
+
+//	vesicle->poly_list=init_poly_list(0, 0, vesicle->vlist, vesicle);
+
 	init_normal_vectors(vesicle->tlist);
 	mean_curvature_and_energy(vesicle);
 
-/* TODO: cells, polymeres, filaments, core, tape */
+/* TODO: filaments */
 
-	fprintf(stderr,"Restoration completed\n");
-	vesicle_free(vesicle);
-	exit(0);
+	ts_fprintf(stdout,"Restoration completed\n");
+//	write_vertex_xml_file(vesicle,999);
+//	vesicle_free(vesicle);
+//	exit(0);
+	return vesicle;
+}
+
+ts_bool setGlobalTapeTXTfromTapeTag(xmlDocPtr doc, xmlNodePtr cur){
+	xmlChar *tape = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	strcpy(tapetxt,(char *)tape);
+	xmlFree(tape);
 	return TS_SUCCESS;
 }
 
 
-
 /* this is a parser of additional data in xml */
 ts_vesicle *parseTrisurfTag(xmlDocPtr doc, xmlNodePtr cur){
-	fprintf(stderr,"Parsing trisurf tag\n");
+	//fprintf(stderr,"Parsing trisurf tag\n");
 	xmlNodePtr child;
 
 #ifdef COMPRESS
@@ -113,23 +130,25 @@
     	inflateInit(&infstream);
     	inflate(&infstream, Z_NO_FLUSH);
     	inflateEnd(&infstream);	
-	fprintf(stderr,"%lu\n",cLen);
+	//fprintf(stderr,"%lu\n",cLen);
 	subtree[infstream.total_out]='\0'; //zero terminate string	
-	fprintf(stderr,"%s\n",subtree);
+	//fprintf(stderr,"%s\n",subtree);
 	
 	free(subtree);
 #endif
 	/*parse xml subtree */
-	xmlChar *nvtx, *npoly, *nfono;
+	xmlChar *nvtx, *npoly, *nmono;
 	nvtx = xmlGetProp(cur, (xmlChar *)"nvtx");
 	npoly=xmlGetProp(cur, (xmlChar *)"npoly");
-	nfono=xmlGetProp(cur, (xmlChar *)"nfono");
-	fprintf(stderr,"nvtx=%u\n",atoi((char *)nvtx));
-	ts_vesicle *vesicle=init_vesicle(atoi((char *)nvtx),10,10,10,0.1);
+	nmono=xmlGetProp(cur, (xmlChar *)"nmono");
+	ts_tape *tape=parsetapebuffer(tapetxt);
+	//fprintf(stderr,"nvtx=%u\n",atoi((char *)nvtx));
+	//TODO: check if nvtx is in agreement with nshell from tape
+	ts_vesicle *vesicle=init_vesicle(atoi((char *)nvtx),tape->ncxmax,tape->ncymax,tape->nczmax,tape->stepsize);
 	//vesicle->poly_list=init_poly_list(atoi((char *)npoly),atoi((char *)nmono), vesicle->vlist, vesicle);
 	xmlFree(nvtx);
 	xmlFree(npoly);
-	xmlFree(nfono);
+	xmlFree(nmono);
 
 	child = cur->xmlChildrenNode;
 	while (child != NULL) {
@@ -150,6 +169,8 @@
 	}
 
 
+	vesicle->tape=tape;
+	set_vesicle_values_from_tape(vesicle);
 
 	return vesicle;
 }
@@ -201,7 +222,7 @@
 		for(i=0;i<3;i++)	vtx[i]=strtok(NULL," ");
 		j++;
 	}	
-	fprintf(stderr,"Parsing triangles %s j=%d\n",triangles,j);	
+	//fprintf(stderr,"Parsing triangles %s j=%d\n",triangles,j);	
 
 	xmlFree(triangles);
 	return TS_SUCCESS;
@@ -225,7 +246,7 @@
 		j++;
 		for(i=0;i<3;i++)	ntria[i]=strtok(NULL," ");
 	}	
-	fprintf(stderr,"Parsing triangle neighbors j=%d\n",j);	
+	//fprintf(stderr,"Parsing triangle neighbors j=%d\n",j);	
 
 	xmlFree(triangles);
 	return TS_SUCCESS;
@@ -265,50 +286,77 @@
 	xmlNodePtr child = cur->xmlChildrenNode;
 	xmlChar *points;
 	char *pts;
-	int i, idx;
+	int i, idx, polyidx, monoidx;
 	char *token[3];
 	while (child != NULL) {
 		if ((!xmlStrcmp(child->name, (const xmlChar *)"DataArray"))){
 			points = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
 			pts=(char *)points;
 			token[0]=strtok(pts," ");
-			for(i=1;i<3;i++)	token[i]=strtok(NULL," ");
+			token[1]=strtok(NULL," ");
+			token[2]=strtok(NULL,"\n");
 			idx=0;
 			while(token[0]!=NULL){
-				vesicle->vlist->vtx[idx]->x=atof(token[0]);
-				vesicle->vlist->vtx[idx]->y=atof(token[1]);
-				vesicle->vlist->vtx[idx]->z=atof(token[2]);
-				for(i=0;i<3;i++)	token[i]=strtok(NULL," ");	
+				if(idx<vesicle->vlist->n){
+					vesicle->vlist->vtx[idx]->x=atof(token[0]);
+					vesicle->vlist->vtx[idx]->y=atof(token[1]);
+					vesicle->vlist->vtx[idx]->z=atof(token[2]);
+				} else {
+					polyidx=(idx-vesicle->vlist->n)/vesicle->tape->nmono;
+					monoidx=(idx-vesicle->vlist->n)%vesicle->tape->nmono;
+					vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->x=atof(token[0]);
+					vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->y=atof(token[1]);
+					vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->z=atof(token[2]);
+				}
+				for(i=0;i<2;i++)	token[i]=strtok(NULL," ");	
+				token[2]=strtok(NULL,"\n");
 				idx++;
 			}
 			xmlFree(points);
 		}
 		child=child->next;
 	}
+	//fprintf(stderr,"Vertices position j=%d\n",idx);	
+
 	return TS_SUCCESS;
 }
 ts_bool parseXMLBonds(ts_vesicle *vesicle,xmlDocPtr doc, xmlNodePtr cur){
 	xmlNodePtr child = cur->xmlChildrenNode;
-	xmlChar *bonds;
+	xmlChar *bonds, *conname;
 	char *b;
-	int i, idx;
+	int idx, polyidx;
 	char *token[2];
 	while (child != NULL) {
-		if ((!xmlStrcmp(child->name, (const xmlChar *)"DataArray"))){
+		conname=xmlGetProp(child, (xmlChar *)"Name");
+		if ((!xmlStrcmp(child->name, (const xmlChar *)"DataArray")) && !xmlStrcmp(conname, (const xmlChar *)"connectivity") ){
 			bonds = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
 			b=(char *)bonds;
 			token[0]=strtok(b," ");
-			token[1]=strtok(NULL," ");
+			token[1]=strtok(NULL,"\n");
 			idx=0;
 			while(token[0]!=NULL){
-				bond_add(vesicle->blist, vesicle->vlist->vtx[atoi(token[0])], vesicle->vlist->vtx[atoi(token[1])]);
-				for(i=0;i<2;i++)	token[i]=strtok(NULL," ");	
+				if(idx<3*(vesicle->vlist->n-2)){
+					bond_add(vesicle->blist, vesicle->vlist->vtx[atoi(token[0])], vesicle->vlist->vtx[atoi(token[1])]);
+				}
+				else {
+				//find grafted vtx
+					if((vesicle->tape->nmono-1)==(idx-3*(vesicle->vlist->n-2))%(vesicle->tape->nmono)){
+						polyidx=(idx-3*(vesicle->vlist->n-2))/(vesicle->tape->nmono);
+						//fprintf(stderr,"poly=%d, vertex=%d\n",polyidx,atoi(token[0]));
+						vesicle->poly_list->poly[polyidx]->grafted_vtx=vesicle->vlist->vtx[atoi(token[0])];
+						vesicle->vlist->vtx[atoi(token[0])]->grafted_poly=vesicle->poly_list->poly[polyidx];
+					}
+				}
+				token[0]=strtok(NULL," ");	
+				token[1]=strtok(NULL,"\n");	
 				idx++;
 			}
 			xmlFree(bonds);
 		}
+		xmlFree(conname);
 		child=child->next;
 	}
+	//fprintf(stderr,"Bond data j=%d\n",idx);	
 	return TS_SUCCESS;
 }
 

--
Gitblit v1.9.3