コード例 #1
0
 def run_method(self):
     if self.args.json is not None:
         json_structure = self.args.json.split(':')
         assert(len(json_structure) >= 1)
         if os.path.isfile(json_structure[0]):
             with open(json_structure[0]) as jsonfile: js = json.load(jsonfile)
         else:
             js = {}
         js_target = js
         if (len(json_structure) >= 2):
             for key in json_structure[1:]:
                 js_target[key] = {}
                 js_target = js_target[key]
     POIs = self.args.POIs.split(',')
     if self.args.algo == 'none':
         res = utils.get_none_results(self.args.input, POIs)
         if self.args.json is not None:
           for key,val in res.iteritems():
             js_target[key] = { 'Val' : val }
         with open(json_structure[0], 'w') as outfile:
           json.dump(js, outfile, sort_keys=True, indent=4, separators=(',', ': '))
     elif self.args.algo == 'singles':
         res = utils.get_singles_results(self.args.input, POIs, POIs)
         for p in POIs:
             val = res[p][p]
             print '%s = %.3f -%.3f/+%.3f' % (p, val[1], val[1] - val[0], val[2] - val[1])
コード例 #2
0
 def run_method(self):
     if self.args.json is not None:
         json_structure = self.args.json.split(':')
         assert (len(json_structure) >= 1)
         if os.path.isfile(json_structure[0]):
             with open(json_structure[0]) as jsonfile:
                 js = json.load(jsonfile)
         else:
             js = {}
         js_target = js
         if (len(json_structure) >= 2):
             for key in json_structure[1:]:
                 js_target[key] = {}
                 js_target = js_target[key]
     POIs = self.args.POIs.split(',')
     if self.args.algo == 'none':
         res = utils.get_none_results(self.args.input, POIs)
         if self.args.json is not None:
             for key, val in res.iteritems():
                 js_target[key] = {'Val': val}
         with open(json_structure[0], 'w') as outfile:
             json.dump(js,
                       outfile,
                       sort_keys=True,
                       indent=4,
                       separators=(',', ': '))
     elif self.args.algo == 'singles':
         res = utils.get_singles_results(self.args.input, POIs, POIs)
         for p in POIs:
             val = res[p][p]
             print '%s = %.3f -%.3f/+%.3f' % (p, val[1], val[1] - val[0],
                                              val[2] - val[1])
コード例 #3
0
ファイル: Output.py プロジェクト: senka/HTT_20162017
 def run_method(self):
     if self.args.json is not None:
         json_structure = self.args.json.split(':')
         assert (len(json_structure) >= 1)
         if os.path.isfile(json_structure[0]):
             with open(json_structure[0]) as jsonfile:
                 js = json.load(jsonfile)
         else:
             js = {}
         js_target = js
         if (len(json_structure) >= 2):
             for key in json_structure[1:]:
                 js_target[key] = {}
                 js_target = js_target[key]
     POIs = self.args.POIs.split(',')
     if self.args.algo == 'none':
         res = utils.get_none_results(self.args.input, POIs)
         for p in POIs:
             val = res[p]
             print '%-30s = %+.3f' % (p, val)
         if self.args.json is not None:
             for key, val in res.iteritems():
                 js_target[key] = {'Val': val}
             with open(json_structure[0], 'w') as outfile:
                 json.dump(js,
                           outfile,
                           sort_keys=True,
                           indent=4,
                           separators=(',', ': '))
     elif self.args.algo == 'singles':
         res = utils.get_singles_results(self.args.input, POIs, POIs)
         for p in POIs:
             val = res[p][p]
             print '%s = %.3f -%.3f/+%.3f' % (p, val[1], val[1] - val[0],
                                              val[2] - val[1])
     elif self.args.algo == 'fixed':
         res = utils.get_fixed_results(self.args.input, POIs)
         print '%-30s   bestfit :   fixed' % ('')
         for p in POIs:
             print '%-30s = %+.3f  :   %+.3f' % (p, res['bestfit'][p],
                                                 res['fixedpoint'][p])
         print '-' * 60
         print '2*deltaNLL = %f, nPOIs = %i, p-value = %0.4f' % (
             2. * res['deltaNLL'], len(POIs), res['pvalue'])
