Exemple #1
0
def ensurevar(*args,**kwargs):
  """Help function to ensure arguments are one Variable object:
      - xvar, nxbins, xmin, xmax (str, int, float, float)
      - xvar, xbins (str, list)
      - var (str)
  """
  args = unwraplistargs(args)
  if len(args)==4:
    return Variable(*args) # (xvar,nxbins,xmin,xmax)
  elif len(args)==2 and islist(args[1]):
    return Variable(*args)  # (xvar,xbins)
  elif len(args)==1 and isinstance(args[0],Variable):
    return args[0]
  else:
    LOG.throw(IOError,'unwrap_variable_args: Could not unwrap arguments %s, len(args)=%d. Returning None.'%(args,len(args)))
Exemple #2
0
def estimatelen(*strings):
    """Estimate maximum length of list of strings."""
    strings = unwraplistargs(*strings)
    maxlen = 0
    replace = [('{', ''), ('}', ''), ('_', ''), ('^', ''), ('#', '')]
    for string in strings:
        if not string: continue
        if '\n' in string:
            strlen = estimatelen(string.split('\n'))
        else:
            string = symregx.sub("x", string)
            for old, new in replace:
                string = string.replace(old, new)
            strlen = len(string)
        if strlen > maxlen:
            maxlen = strlen
    return maxlen
