for anAmp in amps:
  print 'running', anAmp
  counter  = 0
  simpulse.setpar(1, anAmp/scaleFactor)  #this scale factor is here to force the amplitude to be equal to simsignalAmp

  while True:

    #generate a trace - but 
    randomStart = _pulseStartTime + random.uniform(-10, 80) #smear the start time
    simpulse.setpar(0, randomStart )

    simnoise.generate()

    simsignal = simnoise + simpulse

    myOptimalFilter.calcAmp(simsignal)
    tree.amp_in = anAmp
    tree.amp_out = myOptimalFilter.amp_estimator.max()
    tree.amp_out_maxtime = myOptimalFilter.amp_estimator.argmax()
    tree.Fill()

    counter += 1
    if counter == numEvents: 
      break

tree.write()
rootFileOut.close()

    #generate a trace - but 
    randomStart = _pulseStartTime + random.uniform(-10, 80) #smear the start time
    simpulse.setpar(0, randomStart )

    simsignal = simnoise + simpulse
    
    for i in range(len(simsignal)):
      trace[i] =  int(simsignal[i])

    pRaw.SetTrace(trace)
    optkamper = cham.GetOptimalKamper(pRaw)
    optkamper.SetIonPulseStartTime(0.0);  
    optkamper.SetUseMinimizer(False)  #don't look for the minimum of chi**2

    optkamper.MakeKamp(pRaw)
    resultsMap = optkamper.GetResults()
      

    tree.amp_in = anAmp
    tree.amp_out = resultsMap['amp'].fValue
    tree.amp_out_maxtime = resultsMap['peakPosition'].fValue
    tree.Fill()

    counter += 1
    if counter == numEvents: 
      break

tree.write()
rootFileOut.close()