コード例 #4
0
    def run_method(self):
        if self.args.allPars:
            print 'Info: the behaviour of --allPars is now always enabled and the option will be removed in a future update'
        passthru = self.passthru
        mh = self.args.mass
        ws = self.args.datacard
        name = self.args.name if self.args.name is not None else ''
        named = []
        if self.args.named is not None:
            named = self.args.named.split(',')
        # Put intercepted args back
        passthru.extend(['-m', mh])
        passthru.extend(['-d', ws])
        if self.args.setPhysicsModelParameters is not None:
            passthru.extend([
                '--setPhysicsModelParameters',
                self.args.setPhysicsModelParameters
            ])
        if self.args.setParameters is not None:
            passthru.extend(['--setParameters', self.args.setParameters])
            self.args.setPhysicsModelParameters = self.args.setParameters
        pass_str = ' '.join(passthru)

        paramList = []
        if self.args.redefineSignalPOIs is not None:
            poiList = self.args.redefineSignalPOIs.split(',')
        else:
            poiList = utils.list_from_workspace(ws, 'w', 'ModelConfig_POI')
        print 'Have POIs: ' + str(poiList)
        poistr = ','.join(poiList)

        if self.args.approx == 'hesse' and self.args.doFits:
            self.job_queue.append(
                'combine -M MultiDimFit -n _approxFit_%(name)s --algo none --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 --saveFitResult %(pass_str)s'
                % {
                    'name': name,
                    'poistr': poistr,
                    'pass_str': pass_str
                })
            self.flush_queue()
            sys.exit(0)
        elif self.args.approx == 'robust' and self.args.doFits:
            self.job_queue.append(
                'combine -M MultiDimFit -n _approxFit_%(name)s --algo none --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 --robustHesse 1 %(pass_str)s'
                % {
                    'name': name,
                    'poistr': poistr,
                    'pass_str': pass_str
                })
            self.flush_queue()
            sys.exit(0)

        ################################################
        # Generate the initial fit(s)
        ################################################
        if self.args.doInitialFit and self.args.approx is not None:
            print 'No --initialFit needed with --approx, use --output directly'
            sys.exit(0)
        if self.args.doInitialFit:
            if self.args.splitInitial:
                for poi in poiList:
                    self.job_queue.append(
                        'combine -M MultiDimFit -n _initialFit_%(name)s_POI_%(poi)s --algo singles --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 -P %(poi)s %(pass_str)s'
                        % {
                            'name': name,
                            'poi': poi,
                            'poistr': poistr,
                            'pass_str': pass_str
                        })
            else:
                self.job_queue.append(
                    'combine -M MultiDimFit -n _initialFit_%(name)s --algo singles --redefineSignalPOIs %(poistr)s %(pass_str)s'
                    % {
                        'name': name,
                        'poistr': poistr,
                        'pass_str': pass_str
                    })
            self.flush_queue()
            sys.exit(0)

        # Read the initial fit results
        initialRes = {}
        if self.args.approx is not None:
            if self.args.approx == 'hesse':
                fResult = ROOT.TFile('multidimfit_approxFit_%(name)s.root' %
                                     {'name': name})
                rfr = fResult.Get('fit_mdf')
                fResult.Close()
                initialRes = utils.get_roofitresult(rfr, poiList, poiList)
            elif self.args.approx == 'robust':
                fResult = ROOT.TFile('robustHesse_approxFit_%(name)s.root' %
                                     {'name': name})
                floatParams = fResult.Get('floatParsFinal')
                rfr = fResult.Get('h_correlation')
                rfr.SetDirectory(0)
                fResult.Close()
                initialRes = utils.get_robusthesse(floatParams, rfr, poiList,
                                                   poiList)
        elif self.args.splitInitial:
            for poi in poiList:
                initialRes.update(
                    utils.get_singles_results(
                        'higgsCombine_initialFit_%(name)s_POI_%(poi)s.MultiDimFit.mH%(mh)s.root'
                        % vars(), [poi], poiList))
        else:
            initialRes = utils.get_singles_results(
                'higgsCombine_initialFit_%(name)s.MultiDimFit.mH%(mh)s.root' %
                vars(), poiList, poiList)

        ################################################
        # Build the parameter list
        ################################################
        if len(named) > 0:
            paramList = named
        else:
            paramList = self.all_free_parameters(ws, 'w', 'ModelConfig',
                                                 poiList)
        # else:
        #     paramList = utils.list_from_workspace(
        #         ws, 'w', 'ModelConfig_NuisParams')

        # Exclude some parameters
        if self.args.exclude is not None:
            exclude = self.args.exclude.split(',')
            paramList = [x for x in paramList if x not in exclude]

        print 'Have parameters: ' + str(len(paramList))

        prefit = utils.prefit_from_workspace(
            ws, 'w', paramList, self.args.setPhysicsModelParameters)
        res = {}
        res["POIs"] = []
        res["params"] = []
        for poi in poiList:
            res["POIs"].append({"name": poi, "fit": initialRes[poi][poi]})

        missing = []
        for param in paramList:
            pres = {'name': param}
            pres.update(prefit[param])
            # print 'Doing param ' + str(counter) + ': ' + param
            if self.args.doFits:
                self.job_queue.append(
                    'combine -M MultiDimFit -n _paramFit_%(name)s_%(param)s --algo impact --redefineSignalPOIs %(poistr)s -P %(param)s --floatOtherPOIs 1 --saveInactivePOI 1 %(pass_str)s'
                    % vars())
            else:
                if self.args.approx == 'hesse':
                    paramScanRes = utils.get_roofitresult(
                        rfr, [param], poiList + [param])
                elif self.args.approx == 'robust':
                    if floatParams.find(param):
                        paramScanRes = utils.get_robusthesse(
                            floatParams, rfr, [param], poiList + [param])
                    else:
                        paramScanRes = None
                else:
                    paramScanRes = utils.get_singles_results(
                        'higgsCombine_paramFit_%(name)s_%(param)s.MultiDimFit.mH%(mh)s.root'
                        % vars(), [param], poiList + [param])
                if paramScanRes is None:
                    missing.append(param)
                    continue
                pres["fit"] = paramScanRes[param][param]
                for p in poiList:
                    pres.update({
                        p:
                        paramScanRes[param][p],
                        'impact_' + p:
                        max(
                            map(abs, (x - paramScanRes[param][p][1]
                                      for x in (paramScanRes[param][p][2],
                                                paramScanRes[param][p][0]))))
                    })
            res['params'].append(pres)
        self.flush_queue()

        if self.args.approx == 'hesse':
            res['method'] = 'hesse'
        elif self.args.approx == 'robust':
            res['method'] = 'robust'
        else:
            res['method'] = 'default'
        jsondata = json.dumps(res,
                              sort_keys=True,
                              indent=2,
                              separators=(',', ': '))
        # print jsondata
        if self.args.output is not None:
            with open(self.args.output, 'w') as out_file:
                out_file.write(jsondata)
        if len(missing) > 0:
            print 'Missing inputs: ' + ','.join(missing)
