Beispiel #1
0
 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()
Beispiel #2
0
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]