def combine_pth_ggH(args): decay_channel = differentialutils.get_decay_channel_tag(args) out_card = 'suppliedInput/{0}_pth_ggH_{1}.txt'.format( decay_channel, core.datestr()) cmd = [] if args.combWithHbb or args.combination or args.hgg: cmd.append('hgg=' + LatestPaths.card.pth_ggH.hgg) if args.combWithHbb or args.hbb: cmd.append('hbb=' + LatestPaths.card.pth_ggH.hbb) if args.combWithHbb or args.combination or args.hzz: cmd.append('hzz=' + LatestPaths.card.pth_ggH.hzz) combine_cards(out_card, *cmd)
def projection_kbkc_t2ws_floatingBRs(args): decay_channel = differentialutils.get_decay_channel_tag(args) t2ws = T2WSKBKC() t2ws.card = cards.yukawa.s2grouping[decay_channel] if args.hgg: t2ws.extra_options.append('--PO isOnlyHgg=True') if args.hzz: t2ws.extra_options.append('--PO isOnlyHZZ=True') t2ws.add_theory() t2ws.apply_reweighting() t2ws.add_theory_uncertainties() if args.scenario2: t2ws.apply_s2_scaling() t2ws.extra_options.append('--PO freely_floating_BRs=True') t2ws.tags.append('floatingBRs') t2ws.run()
def projection_ktcg_t2ws_couplingdependentBRs(args): decay_channel = differentialutils.get_decay_channel_tag(args) t2ws = T2WSKTCGKB() t2ws.card = cards.ktcgkb.s2grouping[decay_channel] if args.hgg: t2ws.extra_options.append('--PO isOnlyHgg=True') if args.hzz: t2ws.extra_options.append('--PO isOnlyHZZ=True') t2ws.add_theory_ktcg() t2ws.apply_reweighting() t2ws.add_theory_uncertainties() t2ws.add_scaling_ttH() if args.scenario2: t2ws.apply_s2_scaling() t2ws.extra_options.append('--PO BRs_kappa_dependent=True') t2ws.tags.append('couplingdependentBRs') t2ws.run()
def projection_ktcg_t2ws_floatingBRs(args): decay_channel = differentialutils.get_decay_channel_tag(args) t2ws = T2WSKTCGKB() t2ws.card = cards.ktcgkb.s2grouping[decay_channel] if args.hgg: t2ws.extra_options.append('--PO isOnlyHgg=True') if args.hzz: t2ws.extra_options.append('--PO isOnlyHZZ=True') t2ws.add_theory_ktcg() t2ws.apply_reweighting() t2ws.add_theory_uncertainties() t2ws.add_scaling_ttH() # if args.combWithHbb: # t2ws.constrain_bbZZ_ratio() if args.scenario2: t2ws.apply_s2_scaling() t2ws.extra_options.append('--PO freely_floating_BRs=True') t2ws.tags.append('floatingBRs') t2ws.run()
def __init__(self, args): super(CombineConfigKBKC, self).__init__(args) args = differentialutils.force_asimov(args) self.onBatch = True self.queue = 'all.q' self.asimov = True if args.asimov else False self.decay_channel = differentialutils.get_decay_channel_tag(args) self.POIs = ['kappab', 'kappac'] self.PhysicsModelParameters = ['kappab=1.0', 'kappac=1.0'] self.subDirectory = 'out/Scan_projection_kbkc_{0}_{1}'.format( differentials.core.datestr(), self.decay_channel) self.hardPhysicsModelParameters.append('lumiscale={0}'.format( self.lumiscale)) self.freezeNuisances.append('lumiscale') if args.scenario2: self.tags.append('scenario2') self.set_ranges() self.datacard = self.get_workspacedict()[self.decay_channel]
def basic_config_points(args): # assert_highpt(args) config = combine.CombineConfig(args) config.onBatch = True config.queue = 'short.q' config.asimov = True if args.asimov else False config.decay_channel = differentialutils.get_decay_channel_tag(args) if args.combWithHbb or args.hbb: config.minimizer_settings.extend([ '--minimizerStrategy 2', '--minimizerTolerance 0.001', '--robustFit 1', '--minimizerAlgoForMinos Minuit2,Migrad', ]) config.PhysicsModelParameters = ['ct=1.0', 'cg=0.0'] config.subDirectory = 'out/Scan_{0}_TopPoints_{1}'.format( datestr, config.decay_channel) return config
def base_t2ws(args, apply_theory_uncertainties=True, apply_reweighting=True): t2ws = differentials.combine.t2ws.T2WS() decay_channel = differentialutils.get_decay_channel_tag(args, allow_default=True) t2ws.card = LatestPaths.card.yukawa[decay_channel] t2ws.model_file = 'physicsModels/CouplingModel.py' t2ws.model_name = 'couplingModel' t2ws.name = decay_channel + '_Yukawa' t2ws.extra_options.extend([ '--PO linearTerms=True', '--PO splitggH=True', ]) if args.hzz: t2ws.extra_options.append('--PO isOnlyHZZ=True' ) if args.hgg: t2ws.extra_options.append('--PO isOnlyHgg=True' ) obs = LatestBinning.obs_pth_ggH obs.drop_bins_up_to_value(yukawa_exp_binning[-1]+1.0) t2ws.extra_options.append( '--PO binBoundaries={0}' .format(','.join([str(b) for b in obs.binning])) ) add_theory(t2ws) if apply_reweighting: crosssections = obs.crosssection() crosssections_str = ','.join([str(v) for v in crosssections]) t2ws.extra_options.append('--PO SMXS_of_input_ws={0}'.format(crosssections_str)) t2ws.tags.append('reweighted') else: t2ws.tags.append('unreweighted') if apply_theory_uncertainties: add_theory_uncertainties(t2ws) return t2ws
def totalXS_scan(args): config = totalXS_scan_config(args) decay_channel = differentialutils.get_decay_channel_tag(args) config.datacard = LatestPaths.ws.totalXS[decay_channel] config.tags.append(decay_channel) config.make_unique_directory() postfit = differentials.combine.combine.CombinePostfit(config) postfit.run() postfit_file = postfit.get_output() # Stat+syst scan (regular) scan = differentials.combine.combine.CombineScanFromPostFit(config) scan.run(postfit_file) # Stat-only scan scan_stat_only = differentials.combine.combine.CombineScanFromPostFit( config) scan_stat_only.subDirectory += '_statonly' scan_stat_only.freezeNuisances.append('rgx{.*}') scan_stat_only.run(postfit_file)
def projection_pth_smH_scan_GT200(args): args = differentialutils.force_asimov(args) decay_channel = differentialutils.get_decay_channel_tag(args) d = differentials.core.AttrDict() d.s1 = differentials.core.AttrDict() d.s2 = differentials.core.AttrDict() d.s1.hgg = 'projections/workspaces_Oct24/ws_pth_smH_hgg_GT200_s1.root' d.s2.hgg = 'projections/workspaces_Oct24/ws_pth_smH_hgg_GT200_s2.root' ws = (d.s2 if args.scenario2 else d.s1)[decay_channel] config = differential_config(args, ws, 'pth_smH', lumiscale=lumiscale3000) def tight_ranges(config): """Very manual tight r_ ranges based on Hgg scan results""" for POI in config.POIs: if 'GT600' in POI: config.set_parameter_range(POI, 0.64, 1.4) else: config.set_parameter_range(POI, 0.875, 1.14) if args.hbb: set_hbb_parameter_ranges(args, config) if args.hgg: tight_ranges(config) if args.combWithHbb: set_hbb_parameter_ranges(args, config) tight_ranges(config) # Overwrite to do only the scan for 1 POI config.POIs = ['r_smH_PTH_GT200'] config.subDirectory += '_GT200only' if args.hbb or args.hzz: scan_directly(args, config, verbosity=1) else: postfit_and_scan(args, config)
def basic_config(args, hurry=False): config = combine.CombineConfig(args) config.onBatch = True config.queue = 'all.q' if hurry: logging.warning( 'Running with quick settings' ) config.nPointsPerJob = 5 config.queue = 'short.q' if args.hzz: config.nPointsPerJob = 320 config.queue = 'short.q' if args.asimov: config.asimov = True else: config.asimov = False config.decay_channel = differentialutils.get_decay_channel_tag(args) config.nPoints = 70*70 kappab_ranges = [ -15., 15. ] kappac_ranges = [ -35., 35. ] if config.args.lumiScale: config.nPoints = 40*40 kappab_ranges = [ -7., 7. ] kappac_ranges = [ -17., 17. ] config.POIs = [ 'kappab', 'kappac' ] config.PhysicsModelParameters = [ 'kappab=1.0', 'kappac=1.0' ] config.PhysicsModelParameterRanges = [ 'kappab={0},{1}'.format( kappab_ranges[0], kappab_ranges[1] ), 'kappac={0},{1}'.format( kappac_ranges[0], kappac_ranges[1] ) ] config.subDirectory = 'out/Scan_Yukawa_{0}_{1}'.format(datestr, config.decay_channel) config.deltaNLLCutOff = 70. return config
def base_t2ws_fitOnlyTotalXS(args, apply_theory_uncertainties=True, apply_reweighting=False): t2ws = differentials.combine.t2ws.T2WS() decay_channel = differentialutils.get_decay_channel_tag(args, allow_default=True) t2ws.card = LatestPaths.card.inclusive[decay_channel] t2ws.model_file = 'physicsModels/CouplingModel.py' t2ws.model_name = 'couplingModel' t2ws.name = decay_channel + '_Yukawa' t2ws.extra_options.extend([ '--PO linearTerms=True', '--PO splitggH=True', '--PO FitOnlyTotalXS=True' ]) if args.hzz: t2ws.extra_options.append('--PO isOnlyHZZ=True' ) if args.hgg: t2ws.extra_options.append('--PO isOnlyHgg=True' ) add_theory(t2ws) if apply_reweighting: logging.warning('Not sure if applying the reweighting is a good thing for the incl.') obs = LatestBinning.obs_pth_ggH obs.drop_bins_up_to_value(yukawa_exp_binning[-1]+1.0) inc_smxs = obs.inclusive_crosssection() t2ws.extra_options.append('--PO SMXS_of_input_ws={0}'.format(inc_smxs)) t2ws.tags.append('reweighted') else: t2ws.tags.append('unreweighted') if apply_theory_uncertainties: # 0.0795 based on theory_uncertainty_on_inclusive_xs_yukawa (crosschecks.py) t2ws.extra_options.append('--PO inc_xs_uncertainty={0}'.format(0.079528392665)) return t2ws
def scan_topctcb(args): config = basic_config_ctcb(args) config.datacard = LatestPaths.ws.topctcb.nominal[ differentialutils.get_decay_channel_tag(args)] differentialutils.run_postfit_fastscan_scan(config)
def njets_scan(args): ws = LatestPaths.ws.njets[differentialutils.get_decay_channel_tag(args)] config = differential_config(args, ws, 'njets') postfit_and_scan(args, config)
def differential_config(args, ws, obs_name, lumiscale=1.): # base_config = combine.CombineConfig(args) base_config = differentials.combine.combine.CombineConfig(args) base_config.onBatch = True base_config.queue = 'short.q' base_config.asimov = True if args.asimov else False base_config.decay_channel = differentialutils.get_decay_channel_tag(args) if args.hbb or args.combWithHbb: base_config.minimizer_settings = [ '--cminDefaultMinimizerType Minuit2', '--cminDefaultMinimizerAlgo migrad', '--minimizerStrategy 2', '--minimizerTolerance 0.001', '--robustFit 1', '--minimizerAlgoForMinos Minuit2,Migrad', ] base_config.datacard = ws base_config.subDirectory = 'out/ScanProjection_{0}_{1}_{2}'.format( differentials.core.datestr(), obs_name, base_config.decay_channel) # Scale lumi base_config.freezeNuisances.append('lumiscale') base_config.hardPhysicsModelParameters.append( 'lumiscale={0}'.format(lumiscale)) if args.hbb or args.combWithHbb: # Freeze mcstat nuisances logging.info('Freezing mcstat systematics') base_config.extraOptions.append('--freezeNuisanceGroups mcstat') if lumiscale == 1.: base_config.subDirectory += '_36ifb' elif lumiscale == lumiscale300: base_config.subDirectory += '_300ifb' elif lumiscale == lumiscale3000: base_config.subDirectory += '_3000ifb' elif lumiscale == lumiscale6000: base_config.subDirectory += '_6000ifb' if args.statonly: base_config.subDirectory += '_statonly' if args.scenario2: base_config.subDirectory += '_scenario2' POIs = differentials.core.list_POIs(ws) if args.hbb: POIs.pop(0) base_config.POIs = POIs base_config.PhysicsModelParameters = ['{0}=1.0'.format(p) for p in POIs] if args.hbb or args.combWithHbb: logging.warning( 'For hbb: qcdeff and r*p* parameters are given ranges! ' 'Should decide on (freezing) behaviour during postfit/scan') base_config.PhysicsModelParameterRanges.extend([ 'qcdeff=0.001,8.0', 'r1p0=0.1,8.0', 'r2p0=0.1,8.0', 'r3p0=0.1,8.0', 'r0p1=0.1,8.0', 'r1p1=0.1,8.0', 'r2p1=0.1,8.0', 'r3p1=0.1,8.0', ]) base_config.nPoints = 55 # base_config.nPoints = 20 base_config.nPointsPerJob = 5 if args.hzz or args.hbb: base_config.nPoints = 90 base_config.nPointsPerJob = base_config.nPoints if args.combWithHbb: base_config.nPointsPerJob = 1 # Ranges default_p3000 = differentials.core.AttrDict() default_p3000.hzz = [0.7, 1.3] default_p3000.hgg = [0.7, 1.3] default_p3000.hbb = [0.3, 1.7] default_p3000.combWithHbb = [0.5, 1.5] default_ranges = default_p3000 for POI in POIs: ranges = default_ranges[base_config.decay_channel][:] if args.hzz and 'GT200' in POI: ranges = [0.3, 1.7] if (args.hgg) and ('GT600' in POI or '350_600' in POI): ranges = [0.4, 1.6] # if args.combWithHbb and ('GT600' in POI or '350_600' in POI): # ranges = [ 0.6, 1.4 ] base_config.set_parameter_range(POI, ranges[0], ranges[1]) return base_config
def rapidity_scan(args): ws = LatestPaths.ws.rapidity[differentialutils.get_decay_channel_tag(args)] config = differential_config(args, ws, 'rapidity') postfit_and_scan(args, config)
def differential_config(args, ws, obs_name): base_config = combine.CombineConfig(args) base_config.onBatch = True base_config.nPoints = 55 base_config.nPointsPerJob = 5 base_config.queue = 'short.q' if args.asimov: base_config.asimov = True else: base_config.asimov = False base_config.decay_channel = differentialutils.get_decay_channel_tag(args) if args.hzz or args.hbb: base_config.nPointsPerJob = base_config.nPoints if args.combWithHbb: base_config.nPoints = 100 base_config.nPointsPerJob = 4 if args.hbb or args.combWithHbb: base_config.minimizer_settings = [ '--cminDefaultMinimizerType Minuit2', '--cminDefaultMinimizerAlgo migrad', '--minimizerStrategy 2', '--minimizerTolerance 0.001', '--robustFit 1', '--minimizerAlgoForMinos Minuit2,Migrad', ] base_config.datacard = ws base_config.subDirectory = 'out/Scan_{0}_{1}_{2}'.format( datestr, obs_name, base_config.decay_channel) if args.lumiScale: base_config.hardPhysicsModelParameters.append( 'lumiScale={0}'.format(lumiMultiplier)) base_config.freezeNuisances.append('lumiScale') base_config.subDirectory += '_lumiScale{0}'.format( str(lumiMultiplier).replace('.', 'p')) if args.statonly: base_config.subDirectory += '_statonly' POIs = differentials.core.list_POIs(ws) POIrange = [-1.0, 4.0] if args.hzz: POIrange[0] = 0.0 if args.hbb: POIrange = [-10.0, 10.0] if args.combWithHbb: POIrange = [-1.0, 6.0] if args.lumiScale: POIrange = [0.7, 1.3] base_config.nPoints = 35 if lumiMultiplier > 10.: POIrange = [0.9, 1.1] base_config.POIs = POIs base_config.PhysicsModelParameters = ['{0}=1.0'.format(p) for p in POIs] for POI in POIs: left, right = POIrange if '350_600' in POI or 'GT600' in POI or 'GT200' in POI: left = -10. right = 10. if base_config.decay_channel == 'hgg': left = -15. base_config.PhysicsModelParameterRanges.append('{0}={1},{2}'.format( POI, left, right)) if args.hbb or args.combWithHbb: logging.warning( 'For hbb: qcdeff and r*p* parameters are given ranges! ' 'Should decide on (freezing) behaviour during postfit/scan') base_config.PhysicsModelParameterRanges.extend([ 'qcdeff=0.001,8.0', 'r1p0=0.0,8.0', 'r2p0=0.0,8.0', 'r3p0=0.0,8.0', 'r0p1=0.0,8.0', 'r1p1=0.0,8.0', 'r2p1=0.0,8.0', 'r3p1=0.0,8.0', ]) return base_config
def rapidity_t2ws(args): t2ws = basic_t2ws('rapidity', differentialutils.get_decay_channel_tag(args)) t2ws.make_maps_from_processes() t2ws.run()
def base_t2ws( args, apply_theory_uncertainties=True, apply_reweighting=True, drop_last_bin=False, do_kappat_kappag=True, add_scaling_ttH=False, ): decay_channel = differentialutils.get_decay_channel_tag(args) t2ws = differentials.combine.t2ws.T2WS() t2ws.card = LatestPaths.card.pth_ggH[decay_channel] t2ws.model_file = 'physicsModels/CouplingModel.py' t2ws.model_name = 'couplingModel' if do_kappat_kappag: t2ws.name = decay_channel + '_Top' else: t2ws.name = decay_channel + '_TopCtCb' t2ws.extra_options.extend([ '--PO linearTerms=False', '--PO splitggH=True', ]) if args.hzz: t2ws.extra_options.append('--PO isOnlyHZZ=True') if args.hgg: t2ws.extra_options.append('--PO isOnlyHgg=True') obs = LatestBinning.obstuple_pth_ggH[decay_channel] # if drop_last_bin: # obs.drop_last_bin() # t2ws.tags.append('lastBinDropped') t2ws.extra_options.append('--PO binBoundaries={0}'.format(','.join( [str(b) for b in obs.binning]))) # Add the theory if do_kappat_kappag: logging.warning('Doing variations for kappa_t / kappa_g') coupling_variations = FileFinder( cb=1.0, muR=1.0, muF=1.0, Q=1.0, directory=LatestPaths.theory.top.filedir).get() sm = [v for v in coupling_variations if v.ct == 1.0 and v.cg == 0.0][0] coupling_variations.pop(coupling_variations.index(sm)) t2ws.extra_options.append('--PO SM=[ct=1,cg=0,file={0}]'.format( sm.theory_file)) for variation in coupling_variations: if variation.ct == 1.0 or variation.cg == 0.0: continue t2ws.extra_options.append( '--PO theory=[ct={0},cg={1},file={2}]'.format( variation.ct, variation.cg, variation.theory_file)) else: logging.warning('Doing variations for kappa_t / kappa_b') coupling_variations = FileFinder( cg=0.0, muR=1.0, muF=1.0, Q=1.0, directory=LatestPaths.theory.top.filedir).get() sm = [v for v in coupling_variations if v.ct == 1.0 and v.cb == 1.0][0] coupling_variations.pop(coupling_variations.index(sm)) t2ws.extra_options.append('--PO SM=[ct=1,cb=1,file={0}]'.format( sm.theory_file)) for variation in coupling_variations: if variation.ct == 1.0 or variation.cb == 1.0: continue t2ws.extra_options.append( '--PO theory=[ct={0},cb={1},file={2}]'.format( variation.ct, variation.cb, variation.theory_file)) if apply_reweighting: t2ws.extra_options.append('--PO SMXS_of_input_ws={0}'.format(','.join( [str(v) for v in obs.crosssection()]))) t2ws.tags.append('reweighted') if apply_theory_uncertainties: add_theory_uncertainties(t2ws) if add_scaling_ttH: t2ws.extra_options.append('--PO add_scaling_ttH=True') t2ws.tags.append('scalingttH') return t2ws
def t2ws_TopCtCb_nominal(args): t2ws = base_t2ws(args, do_kappat_kappag=False) t2ws.card = LatestPaths.card.top.nominal[ differentialutils.get_decay_channel_tag(args)] t2ws.tags.append('noBinsDropped') t2ws.run()
def projection_ktcg_plot_comparison(args): decay_channel = differentialutils.get_decay_channel_tag(args) Patcher = PlotPatcherKTCG_couplingdependentBRs_scenario2 if args.scenario2 else PlotPatcherKTCG_couplingdependentBRs Patcher(args, decay_channel).quick_patched_vs_unpatched()
def pth_smH_scan(args): ws = LatestPaths.ws.pth_smH[differentialutils.get_decay_channel_tag(args)] config = differential_config(args, ws, 'pth_smH') postfit_and_scan(args, config)
def add_xH_nuisance_parameter_to_ggH_card(args): decay_channel = differentialutils.get_decay_channel_tag(args) card = LatestPaths.card.pth_ggH_noXHunc[decay_channel] add_xH_nuisance_parameter(card, 24, 20, 43)
def create_ktcgkb_projection_datacard(args): decay_channel = differentialutils.get_decay_channel_tag(args) input_card = LatestPaths.card.pth_ggH[decay_channel] datacard = differentials.combine.preprocessing.Datacard(input_card) datacard.add_lumiscale_rateparam() datacard.out('projection_ktcgkb_{0}'.format(decay_channel))
def print_nuisances(args): decay_channel = differentialutils.get_decay_channel_tag(args) card = LatestPaths.card.pth_smH[decay_channel] datacard = differentials.combine.preprocessing.Datacard(card) datacard.print_nuisances()