ソースを参照

Merge branch 'better_structure'

Felix Schultze 9 年 前
コミット
6bf53935a7

+ 1 - 0
templates/volumes/edit.html

@@ -71,6 +71,7 @@
 
         $('.file-item').on('click', function(e) {
             pathInput.val($(this).attr('data'));
+            divFileList.parent().addClass('hidden');
             return false;
         });
 

+ 1 - 1
templates/volumes/show.html

@@ -77,7 +77,7 @@
                 });
             }
 
-            //setTimeout(getNewStatus, timeout);
+            setTimeout(getNewStatus, timeout);
         }
     };
 </script>

+ 2 - 0
visualization/settings.py

@@ -79,6 +79,8 @@ TEMPLATE_DEBUG = True
 ALLOWED_HOSTS = []
 
 SUBVOLUME_STATIC = False
+# seconds
+SUBVOLUME_CACHING_TIME = 180
 
 # Application definition
 

+ 30 - 14
volumes/models.py

@@ -172,22 +172,44 @@ class Volume(Document):
         if document.sliceFrom is not None and document.sliceTo is not None:
             document.slices = document.sliceTo - document.sliceFrom
 
+    def clear_textures(self):
+        for texture in volume.textures:
+            self.remove_texture(texture.size)
+
+    def add_slice_maps(self, size, sprites, originalSize, infoObject):
+        textureSize = int(size)
+
+        texture = Texture()
+        texture.sprites = []
+        texture.info = TextureInfo.from_info_object(infoObject)
+        texture.contenttype = None
+        texture.originalSize = originalSize
+
+        texture.size = textureSize
+
+        for sprite in sprites:
+            if texture.contenttype is None:
+                texture.contenttype = sprite.contenttype
+
+                texture.addSpriteBuffers(sprite.buffers)
+
+        self.insert_texture(texture)
+
     def insert_texture(self, textureToAdd):
         for texture in self.textures:
             if texture.size == textureToAdd.size:
                 self.textures.remove(texture)
 
-        self.textures.append(textureToAdd)
+        return Volume.objects(id=self.id).update_one(push__textures=textureToAdd)
 
     def remove_texture(self, textureSize):
         textures = []
         for texture in self.textures:
             if texture.size == textureSize:
                 texture.deleteContent()
-            else:
-                textures.append(texture)
+                break
 
-        self.textures = textures
+        Volume.objects(id=self.id).update_one(pull__textures={'size' : textureSize })
 
     def add_frame(self, frame, frameNumber):
         rawFrame = RawFrame()
@@ -204,15 +226,11 @@ class Volume(Document):
         rawFrame = self.rawFrames[frameNumber]
         return rawFrame.getNumpyArray(self.get_mmap_path())
 
-    def remove_frame(self, frameNumber):
-        rawFrames = []
+    def remove_frames(self):
         for frame in self.rawFrames:
-            if frame.frameNumber == frameNumber:
-                frame.deleteContent(self.get_mmap_path())
-            else:
-                rawFrames.append(frame)
+            frame.deleteContent(self.get_mmap_path())
 
-        Volume.objects(id=self.id).update_one(set__rawFrames=rawFrames)
+        Volume.objects(id=self.id).update_one(set__rawFrames=[])
 
     def get_mmap_path(self):
         path = settings.PATH_MMAP + str(self.id) + '/'
@@ -221,10 +239,8 @@ class Volume(Document):
 
         return path
 
-
     def delete(self):
-        for rawFrame in self.rawFrames:
-            self.remove_frame(rawFrame.frameNumber)
+        self.remove_frames()
 
         for texture in self.textures:
             self.remove_texture(texture.size)

+ 1 - 1
volumes/processing/models.py

@@ -55,6 +55,6 @@ class SpriteMetaData(Document):
 
 
     def delete(self):
-        GridFSHelper.deletefile(self.getfilename())
+        #GridFSHelper.deletefile(self.getfilename())
 
         return super(SpriteMetaData, self).delete()

+ 37 - 36
volumes/processing/service/SliceGenerator.py

@@ -21,6 +21,24 @@ import pdb
 
 logger = logging.getLogger(__name__)
 
+'''
+This file generates the needed information and images to
+render a volume.
+For that, the volume has to be located in the local filesystem.
+
+The workflow to preprocess volume data is as follows:
+1. read volume data from filesystem
+2. make each slice in the volume to be square by cutting
+   the edges
+3. if float image, normalize it, and covert it to int16
+4. save this data as rawframes to volume, to access it later
+5. convert image to ubyte for first preview slice maps
+6. generate slice maps
+7. save slice maps to volume
+8. save json information to volume
+
+'''
+
 def sliceGenerator(request, volumeId):
     data = request.POST
     sliceFrom = data['sliceFrom']
@@ -33,7 +51,6 @@ def sliceGenerator(request, volumeId):
 
     frames = []
     try:
-        #check for tif(f) file
         if volume.imageSequence is True:
             logger.debug('reading imagesequence')
             frames = tiffPreparer.prepareImageSequence(volume.path)
@@ -53,11 +70,10 @@ def sliceGenerator(request, volumeId):
         return
 
     try:
