Пример #1
0
 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])))
Пример #2
0
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")
Пример #4
0
               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 = []

#
#
Пример #6
0
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.")
Пример #7
0
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)
Пример #8
0
#================ 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()
Пример #9
0
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())
Пример #10
0
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