Exemple #3
0
def makesamples(nevts=10000,**kwargs):
  """Create pseudo MC and data tree for quick and reproducible testing of Plotter tools."""
  
  outdir  = kwargs.get('outdir',  'plots' )
  channel = kwargs.get('channel', 'mutau' )
  samples = kwargs.get('sample',  ['Data','ZTT','WJ','QCD','TT'])
  scales  = kwargs.get('scales',  None    )
  samples = unwraplistargs(samples)
  
  scaledict = { # relative contribtions to pseudo data
    'ZTT': 1.00,
    'WJ':  0.40,
    'QCD': 0.25,
    'TT':  0.15,
    'DYJets':  1.0,
    'DY1Jets': 0.5,
    'DY2Jets': 0.3,
    'DY3Jets': 0.2,
    'DY4Jets': 0.1,
  }
  if scales:
    scaledict.update(scales)
  scaledict.pop('Data',None)
  vardict = { # uncorrelated pseudo distributions for variables
    'm_vis': {
      '*':   lambda gm: gRandom.Gaus( 72, 9) if gm==5 else gRandom.Gaus( 91, 2), # default
      'ZTT': lambda gm: gRandom.Gaus( 72, 9),
      'WJ':  lambda gm: gRandom.Gaus( 65,28),
      'QCD': lambda gm: gRandom.Gaus( 80,44),
      'TT':  lambda gm: gRandom.Gaus(110,70),
    },
    'genmatch_2': { # chance that genmatch_2==5 (real tau)
      '*':   0.9, # default
      'ZTT': 1.0,
      'WJ':  0.5,
      'QCD': 0.5,
      'TT':  0.8,
    },
    'pt_1': {
      '*':   lambda: gRandom.Landau(30,2), # default
      'QCD': lambda: gRandom.Landau(30,5),
      'TT':  lambda: gRandom.Landau(40,6),
    },
    'pt_2': {
      '*':   lambda: gRandom.Landau(24,2), # default
      'WJ':  lambda: gRandom.Landau(24,2),
      'QCD': lambda: gRandom.Landau(24,5),
      'TT':  lambda: gRandom.Landau(30,6),
    },
    'eta_1': {
      '*': lambda: gRandom.Uniform(-2.5,2.5), # default
    },
    'eta_2': {
      '*': lambda: gRandom.Uniform(-2.5,2.5), # default
    },
    'dm_2': {
      '*':   lambda r: 0 if r<0.4 else 1 if r<0.6 else 10 if r<0.9 else 11, # default
    },
    'njets': {
      '*':   lambda: gRandom.Poisson(0.2,), # default
      'ZTT': lambda: gRandom.Poisson(0.2,),
      'WJ':  lambda: gRandom.Poisson(1.2,),
      'QCD': lambda: gRandom.Poisson(2.0,),
      'TT':  lambda: gRandom.Poisson(2.5,),
      'DYJets':  lambda: gRandom.Poisson(0.2,),
      'DY1Jets': lambda: 1,
      'DY2Jets': lambda: 2,
      'DY3Jets': lambda: 3,
      'DY4Jets': lambda: 4,
    },
    'NUP': {
      '*':   lambda: gRandom.Poisson(0.2,), # default
      'ZTT': lambda: gRandom.Poisson(0.2,),
      'WJ':  lambda: gRandom.Poisson(1.2,),
      'QCD': lambda: gRandom.Poisson(2.0,),
      'TT':  lambda: gRandom.Poisson(2.5,),
      'DYJets':  lambda: gRandom.Poisson(0.2,),
      'DY1Jets': lambda: 1,
      'DY2Jets': lambda: 2,
      'DY3Jets': lambda: 3,
      'DY4Jets': lambda: 4,
    },
    'weight': {
      '*':   lambda: gRandom.Gaus(1.0,0.10), # default
      'ZTT': lambda: gRandom.Gaus(1.0,0.10),
      'WJ':  lambda: gRandom.Gaus(1.0,0.10),
      'QCD': lambda: gRandom.Gaus(1.0,0.05),
      'TT':  lambda: gRandom.Gaus(1.0,0.08),
    },
  }
  
  # PREPARE TREES
  ensuredir(outdir)
  filedict   = { }
  histdict   = { }
  m_vis      = np.zeros(1,dtype='f')
  pt_1       = np.zeros(1,dtype='f')
  pt_2       = np.zeros(1,dtype='f')
  dm_2       = np.zeros(1,dtype='f')
  eta_1      = np.zeros(1,dtype='f')
  eta_2      = np.zeros(1,dtype='f')
  njets      = np.zeros(1,dtype='i')
  genmatch_2 = np.zeros(1,dtype='i') # genmatch_2: 5 = real tau; 0 = fake tau
  NUP        = np.zeros(1,dtype='i') # number of LHE-level partons for jet stitching
  weight     = np.zeros(1,dtype='f')
  def makesample(sample): # help function to create file with tree
    fname = "%s/%s_%s.root"%(outdir,sample,channel)
    file  = TFile(fname,'RECREATE')
    hist  = TH1D('cutflow','cutflow',20,0,20)
    tree  = TTree('tree','tree')
    tree.Branch('m_vis',      m_vis,      'm_vis/F')
    tree.Branch('pt_1',       pt_1,       'pt_1/F')
    tree.Branch('pt_2',       pt_2,       'pt_2/F')
    tree.Branch('dm_2',       dm_2,       'dm_2/I')
    tree.Branch('eta_1',      eta_1,      'eta_1/F')
    tree.Branch('eta_2',      eta_2,      'eta_2/F')
    tree.Branch('njets',      njets,      'njets/I')
    tree.Branch('genmatch_2', genmatch_2, 'genmatch_2/I')
    tree.Branch('NUP',        NUP,        'NUP/I')
    tree.Branch('weight',     weight,     'weight/F')
    tree.SetDirectory(file)
    hist.SetDirectory(file)
    hist.SetBinContent( 1,1)
    hist.SetBinContent(17,1)
    histdict[sample] = hist
    filedict[sample] = (file,tree)
  for sample in scaledict:
    makesample(sample)
  makesample('Data')
  
  def getgenerator(var,sample): # get random generator from dictionary
    if sample in vardict[var]: return vardict[var][sample]
    else: return vardict[var]['*']
  def fill(sample,tree,nevts): # help function to fill trees
    for i in xrange(nevts):
      genmatch_2[0] = 5 if gRandom.Uniform(1.)<getgenerator('genmatch_2',sample) else 0
      m_vis[0]      = getgenerator('m_vis',sample)(genmatch_2[0])
      pt_1[0]       = getgenerator('pt_1', sample)()
      pt_2[0]       = getgenerator('pt_2', sample)()
      if m_vis[0]<0 or pt_1[0]<0 or pt_2[0]<0: continue
      if pt_1[0]<pt_1[0]:
        pt_1[0], pt_2[0] = pt_2[0], pt_1[0]
      dm_2[0]   = getgenerator('dm_2', sample)(gRandom.Uniform(1.))
      eta_1[0]  = getgenerator('eta_1', sample)()
      eta_2[0]  = getgenerator('eta_2', sample)()
      njets[0]  = getgenerator('njets', sample)()
      weight[0] = getgenerator('weight',sample)() if sample!='Data' else 1.0
      tree.Fill()
  
  # PSEUDO MC
  print ">>> Generating pseudo MC..."
  #time0 = time.time()
  for sample in samples:
    if sample=='Data': continue
    #print ">>>   %r"%(sample)
    file, tree = filedict[sample]
    file.cd()
    fill(sample,tree,nevts)
    histdict[sample].Write()
    tree.Write()
  #print ">>>   %.1f seconds"%(time.time()-time0)
  
  # PSEUDO DATA
  if 'Data' in samples:
    print ">>> Generating pseudo data..."
    file, tree = filedict['Data']
    file.cd()
    #time0 = time.time()
    for sample in samples:
      if sample=='Data': continue
      prob = scaledict.get(sample,1.0)
      ndevts = int(prob*nevts) # relative contribtion to pseudo data
      fill(sample,tree,ndevts)
    histdict[sample].Write()
    tree.Write()
    #print ">>>   %.1f seconds"%(time.time()-time0)
  
  return filedict