-        sliceFrom, sliceTo = __defineSliceBorders(frames, sliceFrom, sliceTo)
+        sliceFrom, sliceTo = __defineSliceRange(frames, sliceFrom, sliceTo)
     except Exception:
         logger.error('please provide integers or "" for "sliceFrom" and "sliceTo"')
-        volume.generateSlicesStatus = 'generation failed, please read the logs'
-        volume.save()
+        Volume.objects(id=volume.id).update_one(set__generateSlicesStatus = 'generation failed, please read the logs')
         return
 
     if len(frames.shape) is not 4:
@@ -95,8 +111,7 @@ def sliceGenerator(request, volumeId):
     if fileChanged or len(volume.rawFrames) == 0:
         if settings.REDUCE_HARDDISK_ACCESS_FOR_DEV is False:
             logger.debug('deleting rawframes from volume')
-            for rawFrame in volume.rawFrames:
-                volume.remove_frame(rawFrame.frameNumber)
+            volume.remove_frames()
         else:
             logger.debug('not deleting rawframes from volume --> reducing harddisk access')
 
@@ -116,8 +131,7 @@ def sliceGenerator(request, volumeId):
         logger.debug('memory freed, croppedFrames deleted, keeping ubyte frames')
     except Exception as e:
         logger.error(str(e))
-        volume.generateSlicesStatus = str(e)
-        volume.save()
+        Volume.objects(id=volume.id).update_one(set__generateSlicesStatus = str(e))
         return
 
     logger.debug('converting ended')
@@ -138,40 +152,27 @@ def sliceGenerator(request, volumeId):
         infoObject = spriteMaker.generateInfo(sprites, 0, len(framesUByte) - 1, sliceFrom, sliceTo)
     except Exception as e:
         logger.error(str(e))
-        volume.generateSlicesStatus = str(e)
-        volume.save()
+        Volume.objects(id=volume.id).update_one(set__generateSlicesStatus = str(e))
         return
 
+    try:
+        logger.debug('save sprites in volume')
+        for key in sprites:
+            volume.add_slice_maps(int(key), sprites[key], originalSize, infoObject)
+    except Exception as e:
+        logger.error(str(e))
+        Volume.objects(id=volume.id).update_one(set__generateSlicesStatus = str(e))
+        return
 
-    for texture in volume.textures:
-        volume.remove_texture(texture.size)
-
-    # in future, put this in models.Volume for better modularization
-    for key in sprites:
-        textureSize = int(key)
-
-        texture = Texture()
-        texture.sprites = []
-        texture.info = TextureInfo.from_info_object(infoObject)
-        texture.contenttype = None
-        texture.originalSize = originalSize
-
-        texture.size = textureSize
-
-        for sprite in sprites[key]:
-            if texture.contenttype is None:
-                texture.contenttype = sprite.contenttype
-
-            texture.addSpriteBuffers(sprite.buffers)
-
-        volume.insert_texture(texture)
-
-    volume.generateSlicesStatus = 'generation successful'
+    Volume.objects(id=volume.id).update_one(set__generateSlicesStatus = 'generation successful')
     logger.debug('generation successful')
-    volume.save()
 
 
-def __defineSliceBorders(frames, sliceFrom, sliceTo):
+'''
+    This method returns the range of slices, that
+    shall be generated
+'''
+def __defineSliceRange(frames, sliceFrom, sliceTo):
     if sliceFrom != '':
         sliceFrom = int(sliceFrom)
     else:

+ 1 - 1
volumes/processing/service/SubvolumeCreator.py

@@ -108,7 +108,7 @@ def subvolumeCreator(volumeId, frameNumber, numberOfLayers, x, y, z, t, minWidth
     #GridFSHelper.savefile(spriteFilename, buff)
     bufferValue = buff.getvalue()
     print('length of subvolume texture %d' % len(bufferValue))
-    cache.set(spriteFilename, bufferValue, 180)
+    cache.set(spriteFilename, bufferValue, settings.SUBVOLUME_CACHING_TIME)
     endtime = time.time()
     datetimeEnd = datetime.now()
     duration = endtime - starttime

+ 1 - 1
volumes/processing/views.py

@@ -283,7 +283,7 @@ def deletefiles(request, id):
     now = datetime.now()
     deleted = []
     kept = []
-    minCachingTime = timedelta(minutes=1)
+    minCachingTime = timedelta(seconds=settings.SUBVOLUME_CACHING_TIME)
     for spriteMetaData in spriteMetaDatas:
         timeDelta = now - spriteMetaData.creationTime
         if timeDelta > minCachingTime:

+ 2 - 5
volumes/views.py

@@ -147,14 +147,11 @@ def deleteTexture(request, id, size):
         return HttpResponseRedirect(reverse('volumes:show', args=(id,)))
 
     try:
-        volume = Volume.objects(id=id)[0]
+        Volume.objects(id=id).first().remove_texture(size)
     except (IndexError, ValidationError) as e:
         return handleException(request, id, e)
 
-    volume.remove_texture(size)
-    volume.save()
-
-    return HttpResponseRedirect(reverse('volumes:show', args=(volume.id,)))
+    return HttpResponseRedirect(reverse('volumes:show', args=(id,)))
 
 
 def render3D(request, id, res = None):