Exemplo n.º 1
0
def buildNtuple4l(channel):
    "Build a tree for storing important values"
    strToProcess = "struct structSelect_t {"
    strForBranch = ""
    strToProcess += "Int_t   passTight;"
    strForBranch += "passTight/I:"
    strToProcess += "Int_t   passLoose;"
    strForBranch += "passLoose/I:"
    for ne in range(5):
        for nm in range(5-ne):
            strToProcess += "Int_t   pass_%i%i;" %(ne,nm)
            strForBranch += "pass_%i%i/I:" %(ne,nm)
    strToProcess += "};"
    strForBranch = strForBranch[:-1] # remove trailing :
    rt.gROOT.ProcessLine(strToProcess)
    rt.gROOT.ProcessLine(
    "struct structEvent_t {\
       Int_t   evt;\
       Int_t   run;\
       Int_t   lumi;\
       Int_t   nvtx;\
       Float_t lep_scale;\
       Float_t trig_scale;\
       Float_t pu_weight;\
    };");
    rt.gROOT.ProcessLine(
    "struct structChannel_t {\
       Char_t  channel[5];\
    };");
    rt.gROOT.ProcessLine(
    "struct struct4l_t {\
       Float_t mass;\
       Float_t sT;\
       Float_t met;\
       Float_t metPhi;\
       Int_t   jetVeto20;\
       Int_t   jetVeto30;\
       Int_t   jetVeto40;\
       Int_t   bjetVeto20;\
       Int_t   bjetVeto30;\
       Int_t   muonVeto5;\
       Int_t   muonVeto10Loose;\
       Int_t   muonVeto15;\
       Int_t   elecVeto10;\
    };");
    rt.gROOT.ProcessLine(
    "struct structH_t {\
       Float_t mass;\
       Float_t sT;\
       Float_t dPhi;\
       Float_t Pt1;\
       Float_t Eta1;\
       Float_t Phi1;\
       Float_t Pt2;\
       Float_t Eta2;\
       Float_t Phi2;\
       Int_t   Chg1;\
       Int_t   Chg2;\
    };");
    rt.gROOT.ProcessLine(
    "struct structHChar_t {\
       Char_t  Flv[3];\
    };");
    rt.gROOT.ProcessLine(
    "struct structLepton_t {\
       Float_t Pt;\
       Float_t Eta;\
       Float_t Phi;\
       Float_t Iso;\
       Int_t   Chg;\
    };");
    rt.gROOT.ProcessLine(
    "struct structLepChar_t {\
       Char_t  Flv[2];\
    };");

    tree = rt.TTree(channel,'H++H-- 4l')
    structSelect = rt.structSelect_t()
    structEvent = rt.structEvent_t()
    structChannel = rt.structChannel_t()
    struct4l = rt.struct4l_t()
    structH1 = rt.structH_t()
    structH2 = rt.structH_t()
    structH1f = rt.structHChar_t()
    structH2f = rt.structHChar_t()
    structZ1 = rt.structH_t()
    structZ1f = rt.structHChar_t()
    structZ2 = rt.structH_t()
    structZ2f = rt.structHChar_t()
    structTTf = rt.structHChar_t()
    structL1 = rt.structLepton_t()
    structL2 = rt.structLepton_t()
    structL3 = rt.structLepton_t()
    structL4 = rt.structLepton_t()
    structL1f = rt.structLepChar_t()
    structL2f = rt.structLepChar_t()
    structL3f = rt.structLepChar_t()
    structL4f = rt.structLepChar_t()
    tree.Branch('select',structSelect,strForBranch)
    tree.Branch('event',structEvent,'evt/I:run:lumi:nvtx:lep_scale/F:trig_scale:pu_weight')
    tree.Branch('channel',rt.AddressOf(structChannel,'channel'),'channel/C')
    tree.Branch('4l',struct4l,'mass/F:sT:met:metPhi:jetVeto20/I:jetVeto30:jetVeto40:bjetVeto20:bjetVeto30:muonVeto5:muonVeto10Loose:muonVeto15:elecVeto10')
    tree.Branch('h1',structH1,'mass/F:sT:dPhi:Pt1:Eta1:Phi1:Pt2:Eta2:Phi2:Chg1/I:Chg2')
    tree.Branch('h2',structH2,'mass/F:sT:dPhi:Pt1:Eta1:Phi1:Pt2:Eta2:Phi2:Chg1/I:Chg2')
    tree.Branch('h1Flv',rt.AddressOf(structH1f,'Flv'),'Flv/C')
    tree.Branch('h2Flv',rt.AddressOf(structH2f,'Flv'),'Flv/C')
    tree.Branch('z1',structZ1,'mass/F:sT:dPhi:Pt1:Eta1:Phi1:Pt2:Eta2:Phi2:Chg1/I:Chg2')
    tree.Branch('z1Flv',rt.AddressOf(structZ1f,'Flv'),'Flv/C')
    tree.Branch('z2',structZ2,'mass/F:sT:dPhi:Pt1:Eta1:Phi1:Pt2:Eta2:Phi2:Chg1/I:Chg2')
    tree.Branch('z2Flv',rt.AddressOf(structZ2f,'Flv'),'Flv/C')
    tree.Branch('ttFlv',rt.AddressOf(structTTf,'Flv'),'Flv/C')
    tree.Branch('l1',structL1,'Pt/F:Eta:Phi:Iso:Chg/I')
    tree.Branch('l2',structL2,'Pt/F:Eta:Phi:Iso:Chg/I')
    tree.Branch('l3',structL3,'Pt/F:Eta:Phi:Iso:Chg/I')
    tree.Branch('l4',structL4,'Pt/F:Eta:Phi:Iso:Chg/I')
    tree.Branch('l1Flv',rt.AddressOf(structL1f,'Flv'),'Flv/C')
    tree.Branch('l2Flv',rt.AddressOf(structL2f,'Flv'),'Flv/C')
    tree.Branch('l3Flv',rt.AddressOf(structL3f,'Flv'),'Flv/C')
    tree.Branch('l4Flv',rt.AddressOf(structL4f,'Flv'),'Flv/C')
    return tree, structSelect, structEvent, structChannel, struct4l, structH1, structH2, structH1f, structH2f,\
           structZ1, structZ1f, structZ2, structZ2f, structTTf, structL1, structL2, structL3, structL4,\
           structL1f, structL2f, structL3f, structL4f
