Commit 26e84a59a4e13b042d90b2d9f1e0d31695856917

Authored by Jiaming Guo
1 parent 16e854e8

add adjacency_matrix and new way to see information from loaded network

Showing 2 changed files with 118 additions and 34 deletions   Show diff stats
stim/biomodels/network.h
... ... @@ -466,6 +466,31 @@ public:
466 466 }
467 467 }
468 468  
  469 + /// Get adjacency matrix of the network
  470 + std::vector< typename std::vector<int> > get_adj_mat() {
  471 +
  472 + unsigned n = V.size(); // get the number of vertices in the networks
  473 +
  474 + std::vector< typename std::vector<int> > result(n, std::vector<int>(n, 0)); // initialize every entry in the matrix to be 0
  475 + result.resize(n); // resize rows
  476 + for (unsigned i = 0; i < n; i++)
  477 + result[i].resize(n); // resize columns
  478 +
  479 + for (unsigned i = 0; i < n; i++) { // for every vertex
  480 + unsigned num_out = V[i].e[0].size(); // number of outgoing edges of current vertex
  481 + if (num_out != 0) {
  482 + for (unsigned j = 0; j < num_out; j++) {
  483 + int edge_idx = V[i].e[0][j]; // get the jth out-going edge index of current vertex
  484 + int vertex_idx = E[edge_idx].v[1]; // get the ending vertex of specific out-going edge
  485 + result[i][vertex_idx] = 1; // can simply set to 1 if it is simple-graph
  486 + result[vertex_idx][i] = 1; // symmetric
  487 + }
  488 + }
  489 + }
  490 +
  491 + return result;
  492 + }
  493 +
