def GetIntersection(self, pos, dir): point = numpy.array((pos.x, pos.y, pos.z)) vec = numpy.array((dir.x, dir.y, dir.z)) no_intersection = make_pair(numpy.nan, numpy.nan) # perfectly vertical track: only check intersections with caps if abs(dir.z) == 1.: if not self._point_in_hull(point): return no_intersection else: return make_pair(*self._distance_to_caps(point, vec)) # perfectly horizontal track: only check intersections with sides elif dir.z == 0.: if pos.z < self._z_range.first or pos.z > self._z_range.second: return no_intersection else: return make_pair(*self._distance_to_hull(point, vec)) # general case: both rho and z components nonzero else: sin_zenith = numpy.sqrt(1.-dir.z**2) sides = numpy.array(self._distance_to_hull(point, vec))/sin_zenith caps = self._distance_to_caps(point, vec) intersections = numpy.concatenate((sides, caps)) if (caps[0] >= sides[1] or caps[1] <= sides[0]): return no_intersection else: return make_pair(numpy.max((sides[0], caps[0])), numpy.min((sides[1], caps[1])))
def tau_dnde_builder(it): tmp = [] for i in it: if len(i) != 2: raise ValueError( "All elements must have exactly two parameters (tau and dN/dE)!" ) if i[0] <= 0: raise ValueError("tau must be greater than 0") tmp.append(dataclasses.make_pair(i[0], i[1])) return dataclasses.I3VectorDoubleDouble(tmp)
def SplitAndRecoHiveSplitter(tray, Name, Suffix): def re_reconstruct(tray, Pulses, Suffix, If): tray.AddSegment( lilliput.segments.I3SinglePandelFitter, "SPEFitSingle_"+Suffix, domllh="SPE1st", pulses=Pulses, seeds=["LineFit_"+Suffix], If=If ) tray.AddSegment( lilliput.segments.I3IterativePandelFitter, "SPEFit2_"+Suffix, pulses=Pulses, seeds=["SPEFitSingle_"+Suffix], n_iterations=2, If=If ) tray.AddSegment( lilliput.segments.I3SinglePandelFitter, "MPEFit_"+Suffix, domllh="MPE", pulses=Pulses, seeds=["SPEFit2_"+Suffix], If=If ) tray.AddModule(TimeWindowCollector, "collector", TimeWindowName="SplitInIcePulsesTimeRange", TimeWindowSeriesName="TriggerSplitterTimeWindows") tray.AddModule( "I3HiveSplitter", "HiveSplitter", InputName="InIcePulses", OutputName=Suffix+"InIcePulses", Multiplicity=5, TimeWindow=2000.*I3Units.ns, TimeConeMinus=1000.*I3Units.ns, TimeConePlus=1000.*I3Units.ns, SingleDenseRingLimits=[300., 300., 272.7, 272.7, 165.8, 165.8], DoubleDenseRingLimits=[150., 150., 131.5, 131.5, 40.8, 40.8], Mode=1, SaveSplitCount=True) # is needed by CoincSuite ReducedCountMaker = lambda frame: frame.Put("HiveSplitterReducedCount", icetray.I3Int(0)) tray.AddModule(ReducedCountMaker, Streams=[icetray.I3Frame.DAQ]) tray.AddModule("AfterpulseDiscard", "AfterpulseDiscard", SplitName="HiveSplitter", RecoMapName=Suffix+"InIcePulses", QTotFraction=0.1, TimeOffset=3.E3*I3Units.ns, OverlapFraction=0.75) # change stream of identified afterpulses # so that they are not used with hypoframes def change_stream(frame, initialStream, finalStream): if frame["I3EventHeader"].sub_event_stream == initialStream: eh = dataclasses.I3EventHeader(frame["I3EventHeader"]) del frame["I3EventHeader"] eh.sub_event_stream = finalStream frame.Put("I3EventHeader", eh) tray.AddModule(change_stream, initialStream="HiveSplitter", finalStream="AfterpulsesStream", If=lambda frame: frame.Has("AfterpulseDiscard")) tray.AddModule("HypoFrameCreator", SplitName="HiveSplitter", HypoName="hypoframe", RecoMapName=Suffix+"InIcePulses", MaxTimeSeparation=3000.*I3Units.ns) tray.AddSegment(linefit.simple, "LineFit_"+Suffix, inputResponse=Suffix+"InIcePulses", fitName="LineFit_"+Suffix, If=(which_split(split_name="HiveSplitter") | which_split(split_name="hypoframe"))) tray.AddModule("TrackSystemTester", "TestHypoTrackSystem", SplitName="HiveSplitter", RecoMapName=Suffix+"InIcePulses", RecoFitName="LineFit_"+Suffix, HypoName="hypoframe", HypoFitName="LineFit_"+Suffix, CriticalRatio=0.7, CylinderRadius=150.*I3Units.meter, ResTimeWindow=dataclasses.make_pair(-float("Inf"), float("Inf")), ParticleSpeed=dataclasses.I3Constants.c, MutualCompare=False) tray.AddModule("TrackSystemTester", "TestMutualTrackSystem", SplitName="HiveSplitter", RecoMapName=Suffix+"InIcePulses", RecoFitName="LineFit_"+Suffix, HypoName="hypoframe", HypoFitName="LineFit_"+Suffix, CriticalRatio=0.7, CylinderRadius=150.*I3Units.meter, ResTimeWindow=dataclasses.make_pair(-float("Inf"), float("Inf")), ParticleSpeed=dataclasses.I3Constants.c, MutualCompare=True) tray.AddModule("AlignmentTester", "TestHypoAlignment", SplitName="HiveSplitter", RecoFitName="LineFit_"+Suffix, HypoName="hypoframe", HypoFitName="LineFit_"+Suffix, CriticalAngle=25.*I3Units.degree, CriticalDistance=20.*I3Units.meter, MutualCompare=False) tray.AddModule("AlignmentTester", "TestMutualAlignment", SplitName="HiveSplitter", RecoFitName="LineFit_"+Suffix, HypoName="hypoframe", HypoFitName="LineFit_"+Suffix, CriticalAngle=15.*I3Units.degree, CriticalDistance=100.*I3Units.meter, MutualCompare=True) tray.AddModule("SpeedTester", "TestSpeed", SplitName="HiveSplitter", HypoName="hypoframe", HypoFitName="LineFit_"+Suffix, SpeedUpperCut=0.35*I3Units.meter/I3Units.ns, SpeedLowerCut=0.15*I3Units.meter/I3Units.ns) tray.AddModule("cogCausalConnectTester", "TestcogCausalConnect", SplitName="HiveSplitter", RecoMapName=Suffix+"InIcePulses", HypoFitName="LineFit_"+Suffix, HypoName="hypoframe", TravelTimeResidual=dataclasses.make_pair(-1000.*I3Units.ns, 1000.*I3Units.ns), WallTime=3000.*I3Units.ns, MaxVerticalDist=700.*I3Units.meter, MaxHorizontalDist=700.*I3Units.meter, MaxTrackDist=200.*I3Units.m, MaxFurthestDist=600.*I3Units.m) LikeNameList = ["TestHypoTrackSystem", "TestHypoAlignment", "TestMutualTrackSystem", "TestMutualAlignment"] VetoNameList = ["TestcogCausalConnect", "TestSpeed"] tray.AddModule("DecisionMaker", "DecisionDiscard", SplitName="HiveSplitter", RecoMapName=Suffix+"InIcePulses", LikeNameList=LikeNameList, VetoNameList=VetoNameList) def removeHypoFrames(frame): return not(frame["I3EventHeader"].sub_event_stream == "hypoframe") tray.AddModule(removeHypoFrames, "RemoveHypoFrames") def removeRecombined(frame): return not(frame["I3EventHeader"].sub_event_stream == "HiveSplitter" and frame.Has("DecisionDiscard")) tray.AddModule(removeRecombined, "RemoveRecombinedFrame") tray.AddModule("SplitTimeWindowCalculator", SubEventStream="HiveSplitter", AfterpulseEventStream="AfterpulseStream", BasePulses="InIcePulses", SplitPulses=Suffix+"InIcePulses", OutputPulses="Millipede"+Suffix+"SplitPulses", TriggerSplitterTimeWindows="TriggerSplitterTimeWindows") def discardAfterpulses(frame): return frame["I3EventHeader"].sub_event_stream != "AfterpulseStream" tray.AddModule(discardAfterpulses) tray.AddModule("Delete", Keys=[Suffix+"InIcePulsesTimeRange"]) def FinalStream(frame): if frame.Has("I3EventHeader"): if frame["I3EventHeader"].sub_event_stream == "HiveSplitter": eh = dataclasses.I3EventHeader(frame["I3EventHeader"]) eh.sub_event_stream = "Final" frame.Delete("I3EventHeader") frame.Put("I3EventHeader", eh) tray.AddModule(FinalStream, "Finalstream") tray.AddModule(P_Combiner, 'combine_final_and_inicesplit_stream') # def cleanStreams(frame): # return frame["I3EventHeader"].sub_event_stream == "Final" # tray.AddModule(cleanStreams) def removeSmallHLCs(frame, Pulses, MinimumHLCs): if frame.Has(Pulses): pulsemap = dataclasses.I3RecoPulseSeriesMap.from_frame(frame, Pulses) hlcs = len([p.time for key, ps in pulsemap.iteritems() for p in ps if p.flags != 4]) if hlcs < MinimumHLCs: return False else: return True else: return False tray.AddModule(removeSmallHLCs, Pulses=Suffix+"InIcePulses", MinimumHLCs=1) stConfigService = I3DOMLinkSeededRTConfigurationService( allowSelfCoincidence=True, # Old SeededRTBehaviour useDustlayerCorrection=False, # Old SeededRTBehaviour treat_string_36_as_deepcore=False, # Old SeededRT behaviour dustlayerUpperZBoundary=0*I3Units.m, # Default dustlayerLowerZBoundary=-150*I3Units.m, # Default ic_ic_RTTime=1000*I3Units.ns, ic_ic_RTRadius=150*I3Units.m ) # Do the classic seeded RT cleaning. tray.AddModule( "I3SeededRTCleaning_RecoPulseMask_Module", "seededRTcleaning", STConfigService=stConfigService, InputHitSeriesMapName=Suffix+"InIcePulses", OutputHitSeriesMapName="SRT"+Suffix+"InIcePulses", SeedProcedure="HLCCoreHits", MaxNIterations=3, Streams=[icetray.I3Frame.Physics] ) def removeSmallNHitDOMs(frame, Pulses, MinimumHitDOMs): if frame.Has(Pulses): pulsemap = dataclasses.I3RecoPulseSeriesMap.from_frame(frame, Pulses) if len(pulsemap) < MinimumHitDOMs: return False else: return True else: return False tray.AddModule(removeSmallNHitDOMs, Pulses="SRT"+Suffix+"InIcePulses", MinimumHitDOMs=6) tray.AddModule("StaticDOMTimeWindowCleaning", InputPulses="SRT"+Suffix+"InIcePulses", OutputPulses="TWSRT"+Suffix+"InIcePulses", MaximumTimeDifference=3e3*I3Units.ns) recos = ["LineFit_"+Suffix, "SPEFitSingle_"+Suffix, "SPEFit2_"+Suffix, "MPEFit_"+Suffix] fitparams = ["LineFit_"+Suffix+"Params", "SPEFitSingle_"+Suffix+"FitParams", "SPEFit2_"+Suffix+"FitParams", "MPEFit_"+Suffix+"FitParams"] tray.AddModule("Delete", "remove_recos", Keys=recos+fitparams) tray.AddSegment( linefit.simple, "LineFit_"+Suffix+"SRT", inputResponse="SRT"+Suffix+"InIcePulses", fitName="LineFit_"+Suffix, If=lambda frame: frame["I3EventHeader"].sub_event_stream == "Final") tray.AddSegment( linefit.simple, "LineFit_"+Suffix+"TWSRT", inputResponse="TWSRT"+Suffix+"InIcePulses", fitName="LineFit_"+"TW"+Suffix, If=lambda frame: frame["I3EventHeader"].sub_event_stream == "Final") re_reconstruct( tray, Pulses="SRT"+Suffix+"InIcePulses", Suffix=Suffix, If=lambda frame: frame["I3EventHeader"].sub_event_stream == "Final") re_reconstruct( tray, Pulses="TWSRT"+Suffix+"InIcePulses", Suffix="TW"+Suffix, If=lambda frame: frame["I3EventHeader"].sub_event_stream == "Final")
HypoFitName=FitName, RecoFitName=FitName, LlhName=llhname, MiniName=mininame, ParaName=paraname, ReductionFactor=0.8, MutualCompare=True, Refit=False) tray.AddModule("cogCausalConnectTester", redo_org + "cogCausalConnect", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, HypoFitName=FitName, TravelTimeResidual=dataclasses.make_pair( -1000. * I3Units.ns, 1000. * I3Units.ns), WallTime=3000. * I3Units.ns, MaxVerticalDist=700. * I3Units.m, MaxHorizontalDist=700. * I3Units.m, MaxTrackDist=200. * I3Units.m, MaxFurthestDist=600. * I3Units.m) tray.AddModule("impCausalConnectTester", redo_org + "impCausalConnect", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, HypoFitName=FitName, TravelTimeResidual=dataclasses.make_pair( -1000. * I3Units.ns, 1000. * I3Units.ns), WallTime=3000. * I3Units.ns,
elif params["type"] == "gauss": print("-> adding {} of type {}".format(name, params["type"])) params = params["gauss"] # Caution: MultivariateNormal expect the covariance matrix as first argument, so we need to use sigma**2 perturber.add( name, all_parametrizations[name], MultivariateNormal( dataclasses.I3Matrix(np.diag(params["sigma"])**2), params["mu"])) elif params["type"] == "uniform": print("-> adding {} of type {}".format(name, params["type"])) params = params["uniform"] perturber.add( name, all_parametrizations[name], UniformDistribution([ dataclasses.make_pair(*limits) for limits in params["limits"] ])) else: raise NotImplementedError( "Perturbation '{}' of type '{}' not implemented.".format( name, params["type"])) print("done") # Setting up some other things gcdFrames = list(dataio.I3File(GCDFile)) inputStream = dataio.I3FrameSequence([InputFiles]) summary = dataclasses.I3MapStringDouble() intermediateOutputFiles = [] # #
def run_snowstorm_propagation(cfg, infile, outfile): """Run SnowStorm Propagation. Adopted from: https://code.icecube.wisc.edu/projects/icecube/browser/IceCube/ meta-projects/combo/stable/simprod-scripts/resources/scripts/ SnowSuite/3-Snowstorm.py Parameters ---------- cfg : dict Dictionary with configuration settings. infile : str Path to input file. outfile : str Path to output file. """ start_time = time.time() # -------- # Settings # -------- default_args = { # required 'NumEventsPerModel': 100, 'DOMOversizeFactor': 1., 'UseI3PropagatorService': True, # optional 'UseGPUs': True, 'SummaryFile': 'summary_snowstorm.yaml', 'UseOnlyDeviceNumber': None, 'MCTreeName': 'I3MCTree', 'OutputMCTreeName': None, 'FlasherInfoVectName': None, 'FlasherPulseSeriesName': None, 'PhotonSeriesName': None, 'MCPESeriesName': "I3MCPESeriesMap", 'DisableTilt': False, 'UnWeightedPhotons': False, 'UnWeightedPhotonsScalingFactor': None, 'UseGeant4': False, 'ParticleHistory': True, 'ParticleHistoryGranularity': 1*icetray.I3Units.m, 'CrossoverEnergyEM': None, 'CrossoverEnergyHadron': None, 'UseCascadeExtension': True, 'StopDetectedPhotons': True, 'PhotonHistoryEntries': 0, 'DoNotParallelize': False, 'UnshadowedFraction': 1.0, 'WavelengthAcceptance': None, 'DOMRadius': 0.16510*icetray.I3Units.m, 'CableOrientation': None, 'OverrideApproximateNumberOfWorkItems': None, 'IgnoreSubdetectors': ["IceTop"], 'ExtraArgumentsToI3CLSimClientModule': dict(), } # overwrite default settings default_args.update(cfg) cfg = default_args snowstorm_config = cfg['snowstorm_config'] if cfg['SummaryFile'] is not None: cfg['SummaryFile'] = cfg['SummaryFile'].format(**cfg) ice_model_location = \ os.path.expandvars(snowstorm_config["IceModelLocation"]) hole_ice_parameterization = \ os.path.expandvars(snowstorm_config["HoleIceParameterization"]) # set units to meter cfg['ParticleHistoryGranularity'] *= icetray.I3Units.m cfg['DOMRadius'] *= icetray.I3Units.m # Print out most important settings click.echo('\n---------------') click.echo('Script Settigns') click.echo('---------------') click.echo('\tInput: {}'.format(infile)) click.echo('\tGCDFile: {}'.format(cfg['gcd'])) click.echo('\tOutput: {}'.format(outfile)) for key in ['DOMOversizeFactor', 'UseI3PropagatorService', 'UseGPUs', 'SummaryFile']: click.echo('\t{}: {}'.format(key, cfg[key])) click.echo('---------------\n') # get random service random_services, _ = create_random_services( dataset_number=cfg['dataset_number'], run_number=cfg['run_number'], seed=cfg['seed'], n_services=1, use_gslrng=cfg['random_service_use_gslrng']) random_service = random_services[0] """ Setup and run Snowstorm (aka MultiSim) by running a series of short trays, each with a different ice model. This works by front-loading as much of the expensive initialization (reading the GCD file, setting up PROPOSAL/Geant4, etc) as possible, so that only the propagation kernel needs to be recompiled for every tray. """ # instantiate baseline detector setup. # this will help construct the baseline characteristics before applying # the perturbers print("Setting up detector... ", end="") clsimParams = setupDetector( GCDFile=cfg['gcd'], SimulateFlashers=bool(cfg['FlasherInfoVectName'] or cfg['FlasherPulseSeriesName']), IceModelLocation=ice_model_location, DisableTilt=cfg['DisableTilt'], UnWeightedPhotons=cfg['UnWeightedPhotons'], UnWeightedPhotonsScalingFactor=cfg['UnWeightedPhotonsScalingFactor'], UseI3PropagatorService=cfg['UseI3PropagatorService'], UseGeant4=cfg['UseGeant4'], CrossoverEnergyEM=cfg['CrossoverEnergyEM'], CrossoverEnergyHadron=cfg['CrossoverEnergyHadron'], UseCascadeExtension=cfg['UseCascadeExtension'], StopDetectedPhotons=cfg['StopDetectedPhotons'], DOMOversizeFactor=cfg['DOMOversizeFactor'], UnshadowedFraction=cfg['UnshadowedFraction'], HoleIceParameterization=hole_ice_parameterization, WavelengthAcceptance=cfg['WavelengthAcceptance'], DOMRadius=cfg['DOMRadius'], CableOrientation=cfg['CableOrientation'], IgnoreSubdetectors=cfg['IgnoreSubdetectors'], ) print("done") print("Setting up OpenCLDevices... ", end="") openCLDevices = configureOpenCLDevices( UseGPUs=cfg['UseGPUs'], UseCPUs=not cfg['UseGPUs'], OverrideApproximateNumberOfWorkItems=cfg[ 'OverrideApproximateNumberOfWorkItems'], DoNotParallelize=cfg['DoNotParallelize'], UseOnlyDeviceNumber=cfg['UseOnlyDeviceNumber']) print("done") # ------------------- # Setup perturbations # ------------------- # create empty "perturber" object perturber = Perturber() # get perturbation_cfg dict to simplify calls perturbation_cfg = snowstorm_config["Perturbations"] # loop over all perturbations in the perturbation_cfg print("Setting up perturbers... ") for name, params in perturbation_cfg.items(): # catch special case of IceWavePlusModes if name == "IceWavePlusModes": if not params["apply"]: continue if params["type"] == "default": print("-> adding {} of type {}".format(name, params["type"])) perturber.add('IceWavePlusModes', *icewave.get_default_perturbation()) continue elif hasattr(snowstorm_perturbers, params["type"]): print("-> adding {} of type {}".format(name, params["type"])) get_perturber = getattr(snowstorm_perturbers, params["type"]) perturber.add('IceWavePlusModes', *get_perturber(**params['settings'])) continue else: msg = "IceWavePlusModes of type '{}' are not implemented(yet)." raise NotImplementedError(msg.format(params["type"])) # all other cases if params["type"] == "delta": print("-> adding {} of type {}".format(name, params["type"])) params = params["delta"] perturber.add(name, all_parametrizations[name], DeltaDistribution(params["x0"])) elif params["type"] == "gauss": print("-> adding {} of type {}".format(name, params["type"])) params = params["gauss"] # Caution: MultivariateNormal expect the covariance matrix as # first argument, so we need to use sigma**2 perturber.add(name, all_parametrizations[name], MultivariateNormal( dataclasses.I3Matrix(np.diag(params["sigma"])**2), params["mu"])) elif params["type"] == "uniform": print("-> adding {} of type {}".format(name, params["type"])) params = params["uniform"] perturber.add(name, all_parametrizations[name], UniformDistribution( [dataclasses.make_pair(*limits) for limits in params["limits"]])) else: msg = "Perturbation '{}' of type '{}' not implemented." raise NotImplementedError(msg.format(name, params["type"])) print("done") # Setting up some other things gcdFrames = list(dataio.I3File(cfg['gcd'])) inputStream = dataio.I3FrameSequence([infile]) summary = dataclasses.I3MapStringDouble() intermediateOutputFiles = [] # -------------- # Run PhotonProp # -------------- # start a model counter model_counter = 0 # Execute photon propagation print("Executing photon propagation...", end="") while inputStream.more(): # measure CLSimInit time time_CLSimInit_start = time.time() tray = I3Tray() tray.context['I3RandomService'] = random_service tray.context['I3SummaryService'] = summary # make a mutable copy of the config dict config = dict(clsimParams) # populate the M frame with I3FrameObjects from clsimParams model = icetray.I3Frame('M') for k, v in config.items(): if isinstance(v, icetray.I3FrameObject): model[k] = v # apply perturbations in the order they were configured perturber.perturb(random_service, model) # check for items in the M-frame that were changed/added # by the perturbers for k in model.keys(): if k.startswith('Snowstorm'): # keep all Snowstorm keys continue if k not in config: msg = "\n {} was put in the M frame, but does not appear in " msg += "the CLSim configuration dict" raise KeyError(msg.format(k)) if config[k] != model[k]: # if an items was changed, copy it back to clsimParams config[k] = model[k] else: # remove unmodified items from the M frame del model[k] # add "persistent" I3Reader tray.Add(FrameSequenceReader, Sequence=itertools.chain(gcdFrames, [model], inputStream)) # inject an S frame if it doesn't exist tray.Add(EnsureSFrame, Enable=len(intermediateOutputFiles) == 0) # write pertubations to frame def populate_s_frame(frame): perturber.to_frame(frame) tray.Add(populate_s_frame, Streams=[icetray.I3Frame.Stream('S')]) # Add Bumper to stop the tray after NumEventsPerModel Q-frames tray.Add(Bumper, NumFrames=cfg['NumEventsPerModel']) # initialize CLSim server and setup the propagators server_location = tempfile.mkstemp(prefix='clsim-server-')[1] address = 'ipc://'+server_location converters = setupPropagators( random_service, config, UseGPUs=cfg['UseGPUs'], UseCPUs=not cfg['UseGPUs'], OverrideApproximateNumberOfWorkItems=cfg[ 'OverrideApproximateNumberOfWorkItems'], DoNotParallelize=cfg['DoNotParallelize'], UseOnlyDeviceNumber=cfg['UseOnlyDeviceNumber'] ) server = clsim.I3CLSimServer( address, clsim.I3CLSimStepToPhotonConverterSeries(converters)) # stash server instance in the context to keep it alive tray.context['CLSimServer'] = server # recycle StepGenerator to prevent repeated, expensive initialization if 'StepGenerator' in cfg['ExtraArgumentsToI3CLSimClientModule']: stepGenerator = \ cfg['ExtraArgumentsToI3CLSimClientModule']['StepGenerator'] stepGenerator.SetMediumProperties(config['MediumProperties']) stepGenerator.SetWlenBias(config['WavelengthGenerationBias']) # add CLSim server to tray module_config = \ tray.Add( I3CLSimMakePhotonsWithServer, ServerAddress=address, DetectorSettings=config, MCTreeName=cfg['MCTreeName'], OutputMCTreeName=cfg['OutputMCTreeName'], FlasherInfoVectName=cfg['FlasherInfoVectName'], FlasherPulseSeriesName=cfg['FlasherPulseSeriesName'], PhotonSeriesName=cfg['PhotonSeriesName'], MCPESeriesName=cfg['MCPESeriesName'], RandomService=random_service, ParticleHistory=cfg['ParticleHistory'], ParticleHistoryGranularity=cfg['ParticleHistoryGranularity'], ExtraArgumentsToI3CLSimClientModule=cfg[ 'ExtraArgumentsToI3CLSimClientModule'], ) # recycle StepGenerator to prevent repeated, expensive initialization cfg['ExtraArgumentsToI3CLSimClientModule']['StepGenerator'] = \ module_config['StepGenerator'] # write to temporary output file intermediateOutputFiles.append( tempfile.mkstemp(suffix=(outfile.split("/"))[-1])[1]) tray.Add("I3Writer", Filename=intermediateOutputFiles[-1], DropOrphanStreams=[icetray.I3Frame.TrayInfo], Streams=[icetray.I3Frame.TrayInfo, icetray.I3Frame.Simulation, icetray.I3Frame.Stream('M'), icetray.I3Frame.Stream('m'), icetray.I3Frame.DAQ, icetray.I3Frame.Physics]) # gather statistics in the "I3SummaryService" tray.Add(GatherStatistics) # measure CLSimInit time time_CLSimInit = time.time() - time_CLSimInit_start summary["CLSimInitTime_{:03d}".format(model_counter)] = time_CLSimInit if "TotalCLSimInitTime" not in summary: summary["TotalCLSimInitTime"] = time_CLSimInit else: summary["TotalCLSimInitTime"] += time_CLSimInit # measure CLSimTray time time_CLSimTray_start = time.time() # Execute Tray tray.Execute() # measure CLSimTray time time_CLSimTray = time.time() - time_CLSimTray_start summary["CLSimTrayTime_{:03d}".format(model_counter)] = time_CLSimTray if "TotalCLSimTrayTime" not in summary: summary["TotalCLSimTrayTime"] = time_CLSimTray else: summary["TotalCLSimTrayTime"] += time_CLSimTray # remove the temp file made by the server location thingy os.unlink(server_location) # increase model counter model_counter += 1 print("done") # Add number of models to summary summary["TotalNumberOfModels"] = model_counter # Concatenate intermediate files print("Concatenating temporary files... ", end='') tray = I3Tray() tray.Add(dataio.I3Reader, "I3Reader", FilenameList=intermediateOutputFiles) tray.Add("I3Writer", Filename=outfile, DropOrphanStreams=[icetray.I3Frame.TrayInfo], Streams=[icetray.I3Frame.TrayInfo, icetray.I3Frame.Simulation, icetray.I3Frame.Stream('M'), icetray.I3Frame.Stream('m'), icetray.I3Frame.DAQ, icetray.I3Frame.Physics]) tray.Execute() tray.Finish() print("done") print("Cleaning up Temporary files... ") for fname in intermediateOutputFiles: os.unlink(fname) print("done") # Recalculate averages print("Writing summary file... ", end='') if cfg['UseGPUs']: if summary['TotalHostTime'] > 0.0: summary['DeviceUtilization'] = \ summary['TotalDeviceTime']/summary['TotalHostTime'] if summary['TotalNumPhotonsGenerated'] > 0.0: summary['AverageDeviceTimePerPhoton'] = \ summary['TotalDeviceTime']/summary['TotalNumPhotonsGenerated'] if summary['TotalNumPhotonsGenerated'] > 0.0: summary['AverageHostTimePerPhoton'] = \ summary['TotalHostTime']/summary['TotalNumPhotonsGenerated'] if cfg['SummaryFile']: with open(cfg['SummaryFile'], 'w') as f: yaml.dump(dict(summary), f) print("done") print('--------') print('Summary:') print('--------') for key, value in summary.items(): print('\t{}: {}'.format(key, value)) print('--------\n') # Hurray! print("All finished!") # say something about the runtime end_time = time.time() print("That took "+str(end_time - start_time)+" seconds.")
tray = I3Tray() icetray.logging.set_level(icetray.I3LogLevel.LOG_INFO) tray.AddModule(ScenarioSource, "ScenarioSource", GCDfile=GCDfile) tray.AddModule( "TrackSystemTester", "MutualTrackSystemTester", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, RecoFitName="Fit", CriticalRatio=0.7, #0.8 CylinderRadius=150. * I3Units.meter, ResTimeWindow=dataclasses.make_pair(-100 * I3Units.ns, 100 * I3Units.ns), ParticleSpeed=dataclasses.I3Constants.c, MutualCompare=True) tray.AddModule( "TrackSystemTester", "HypoTrackSystemTester", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, HypoFitName="HFit", CriticalRatio=0.7, #0.8 CylinderRadius=150. * I3Units.meter, ResTimeWindow=dataclasses.make_pair(-100, 100), ParticleSpeed=dataclasses.I3Constants.c)
#================ TRAY ============== from I3Tray import * tray = I3Tray() icetray.logging.set_level(icetray.I3LogLevel.LOG_INFO) tray.AddModule(ScenarioSource, "ScenarioSource", GCDfile=GCDfile) tray.AddModule("impCausalConnectTester", "impCausalConnectTester", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, HypoFitName="HFit", TravelTimeResidual=dataclasses.make_pair( -20. * I3Units.ns, 20. * I3Units.ns), WallTime=1005. * I3Units.m / I3Constants.c, MaxVerticalDist=1005. * I3Units.m, MaxHorizontalDist=1. * I3Units.m) tray.AddModule(icetray.I3TestModuleFactory(TestDaqSequence), "TestDaqSequence", Streams=[icetray.I3Frame.DAQ]) tray.AddModule(icetray.I3TestModuleFactory(TestPhysicsSequence), "TestPhysicsSequence", Streams=[icetray.I3Frame.Physics]) tray.Execute()
def Split_and_Recombine( tray, name, LineFitName="LineFit", SplitName="IceHiveSplit", OriginalPulses="InIcePulses", SplitPulses="SplitInIcePulses", CleanedSplitPulsesName="CleanSplitInIcePulses", DesignatedPulsesName="RecoInIcePulses", TriggerHierarchyName="QTriggerHierarchy", InIceTriggerIDs=[1006, 1007, 1011, 21001], #[(SMT8),(string),(SMT3),(volume)] AddTimeWindow=True, Clean=True, LineFitReco=True, Recombine=True, Recover=False, ): """ A tray-segment to perform event-splitting and event-recombination at low-level in data processing :param DesignatedPulsesName: The end product pulses will be written to this key :param LineFitName: The end produce LineFit will be written to this key :param OriginalPulses: Name of the original pulse in the Q-frame that will be split :param SplitName: Name of the splitter and therefore the subevent-stream that is delivered :param SplitPulses: Name of the SplitPulses in the P-frame :param TriggerHierarchyName: Name of the TriggerHierarchy in the Q-frame :param LineFitName: Name of that the LineFit reconstruction will be given :param AddTimeWindow: Set to True if a time window should be added (needed for EHE filter, I3TriggerSplitter does this too) :param CleanedSplitPulsesName: Name of the Cleaned Pulses if option 'Clean' is enabled :param Clean: Choose if a round of HiveCleaning (similar to RT-Cleaning) should commence on the output-pulses; improves reconstructability :param LineFitReco: make a importvedLineFit reconstruction; needed for Recombine and Recover option :param Recombine: recombine wrongly split events with CoincSuite :param Recover: try to recover lost pulses, by tracing back the track The Output are Q-frames containing: -[SplitNameSplitCount]: The number of created P-frames (SplitFrames) by the splitter -[SplitNameReducedCount]: The number of removed splits by means of recombinations; [SplitNameSplitCount]-[SplitNameReducedCount] is the effective remaining number of SplitFrames -[SplitPulses_Physics]: All clustered Pulses in the OriginalPulseSeries; identical to the union of all SplitPulses in the SubFrames -[SplitPulses_Noise]: All not clustered Pulses in the OriginalPulseSeries; identical to the inversion of SplitPulses_Physics and P-frames containing: -[SplitPulses]: The split PulseSeriesMapMask, which contains the clustered Pulses as selected by the Splitter -[HCSplitPulses]: The split PulseSeriesMapMask after the application of HiveCleaning, if the 'Clean'-option has been chosen -[SplitPulsesTimeRange]: The time range of the PulseSeriesMapMask equal to [first-pulse.time, last-pulse.time] -[SplitPulses_Noised]: The SplitPulses plus all noise in the feasible time-range; might be helpful for native reconstructions which do not depend on hit/pulse-cleaning or which explicitly require noised pulses, because they assume a noise-probability -[I3TriggerHierarchy]: The SubTrigger Hierarchy containing only Triggers participating in this event -[LineFitName]: A LineFit reconstruction """ from icecube import icetray, dataclasses, phys_services, IceHive from I3Tray import I3Units from icecube.icetray import pypick from icecube.phys_services.which_split import which_split if LineFitReco: try: from icecube import linefit except: raise RuntimeError( "for the option LineFitReco you need to have LineFit installed" ) if Recombine: try: from icecube import CoincSuite except: raise RuntimeError( "for the options 'Recombine' you need to have CoincSuite installed" ) if AddTimeWindow: try: from icecube import CoincSuite except: raise RuntimeError( "for the options 'AddTimeWindow' you need to have CoincSuite installed" ) if Recover: try: from icecube import PulseRecover except: raise RuntimeError( "for the option 'Clean' you need to have PulseRecover installed.\nYou can fin it in SVN/sandbox/mzoll/PulseRecover/branches/LineFit." ) #===================== # IceHive Event Splitting #====================== #Run the HiveSplitter: create P-frames containing its splits from icecube import IceHive singleRings = IceHive.RingLimits() singleRings.AddLimitPair(IceHive.LimitPair(-255., 255.)) singleRings.AddLimitPair(IceHive.LimitPair(-272.7, 272.7)) singleRings.AddLimitPair(IceHive.LimitPair(-165.8, 165.8)) doubleRings = IceHive.RingLimits() doubleRings.AddLimitPair(IceHive.LimitPair(-130., 70.)) doubleRings.AddLimitPair(IceHive.LimitPair(-131.5, 131.5)) doubleRings.AddLimitPair(IceHive.LimitPair(-40.8, 40.8)) tripleRings = IceHive.RingLimits() tripleRings.AddLimitPair(IceHive.LimitPair(-130., 70.)) tripleRings.AddLimitPair(IceHive.LimitPair(-144.1, 144.1)) tripleRings.AddLimitPair(IceHive.LimitPair(-124.7, 124.7)) tripleRings.AddLimitPair(IceHive.LimitPair(-82.8, 82.8)) singleVicinity = singleRings doubleVicinity = doubleRings tripleVicinity = tripleRings #NOTE FUTURE a more stringend set of limits #singleVicinity = IceHive.RingLimits() #singleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) #singleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) #doubleVicinity = IceHive.RingLimits() #doubleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) #doubleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) #doubleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) #tripleVicinity = IceHive.RingLimits() #tripleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) #tripleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) #tripleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) #tripleVicinity.AddLimitPair(IceHive.LimitPair(-100., 100.)) tray.AddModule( "I3IceHive<I3RecoPulse>", SplitName, InputName=OriginalPulses, OutputName=SplitPulses, Multiplicity=3, TimeWindow=2000. * I3Units.ns, TimeCVMinus=300. * I3Units.ns, TimeCVPlus=300. * I3Units.ns, TimeCNMinus=200. * I3Units.ns, TimeCNPlus=200. * I3Units.ns, TimeStatic=200. * I3Units.ns, SingleDenseRingLimits=singleRings, DoubleDenseRingLimits=doubleRings, TripleDenseRingLimits=tripleRings, SingleDenseRingVicinity=singleVicinity, DoubleDenseRingVicinity=doubleVicinity, TripleDenseRingVicinity=tripleVicinity, SaveSplitCount=True, UpdateTriggerHierarchy=True, TrigHierName=TriggerHierarchyName, #TriggerConfigIDs= InIceTriggerIDs, #NoSplitDt = 10000, ReadoutWindowMinus=4000. * I3Units.ns, ReadoutWindowPlus=6000. * I3Units.ns) RecoPulses = SplitPulses #NOTE Make an alias on which pulses Reconstructions should commence if (Clean): cleanVicinity = IceHive.RingLimits() cleanVicinity.AddLimitPair(IceHive.LimitPair(-70., 70.)) cleanVicinity.AddLimitPair(IceHive.LimitPair(-70., 70.)) tray.AddModule( "I3HiveCleaning<I3RecoPulse>", "HiveClean", InputName=SplitPulses, OutputName=CleanedSplitPulsesName, TimeStaticMinus=600. * I3Units.ns, #NOTE default is 200. TimeStaticPlus=600. * I3Units.ns, #NOTE default is 200. SingleDenseRingVicinity=cleanVicinity, DoubleDenseRingVicinity=cleanVicinity, TripleDenseRingVicinity=cleanVicinity, If=which_split(SplitName)) RecoPulses = CleanedSplitPulsesName if Recombine: tray.AddModule( lambda f: f.Put(SplitName + "ReducedCount", icetray.I3Int(0)), "ReducedCountMaker", Streams=[icetray.I3Frame.DAQ]) #========================= # CoincSuite Recombinations #========================= if (Clean and Recombine): tray.AddModule(CoincSuite.discardEmptySplits, "removeEmptySplit", SplitName=SplitName, PulsesName=RecoPulses) if Recombine: tray.AddModule("AfterpulseDiscard", "AfterpulseDiscard", SplitName=SplitName, RecoMapName=SplitPulses, QTotFraction=.1, TimeOffset=3000. * I3Units.ns, OverlapFraction=0.5, Discard=True) tray.AddModule("HypoFrameCreator", "HypoFrameCreator", SplitName=SplitName, HypoName="hypoframe", RecoMapName=RecoPulses, MaxTimeSeparation=3000. * I3Units.ns) ### LineFit, a fast and simple reconstruction tray.AddSegment(linefit.simple, 'LineFit', inputResponse=RecoPulses, fitName=LineFitName, If=(which_split(split_name=SplitName) | which_split(split_name='hypoframe'))) tray.AddModule( "TrackSystemTester", "TestHypoTrackSystem", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, HypoFitName=LineFitName, CriticalRatio=0.7, #0.8 CylinderRadius=150. * I3Units.meter, ResTimeWindow=dataclasses.make_pair( -float("inf"), float("inf") ), #FUTURE dataclasses.make_pair(-200*I3Units.ns,200*I3Units.ns), ParticleSpeed=float("nan")) #FUTURE dataclasses.I3Constants.c, tray.AddModule( "TrackSystemTester", "TestMutualTrackSystem", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, RecoFitName=LineFitName, CriticalRatio=0.7, #0.8 CylinderRadius=150. * I3Units.meter, ResTimeWindow=dataclasses.make_pair( -float("inf"), float("inf") ), #FUTURE dataclasses.make_pair(-200*I3Units.ns,200*I3Units.ns), ParticleSpeed=float("nan"), #FUTURE dataclasses.I3Constants.c, MutualCompare=True) tray.AddModule("AlignmentTester", "TestHypoAlignment", SplitName=SplitName, HypoName="hypoframe", HypoFitName=LineFitName, RecoFitName=LineFitName, CriticalAngle=25. * I3Units.degree, CriticalDistance=20. * I3Units.meter) tray.AddModule("AlignmentTester", "TestMutualAlignment", SplitName=SplitName, HypoName="hypoframe", HypoFitName=LineFitName, RecoFitName=LineFitName, CriticalAngle=25. * I3Units.degree, CriticalDistance=20. * I3Units.meter, MutualCompare=True) tray.AddModule("SpeedTester", "TestSpeed", SplitName=SplitName, HypoName="hypoframe", HypoFitName=LineFitName, SpeedUpperCut=0.35 * I3Units.m / I3Units.ns, SpeedLowerCut=0.15 * I3Units.m / I3Units.ns) tray.AddModule("cogCausalConnectTester", "TestcogCausalConnect", SplitName=SplitName, HypoName="hypoframe", RecoMapName=RecoPulses, HypoFitName=LineFitName, TravelTimeResidual=dataclasses.make_pair( -1000. * I3Units.ns, 1000. * I3Units.ns), WallTime=3000. * I3Units.ns, MaxVerticalDist=700. * I3Units.m, MaxHorizontalDist=700. * I3Units.m) #where recombinations happen, for real RecombineKeys = [SplitPulses + "_Noised"] if (Clean): RecombineKeys.append(CleanedSplitPulsesName) tray.AddModule("DecisionMaker", "FinalDecision", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, LikeNameList=[ "TestHypoTrackSystem", "TestMutualTrackSystem", "TestHypoAlignment", "TestMutualAlignment" ], VetoNameList=["TestcogCausalConnect", "TestSpeed"], TrueNameList=[], RecombineRecoMaps=RecombineKeys, Discard=True) #discard the hypoframes, as they are of no use anymore tray.AddModule( lambda f: f['I3EventHeader'].sub_event_stream != "hypoframe", "KillHypoFrame") #================= # REPEAT and uniformize #================= #Here procedures need to be repeated, which have not yet been performed on the recombined frames # if (Clean): # from icecube import IceHive # tray.AddModule("I3HiveCleaning<I3RecoPulse>","HiveClean_AGAIN", # InputName = SplitPulses, # OutputName = CleanedSplitPulsesName, # TimeStaticMinus=600.*I3Units.ns,#NOTE default is 200. # TimeStaticPlus=600.*I3Units.ns, #NOTE default is 200. # SingleDenseRingVicinity=cleanVicinity, # DoubleDenseRingVicinity=cleanVicinity, # TripleDenseRingVicinity=cleanVicinity, # If = which_split(SplitName) & pypick(lambda f: not f.Has(CleanedSplitPulsesName))) if (AddTimeWindow): tray.AddModule(CoincSuite.createTimeWindow, "HiveTimeWindow", InputPulses=SplitPulses, Output="TriggerSplitterLaunchWindow", If=which_split(SplitName)) #NOTE Drop-in fix for TriggerHierarchies, which need to be present in the frame for certain filters def ClipTriggerHierarchy(frame): """ if frames do not have I3TriggerHierarchy put it there by clipping in time""" qth = frame[TriggerHierarchyName] tw = frame["TriggerSplitterLaunchWindow"] th = IceHive.clip_TriggerHierarchy( qth, tw, [1011, 1006, 1007, 21001]) #SMT8, SMT3, String, Volume-trigger frame.Put("I3TriggerHierarchy", th) tray.AddModule(ClipTriggerHierarchy, "ClipTriggers", If=which_split(SplitName) & pypick(lambda f: not f.Has("I3TriggerHierarchy"))) if Recombine: tray.AddSegment(linefit.simple, 'LineFit_AGAIN', inputResponse=RecoPulses, fitName=LineFitName, If=which_split(SplitName) & pypick(lambda f: not f.Has(LineFitName))) ### copy the key at 'filter_globals.SplitRTCleanedInIcePulses' to 'pulses' tray.AddModule("Copy", "copy_AGAIN", Keys=[RecoPulses, DesignatedPulsesName], If=which_split(SplitName)) ### # option to recover crutial pulses, which have been lost ### if (Recover): tray.AddModule( "I3SimplePulseRecover", "SimplePulseRecover", #TODO options switch to IterativePulseRecover here! PhysicsPulsesName=RecoPulses, TrackName=LineFitName, DiscoverablePulsesName=SplitPulses + "_Noised", OutputPulsesName=RecoPulses + "Plus", OutputTrackName=LineFitName + "Plus", TimeResidualWindow=dataclasses.make_pair(-500. * I3Units.ns, +500. * I3Units.ns), MaxDistance=150. * I3Units.m, ApproxTrack=True, TrimTrack=True, BackwardSearch=True, ForwardSearch=False, Deadtime=0.0, If=which_split(SplitName)) def pick_recover(): def f(frame): if (frame.Stop == icetray.I3Frame.Physics): return (frame[RecoPulses + 'Plus' + "_discNCh"].value >= 2 and frame[RecoPulses + 'Plus' + "_discQ"].value >= 1.5) return False return icetray.pypick(f) tray.AddModule( "Delete", "delete_TRICE", Keys=[DesignatedPulsesName, LineFitName, LineFitName + "Params"], If=which_split(SplitName) & pick_recover()) tray.AddModule("Copy", "copy_TRICE", Keys=[RecoPulses + 'Plus', DesignatedPulsesName], If=which_split(SplitName) & pick_recover()) tray.AddSegment(linefit.simple, 'LineFit_TRICE', inputResponse=DesignatedPulsesName, fitName=LineFitName, If=which_split(SplitName) & pick_recover())
def Complete(tray, name, suffix='', SplitName='', SplitPulses='', FitName='LineFit'): """ A segment doing everything that CoincSuite possibly provide. Run after your splitter, which has written the SplitFrames and SplitCount :param suffix: right now an unused option FIXME appendable suffix :param SplitName: name of the subevent-stream, identical to SplitterModule :param SplitPulses: name of the split PulseSeries in the subevent-stream :param FitName: Name of that will be given to the LineFit """ icetray.logging.log_info("Using CoincSuite Recombinations") if (SplitName == ''): icetray.logging.log_fatal( "Configure CSComplete Traysegment Parameter 'Splitname'") if (SplitPulses == ''): icetray.logging.log_fatal( "Configure CSComplete Traysegment Parameter 'Pulses'") tray.AddModule( lambda f: f.Put(SplitName + "ReducedCount", icetray.I3Int(0)), "ReducedCountMaker", Streams=[icetray.I3Frame.DAQ]) tray.AddModule("AfterpulseDiscard", "AfterpulseDiscard", SplitName=SplitName, RecoMapName=SplitPulses, QTotFraction=.1, TimeOffset=3.E3 * I3Units.ns, OverlapFraction=0.75, Discard=True) tray.AddModule("HypoFrameCreator", "HypoFrameCreator", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, MaxTimeSeparation=3000. * I3Units.ns) from icecube import linefit tray.AddSegment(linefit.simple, 'LineFit', inputResponse=SplitPulses, fitName=FitName, If=which_split(SplitName) | which_split('hypoframe')) tray.AddModule( "TrackSystemTester", "TestHypoTrackSystem", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, HypoFitName=FitName, CriticalRatio=0.7, #0.8 CylinderRadius=150 * I3Units.meter, ResTimeWindow=dataclasses.make_pair(-200, 200), ParticleSpeed=dataclasses.I3Constants.c) tray.AddModule( "TrackSystemTester", "TestMutualTrackSystem", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, RecoFitName=FitName, CriticalRatio=0.7, #0.8 CylinderRadius=150 * I3Units.meter, ResTimeWindow=dataclasses.make_pair(-200 * I3Units.ns, 200 * I3Units.ns), ParticleSpeed=dataclasses.I3Constants.c, MutualCompare=True) tray.AddModule("AlignmentTester", "TestHypoAlignment", SplitName=SplitName, HypoName="hypoframe", HypoFitName=FitName, RecoFitName=FitName, CriticalAngle=25 * I3Units.degree, CriticalDistance=20 * I3Units.meter) tray.AddModule("AlignmentTester", "TestMutualAlignment", SplitName=SplitName, HypoName="hypoframe", HypoFitName=FitName, RecoFitName=FitName, CriticalAngle=25 * I3Units.degree, CriticalDistance=20 * I3Units.meter, MutualCompare=True) tray.AddModule( "SpeedTester", "TestSpeed", SplitName=SplitName, HypoName="hypoframe", HypoFitName=FitName, SpeedUpperCut=0.35 * I3Units.m / I3Units.ns, #1.17*c SpeedLowerCut=0.15 * I3Units.m / I3Units.ns) #0.5*c tray.AddModule("cogCausalConnectTester", "TestCogCausalConnect", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, HypoFitName=FitName, TravelTimeResidual=dataclasses.make_pair( -1000. * I3Units.ns, 1000. * I3Units.ns), WallTime=3000. * I3Units.ns, MaxVerticalDist=700. * I3Units.m, MaxHorizontalDist=700. * I3Units.m, MaxTrackDist=200. * I3Units.m, MaxFurthestDist=600. * I3Units.m) from icecube import lilliput import icecube.lilliput.segments mininame = lilliput.segments.add_minuit_simplex_minimizer_service(tray) paraname = lilliput.segments.add_simple_track_parametrization_service(tray) llhname = lilliput.segments.add_pandel_likelihood_service( tray, SplitPulses, 'SPE1st', 10. * I3Units.hertz) tray.AddModule("ReducingLikelihoodTester", "TestHypoReducingLikelihood", SplitName=SplitName, HypoName="hypoframe", HypoFitName=FitName, RecoFitName=FitName, LlhName=llhname, MiniName=mininame, ParaName=paraname, ReductionFactor=0.8, Refit=False) tray.AddModule("ReducingLikelihoodTester", "TestMutualReducingLikelihood", SplitName=SplitName, HypoName="hypoframe", HypoFitName=FitName, RecoFitName=FitName, LlhName=llhname, MiniName=mininame, ParaName=paraname, ReductionFactor=0.8, Refit=False, MutualCompare=True) tray.AddModule("DecisionMaker", "FinalDecision", SplitName=SplitName, HypoName="hypoframe", RecoMapName=SplitPulses, LikeNameList=[ "TestHypoTrackSystem", "TestMutualTrackSystem", "TestHypoAlignment", "TestMutualAlignment", "TestHypoReducingLikelihood", "TestMutualReducingLikelihood" ], VetoNameList=["TestCogCausalConnect", "TestSpeed"], TrueNameList=[], Discard=True) tray.AddModule( lambda f: f["I3EventHeader"].sub_event_stream != "hypoframe", "KillHypoFrame") tray.AddSegment(linefit.simple, 'LineFit_repeat', inputResponse=SplitPulses, fitName=FitName, If=which_split(SplitName) & pypick(lambda f: not f.Has(FitName))) tray.AddModule("Delete", "Delete", Keys=[]) # NOTE MAYBE remove unused keys here