Exemplo n.º 2
0
def buildNtuple(object_definitions,states,channelName,final_states,**kwargs):
    '''
    A function to build an initial state ntuple for AnalyzerBase.py
    '''
    alternateIds = kwargs.pop('altIds',[])
    doVBF = kwargs.pop('doVBF',False)
    doMetUnc = kwargs.pop('doMetUnc',False)

    finalStateObjects = 'emtjgn'
    structureDict = {}
    structOrder = []

    # count objects
    nl = 0
    nj = 0
    np = 0
    for key in states[0]:
        val = object_definitions[key]
        for obj in val:
            if obj=='n': continue
            else:
                if obj in 'emt':
                    nl += 1
                if obj == 'j':
                    nj += 1
                if obj == 'g':
                    np += 1


    # some common things
    baseMetVars = ['met','metPhi','mT']
    metVars = []
    metVars += baseMetVars
    baseLepMetVars = ['mass','Pt','sT','dPhi']
    lepMetVars = []
    if doMetUnc:
        for s in ['JetRes','JetEn','MuonEn','ElectronEn','TauEn','UnclusteredEn','PhotonEn']:
            for d in ['Up','Down']:
                for m in baseMetVars:
                    metVars += ['{0}{1}{2}'.format(m,s,d)]
                for m in baseLepMetVars:
                    lepMetVars += ['{0}{1}{2}'.format(m,s,d)]

    lepFloats = ['Pt', 'Eta', 'Phi', 'Iso', 'Dxy', 'Dz', 'SigmaIEtaIEta', 'DEtaIn', 'DPhiIn', 'HOverE', 'OoEmOoP', 'TriggeringMVA', 'NonTriggeringMVA', 'NormalizedChi2', 'JetPt', 'JetBTag']
    for t in ['','_up','_down']:
        for l in ['Loose','Tight']:
            lepFloats += ['LepScale{0}{1}'.format(l,t)]
        lepFloats += ['LepEff{0}'.format(t)]
        lepFloats += ['LepFake{0}'.format(t)]
    lepInts = ['Chg', 'PassLoose', 'PassTight', 'GenPdgId', 'MotherGenPdgId', 'ChargeConsistent', 'ExpectedMissingInnerHits', 'PassConversionVeto', 'IsGlobalMuon', 'IsPFMuon', 'IsTrackerMuon', 'ValidMuonHits', 'MatchedStations', 'ValidPixelHits', 'TrackerLayers']



    # define selection bools
    numObjs = len(final_states[0])
    allowedObjects = ''
    for fsObj in finalStateObjects:
        for fs in final_states:
            if fsObj in fs:
                allowedObjects += fsObj
                break
    numObjTypes = len(allowedObjects)
    
    selectVars = {}
    selectVars['I'] = ['passTight','passLoose']
    for trig in ['DoubleMuon','DoubleEG','MuonEG','EGMuon']:
        selectVars['I'] += ['pass{0}'.format(trig)]
    for altId in alternateIds:
        selectVars['I'] += ['pass_{0}'.format(altId)]
    selectName = 'structSelect_t'
    selectStruct, selectStrForBranch = getStruct(selectName,selectVars)

    structureDict['select'] = [selectStruct, selectStruct, selectStrForBranch]
    structOrder += ['select']    

    # define common root classes
    eventVars = {}
    eventVars['I'] = ['run','lumi','nvtx','GenNUP','trig_prescale']
    eventVars['l'] = ['evt'] # ULong64
    eventVars['F'] = ['gen_weight','charge_uncertainty']
    for v in ['lep_scale','lep_scale_e','lep_scale_m','pu_weight','fakerate','trig_scale','lepeff']:
        for t in ['','_up','_down']:
            eventVars['F'] += ['{0}{1}'.format(v,t)]
    eventName = 'structEvent_t'
    eventStruct, eventStrForBranch = getStruct(eventName,eventVars)
    structOrder += ['event']
    structureDict['event'] = [eventStruct,eventStruct,eventStrForBranch]

    # add channels
    if not hasattr(rt,'structChannel_t'):
        rt.gROOT.ProcessLine(
        "struct structChannel_t {\
           Char_t  channel[9];\
        };");
    channelStruct = rt.structChannel_t()
    structureDict['channel'] = [channelStruct, rt.AddressOf(channelStruct,'channel'),'channel/C']
    structOrder += ['channel']
    genChannelStruct = rt.structChannel_t()
    structureDict['genChannel'] = [genChannelStruct, rt.AddressOf(genChannelStruct,'channel'),'channel/C']
    structOrder += ['genChannel']
    fakeChannelStruct = rt.structChannel_t()
    structureDict['fakeChannel'] = [fakeChannelStruct, rt.AddressOf(fakeChannelStruct,'channel'),'channel/C']
    structOrder += ['fakeChannel']

    # add final state structs
    fsVars = {}
    fsVars['F'] = ['mass','eta','phi','sT']
    fsVars['F'] += metVars
    fsVars['F'] += ['leadJetPt','leadJetEta','leadJetPhi','leadJetPUMVA']
    fsVars['I'] = ['jetVeto20','jetVeto30','jetVeto40']
    fsVars['I'] += ['elecVetoLoose','elecVetoTight','muonVetoLoose','muonVetoTight']
    for pt in ['20','30']:
        for l in ['Loose','Medium','Tight']:
            fsVars['I'] += ['bjetVeto{0}{1}'.format(pt,l)]
    if doVBF:
        fsVars['F'] += ['vbfMass','vbfPt','vbfPt1','vbfPt2','vbfEta1','vbfEta2']
        fsVars['I'] += ['centralJetVeto20','centralJetVeto30']
    fsName = 'structFinalState_t'
    fsStruct, fsStrForBranch = getStruct(fsName,fsVars)
    structureDict['finalstate'] = [fsStruct, fsStruct, fsStrForBranch]
    structOrder += ['finalstate']

    # add object struct
    objVars = {}
    objVars['F'] = lepFloats
    objVars['I'] = lepInts
    objName = 'structObject_t'

    if not hasattr(rt,'structObjChar_t'):
        rt.gROOT.ProcessLine(
        "struct structObjChar_t {\
           Char_t  Flv[2];\
        };");

    lepCount = 0
    jetCount = 0
    phoCount = 0
    for key in states[0]:
        val = object_definitions[key]
        for obj in val:
            if obj=='n': continue
            else:
                objStruct, objStrForBranch = getStruct(objName,objVars)
                flvStruct = rt.structObjChar_t()
                if obj in 'emt': 
                    charName = 'l'
                    lepCount += 1
                    objCount = lepCount
                if obj == 'j':
                    charName = 'j'
                    jetCount += 1
                    objCount = jetCount
                if obj == 'g':
                    charName = 'g'
                    phoCount += 1
                    objCount = phoCount
                structureDict['%s%i' % (charName, objCount)] = [objStruct, objStruct, objStrForBranch]
                structureDict['%s%iFlv' % (charName, objCount)] = [flvStruct, rt.AddressOf(flvStruct,'Flv'),'Flv/C']
                structOrder += ['%s%i' % (charName, objCount)]
                structOrder += ['%s%iFlv' % (charName, objCount)]

    # define objects for each initial state
    for state in states:
        for key in state:
            val = object_definitions[key]
            stateVars = {'I':[],'F':[]}
            stateName = 'struct{0}_t'.format(key.upper())
            stateVars['F'] += ['mass','Pt','sT','dPhi']
            if 'n' not in val:
                stateVars['F'] += ['dR']
            objCount = 0
            for obj in val:
                if obj == 'n':
                    #stateVars['F'] += metVars
                    stateVars['F'] += lepMetVars
                else:
                    objCount += 1
                    for v in lepFloats:
                        stateVars['F'] += ['{0}{1}'.format(v,objCount)]
                    for v in lepInts:
                        stateVars['I'] += ['{0}{1}'.format(v,objCount)]
                    # manually add the W Z deltaRs for now
                    if key == 'w1':
                        stateVars['F'] += ['dR1_z1_1','dR1_z1_2','mll_z1_1','mll_z1_2','dR1_leadJet']
                    for altId in alternateIds:
                        stateVars['I'] += ['pass_{0}_{1}'.format(altId, objCount)]
            initialStruct, initialStrForBranch = getStruct(stateName,stateVars)
            structureDict[key] = [initialStruct, initialStruct, initialStrForBranch]
            structOrder += [key]

    if not hasattr(rt,'structInitialChar_t'):
        rt.gROOT.ProcessLine(
        "struct structInitialChar_t {\
           Char_t  Flv[3];\
        };");
    for key in object_definitions:
        initialFlvStruct = rt.structInitialChar_t()
        structureDict['%sFlv' % key] = [initialFlvStruct,rt.AddressOf(initialFlvStruct,'Flv'),'Flv/C']
        structOrder += ['%sFlv' % key]

    # now create the tree
    tree = rt.TTree(channelName,channelName)
    allBranches = {}
    for key in structOrder:
        val = structureDict[key]
        tree.Branch(key,val[1],val[2])
        allBranches[key] = val[0]

    return (tree, allBranches)