コード例 #5
0
ファイル: Impacts.py プロジェクト: rcl11/CombineHarvester
  def run_method(self):
    # offset      = self.args.offset
    # advance     = self.args.advance
    passthru    = self.passthru 
    mh          = self.args.mass
    ws          = self.args.datacard
    name        = self.args.name if self.args.name is not None else ''
    named = []
    if self.args.named is not None:
      named = args.named.split(',')
    # Put intercepted args back
    passthru.extend(['-m', mh])
    passthru.extend(['-d', ws])
    pass_str = ' '.join(passthru)
    paramList = []
    if self.args.redefineSignalPOIs is not None:
      poiList = args.redefineSignalPOIs.split(',')
    else:
      poiList = utils.list_from_workspace(ws, 'w', 'ModelConfig_POI')
    #print 'Have nuisance parameters: ' + str(paramList)
    print 'Have POIs: ' + str(poiList)
    poistr = ','.join(poiList)
    if self.args.doInitialFit:
      if self.args.splitInitial:
        for poi in poiList:
          self.job_queue.append('combine -M MultiDimFit -n _initialFit_%(name)s_POI_%(poi)s --algo singles --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 -P %(poi)s %(pass_str)s --altCommit' % vars())
      else:
        self.job_queue.append('combine -M MultiDimFit -n _initialFit_%(name)s --algo singles --redefineSignalPOIs %(poistr)s %(pass_str)s --altCommit' % vars())
      self.flush_queue()
      sys.exit(0)
    initialRes = utils.get_singles_results('higgsCombine_initialFit_%(name)s.MultiDimFit.mH%(mh)s.root' % vars(), poiList, poiList)
    if len(named) > 0:
      paramList = named
    else:
      paramList = utils.list_from_workspace(ws, 'w', 'ModelConfig_NuisParams')
    print 'Have nuisance parameters: ' + str(len(paramList))
    prefit = utils.prefit_from_workspace(ws, 'w', paramList)
    res = { }
    res["POIs"] = []
    res["params"] = []
    # for poi in poiList:
    #   res["POIs"].append({"name" : poi, "fit" : initialRes[poi][poi]})

    missing = [ ]
    for param in paramList:
      pres = { }
      # print 'Doing param ' + str(counter) + ': ' + param
      if self.args.doFits:
        self.job_queue.append('combine -M MultiDimFit -n _paramFit_%(name)s_%(param)s --algo singles --redefineSignalPOIs %(param)s,%(poistr)s -P %(param)s --floatOtherPOIs 1 --saveInactivePOI 1 %(pass_str)s --altCommit' % vars())
      else:
        paramScanRes = get_singles_results('higgsCombine_paramFit_%(name)s_%(param)s.MultiDimFit.mH%(mh)s.root' % vars(), [param], poiList + [param])
        if paramScanRes is None:
          missing.append(param)
          continue
        pres.update({"name" : param, "fit" : paramScanRes[param][param], "prefit" : prefit[param]})
        for p in poiList:
          pres.update({p : paramScanRes[param][p], 'impact_'+p : (paramScanRes[param][p][2] - paramScanRes[param][p][0])/2.})
        res['params'].append(pres)
    self.flush_queue()
    jsondata = json.dumps(res, sort_keys=True, indent=2, separators=(',', ': '))
    print jsondata
    if self.args.output is not None:
      with open(args.output, 'w') as out_file:
        out_file.write(jsondata)
    if len(missing) > 0:
      print 'Missing inputs: ' + ','.join(missing)
