From f9ab483f72ad9330acc165b92386c7424a6234a9 Mon Sep 17 00:00:00 2001 From: haehn Date: Tue, 10 Mar 2015 14:35:36 -0400 Subject: [PATCH 01/22] Add first neuroblocks classes. --- _dojo/nbdatabase.py | 24 ++++++++++++++++++++++++ _dojo/scripts/sub.py | 29 +++++++++++++++++++++++++++++ _dojo/scripts/subcv.py | 11 +++++++++++ _dojo/state.py | 8 ++++++++ _web/lib/unzip.min.js | 31 +++++++++++++++++++++++++++++++ _web/lib/zip.min.js | 37 +++++++++++++++++++++++++++++++++++++ _web/lib/zip.min.js.map | 8 ++++++++ 7 files changed, 148 insertions(+) create mode 100644 _dojo/nbdatabase.py create mode 100644 _dojo/scripts/sub.py create mode 100644 _dojo/scripts/subcv.py create mode 100644 _dojo/state.py create mode 100644 _web/lib/unzip.min.js create mode 100644 _web/lib/zip.min.js create mode 100644 _web/lib/zip.min.js.map diff --git a/_dojo/nbdatabase.py b/_dojo/nbdatabase.py new file mode 100644 index 0000000..61ae84e --- /dev/null +++ b/_dojo/nbdatabase.py @@ -0,0 +1,24 @@ +import pymongo + +class NBDatabase(object): + + NB_DATABASE_SERVER = '127.0.0.1' + NB_DATABASE = 'meteor' + + def __init__(self): + ''' + ''' + self._connection = pymongo.Connection('mongodb://'+NB_DATABASE_SERVER+'/meteor') + self._db = self._connection[NB_DATABASE] + + def get_segmentation(self, id): + ''' + ''' + return self._db.segmentation.find_one({"_id": id}) + + def get_segmentation_log(self, id): + ''' + ''' + return self._db.segmentation_log.find_one({"_id": id}) + + \ No newline at end of file diff --git a/_dojo/scripts/sub.py b/_dojo/scripts/sub.py new file mode 100644 index 0000000..67eb8ff --- /dev/null +++ b/_dojo/scripts/sub.py @@ -0,0 +1,29 @@ +import cv2 +import numpy as np +import sys + + +factor = int(sys.argv[2]) + +out = np.zeros((16384/factor,16384/factor), dtype=np.uint8) + + +img = cv2.imread(sys.argv[1], cv2.CV_LOAD_IMAGE_GRAYSCALE) + +k = 0 +l = 0 + +for i in range(16384): + if i % factor == 0: + + for j in range(16384): + if j % factor == 0: + + out[k][l] = img[i][j] + + l += 1 + + l = 0 + k += 1 + +cv2.imwrite('/tmp/subplain.jpg', out) diff --git a/_dojo/scripts/subcv.py b/_dojo/scripts/subcv.py new file mode 100644 index 0000000..7f44fc4 --- /dev/null +++ b/_dojo/scripts/subcv.py @@ -0,0 +1,11 @@ +import cv2 +import numpy as np +import sys + + +factor = int(sys.argv[2]) + + +img = cv2.imread(sys.argv[1], cv2.CV_LOAD_IMAGE_GRAYSCALE) +# img = cv2.resize(img, (16384/factor, 16384/factor)) +# cv2.imwrite('/tmp/subcv.jpg', img) diff --git a/_dojo/state.py b/_dojo/state.py new file mode 100644 index 0000000..25198fd --- /dev/null +++ b/_dojo/state.py @@ -0,0 +1,8 @@ +class State(object): + + def __init__(self): + ''' + ''' + pass + + \ No newline at end of file diff --git a/_web/lib/unzip.min.js b/_web/lib/unzip.min.js new file mode 100644 index 0000000..8d19e36 --- /dev/null +++ b/_web/lib/unzip.min.js @@ -0,0 +1,31 @@ +/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';function m(a){throw a;}var q=void 0,u,aa=this;function v(a,b){var c=a.split("."),d=aa;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var f;c.length&&(f=c.shift());)!c.length&&b!==q?d[f]=b:d=d[f]?d[f]:d[f]={}};var w="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;new (w?Uint8Array:Array)(256);var x;for(x=0;256>x;++x)for(var y=x,ba=7,y=y>>>1;y;y>>>=1)--ba;var z=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759, +2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977, +2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755, +2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956, +3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270, +936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],B=w?new Uint32Array(z):z;function C(a){var b=a.length,c=0,d=Number.POSITIVE_INFINITY,f,h,k,e,g,l,p,s,r,A;for(s=0;sc&&(c=a[s]),a[s]>=1;A=k<<16|s;for(r=l;rE;E++)switch(!0){case 143>=E:D.push([E+48,8]);break;case 255>=E:D.push([E-144+400,9]);break;case 279>=E:D.push([E-256+0,7]);break;case 287>=E:D.push([E-280+192,8]);break;default:m("invalid literal: "+E)} +var ca=function(){function a(a){switch(!0){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272, +a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:m("invalid length: "+a)}}var b=[],c,d;for(c=3;258>=c;c++)d=a(c),b[c]=d[2]<<24|d[1]<< +16|d[0];return b}();w&&new Uint32Array(ca);function F(a,b){this.l=[];this.m=32768;this.d=this.f=this.c=this.t=0;this.input=w?new Uint8Array(a):a;this.u=!1;this.n=G;this.L=!1;if(b||!(b={}))b.index&&(this.c=b.index),b.bufferSize&&(this.m=b.bufferSize),b.bufferType&&(this.n=b.bufferType),b.resize&&(this.L=b.resize);switch(this.n){case H:this.a=32768;this.b=new (w?Uint8Array:Array)(32768+this.m+258);break;case G:this.a=0;this.b=new (w?Uint8Array:Array)(this.m);this.e=this.X;this.B=this.S;this.q=this.W;break;default:m(Error("invalid inflate mode"))}} +var H=0,G=1; +F.prototype.r=function(){for(;!this.u;){var a=I(this,3);a&1&&(this.u=!0);a>>>=1;switch(a){case 0:var b=this.input,c=this.c,d=this.b,f=this.a,h=b.length,k=q,e=q,g=d.length,l=q;this.d=this.f=0;c+1>=h&&m(Error("invalid uncompressed block header: LEN"));k=b[c++]|b[c++]<<8;c+1>=h&&m(Error("invalid uncompressed block header: NLEN"));e=b[c++]|b[c++]<<8;k===~e&&m(Error("invalid uncompressed block header: length verify"));c+k>b.length&&m(Error("input buffer is broken"));switch(this.n){case H:for(;f+k>d.length;){l= +g-f;k-=l;if(w)d.set(b.subarray(c,c+l),f),f+=l,c+=l;else for(;l--;)d[f++]=b[c++];this.a=f;d=this.e();f=this.a}break;case G:for(;f+k>d.length;)d=this.e({H:2});break;default:m(Error("invalid inflate mode"))}if(w)d.set(b.subarray(c,c+k),f),f+=k,c+=k;else for(;k--;)d[f++]=b[c++];this.c=c;this.a=f;this.b=d;break;case 1:this.q(da,ea);break;case 2:fa(this);break;default:m(Error("unknown BTYPE: "+a))}}return this.B()}; +var J=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],K=w?new Uint16Array(J):J,L=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],M=w?new Uint16Array(L):L,ga=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],O=w?new Uint8Array(ga):ga,ha=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],ia=w?new Uint16Array(ha):ha,ja=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11, +12,12,13,13],P=w?new Uint8Array(ja):ja,Q=new (w?Uint8Array:Array)(288),R,la;R=0;for(la=Q.length;R=R?8:255>=R?9:279>=R?7:8;var da=C(Q),S=new (w?Uint8Array:Array)(30),T,ma;T=0;for(ma=S.length;T=k&&m(Error("input buffer is broken")),c|=f[h++]<>>b;a.d=d-b;a.c=h;return e} +function U(a,b){for(var c=a.f,d=a.d,f=a.input,h=a.c,k=f.length,e=b[0],g=b[1],l,p;d=k);)c|=f[h++]<>>16;a.f=c>>p;a.d=d-p;a.c=h;return l&65535} +function fa(a){function b(a,b,c){var d,e=this.K,f,g;for(g=0;gh)d>=f&&(this.a=d,c=this.e(),d=this.a),c[d++]=h;else{k=h-257;g=M[k];0=f&&(this.a=d,c=this.e(),d=this.a);for(;g--;)c[d]=c[d++-e]}for(;8<=this.d;)this.d-=8,this.c--;this.a=d}; +u.W=function(a,b){var c=this.b,d=this.a;this.C=a;for(var f=c.length,h,k,e,g;256!==(h=U(this,a));)if(256>h)d>=f&&(c=this.e(),f=c.length),c[d++]=h;else{k=h-257;g=M[k];0f&&(c=this.e(),f=c.length);for(;g--;)c[d]=c[d++-e]}for(;8<=this.d;)this.d-=8,this.c--;this.a=d}; +u.e=function(){var a=new (w?Uint8Array:Array)(this.a-32768),b=this.a-32768,c,d,f=this.b;if(w)a.set(f.subarray(32768,a.length));else{c=0;for(d=a.length;cc;++c)f[c]=f[b+c];this.a=32768;return f}; +u.X=function(a){var b,c=this.input.length/this.c+1|0,d,f,h,k=this.input,e=this.b;a&&("number"===typeof a.H&&(c=a.H),"number"===typeof a.Q&&(c+=a.Q));2>c?(d=(k.length-this.c)/this.C[2],h=258*(d/2)|0,f=hb&&(this.b.length=b),a=this.b);return this.buffer=a};function V(a){a=a||{};this.files=[];this.v=a.comment}V.prototype.M=function(a){this.j=a};V.prototype.s=function(a){var b=a[2]&65535|2;return b*(b^1)>>8&255};V.prototype.k=function(a,b){a[0]=(B[(a[0]^b)&255]^a[0]>>>8)>>>0;a[1]=(6681*(20173*(a[1]+(a[0]&255))>>>0)>>>0)+1>>>0;a[2]=(B[(a[2]^a[1]>>>24)&255]^a[2]>>>8)>>>0};V.prototype.U=function(a){var b=[305419896,591751049,878082192],c,d;w&&(b=new Uint32Array(b));c=0;for(d=a.length;c>>0;this.z=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.J=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.h=a[b++]|a[b++]<< +8;this.g=a[b++]|a[b++]<<8;this.F=a[b++]|a[b++]<<8;this.fa=a[b++]|a[b++]<<8;this.ha=a[b++]|a[b++]<<8;this.ga=a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24;this.aa=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.filename=String.fromCharCode.apply(null,w?a.subarray(b,b+=this.h):a.slice(b,b+=this.h));this.Y=w?a.subarray(b,b+=this.g):a.slice(b,b+=this.g);this.v=w?a.subarray(b,b+this.F):a.slice(b,b+this.F);this.length=b-this.offset};function pa(a,b){this.input=a;this.offset=b}var qa={O:1,da:8,ea:2048}; +pa.prototype.parse=function(){var a=this.input,b=this.offset;(a[b++]!==Y[0]||a[b++]!==Y[1]||a[b++]!==Y[2]||a[b++]!==Y[3])&&m(Error("invalid local file header signature"));this.$=a[b++]|a[b++]<<8;this.I=a[b++]|a[b++]<<8;this.A=a[b++]|a[b++]<<8;this.time=a[b++]|a[b++]<<8;this.V=a[b++]|a[b++]<<8;this.p=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.z=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.J=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.h=a[b++]|a[b++]<<8;this.g=a[b++]|a[b++]<<8;this.filename= +String.fromCharCode.apply(null,w?a.subarray(b,b+=this.h):a.slice(b,b+=this.h));this.Y=w?a.subarray(b,b+=this.g):a.slice(b,b+=this.g);this.length=b-this.offset}; +function $(a){var b=[],c={},d,f,h,k;if(!a.i){if(a.o===q){var e=a.input,g;if(!a.D)a:{var l=a.input,p;for(p=l.length-12;0>>0;a.o=(e[g++]| +e[g++]<<8|e[g++]<<16|e[g++]<<24)>>>0;a.w=e[g++]|e[g++]<<8;a.v=w?e.subarray(g,g+a.w):e.slice(g,g+a.w)}d=a.o;h=0;for(k=a.ba;h>>8^B[(n^l[t])&255];for(N=ka>>3;N--;t+=8)n=n>>>8^B[(n^l[t])&255],n=n>>>8^B[(n^l[t+1])&255],n=n>>>8^B[(n^l[t+2])&255],n=n>>>8^B[(n^l[t+3])&255],n=n>>>8^B[(n^l[t+4])&255],n=n>>>8^B[(n^l[t+5])&255],n=n>>>8^B[(n^l[t+6])&255],n=n>>>8^B[(n^l[t+7])&255];p=(n^4294967295)>>>0;k.p!==p&&m(Error("wrong crc: file=0x"+ +k.p.toString(16)+", data=0x"+p.toString(16)))}return l};u.M=function(a){this.j=a};function ra(a,b,c){c^=a.s(b);a.k(b,c);return c}u.k=V.prototype.k;u.T=V.prototype.U;u.s=V.prototype.s;v("Zlib.Unzip",W);v("Zlib.Unzip.prototype.decompress",W.prototype.r);v("Zlib.Unzip.prototype.getFilenames",W.prototype.Z);v("Zlib.Unzip.prototype.setPassword",W.prototype.M);}).call(this); //@ sourceMappingURL=unzip.min.js.map diff --git a/_web/lib/zip.min.js b/_web/lib/zip.min.js new file mode 100644 index 0000000..075eba5 --- /dev/null +++ b/_web/lib/zip.min.js @@ -0,0 +1,37 @@ +/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var n=void 0,y=!0,aa=this;function G(e,b){var a=e.split("."),d=aa;!(a[0]in d)&&d.execScript&&d.execScript("var "+a[0]);for(var c;a.length&&(c=a.shift());)!a.length&&b!==n?d[c]=b:d=d[c]?d[c]:d[c]={}};var H="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;function ba(e,b){this.index="number"===typeof b?b:0;this.f=0;this.buffer=e instanceof(H?Uint8Array:Array)?e:new (H?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&ca(this)}function ca(e){var b=e.buffer,a,d=b.length,c=new (H?Uint8Array:Array)(d<<1);if(H)c.set(b);else for(a=0;a>>8&255]<<16|L[e>>>16&255]<<8|L[e>>>24&255])>>32-b:L[e]>>8-b);if(8>b+f)l=l<>b-p-1&1,8===++f&&(f=0,d[c++]=L[l],l=0,c===d.length&&(d=ca(this)));d[c]=l;this.buffer=d;this.f=f;this.index=c};ba.prototype.finish=function(){var e=this.buffer,b=this.index,a;0ha;++ha){for(var U=ha,ja=U,ka=7,U=U>>>1;U;U>>>=1)ja<<=1,ja|=U&1,--ka;da[ha]=(ja<>>0}var L=da;function la(e){var b=n,a,d="number"===typeof b?b:b=0,c=e.length;a=-1;for(d=c&7;d--;++b)a=a>>>8^V[(a^e[b])&255];for(d=c>>3;d--;b+=8)a=a>>>8^V[(a^e[b])&255],a=a>>>8^V[(a^e[b+1])&255],a=a>>>8^V[(a^e[b+2])&255],a=a>>>8^V[(a^e[b+3])&255],a=a>>>8^V[(a^e[b+4])&255],a=a>>>8^V[(a^e[b+5])&255],a=a>>>8^V[(a^e[b+6])&255],a=a>>>8^V[(a^e[b+7])&255];return(a^4294967295)>>>0} +var ma=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759, +2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977, +2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755, +2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956, +3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270, +936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],V=H?new Uint32Array(ma):ma;function na(e){this.buffer=new (H?Uint16Array:Array)(2*e);this.length=0}na.prototype.getParent=function(e){return 2*((e-2)/4|0)};na.prototype.push=function(e,b){var a,d,c=this.buffer,f;a=this.length;c[this.length++]=b;for(c[this.length++]=e;0c[d])f=c[a],c[a]=c[d],c[d]=f,f=c[a+1],c[a+1]=c[d+1],c[d+1]=f,a=d;else break;return this.length}; +na.prototype.pop=function(){var e,b,a=this.buffer,d,c,f;b=a[0];e=a[1];this.length-=2;a[0]=a[this.length];a[1]=a[this.length+1];for(f=0;;){c=2*f+2;if(c>=this.length)break;c+2a[c]&&(c+=2);if(a[c]>a[f])d=a[f],a[f]=a[c],a[c]=d,d=a[f+1],a[f+1]=a[c+1],a[c+1]=d;else break;f=c}return{index:e,value:b,length:this.length}};function pa(e,b){this.k=qa;this.l=0;this.input=H&&e instanceof Array?new Uint8Array(e):e;this.e=0;b&&(b.lazy&&(this.l=b.lazy),"number"===typeof b.compressionType&&(this.k=b.compressionType),b.outputBuffer&&(this.c=H&&b.outputBuffer instanceof Array?new Uint8Array(b.outputBuffer):b.outputBuffer),"number"===typeof b.outputIndex&&(this.e=b.outputIndex));this.c||(this.c=new (H?Uint8Array:Array)(32768))}var qa=2,sa=[],Y; +for(Y=0;288>Y;Y++)switch(y){case 143>=Y:sa.push([Y+48,8]);break;case 255>=Y:sa.push([Y-144+400,9]);break;case 279>=Y:sa.push([Y-256+0,7]);break;case 287>=Y:sa.push([Y-280+192,8]);break;default:throw"invalid literal: "+Y;} +pa.prototype.g=function(){var e,b,a,d,c=this.input;switch(this.k){case 0:a=0;for(d=c.length;a>>8&255;m[h++]=q&255;m[h++]=q>>>8&255;if(H)m.set(f,h),h+=f.length,m=m.subarray(0,h);else{w=0;for(u=f.length;wx)for(;0x?x:138,E>x-3&&E=E?(M[K++]=17,M[K++]=E-3,S[17]++):(M[K++]=18,M[K++]=E-11,S[18]++),x-=E;else if(M[K++]=P[v],S[P[v]]++,x--,3>x)for(;0x?x:6,E>x-3&&ED;D++)oa[D]=X[g[D]];for(C=19;4=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272, +a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:throw"invalid length: "+a;}}var b=[],a,d;for(a=3;258>=a;a++)d=e(a),b[a]=d[2]<<24| +d[1]<<16|d[0];return b}(),Ja=H?new Uint32Array(xa):xa; +function ta(e,b){function a(a,c){var b=a.n,d=[],e=0,f;f=Ja[a.length];d[e++]=f&65535;d[e++]=f>>16&255;d[e++]=f>>24;var g;switch(y){case 1===b:g=[0,b-1,0];break;case 2===b:g=[1,b-2,0];break;case 3===b:g=[2,b-3,0];break;case 4===b:g=[3,b-4,0];break;case 6>=b:g=[4,b-5,1];break;case 8>=b:g=[5,b-7,1];break;case 12>=b:g=[6,b-9,2];break;case 16>=b:g=[7,b-13,2];break;case 24>=b:g=[8,b-17,3];break;case 32>=b:g=[9,b-25,3];break;case 48>=b:g=[10,b-33,4];break;case 64>=b:g=[11,b-49,4];break;case 96>=b:g=[12,b- +65,5];break;case 128>=b:g=[13,b-97,5];break;case 192>=b:g=[14,b-129,6];break;case 256>=b:g=[15,b-193,6];break;case 384>=b:g=[16,b-257,7];break;case 512>=b:g=[17,b-385,7];break;case 768>=b:g=[18,b-513,8];break;case 1024>=b:g=[19,b-769,8];break;case 1536>=b:g=[20,b-1025,9];break;case 2048>=b:g=[21,b-1537,9];break;case 3072>=b:g=[22,b-2049,10];break;case 4096>=b:g=[23,b-3073,10];break;case 6144>=b:g=[24,b-4097,11];break;case 8192>=b:g=[25,b-6145,11];break;case 12288>=b:g=[26,b-8193,12];break;case 16384>= +b:g=[27,b-12289,12];break;case 24576>=b:g=[28,b-16385,13];break;case 32768>=b:g=[29,b-24577,13];break;default:throw"invalid distance";}f=g;d[e++]=f[0];d[e++]=f[1];d[e++]=f[2];var k,l;k=0;for(l=d.length;k=f;)t[f++]=0;for(f=0;29>=f;)r[f++]=0}t[256]=1;d=0;for(c=b.length;d=c){u&&a(u,-1);f=0;for(l=c-d;fl&&b+lf&&(c=d,f=l);if(258===l)break}return new wa(f,b-c)} +function ua(e,b){var a=e.length,d=new na(572),c=new (H?Uint8Array:Array)(a),f,l,p,k,q;if(!H)for(k=0;k2*c[h-1]+f[h]&&(c[h]=2*c[h-1]+f[h]),p[h]=Array(c[h]),k[h]=Array(c[h]);for(m=0;me[m]?(p[h][s]=t,k[h][s]=b,r+=2):(p[h][s]=e[m],k[h][s]=m,++m);q[h]=0;1===f[h]&&d(h)}return l} +function va(e){var b=new (H?Uint16Array:Array)(e.length),a=[],d=[],c=0,f,l,p,k;f=0;for(l=e.length;f>>=1}return b};function $(e){e=e||{};this.files=[];this.d=e.comment}var Ma=[80,75,1,2],Na=[80,75,3,4],Oa=[80,75,5,6];$.prototype.m=function(e,b){b=b||{};var a,d=e.length,c=0;H&&e instanceof Array&&(e=new Uint8Array(e));"number"!==typeof b.compressionMethod&&(b.compressionMethod=8);if(b.compress)switch(b.compressionMethod){case 0:break;case 8:c=la(e);e=(new pa(e,b.deflateOption)).g();a=y;break;default:throw Error("unknown compression method:"+b.compressionMethod);}this.files.push({buffer:e,a:b,j:a,r:!1,size:d,h:c})}; +$.prototype.q=function(e){this.i=e}; +$.prototype.g=function(){var e=this.files,b,a,d,c,f,l=0,p=0,k,q,w,u,m,h,s,t,r,Q,z,A,F,I,N,B,C,g,J;B=0;for(C=e.length;Bg;++g)F[g]=Qa(N,11===B?b.h&255:256*Math.random()|0);for(J=F.length;g>8&255;w=b.a.compressionMethod;a[d++]=a[c++]=w&255;a[d++]=a[c++]=w>>8&255;u=b.a.date||new Date;a[d++]=a[c++]=(u.getMinutes()&7)<<5|u.getSeconds()/2|0;a[d++]=a[c++]=u.getHours()<<3|u.getMinutes()>>3;a[d++]=a[c++]=(u.getMonth()+1&7)<<5|u.getDate();a[d++]=a[c++]=(u.getFullYear()- +1980&127)<<1|u.getMonth()+1>>3;m=b.h;a[d++]=a[c++]=m&255;a[d++]=a[c++]=m>>8&255;a[d++]=a[c++]=m>>16&255;a[d++]=a[c++]=m>>24&255;h=b.buffer.length;a[d++]=a[c++]=h&255;a[d++]=a[c++]=h>>8&255;a[d++]=a[c++]=h>>16&255;a[d++]=a[c++]=h>>24&255;s=b.size;a[d++]=a[c++]=s&255;a[d++]=a[c++]=s>>8&255;a[d++]=a[c++]=s>>16&255;a[d++]=a[c++]=s>>24&255;a[d++]=a[c++]=t&255;a[d++]=a[c++]=t>>8&255;a[d++]=a[c++]=0;a[d++]=a[c++]=0;a[c++]=r&255;a[c++]=r>>8&255;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]= +0;a[c++]=0;a[c++]=k&255;a[c++]=k>>8&255;a[c++]=k>>16&255;a[c++]=k>>24&255;if(Q=b.a.filename)if(H)a.set(Q,d),a.set(Q,c),d+=t,c+=t;else for(g=0;g>8&255;a[f++]=C&255;a[f++]=C>>8&255;a[f++]=p&255;a[f++]=p>>8&255;a[f++]=p>>16&255;a[f++]=p>>24&255;a[f++]=l&255;a[f++]=l>>8&255;a[f++]=l>>16&255;a[f++]=l>>24&255;r=this.d?this.d.length:0;a[f++]=r&255;a[f++]=r>>8&255;if(this.d)if(H)a.set(this.d,f);else{g=0;for(J=r;g>8&255;Pa(e,b);return a^b} +function Pa(e,b){e[0]=(V[(e[0]^b)&255]^e[0]>>>8)>>>0;e[1]=(6681*(20173*(e[1]+(e[0]&255))>>>0)>>>0)+1>>>0;e[2]=(V[(e[2]^e[1]>>>24)&255]^e[2]>>>8)>>>0};function Ra(e,b){var a,d,c,f;if(Object.keys)a=Object.keys(b);else for(d in a=[],c=0,b)a[c++]=d;c=0;for(f=a.length;c Date: Tue, 10 Mar 2015 14:52:04 -0400 Subject: [PATCH 02/22] Connection with neuroblocks DB successful. --- _dojo/__init__.py | 1 + _dojo/controller.py | 4 +++- _dojo/nbdatabase.py | 24 ------------------------ _dojo/neuroblocks.py | 31 +++++++++++++++++++++++++++++++ _dojo/state.py | 8 -------- dojo.py | 13 ++++++++++--- 6 files changed, 45 insertions(+), 36 deletions(-) delete mode 100644 _dojo/nbdatabase.py create mode 100644 _dojo/neuroblocks.py delete mode 100644 _dojo/state.py diff --git a/_dojo/__init__.py b/_dojo/__init__.py index 0c8597a..5934b96 100644 --- a/_dojo/__init__.py +++ b/_dojo/__init__.py @@ -5,3 +5,4 @@ from websockets import Websockets from controller import Controller from database import Database +from neuroblocks import Neuroblocks diff --git a/_dojo/controller.py b/_dojo/controller.py index e7935bf..308a7a5 100644 --- a/_dojo/controller.py +++ b/_dojo/controller.py @@ -11,7 +11,7 @@ class Controller(object): - def __init__(self, mojo_dir, out_dir, tmp_dir, database): + def __init__(self, mojo_dir, out_dir, tmp_dir, database, neuroblocks): ''' ''' self.__websocket = None @@ -32,6 +32,8 @@ def __init__(self, mojo_dir, out_dir, tmp_dir, database): self.__database = database + self.__neuroblocks = neuroblocks + if self.__database: self.__largest_id = self.__database.get_largest_id() else: diff --git a/_dojo/nbdatabase.py b/_dojo/nbdatabase.py deleted file mode 100644 index 61ae84e..0000000 --- a/_dojo/nbdatabase.py +++ /dev/null @@ -1,24 +0,0 @@ -import pymongo - -class NBDatabase(object): - - NB_DATABASE_SERVER = '127.0.0.1' - NB_DATABASE = 'meteor' - - def __init__(self): - ''' - ''' - self._connection = pymongo.Connection('mongodb://'+NB_DATABASE_SERVER+'/meteor') - self._db = self._connection[NB_DATABASE] - - def get_segmentation(self, id): - ''' - ''' - return self._db.segmentation.find_one({"_id": id}) - - def get_segmentation_log(self, id): - ''' - ''' - return self._db.segmentation_log.find_one({"_id": id}) - - \ No newline at end of file diff --git a/_dojo/neuroblocks.py b/_dojo/neuroblocks.py new file mode 100644 index 0000000..0eefc68 --- /dev/null +++ b/_dojo/neuroblocks.py @@ -0,0 +1,31 @@ +import pymongo + +class Neuroblocks(object): + + DATABASE = 'meteor' + + def __init__(self, server): + ''' + ''' + if server: + try: + self._connection = pymongo.Connection('mongodb://'+server+'/meteor') + self._db = self._connection[Neuroblocks.DATABASE] + print 'Connected to Neuroblocks.' + except: + print 'Connection to Neuroblocks failed.' + + + else: + self._connection = None + + def get_segmentation(self, id): + ''' + ''' + return self._db.segmentation.find_one({"_id": id}) + + def get_segmentation_log(self, id): + ''' + ''' + return self._db.segmentation_log.find_one({"_id": id}) + diff --git a/_dojo/state.py b/_dojo/state.py deleted file mode 100644 index 25198fd..0000000 --- a/_dojo/state.py +++ /dev/null @@ -1,8 +0,0 @@ -class State(object): - - def __init__(self): - ''' - ''' - pass - - \ No newline at end of file diff --git a/dojo.py b/dojo.py index 4bb1482..7ae283c 100755 --- a/dojo.py +++ b/dojo.py @@ -42,7 +42,7 @@ def __init__( self ): ''' pass - def run( self, mojo_dir, out_dir, port, configured ): + def run( self, mojo_dir, out_dir, port, neuroblocks_server, configured ): ''' ''' @@ -62,8 +62,13 @@ def run( self, mojo_dir, out_dir, port, configured ): self.__segmentation = _dojo.Segmentation(mojo_dir, tmpdir) self.__image = _dojo.Image(mojo_dir, tmpdir) + # + # setup neuroblocks link + # + neuroblocks = _dojo.Neuroblocks(neuroblocks_server) + # and the controller - self.__controller = _dojo.Controller(mojo_dir, out_dir, tmpdir, self.__segmentation.get_database()) + self.__controller = _dojo.Controller(mojo_dir, out_dir, tmpdir, self.__segmentation.get_database(), neuroblocks) # and the viewer self.__viewer = _dojo.Viewer() @@ -193,6 +198,7 @@ def print_help( scriptName ): output_dir = tempfile.mkdtemp() # and a free port port = 1336 + neuroblocks_server = None result = 0 import socket; while result==0: @@ -206,7 +212,8 @@ def print_help( scriptName ): input_dir = sys.argv[1] output_dir = sys.argv[2] port = sys.argv[3] + neuroblocks_server = sys.argv[4] configured = True logic = ServerLogic() - logic.run( input_dir, output_dir, port, configured ) + logic.run( input_dir, output_dir, port, neuroblocks_server, configured ) From 4133d53c0657d6da823466bbc57e81118c504e5a Mon Sep 17 00:00:00 2001 From: haehn Date: Tue, 10 Mar 2015 16:09:19 -0400 Subject: [PATCH 03/22] Add save state icon which transfers merge table and viewport to the server if neuroblocks is connected. --- _dojo/controller.py | 17 +++++++++++- _web/controller.js | 43 +++++++++++++++++++++++++++++++ _web/dojo.js | 30 +++++++++++++++++++++ _web/gfx/save_state.png | Bin 0 -> 19216 bytes _web/gfx/save_state_selected.png | Bin 0 -> 19176 bytes _web/index.html | 2 ++ dojo.py | 4 +-- 7 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 _web/gfx/save_state.png create mode 100644 _web/gfx/save_state_selected.png diff --git a/_dojo/controller.py b/_dojo/controller.py index 308a7a5..6ffa461 100644 --- a/_dojo/controller.py +++ b/_dojo/controller.py @@ -65,7 +65,11 @@ def send_welcome(self): output = {} output['name'] = 'WELCOME' output['origin'] = 'SERVER' - output['value'] = '' + + config = {} + config['neuroblocks'] = self.__neuroblocks != None + + output['value'] = config self.__websocket.send(json.dumps(output)) @@ -180,6 +184,17 @@ def on_message(self, message): elif input['name'] == 'SAVE': self.save(input) + elif input['name'] == 'SAVE_STATE': + self.save_state(input) + + + def save_state(self, input): + ''' + ''' + values = input['value'] + + print values + def adjust(self, input): ''' diff --git a/_web/controller.js b/_web/controller.js index 0b1076c..dcbc1e9 100644 --- a/_web/controller.js +++ b/_web/controller.js @@ -45,6 +45,8 @@ J.controller = function(viewer) { this._brush_size = 3; this._brush_ijs = []; + this._neuroblocks = false; + this.create_gl_3d_labels(); }; @@ -102,6 +104,13 @@ J.controller.prototype.receive = function(data) { if (input.name == 'WELCOME') { + // check for the config + var config = input.value; + if (config['neuroblocks'] == true) { + this._neuroblocks = true; + DOJO.init_save_state_button(); + } + this.send('WELCOME', {}); } else if (input.name == 'MERGETABLE') { @@ -1314,3 +1323,37 @@ J.controller.prototype.end = function() { this.activate(null); }; + +J.controller.prototype.save_state = function() { + + console.log('Saving state..'); + + // we need the merge table and the viewport + + // the merge table + var merge_table = this._merge_table; + + // the viewport + var camera = this._viewer._camera; + + var viewport = { + 'x': camera._x, + 'y': camera._y, + 'z': camera._z, + 'w': camera._w, + 'i_j': camera._i_j, + 'view': camera._view + } + + var data = {}; + data['viewport'] = viewport; + data['merge_table'] = merge_table; + this.send('SAVE_STATE', data); + + setTimeout(function() { + + DOJO.save_state_done(); + + }, 500); + +}; diff --git a/_web/dojo.js b/_web/dojo.js index 370780b..4467a2f 100644 --- a/_web/dojo.js +++ b/_web/dojo.js @@ -12,6 +12,7 @@ DOJO.modes = { DOJO.threeD_active = false; DOJO.link_active = false; DOJO.mousemove_timeout = null; +DOJO.save_state_active = false; DOJO.init = function() { @@ -163,6 +164,35 @@ DOJO.setup_buttons = function() { }; +DOJO.init_save_state_button = function() { + + var save_state = document.getElementById('save_state'); + var save_state_selected = document.getElementById('save_state_selected'); + + save_state.onclick = save_state_selected.onclick = function() { + + // link.style.border = '1px solid white'; + save_state.style.display = 'none'; + save_state_selected.style.display = 'block'; + + DOJO.save_state_active = true; + + DOJO.viewer._controller.save_state(); + + }; + +}; + +DOJO.save_state_done = function() { + + save_state.style.display = 'block'; + save_state_selected.style.display = 'none'; + + DOJO.save_state_active = false; + +}; + + DOJO.reset_tools = function() { DOJO.mode = DOJO.modes.pan_zoom; diff --git a/_web/gfx/save_state.png b/_web/gfx/save_state.png new file mode 100644 index 0000000000000000000000000000000000000000..d166bab9f0796a670a4ea0918316bcaf6018464d GIT binary patch literal 19216 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 s!*;BxI@BQ6%eMQ^ZtdkH` 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