import misc


odors = {}

def hill(eta, k, n, Fmax, cc): return Fmax/(1+((1+(0.0+k)/cc)/eta)**n)
def PG(val): return 0.5/(1+0.01*(1.0/val-1))

class odor:
  def __init__(self, name, eta, k):
    self.name = name
    self.eta = eta
    self.k = k
    
  def getORNs(self, cc):
    return [ hill(self.eta[i], self.k[i], 2, 25.0, cc) for i in range(len(self.eta)) ]

  def afterPG_1(self, cc):
    act = self.getORNs(cc)
    mu = misc.mean(act)
    for i in range(len(act)):
      act[i] -= mu
      if act[i] < 0:
        act[i] = 0
    return act
      
  def afterPG_2(self, cc):
    act = self.afterPG_1(cc)
    for i in range(len(act)):
      if act[i] > 0:
        act[i] -= PG(act[i])
        if act[i] < 0:
          act[i] = 0
    return act

    

def init(kfilename, etafilename):
  odors.clear()
  
  import fileinput
  
  for l in fileinput.input(etafilename):
    data = l.split('\t')
    odors.update({ data[0]: odor(data[0], [ float(x) for x in data[1:] ], []) })
    
  for l in fileinput.input(kfilename):
    data = l.split('\t')
    odors[data[0]].k = [ float(x) for x in data[1:] ]
    

init('Kod.txt', 'Eta.txt')

if __name__ == '__main__':
  o = odors['Mint']