コード例 #6
0
ファイル: Impacts.py プロジェクト: taroni/CombineHarvester
    def run_method(self):
        passthru = self.passthru
        mh = self.args.mass
        ws = self.args.datacard
        name = self.args.name if self.args.name is not None else ''
        named = []
        if self.args.named is not None:
            named = self.args.named.split(',')
        # Put intercepted args back
        passthru.extend(['-m', mh])
        passthru.extend(['-d', ws])
        if self.args.setPhysicsModelParameters is not None:
            passthru.extend(['--setPhysicsModelParameters', self.args.setPhysicsModelParameters])
        pass_str = ' '.join(passthru)
        paramList = []
        if self.args.redefineSignalPOIs is not None:
            poiList = self.args.redefineSignalPOIs.split(',')
        else:
            poiList = utils.list_from_workspace(ws, 'w', 'ModelConfig_POI')
        # print 'Have nuisance parameters: ' + str(paramList)
        print 'Have POIs: ' + str(poiList)
        poistr = ','.join(poiList)
        if self.args.doInitialFit:
            if self.args.splitInitial:
                for poi in poiList:
                    self.job_queue.append(
                        'combine -M MultiDimFit -n _initialFit_%(name)s_POI_%(poi)s --algo singles --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 -P %(poi)s %(pass_str)s' % vars())
            else:
                self.job_queue.append(
                    'combine -M MultiDimFit -n _initialFit_%(name)s --algo singles --redefineSignalPOIs %(poistr)s %(pass_str)s' % vars())
            self.flush_queue()
            sys.exit(0)
        if self.args.splitInitial:
            initialRes = {}
            for poi in poiList:
                initialRes.update(utils.get_singles_results(
                'higgsCombine_initialFit_%(name)s_POI_%(poi)s.MultiDimFit.mH%(mh)s.root' % vars(), [poi], poiList))
        else:
            initialRes = utils.get_singles_results(
                'higgsCombine_initialFit_%(name)s.MultiDimFit.mH%(mh)s.root' % vars(), poiList, poiList)
        if len(named) > 0:
            paramList = named
        elif self.args.allPars:
            paramList = self.all_free_parameters(ws, 'w', 'ModelConfig', poiList)
        else:
            paramList = utils.list_from_workspace(
                ws, 'w', 'ModelConfig_NuisParams')
        if self.args.exclude is not None:
            exclude = self.args.exclude.split(',')
            paramList = [x for x in paramList if x not in exclude]

        print 'Have nuisance parameters: ' + str(len(paramList))
        prefit = utils.prefit_from_workspace(ws, 'w', paramList, self.args.setPhysicsModelParameters)
        res = {}
        res["POIs"] = []
        res["params"] = []
        for poi in poiList:
            res["POIs"].append({"name": poi, "fit": initialRes[poi][poi]})

        missing = []
        for param in paramList:
            pres = {'name': param}
            pres.update(prefit[param])
            # print 'Doing param ' + str(counter) + ': ' + param
            if self.args.doFits:
                self.job_queue.append(
                    'combine -M MultiDimFit -n _paramFit_%(name)s_%(param)s --algo impact --redefineSignalPOIs %(poistr)s -P %(param)s --floatOtherPOIs 1 --saveInactivePOI 1 %(pass_str)s' % vars())
            else:
                paramScanRes = utils.get_singles_results(
                    'higgsCombine_paramFit_%(name)s_%(param)s.MultiDimFit.mH%(mh)s.root' % vars(), [param], poiList + [param])
                if paramScanRes is None:
                    missing.append(param)
                    continue
                pres["fit"] = paramScanRes[param][param]
                for p in poiList:
                    pres.update({p: paramScanRes[param][p], 'impact_' + p: max(map(abs, (x - paramScanRes[
                                param][p][1] for x in (paramScanRes[param][p][2], paramScanRes[param][p][0]))))})
            res['params'].append(pres)
        self.flush_queue()
        jsondata = json.dumps(
            res, sort_keys=True, indent=2, separators=(',', ': '))
        # print jsondata
        if self.args.output is not None:
            with open(self.args.output, 'w') as out_file:
                out_file.write(jsondata)
        if len(missing) > 0:
            print 'Missing inputs: ' + ','.join(missing)
