def __init__(self, errorDetector, parent=None):
     '''
     Constructor
     '''
     super(TrajectoryAnalysis, self).__init__(parent)
     
     self.errorDetector = ErrorDetector(self)
     self.analysers = [RunRestAnalyser(self), 
                       RatRunAnalyser(self)]
     self.analyser = self.analysers[0]
     self.analyseRunning = False
     self.imageLevels = 3
     self.imageCreators = [self.createImageLines, self.createImageDots]
     self.imageCreatorsCaptions = ['Lines','Dots']
     self.imageCreator = self.createImageDots
     self.setWriteSpeed(0)
     
     data = vstack((rand(150,2) + array([.5,.5]),rand(150,2)))
class TrajectoryAnalysis(QtCore.QObject):

    signalAnalysisStarted = QtCore.pyqtSignal(int)
    signalNextFileAnalysing = QtCore.pyqtSignal(str, int)
    signalAnalysisFinished = QtCore.pyqtSignal()
    imageMargin = 10
    
    def __init__(self, errorDetector, parent=None):
        '''
        Constructor
        '''
        super(TrajectoryAnalysis, self).__init__(parent)
        
        self.errorDetector = ErrorDetector(self)
        self.analysers = [RunRestAnalyser(self), 
                          RatRunAnalyser(self)]
        self.analyser = self.analysers[0]
        self.analyseRunning = False
        self.imageLevels = 3
        self.imageCreators = [self.createImageLines, self.createImageDots]
        self.imageCreatorsCaptions = ['Lines','Dots']
        self.imageCreator = self.createImageDots
        self.setWriteSpeed(0)
        
        data = vstack((rand(150,2) + array([.5,.5]),rand(150,2)))
        #self.kMeans=KMeans(self)
        #self.kMeans.clusters(data,2)
        
    @QtCore.pyqtSlot(int)
    def setWriteSpeed(self, checked):
        self.writeSpeedInfo = checked
        
    @QtCore.pyqtSlot(int)
    def setImageCreator(self, index):
        self.imageCreator = self.imageCreators[index]
      
    @QtCore.pyqtSlot(int)  
    def setAnalyser(self, index):
        self.analyser = self.analysers[index]
    
    @QtCore.pyqtSlot(int)
    def setImageLevelsCount(self, value):
        self.imageLevels = value
    
    def ltObjectToPoint(self, ltObject, displace):
        return QtCore.QPointF(*ltObject.center).toPoint()+displace
    
    def createImageDots(self, chamber):
        '''
        Create trajectory image in dots representation
        '''
        minX,minY, maxX,maxY = chamber.trajectory.minMax()
        trajectoryImage = QtGui.QImage(maxX-minX + self.imageMargin * 2,
            maxY-minY + self.imageMargin * 2, QtGui.QImage.Format_RGB888)
        trajectoryImage.fill(QtCore.Qt.white)
        step = 255 // self.imageLevels
        displace = QtCore.QPoint(self.imageMargin-minX,self.imageMargin-minY)
        for ltObject in chamber.trajectory :
            if ltObject is None :
                continue
            point = self.ltObjectToPoint(ltObject,displace)
            color = trajectoryImage.pixel(point)
            level = color & 255
            newLevel = max(0, level - step)
            trajectoryImage.setPixel(point, QtGui.QColor(newLevel, newLevel, newLevel).rgb())
            QtGui.QApplication.processEvents()
        return trajectoryImage
    
    def createImageLines(self, chamber):
        '''
        Create trajectory image in lines representation
        '''   
        width,height = chamber.width(), chamber.height()
        
        trajectoryImage = QtGui.QImage(width + self.imageMargin * 2,
            height + self.imageMargin * 2, QtGui.QImage.Format_ARGB32_Premultiplied)
        trajectoryImage.fill(QtCore.Qt.white)
        trajectoryPainter = QtGui.QPainter(trajectoryImage)
        #Draw chamber
        trajectoryPainter.setPen(QtCore.Qt.black)
        chamberRect = QtCore.QRectF(self.imageMargin,self.imageMargin,width,height)
        trajectoryPainter.drawRect(chamberRect)
        trajectoryPainter.drawEllipse(chamberRect)
        trajectoryPainter.setPen(QtCore.Qt.green)
        displace = QtCore.QPoint(self.imageMargin,self.imageMargin)
        ltObject1 = None
        for ltObject2 in chamber.trajectory :
            if ltObject2 is None : continue
            if ltObject1 is None :
                ltObject1 = ltObject2
                continue
            trajectoryPainter.drawLine(self.ltObjectToPoint(ltObject1,displace),
                                       self.ltObjectToPoint(ltObject2,displace))
            ltObject1=ltObject2
            QtGui.QApplication.processEvents()
        trajectoryPainter.end()
        return trajectoryImage
    
    
    def analyseChambers(self, chamberList):
        self.signalAnalysisStarted.emit(len(chamberList))
        i = 0
        self.analyseRunning = True
        histograms=[]
        names=[]
        for chamber,scale,frameRate in chamberList:
            print('Analysing chamber #{}-{}, scale:{:.3f}, framerate:{:.1f}'.format(i+1,chamber.sampleName,scale,frameRate))
            if not self.analyseRunning : 
                print('Analysis aborted')
                break
            # Signal to update GUI
            i += 1
            QtGui.QApplication.processEvents()
            if chamber.trajectory is None : 
                continue
            self.signalNextFileAnalysing.emit('Chamber ',i)
            if not chamber.trajectory.findBorders():
                continue
            errorStatus = self.errorDetector.checkForErrors(chamber.trajectory, scale, frameRate) 
            chamber.setTrajectoryErrorStatus(errorStatus)
                # Create image and analyse   
            trajectoryStats,trajectoryHist=self.analyser.analyseChamber(chamber,scale,frameRate)
            n,m = trajectoryHist.shape
            names.append(chamber.sampleName)
            histograms.append(trajectoryHist.reshape(n*m))
            
            chamber.setTrajectoryStats(trajectoryStats)
            chamber.setTrajectoryImage(self.imageCreator(chamber))
            print(trajectoryStats.totalReport())
            #print(trajectoryStats.hystogram)      
        '''
        print("Starting PCA for histograms:",len(histograms)  )    
        pca =PCA(n_components=10)
        #print(hist[0])     
            
        transform=pca.fit_transform(np.array(histograms)).T
        print(pca.explained_variance_ratio_)
        '''
        '''
        [samm,E] = sammon(np.array(histograms),init ='pca')
        
        transform=samm.T
        print("Sammon E: ",E)
        
        x = transform[0]
        y = transform[1]
        
        species = set(names) 
        mpl.pyplot.clf() 
        for name in species:
            xx=[]
            yy=[]
            for i in range(len(names)):
                if names[i]==name:
                    xx.append(x[i])
                    yy.append(y[i])
            mpl.pyplot.plot(xx,yy,'o',label=name)
            
        mpl.pyplot.show()
        mpl.pyplot.clf()
        '''
        
        self.signalAnalysisFinished.emit()  

    @QtCore.pyqtSlot()
    def abortAnalysis(self):
        self.analyseRunning = False   
        
    def hystogramCluster(self):
        pass