def compareClassesStep(self, i1, i2): set1 = self.inputClasses1.get() set2 = self.inputClasses2.get() # Compare each pair of class from set1 and set2 # compute the Jaccard index for each (J = len(intersection) / len(union)) # Create a list will all pairs indexes and the sort them jaccardList = [] f = open(self._getPath('jaccard.txt'), 'w') f.write( '; class1 class2 intersection(i) union(i) jaccard index = len(i)/len(u)\n' ) for cls1 in set1: ids1 = cls1.getIdSet() for cls2 in set2: ids2 = cls2.getIdSet() inter = len(ids1.intersection(ids2)) union = len(ids1.union(ids2)) jaccardIndex = float(inter) / union jaccardTuple = (cls1.getObjId(), cls2.getObjId(), inter, union, jaccardIndex) f.write('%d %d %d %d %0.3f\n' % jaccardTuple) jaccardList.append(jaccardTuple) f.close() jaccardList.sort(key=lambda e: e[4], reverse=True) visitedClasses = set() outputFn = self._getPath('consensus.sqlite') cleanPath(outputFn) outputSet = EMSet(filename=outputFn) for clsId1, clsId2, inter, union, jaccardIndex in jaccardList: if clsId1 not in visitedClasses: visitedClasses.add(clsId1) # mark as visited cls1 = set1[clsId1] cls2 = set2[clsId2] o = Object() o.setObjLabel('classes %d - %d' % (clsId1, clsId2)) o.class1 = cls1.clone() o.class1.id = Integer(clsId1) o.class2 = cls2.clone() o.class2.id = Integer(clsId2) o.jaccard = Float(jaccardIndex) o.intersection = Integer(inter) o.union = Integer(union) outputSet.append(o) self._defineOutputs(outputConsensus=outputSet)
def createAnalyzeFilesStep(self): """ This method will create two sqlite files that will be used in by the viewer in the 'Analyze result' action. ctfSet: a table with average ctf values between all methods. ctfSetPair: a table where each row is a pair between two methods """ ctfSetFn, ctfSetPairFn = self._getAnalyzeFiles() cleanPath(ctfSetFn, ctfSetPairFn) ctfSet = Set(filename=ctfSetFn) ctfSetPair = em.SetOfCTF(filename=ctfSetPairFn) #import pdb #pdb.set_trace() minimumResolution = {} maximumResolution = {} averageResolution = {} averageDefocusU = {} averageDefocusV = {} averageDefocusAngle = {} for ctf in self.setOfCTF: micFileName = self._getMicName(ctf) minimumResolution[micFileName] = 0. maximumResolution[micFileName] = 0. averageResolution[micFileName] = 0. averageDefocusU[micFileName] = 0. averageDefocusV[micFileName] = 0. averageDefocusAngle[micFileName] = 0. for method1, method2, ctfId in self._freqResol: ctf = em.CTFModel() ctf1 = self.inputCTFs[method1].get()[ctfId] ctf2 = self.inputCTFs[method2].get()[ctfId] ctf.setDefocusU((ctf1.getDefocusU() + ctf2.getDefocusU()) / 2.) ctf.setDefocusV((ctf1.getDefocusV() + ctf2.getDefocusV()) / 2.) ctf.setDefocusAngle( (ctf1.getDefocusAngle() + ctf2.getDefocusAngle()) / 2.) ctf.setMicrograph(ctf1.getMicrograph()) #Clean objId since we can have ctf from the same micrograph # and by default it is set to micrograph id ctf.cleanObjId() resolution = self._freqResol[(method1, method2, ctfId)] ctf.resolution = Float(resolution) ctf.method1 = String(self.methodNames[method1]) ctf.method2 = String(self.methodNames[method2]) # save the values of defocus for each micrograph in a list ctfSetPair.append(ctf) micFileName = self._getMicName(ctf1) if (not micFileName in minimumResolution or not micFileName in maximumResolution): pass if resolution < minimumResolution[micFileName]: minimumResolution[micFileName] = resolution if resolution > maximumResolution[micFileName]: maximumResolution[micFileName] = resolution averageResolution[micFileName] += resolution averageDefocusU[micFileName] += ctf.getDefocusU() averageDefocusV[micFileName] += ctf.getDefocusV() averageDefocusAngle[micFileName] += ctf.getDefocusAngle() size = float(len(self.setOfCTF)) for ctf in self.setOfCTF: ctfAvg = Object() micFileName = self._getMicName(ctf) ctfAvg._micObj = ctf.getMicrograph() ctfAvg.averageDefocusU = Float(averageDefocusU[micFileName] / size) ctfAvg.averageDefocusV = Float(averageDefocusV[micFileName] / size) ctfAvg.averageDefocusAngle = Float( averageDefocusAngle[micFileName] / size) ctfAvg.averageResolution = Float(averageResolution[micFileName] / size) ctfSet.append(ctfAvg) ctfSetPair.write() ctfSet.write()