Commit 029c021a64c23612b891b81d630834a9b7801dba
1 parent
66d1c0ff
filled in the rest of the code necessary for reading the writing .nwt files. fully functional
Showing
1 changed file
with
80 additions
and
23 deletions
Show diff stats
stim/biomodels/network.h
@@ -112,6 +112,7 @@ class network{ | @@ -112,6 +112,7 @@ class network{ | ||
112 | } | 112 | } |
113 | return E; | 113 | return E; |
114 | } | 114 | } |
115 | + | ||
115 | /// operator for writing the edge information into a binary .nwt file. | 116 | /// operator for writing the edge information into a binary .nwt file. |
116 | friend std::ofstream& operator<<(std::ofstream& out, const edge& e) | 117 | friend std::ofstream& operator<<(std::ofstream& out, const edge& e) |
117 | { | 118 | { |
@@ -122,10 +123,11 @@ class network{ | @@ -122,10 +123,11 @@ class network{ | ||
122 | for(int i = 0; i < sz; i++) ///write each point | 123 | for(int i = 0; i < sz; i++) ///write each point |
123 | { | 124 | { |
124 | stim::vec3<T> point = e[i]; | 125 | stim::vec3<T> point = e[i]; |
125 | - out.write(reinterpret_cast<const char*>(point[0]), 3*sizeof(T)); | 126 | + out.write(reinterpret_cast<const char*>(&point[0]), 3*sizeof(T)); |
126 | // for(int j = 0; j < nmags(); j++) //future code for multiple mags | 127 | // for(int j = 0; j < nmags(); j++) //future code for multiple mags |
127 | // { | 128 | // { |
128 | - out.write(reinterpret_cast<const char*>(e[i].R[0]), sizeof(T)); ///write the radius | 129 | + out.write(reinterpret_cast<const char*>(&e.R[i]), sizeof(T)); ///write the radius |
130 | + std::cout << point.str() << " " << e.R[i] << std::endl; | ||
129 | // } | 131 | // } |
130 | } | 132 | } |
131 | return out; //return stream | 133 | return out; //return stream |
@@ -134,13 +136,13 @@ class network{ | @@ -134,13 +136,13 @@ class network{ | ||
134 | /// operator for reading an edge from a binary .nwt file. | 136 | /// operator for reading an edge from a binary .nwt file. |
135 | friend std::ifstream& operator>>(std::ifstream& in, edge& e) | 137 | friend std::ifstream& operator>>(std::ifstream& in, edge& e) |
136 | { | 138 | { |
137 | -// unsigned int v0, v1, sz; | ||
138 | - unsigned int sz; | ||
139 | - in.read(reinterpret_cast<char*>(&e.v[0]), sizeof(unsigned int)); //read the staring point. | ||
140 | - in.read(reinterpret_cast<char*>(&e.v[1]), sizeof(unsigned int)); //read the ending point | 139 | + unsigned int v0, v1, sz; |
140 | + in.read(reinterpret_cast<char*>(&v0), sizeof(unsigned int)); //read the staring point. | ||
141 | + in.read(reinterpret_cast<char*>(&v1), sizeof(unsigned int)); //read the ending point | ||
141 | in.read(reinterpret_cast<char*>(&sz), sizeof(unsigned int)); //read the number of points in the edge | 142 | in.read(reinterpret_cast<char*>(&sz), sizeof(unsigned int)); //read the number of points in the edge |
142 | stim::centerline<T> temp = stim::centerline<T>(sz); //allocate the new edge | 143 | stim::centerline<T> temp = stim::centerline<T>(sz); //allocate the new edge |
143 | e = edge(temp); | 144 | e = edge(temp); |
145 | + e.v[0] = v0; e.v[1] = v1; | ||
144 | for(int i = 0; i < sz; i++) //set the points and radii to the newly read values | 146 | for(int i = 0; i < sz; i++) //set the points and radii to the newly read values |
145 | { | 147 | { |
146 | stim::vec3<T> point; | 148 | stim::vec3<T> point; |
@@ -150,7 +152,8 @@ class network{ | @@ -150,7 +152,8 @@ class network{ | ||
150 | // for(int j = 0; j < nmags(); j++) ///future code for mags | 152 | // for(int j = 0; j < nmags(); j++) ///future code for mags |
151 | // { | 153 | // { |
152 | in.read(reinterpret_cast<char*>(&mag), sizeof(T)); | 154 | in.read(reinterpret_cast<char*>(&mag), sizeof(T)); |
153 | - set_r(0, mag); | 155 | + e.set_r(0, mag); |
156 | + std::cout << point.str() << " " << mag << std::endl; | ||
154 | // } | 157 | // } |
155 | } | 158 | } |
156 | return in; | 159 | return in; |
@@ -164,7 +167,10 @@ class network{ | @@ -164,7 +167,10 @@ class network{ | ||
164 | //std::vector<unsigned int> edges; //indices of edges connected to this node. | 167 | //std::vector<unsigned int> edges; //indices of edges connected to this node. |
165 | std::vector<unsigned int> e[2]; //indices of edges going out (e[0]) and coming in (e[1]) | 168 | std::vector<unsigned int> e[2]; //indices of edges going out (e[0]) and coming in (e[1]) |
166 | //stim::vec3<T> p; //position of this node in physical space. | 169 | //stim::vec3<T> p; //position of this node in physical space. |
167 | - | 170 | + //default constructor |
171 | + vertex() : stim::vec3<T>() | ||
172 | + { | ||
173 | + } | ||
168 | //constructor takes a stim::vec | 174 | //constructor takes a stim::vec |
169 | vertex(stim::vec3<T> p) : stim::vec3<T>(p){} | 175 | vertex(stim::vec3<T> p) : stim::vec3<T>(p){} |
170 | 176 | ||
@@ -193,27 +199,27 @@ class network{ | @@ -193,27 +199,27 @@ class network{ | ||
193 | unsigned int s0, s1; | 199 | unsigned int s0, s1; |
194 | s0 = v.e[0].size(); | 200 | s0 = v.e[0].size(); |
195 | s1 = v.e[1].size(); | 201 | s1 = v.e[1].size(); |
196 | - out.write(reinterpret_cast<const char*>(&v[0]), 3*sizeof(T)); | ||
197 | - out.write(reinterpret_cast<const char*>(&s0), sizeof(unsigned int)); | ||
198 | - out.write(reinterpret_cast<const char*>(&s1), sizeof(unsigned int)); | ||
199 | - out.write(reinterpret_cast<const char*>(&v.e[0][0]), sizeof(unsigned int)*v.e[0].size()); | ||
200 | - out.write(reinterpret_cast<const char*>(&v.e[1][0]), sizeof(unsigned int)*v.e[1].size()); | 202 | + out.write(reinterpret_cast<const char*>(&v.ptr[0]), 3*sizeof(T)); ///write physical vertex location |
203 | + out.write(reinterpret_cast<const char*>(&s0), sizeof(unsigned int)); ///write the number of "incoming edges" | ||
204 | + out.write(reinterpret_cast<const char*>(&s1), sizeof(unsigned int)); ///write the number of "outgoing edges" | ||
205 | + out.write(reinterpret_cast<const char*>(&v.e[0][0]), sizeof(unsigned int)*v.e[0].size()); ///write the "incoming edges" | ||
206 | + out.write(reinterpret_cast<const char*>(&v.e[1][0]), sizeof(unsigned int)*v.e[1].size()); ///write the "outgoing edges" | ||
201 | return out; | 207 | return out; |
202 | } | 208 | } |
203 | 209 | ||
204 | ///operator for reading the edge out of the stream; | 210 | ///operator for reading the edge out of the stream; |
205 | friend std::ifstream& operator>>(std::ifstream& in, vertex& v) | 211 | friend std::ifstream& operator>>(std::ifstream& in, vertex& v) |
206 | { | 212 | { |
207 | - in.read(reinterpret_cast<char*>(&v[0]), 3*sizeof(T)); | ||
208 | - unsigned int s[2]; | ||
209 | - in.read(reinterpret_cast<char*>(&s[0]), 2*sizeof(unsigned int)); | 213 | + in.read(reinterpret_cast<char*>(&v[0]), 3*sizeof(T)); ///read the physical position |
214 | + unsigned int s[2]; | ||
215 | + in.read(reinterpret_cast<char*>(&s[0]), 2*sizeof(unsigned int)); ///read the sizes of incoming and outgoing edge arrays | ||
210 | 216 | ||
211 | std::vector<unsigned int> one(s[0]); | 217 | std::vector<unsigned int> one(s[0]); |
212 | std::vector<unsigned int> two(s[1]); | 218 | std::vector<unsigned int> two(s[1]); |
213 | v.e[0] = one; | 219 | v.e[0] = one; |
214 | v.e[1] = two; | 220 | v.e[1] = two; |
215 | - in.read(reinterpret_cast<char*>(&v.e[0][0]),s[0]*sizeof(unsigned int)); | ||
216 | - in.read(reinterpret_cast<char*>(&v.e[1][0]),s[1]*sizeof(unsigned int)); | 221 | + in.read(reinterpret_cast<char*>(&v.e[0][0]),s[0]*sizeof(unsigned int)); ///read the arrays of "incoming edges" |
222 | + in.read(reinterpret_cast<char*>(&v.e[1][0]),s[1]*sizeof(unsigned int)); ///read the arrays of "outgoing edges" | ||
217 | return in; | 223 | return in; |
218 | } | 224 | } |
219 | 225 | ||
@@ -529,23 +535,48 @@ public: | @@ -529,23 +535,48 @@ public: | ||
529 | void | 535 | void |
530 | loadNwt(std::string filename) | 536 | loadNwt(std::string filename) |
531 | { | 537 | { |
538 | + int dims[2]; ///number of vertex, number of edges | ||
539 | + readHeader(filename, &dims[0]); //read header | ||
540 | + std::ifstream file; | ||
541 | + file.open(filename, std::ios::in | std::ios::binary); ///skip header information. | ||
542 | + file.seekg(14+58+4+4, file.beg); | ||
543 | + vertex v; | ||
544 | + for(int i = 0; i < dims[0]; i++) ///for every vertex, read vertex, add to network. | ||
545 | + { | ||
546 | + file >> v; | ||
547 | + V.push_back(v); | ||
548 | +// std::cout << i << " " << v.str() << std::endl; | ||
549 | + } | ||
532 | 550 | ||
551 | + std::cout << std::endl; | ||
552 | + for(int i = 0; i < dims[1]; i++) ///for every edge, read edge, add to network. | ||
553 | + { | ||
554 | + edge e; | ||
555 | + file >> e; | ||
556 | + E.push_back(e); | ||
557 | + std::cout << i << " " << E[i].str() << std::endl; | ||
558 | + } | ||
559 | + file.close(); | ||
533 | } | 560 | } |
534 | 561 | ||
535 | ///saves a .nwt file. Writes the header in raw text format, then saves the network as a binary file. | 562 | ///saves a .nwt file. Writes the header in raw text format, then saves the network as a binary file. |
536 | void | 563 | void |
537 | saveNwt(std::string filename) | 564 | saveNwt(std::string filename) |
538 | { | 565 | { |
566 | + writeHeader(filename); | ||
539 | std::ofstream file; | 567 | std::ofstream file; |
540 | - file.open(filename, std::ios::out | std::ios::binary); | ||
541 | - for(int i = 0; i < V.size(); i++) | 568 | + file.open(filename, std::ios::out | std::ios::binary | std::ios::app); ///since we have written the header we are not appending. |
569 | + for(int i = 0; i < V.size(); i++) ///look through the Vertices and write each one. | ||
542 | { | 570 | { |
571 | +// std::cout << i << " " << V[i].str() << std::endl; | ||
543 | file << V[i]; | 572 | file << V[i]; |
544 | } | 573 | } |
545 | - for(int i = 0; i < E.size(); i++) | 574 | + for(int i = 0; i < E.size(); i++) ///loop through the Edges and write each one. |
546 | { | 575 | { |
576 | + std::cout << i << " " << E[i].str() << std::endl; | ||
547 | file << E[i]; | 577 | file << E[i]; |
548 | } | 578 | } |
579 | + file.close(); | ||
549 | } | 580 | } |
550 | 581 | ||
551 | 582 | ||
@@ -553,14 +584,40 @@ public: | @@ -553,14 +584,40 @@ public: | ||
553 | void | 584 | void |
554 | writeHeader(std::string filename) | 585 | writeHeader(std::string filename) |
555 | { | 586 | { |
587 | + std::string magicString = "nwtFileFormat "; ///identifier for the file. | ||
588 | + std::string desc = "fileid(14B), desc(58B), #vertices(4B), #edges(4B): bindata"; | ||
589 | + int hNumVertices = V.size(); ///int byte header storing the number of vertices in the file | ||
590 | + int hNumEdges = E.size(); ///int byte header storing the number of edges. | ||
591 | + std::ofstream file; | ||
592 | + file.open(filename, std::ios::out | std::ios::binary); | ||
593 | + std::cout << hNumVertices << " " << hNumEdges << std::endl; | ||
594 | + file.write(reinterpret_cast<const char*>(&magicString.c_str()[0]), 14); //write the file id | ||
595 | + file.write(reinterpret_cast<const char*>(&desc.c_str()[0]), 58); //write the description | ||
596 | + file.write(reinterpret_cast<const char*>(&hNumVertices), sizeof(int)); //write #vert. | ||
597 | + file.write(reinterpret_cast<const char*>(&hNumEdges), sizeof(int)); //write #edges | ||
598 | +// file << magicString.c_str() << desc.c_str() << hNumVertices << hNumEdges; | ||
599 | + file.close(); | ||
556 | 600 | ||
557 | } | 601 | } |
558 | 602 | ||
559 | ///Reads the header information from a .nwt file. | 603 | ///Reads the header information from a .nwt file. |
560 | void | 604 | void |
561 | - readHeader(std::string filename, unsigned int &dims) | 605 | + readHeader(std::string filename, int *dims) |
562 | { | 606 | { |
563 | - | 607 | + char magicString[14]; ///id |
608 | + char desc[58]; ///description | ||
609 | + int hNumVertices; ///#vert | ||
610 | + int hNumEdges; ///#edges | ||
611 | + std::ifstream file; ////create stream | ||
612 | + file.open(filename, std::ios::in | std::ios::binary); | ||
613 | + file.read(reinterpret_cast<char*>(&magicString[0]), 14); ///read the file id. | ||
614 | + file.read(reinterpret_cast<char*>(&desc[0]), 58); ///read the description | ||
615 | + file.read(reinterpret_cast<char*>(&hNumVertices), sizeof(int)); ///read the number of vertices | ||
616 | + file.read(reinterpret_cast<char*>(&hNumEdges), sizeof(int)); ///read the number of edges | ||
617 | +// std::cout << magicString << desc << hNumVertices << " " << hNumEdges << std::endl; | ||
618 | + file.close(); ///close the file. | ||
619 | + dims[0] = hNumVertices; ///fill the returned reference. | ||
620 | + dims[1] = hNumEdges; | ||
564 | } | 621 | } |
565 | 622 | ||
566 | //load a network from an SWC file | 623 | //load a network from an SWC file |