コード例 #7
0
    def run_method(self):
        if self.args.allPars:
            print 'Info: the behaviour of --allPars is now always enabled and the option will be removed in a future update'
        passthru = self.passthru
        mh = self.args.mass
        ws = self.args.datacard
        name = self.args.name if self.args.name is not None else ''
        named = []
        if self.args.named is not None:
            named = self.args.named.split(',')
        # Put intercepted args back
        passthru.extend(['-m', mh])
        passthru.extend(['-d', ws])
        if self.args.setPhysicsModelParameters is not None:
            passthru.extend(['--setPhysicsModelParameters', self.args.setPhysicsModelParameters])
        if self.args.setParameters is not None:
            passthru.extend(['--setParameters', self.args.setParameters])
            self.args.setPhysicsModelParameters = self.args.setParameters
        pass_str = ' '.join(passthru)

        paramList = []
        if self.args.redefineSignalPOIs is not None:
            poiList = self.args.redefineSignalPOIs.split(',')
        else:
            poiList = utils.list_from_workspace(ws, 'w', 'ModelConfig_POI')
        print 'Have POIs: ' + str(poiList)
        poistr = ','.join(poiList)

        if self.args.approx == 'hesse' and self.args.doFits:
            self.job_queue.append(
                'combine -M MultiDimFit -n _approxFit_%(name)s --algo none --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 --saveFitResult %(pass_str)s' % {
                    'name': name,
                    'poistr': poistr,
                    'pass_str': pass_str
                })
            self.flush_queue()
            sys.exit(0)
        elif self.args.approx == 'robust' and self.args.doFits:
            self.job_queue.append(
                'combine -M MultiDimFit -n _approxFit_%(name)s --algo none --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 --robustHesse 1 %(pass_str)s' % {
                    'name': name,
                    'poistr': poistr,
                    'pass_str': pass_str
                })
            self.flush_queue()
            sys.exit(0)

        ################################################
        # Generate the initial fit(s)
        ################################################
        if self.args.doInitialFit and self.args.approx is not None:
            print 'No --initialFit needed with --approx, use --output directly'
            sys.exit(0)
        if self.args.doInitialFit:
            if self.args.splitInitial:
                for poi in poiList:
                    self.job_queue.append(
                        'combine -M MultiDimFit -n _initialFit_%(name)s_POI_%(poi)s --algo singles --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 -P %(poi)s %(pass_str)s' % {
                            'name': name,
                            'poi': poi,
                            'poistr': poistr,
                            'pass_str': pass_str
                        })
            else:
                self.job_queue.append(
                    'combine -M MultiDimFit -n _initialFit_%(name)s --algo singles --redefineSignalPOIs %(poistr)s %(pass_str)s' % {
                        'name': name,
                        'poistr': poistr,
                        'pass_str': pass_str
                    })
            self.flush_queue()
            sys.exit(0)

        # Read the initial fit results
        initialRes = {}
        if self.args.approx is not None:
            if self.args.approx == 'hesse':
                fResult = ROOT.TFile('multidimfit_approxFit_%(name)s.root' % {'name': name})
                rfr = fResult.Get('fit_mdf')
                fResult.Close()
                initialRes = utils.get_roofitresult(rfr, poiList, poiList)
            elif self.args.approx == 'robust':
                fResult = ROOT.TFile('robustHesse_approxFit_%(name)s.root' % {'name': name})
                floatParams = fResult.Get('floatParsFinal')
                rfr = fResult.Get('h_correlation')
                rfr.SetDirectory(0)
                fResult.Close()
                initialRes = utils.get_robusthesse(floatParams, rfr, poiList, poiList)
        elif self.args.splitInitial:
            for poi in poiList:
                initialRes.update(utils.get_singles_results(
                'higgsCombine_initialFit_%(name)s_POI_%(poi)s.MultiDimFit.mH%(mh)s.root' % vars(), [poi], poiList))
        else:
            initialRes = utils.get_singles_results(
                'higgsCombine_initialFit_%(name)s.MultiDimFit.mH%(mh)s.root' % vars(), poiList, poiList)

        ################################################
        # Build the parameter list
        ################################################
        if len(named) > 0:
            paramList = named
        else:
            paramList = self.all_free_parameters(ws, 'w', 'ModelConfig', poiList)
        # else:
        #     paramList = utils.list_from_workspace(
        #         ws, 'w', 'ModelConfig_NuisParams')

        # Exclude some parameters
        if self.args.exclude is not None:
            exclude = self.args.exclude.split(',')
            paramList = [x for x in paramList if x not in exclude]

        print 'Have parameters: ' + str(len(paramList))

        prefit = utils.prefit_from_workspace(ws, 'w', paramList, self.args.setPhysicsModelParameters)
        res = {}
        res["POIs"] = []
        res["params"] = []
        for poi in poiList:
            res["POIs"].append({"name": poi, "fit": initialRes[poi][poi]})

        missing = []
        for param in paramList:
            pres = {'name': param}
            pres.update(prefit[param])
            # print 'Doing param ' + str(counter) + ': ' + param
            if self.args.doFits:
                self.job_queue.append(
                    'combine -M MultiDimFit -n _paramFit_%(name)s_%(param)s --algo impact --redefineSignalPOIs %(poistr)s -P %(param)s --floatOtherPOIs 1 --saveInactivePOI 1 %(pass_str)s' % vars())
            else:
                if self.args.approx == 'hesse':
                    paramScanRes = utils.get_roofitresult(rfr, [param], poiList + [param])
                elif self.args.approx == 'robust':
                    if floatParams.find(param):
                        paramScanRes = utils.get_robusthesse(floatParams, rfr, [param], poiList + [param])
                    else:
                        paramScanRes = None
                else:
                    paramScanRes = utils.get_singles_results(
                        'higgsCombine_paramFit_%(name)s_%(param)s.MultiDimFit.mH%(mh)s.root' % vars(), [param], poiList + [param])
                if paramScanRes is None:
                    missing.append(param)
                    continue
                pres["fit"] = paramScanRes[param][param]
                for p in poiList:
                    pres.update({p: paramScanRes[param][p], 'impact_' + p: max(map(abs, (x - paramScanRes[
                                param][p][1] for x in (paramScanRes[param][p][2], paramScanRes[param][p][0]))))})
            res['params'].append(pres)
        self.flush_queue()

        if self.args.approx == 'hesse':
                res['method'] = 'hesse'
        elif self.args.approx == 'robust':
                res['method'] = 'robust'
        else:
                res['method'] = 'default'
        jsondata = json.dumps(
            res, sort_keys=True, indent=2, separators=(',', ': '))
        # print jsondata
        if self.args.output is not None:
            with open(self.args.output, 'w') as out_file:
                out_file.write(jsondata)
        if len(missing) > 0:
            print 'Missing inputs: ' + ','.join(missing)
