def __init__( self, masses, probs, atomCnt, tabSize = 1000, hashSize = 1000, burnIn = 1000 ): self.clib = isoFFI.clib #because you can't use global vars in destructor, which is UTTERLY STUPID self.masses = masses self.probs = probs self.isotopeNo = len(masses) self.atomCnt = atomCnt self.tabSize = tabSize self.hashSize = hashSize self.marginal = isoFFI.clib.setupMarginal( masses, probs, self.isotopeNo, atomCnt, tabSize, hashSize) self.cconf_mass = isoFFI.ffi.new("double[1]") self.cconf_lProb = isoFFI.ffi.new("double[1]") self.cconf = isoFFI.ffi.new("int[{0}]".format(self.isotopeNo)) self.cprobs = [] self.summator = Summator()
class MarginalDistribution: def __init__( self, masses, probs, atomCnt, tabSize = 1000, hashSize = 1000, burnIn = 1000 ): self.clib = isoFFI.clib #because you can't use global vars in destructor, which is UTTERLY STUPID self.masses = masses self.probs = probs self.isotopeNo = len(masses) self.atomCnt = atomCnt self.tabSize = tabSize self.hashSize = hashSize self.marginal = isoFFI.clib.setupMarginal( masses, probs, self.isotopeNo, atomCnt, tabSize, hashSize) self.cconf_mass = isoFFI.ffi.new("double[1]") self.cconf_lProb = isoFFI.ffi.new("double[1]") self.cconf = isoFFI.ffi.new("int[{0}]".format(self.isotopeNo)) self.cprobs = [] self.summator = Summator() def __del__(self): self.clib.destroyConf(self.marginal) def getConfsRaw(self): masses = isoFFI.ffi.new("double[{0}]".format(len(self))) logProbs = isoFFI.ffi.new("double[{0}]".format(len(self))) confs = isoFFI.ffi.new("int[{0}]".format(len(self)*self.isotopeNo)) isoFFI.clib.getConfs(len(self), self.marginal, masses, logProbs, confs) return (masses, logProbs, confs) def getConfs(self): ret = [] masses, logProbs, confs = self.getConfsRaw() for i in xrange(len(masses)): ret.append((masses[i], logProbs[i], list(confs[self.isotopeNo*i:(i+1)*self.isotopeNo]))) return ret def getConf(self, idx): if isoFFI.clib.getConfMT(self.marginal, idx, self.cconf_mass, self.cconf_lProb, self.cconf) == 1: return (self.cconf_mass[0], self.cconf_lProb[0], tuple(self.cconf)) else: raise IndexError def probeConf(self, idx): return self.clib.probeConfigurationIdx(self.marginal, idx) > 0 def CumulativeProb(self, idx): if len(self.cprobs) > idx: return self.cprobs[idx] else: for i in xrange(len(self.cprobs), idx+1): self.summator.add(math.exp(self.getConf(i)[1])) self.cprobs.append(self.summator.get()) return self.cprobs[idx]