469 494 /// Output the network as a string
470 495 std::string str(){
471 496  
... ...
stim/visualization/gl_network.h
... ... @@ -210,9 +210,9 @@ public:
210 210 void glAdjointCylinder(float sigma, float radius) {
211 211  
212 212 if (radius != sigma) // if render radius was changed by user, create a new display list
213   - glDeleteLists(dlist+4, 1);
214   - if (!glIsList(dlist+4)) {
215   - glNewList(dlist+4, GL_COMPILE);
  213 + glDeleteLists(dlist + 4, 1);
  214 + if (!glIsList(dlist + 4)) {
  215 + glNewList(dlist + 4, GL_COMPILE);
216 216 for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network
217 217 for (unsigned p = 1; p < E[e].size(); p++) { // for each point on that edge
218 218 stim::circle<T> C1 = E[e].circ(p - 1);
... ... @@ -241,7 +241,7 @@ public:
241 241 }
242 242 glEndList();
243 243 }
244   - glCallList(dlist+4);
  244 + glCallList(dlist + 4);
245 245 }
246 246  
247 247 ///render the network cylinder as series of tubes
... ... @@ -251,9 +251,9 @@ public:
251 251 void glRandColorCylinder(int I, std::vector<unsigned> map, std::vector<T> colormap, float sigma, float radius) {
252 252  
253 253 if (radius != sigma) // if render radius was changed by user, create a new display list
254   - glDeleteLists(dlist+2, 1);
255   - if (!glIsList(dlist+2)) { // if dlist isn't a display list, create it
256   - glNewList(dlist+2, GL_COMPILE); // start a new display list
  254 + glDeleteLists(dlist + 2, 1);
  255 + if (!glIsList(dlist + 2)) { // if dlist isn't a display list, create it
  256 + glNewList(dlist + 2, GL_COMPILE); // start a new display list
257 257 for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network
258 258 if (map[e] != unsigned(-1)) {
259 259 if (I == 0) { // if it is to render GT
... ... @@ -274,7 +274,7 @@ public:
274 274 }
275 275 }
276 276 else {
277   - glColor3f(0.2, 0.0, 0.0); // red color for the un-mapping edges
  277 + glColor3f(1.0, 1.0, 1.0); // white color for the un-mapping edges
278 278 for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge
279 279 stim::circle<T> C1 = E[e].circ(p - 1);
280 280 stim::circle<T> C2 = E[e].circ(p);
... ... @@ -289,46 +289,26 @@ public:
289 289 for (unsigned n = 0; n < V.size(); n++) {
290 290 size_t num_edge = V[n].e[0].size() + V[n].e[1].size();
291 291 if (num_edge > 1) { // if it is the joint vertex
292   - if (V[n].e[0].size() != 0) {
293   - unsigned idx = V[n].e[0][0]; // find the index of first incoming edge of that vertex
294   - stim::circle<T> C = E[idx].circ(0);
295   - stim::vec3<T> normal = C.n();
296   - glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector
297   - }
298   - else {
299   - unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex
300   - stim::circle<T> C = E[idx].circ(E[idx].size() - 1);
301   - stim::vec3<T> normal = C.n();
302   - glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector
303   - }
304 292 glColor3f(0.3, 0.3, 0.3); // gray
305 293 renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20);
306 294 }
307 295 else { // if it is the terminal vertex
308   - if (V[n].e[0].size() != 0) {
309   - unsigned idx = V[n].e[0][0]; // find the index of first incoming edge of that vertex
310   - }
311   - else {
312   - unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex
313   - }
314 296 glColor3f(0.6, 0.6, 0.6); // more white gray
315 297 renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20);
316 298 }
317 299 }
318 300 glEndList();
319 301 }
320   - glCallList(dlist+2);
  302 + glCallList(dlist + 2);
321 303 }
322 304  
323 305 ///render the network centerline as a series of line strips in random different color
324 306 ///@param I is a indicator: 0 -> GT, 1 -> T
325   - ///@param dlist1 is the display list
326 307 ///@param map is the mapping relationship between two networks
327 308 ///@param colormap is the random generated color set for render
328   - void glRandColorCenterline(int I, GLuint &dlist1, std::vector<unsigned> map, std::vector<T> colormap) {
329   - if (!glIsList(dlist1)) {
330   - dlist1 = glGenLists(1);
331   - glNewList(dlist1, GL_COMPILE);
  309 + void glRandColorCenterline(int I, std::vector<unsigned> map, std::vector<T> colormap) {
  310 + if (!glIsList(dlist + 2)) {
  311 + glNewList(dlist + 2, GL_COMPILE);
332 312 for (unsigned e = 0; e < E.size(); e++) {
333 313 if (map[e] != unsigned(-1)) { // if it has corresponding edge in another network
334 314 if (I == 0) // if it is to render GT
... ... @@ -343,7 +323,7 @@ public:
343 323 glEnd();
344 324 }
345 325 else {
346   - glColor3f(0.2, 0.0, 0.0); // red color for the un-mapping edges
  326 + glColor3f(1.0, 1.0, 1.0); // white color for the un-mapping edges
347 327 glBegin(GL_LINE_STRIP);
348 328 for (unsigned p = 0; p < E[e].size(); p++) {
349 329 glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]);
... ... @@ -353,7 +333,86 @@ public:
353 333 }
354 334 glEndList();
355 335 }
356   - glCallList(dlist1);
  336 + glCallList(dlist + 2);
  337 + }
  338 +
  339 + void glAdjointCenterline() {
  340 + if (!glIsList(dlist + 4)) {
  341 + glNewList(dlist + 4, GL_COMPILE);
  342 + for (unsigned e = 0; e < E.size(); e++) { //for each edge in the network
  343 +
  344 + glBegin(GL_LINE_STRIP);
  345 + for (unsigned p = 0; p < E[e].size(); p++) { //for each point on that edge
  346 + glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]); //set the vertex position based on the current point
  347 + glTexCoord1f(E[e].r(p)); //set the texture coordinate based on the specified magnitude index
  348 + }
  349 + glEnd();
  350 + }
  351 + glEndList();
  352 + }
  353 + glCallList(dlist + 4);
  354 + }
  355 +
  356 + // highlight the difference part
  357 + void glDifferenceCylinder(int I, std::vector<unsigned> map, std::vector<T> colormap, float sigma, float radius) {
  358 +
  359 + if (radius != sigma) // if render radius was changed by user, create a new display list
  360 + glDeleteLists(dlist + 6, 1);
  361 + if (!glIsList(dlist + 6)) { // if dlist isn't a display list, create it
  362 + glNewList(dlist + 6, GL_COMPILE); // start a new display list
  363 + for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network
  364 + if (map[e] != unsigned(-1)) {
  365 + glEnable(GL_BLEND); //enable color blend
  366 + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //set blend function
  367 + glDisable(GL_DEPTH_TEST); //should disable depth
  368 +
  369 + if (I == 0) { // if it is to render GT
  370 + glColor4f(colormap[e * 3 + 0], colormap[e * 3 + 1], colormap[e * 3 + 2], 0.1);
  371 + }
  372 + else { // if it is to render T
  373 + glColor4f(colormap[map[e] * 3 + 0], colormap[map[e] * 3 + 1], colormap[map[e] * 3 + 2], 0.1);
  374 + }
  375 +
  376 + for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge
  377 + stim::circle<T> C1 = E[e].circ(p - 1);
  378 + stim::circle<T> C2 = E[e].circ(p);
  379 + C1.set_R(2 * radius); // re-scale the circle to the same
  380 + C2.set_R(2 * radius);
  381 + std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
  382 + std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
  383 + renderCylinder(Cp1, Cp2, E[e][p - 1], E[e][p]);
  384 + }
  385 + glDisable(GL_BLEND);
  386 + glEnable(GL_DEPTH_TEST);
  387 + }
  388 + else {
  389 + glColor3f(1.0, 1.0, 1.0); // white color for the un-mapping edges
  390 + for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge
  391 + stim::circle<T> C1 = E[e].circ(p - 1);
  392 + stim::circle<T> C2 = E[e].circ(p);
  393 + C1.set_R(2 * radius); // scale the circle to the same
  394 + C2.set_R(2 * radius);
  395 + std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
  396 + std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
  397 + renderCylinder(Cp1, Cp2, E[e][p - 1], E[e][p]);
  398 + }
  399 + }
  400 + }
  401 + for (unsigned n = 0; n < V.size(); n++) {
  402 +
  403 + size_t num_edge = V[n].e[0].size() + V[n].e[1].size();
  404 + if (num_edge > 1) { // if it is the joint vertex
  405 + glColor4f(0.3, 0.3, 0.3, 0.1); // gray
  406 + renderBall(V[n][0], V[n][1], V[n][2], 3 * radius, 20);
  407 + }
  408 + else { // if it is the terminal vertex
  409 + glColor4f(0.6, 0.6, 0.6, 0.1); // more white gray
  410 + renderBall(V[n][0], V[n][1], V[n][2], 3 * radius, 20);
  411 + }
  412 + }
  413 + glEndList();
  414 + }
  415 + glCallList(dlist + 6);
357 416 }
358 417  
359 418 //void glRandColorCenterlineGT(GLuint &dlist1, std::vector<unsigned> map, std::vector<T> colormap){
... ...