コード例 #8
0
ファイル: Impacts.py プロジェクト: latinos/LatinoCombineTools
    def run_method(self):
        passthru = self.passthru
        mh = self.args.mass
        ws = self.args.datacard
        name = self.args.name if self.args.name is not None else ''
        named = []
        if self.args.named is not None:
            named = self.args.named.split(',')
        # Put intercepted args back
        passthru.extend(['-m', mh])
        passthru.extend(['-d', ws])
        if self.args.setPhysicsModelParameters is not None:
            passthru.extend(['--setPhysicsModelParameters', self.args.setPhysicsModelParameters])
        pass_str = ' '.join(passthru)
        paramList = []
        if self.args.redefineSignalPOIs is not None:
            poiList = self.args.redefineSignalPOIs.split(',')
        else:
            poiList = utils.list_from_workspace(ws, 'w', 'ModelConfig_POI')
        # print 'Have nuisance parameters: ' + str(paramList)
        print 'Have POIs: ' + str(poiList)
        poistr = ','.join(poiList)
        if self.args.doInitialFit:
            if self.args.splitInitial:
                for poi in poiList:
                    self.job_queue.append(
                        'combine -M MultiDimFit -n _initialFit_%(name)s_POI_%(poi)s --algo singles --redefineSignalPOIs %(poistr)s --floatOtherPOIs 1 --saveInactivePOI 1 -P %(poi)s %(pass_str)s' % vars())
            else:
                self.job_queue.append(
                    'combine -M MultiDimFit -n _initialFit_%(name)s --algo singles --redefineSignalPOIs %(poistr)s %(pass_str)s' % vars())
            self.flush_queue()
            sys.exit(0)
 
        #if self.args.doImpactNoCorr:
          #initialRes = utils.get_singles_results_grid('higgsCombine_initialFit_%(name)s.MultiDimFit.mH%(mh)s.root' % vars(), poiList, poiList)
        #else :    
        initialRes = utils.get_singles_results('higgsCombine_initialFit_%(name)s.MultiDimFit.mH%(mh)s.root' % vars(), poiList, poiList)
            
        if len(named) > 0:
            paramList = named
        elif self.args.allPars:
            paramList = self.all_free_parameters(ws, 'w', 'ModelConfig', poiList)
        else:
            paramList = utils.list_from_workspace(
                ws, 'w', 'ModelConfig_NuisParams')
        if self.args.exclude is not None:
            exclude = self.args.exclude.split(',')
            paramList = [x for x in paramList if x not in exclude]

        print 'Have nuisance parameters: ' + str(len(paramList))
        prefit = utils.prefit_from_workspace(ws, 'w', paramList, self.args.setPhysicsModelParameters)
        res = {}
        res["POIs"] = []
        res["params"] = []
        for poi in poiList:
            res["POIs"].append({"name": poi, "fit": initialRes[poi][poi]})

        missing = []
        for param in paramList:
            pres = {'name': param}
            pres.update(prefit[param])
            #print 'Doing param ' + str(counter) + ': ' + param
            print 'Doing param ' + ': ' + param
            if self.args.doFits:

                if self.args.doImpactNoCorr:
                  self.job_queue.append(
                      'combine -M MultiDimFit -n _paramFit_%(name)s_%(param)s --algo grid  --points 3  --autoRange 1.5  --freezeParameters all   --redefineSignalPOIs %(poistr)s -P %(param)s --floatOtherPOIs 1 --saveInactivePOI 1 %(pass_str)s' % vars())
                  #self.job_queue.append(
                      #'combine -M MultiDimFit -n _paramFit_%(name)s_%(param)s --algo grid  --points 3  --autoRange 1  --freezeParameters all   --redefineSignalPOIs %(poistr)s -P %(param)s --floatOtherPOIs 1 --saveInactivePOI 1 %(pass_str)s' % vars())
                else : 
                  self.job_queue.append(
                      'combine -M MultiDimFit -n _paramFit_%(name)s_%(param)s --algo impact --redefineSignalPOIs %(poistr)s -P %(param)s --floatOtherPOIs 1 --saveInactivePOI 1 %(pass_str)s' % vars())

            else:
                if self.args.doImpactNoCorr:
                  paramScanRes = utils.get_singles_results_grid('higgsCombine_paramFit_%(name)s_%(param)s.MultiDimFit.mH%(mh)s.root' % vars(), [param], poiList + [param])
                else:
                  paramScanRes = utils.get_singles_results('higgsCombine_paramFit_%(name)s_%(param)s.MultiDimFit.mH%(mh)s.root' % vars(), [param], poiList + [param])
                
                if paramScanRes is None:
                    missing.append(param)
                    continue
                pres["fit"] = paramScanRes[param][param]
                
                print " paramScanRes = ", paramScanRes
                
                for p in poiList:
                    pres.update({p: paramScanRes[param][p], 'impact_' + p: max(map(abs, (x - paramScanRes[
                                param][p][1] for x in (paramScanRes[param][p][2], paramScanRes[param][p][0]))))})

            res['params'].append(pres)
        self.flush_queue()
        jsondata = json.dumps(
            res, sort_keys=True, indent=2, separators=(',', ': '))
        # print jsondata
        if self.args.output is not None:
            with open(self.args.output, 'w') as out_file:
                out_file.write(jsondata)
        if len(missing) > 0:
            print 'Missing inputs: ' + ','.join(missing)