예제 #1
0
userPrint("Added photonic information")

#-----------------------------#
# Source with geometry
#-----------------------------#
tray.AddModule("I3InfiniteSource", "somanyevents",
               Prefix= m_MCOpt.GCDFile,
               Stream=icetray.I3Frame.DAQ)

userPrint("Added Geometry (GCD) file")

#-----------------------------#
# Timing module
#-----------------------------#
time = get_time( dataio.I3File(m_MCOpt.GCDFile))
tray.AddModule( DrivingTime, "dt",
                Streams = [icetray.I3Frame.DAQ])

userPrint("Timing info included")

#-----------------------------#
# Generate event header info
#-----------------------------#
tray.AddModule("I3MCEventHeaderGenerator","time-gen")(
    ("Year",time.utc_year),
    ("DAQTime",time.utc_daq_time)
    )

userPrint("Event header infor added")
예제 #2
0
#	("DriverFileDirectory", "/home/mase/work/I3/EHE/trunk_new/src/"),
#	("PhotonicsLevel1DriverFile","level1_SC2_100cmtable_newtrunk.list"),
#	("PhotonicsLevel2DriverFile", "level2_table.list"),
#	)




#                                                                                         
# IceTray modules                                                                         
#                                                                                         
tray.AddModule("I3InfiniteSource", "somanyevents",
               Prefix= gcdfile,
               Stream=icetray.I3Frame.DAQ)

time = get_time( dataio.I3File(gcdfile))

tray.AddModule( DrivingTime, "dt",
                Streams = [icetray.I3Frame.DAQ])


tray.AddModule("I3MCEventHeaderGenerator","time-gen")(
    ("Year",time.utc_year),
    ("DAQTime",time.utc_daq_time)
    )

# SC-generator #
tray.AddModule("I3SCGenerator","generator")(
        ("NumPhotons", numPhotons), # set the intensity of SC output 
	("xPosition",11.87*I3Units.m),
	("yPosition",179.19*I3Units.m),
예제 #3
0
def SimIceTop(tray, name,
              input,
              output=None,
              gcd=None,
              log_level=2,
              samples=1,
              tanks=[],
              x=0.0,
              y=0.0,
              r=0.0,
              seed=0,
              rng="gsl",
              injector="normal",
              response="g4",
              new=True,
              pecompress=2,
              weighted=False,
              calibrate=False,
              trigger=False):
    """
    Simulate IceTop response.

    Input can be a list of CORSIKA files or a tuple of ``(str, kwargs)``,
    which are passed to ``tray.AddService(str, "particle-injector", **kwargs)``
    to create a custom particle injector. RandomServiceName should not be
    specified, it is overridden internally.

    The option "weighted" only takes effect if the input are CORSIKA files.
    """
    import os
    import re
    from icecube import icetray, dataclasses, dataio
    from icecube.sim_services.sim_utils.gcd_utils import get_time
    from icecube.icetray import I3Units

    custom_injector = False
    if len(input) == 2 and isinstance(input[0], str) and isinstance(input[1], dict):
        custom_injector = True

    if gcd is None:
        raise ValueError("Need to specify a GCD file")
    if not os.path.exists(gcd):
        raise IOError("Specified GCD file does not exist")

    icetray.set_log_level_for_unit('I3TopSimulator', icetray.I3LogLevel(log_level))
    icetray.set_log_level_for_unit('I3CorsikaReader', icetray.I3LogLevel(log_level))
    icetray.set_log_level_for_unit('I3CorsikaInjector', icetray.I3LogLevel(log_level))
    icetray.set_log_level_for_unit('I3G4TankResponse', icetray.I3LogLevel(log_level))
    icetray.set_log_level_for_unit('I3ParamTankResponse', icetray.I3LogLevel(log_level))

    # to be used by injector
    for tag in ("inj", "resp", "other"):
        if rng == "gsl":
            tray.AddService("I3GSLRandomServiceFactory", "gslrandom_" + tag,
                            Seed=seed,
                            InstallServiceAs='random_' + tag)
        elif rng == "root":
            tray.AddService("I3TRandomServiceFactory", "rootrandom_" + tag,
                            Seed=seed,
                            InstallServiceAs='random_' + tag)
        elif rng == "sprng":
            tray.AddService("I3SPRNGRandomServiceFactory", "sprngrandom_" + tag,
                            Seed=seed,
                            NStreams=1,
                            StreamNum=0,
                            InstallServiceAs='random_' + tag)
        else:
            raise ValueError("Unknown randon number generator: " + rng)


    if custom_injector:
        tray.AddService(input[0], "particle-injector",
                        RandomServiceName = 'random_inj',
                        **input[1])
    else:
        # CORSIKA injector
        if weighted:
            if injector == "normal":
                tray.AddService("I3InjectorFactory<I3CorsikaInjector>", "particle-injector",
                                FileNameList = input,
                                RandomServiceName = 'random_inj',
                                NumSamples = samples,     # <-- Number of re-samples of the same shower
                                ImportanceSampling = True,
                                #PartDistr = os.path.join(os.path.dirname(options.output),
                                #                         'on_regions_' + os.path.basename(options.output).replace(extension, 'root')),
                                Tanks = tanks,
                                IgnoreParticleTypes = [75, 76, 85, 86, 95, 96]
                                )
            else:
                raise ValueError("option weighted requires normal injector")
        else:
            if injector == "normal":
                tray.AddService("I3InjectorFactory<I3CorsikaInjector>", "particle-injector",
                                FileNameList = input,
                                RandomServiceName = 'random_inj',
                                NumSamples = samples,     # <-- Number of re-samples of the same shower
                                RelocationX = x,  # <-- x-coordinate of core or resampling center (if Relocation R > 0)
                                RelocationY = y, # <-- y-coordinate or core or resampling center (if Relocation R > 0)
                                RelocationR = r,   # <-- Re-sampling radius (if zero --> fixed core location)
                                Tanks = tanks,
                                IgnoreParticleTypes = [75, 76, 85, 86, 95, 96]
                                )
            elif injector == "unthin":
                tray.AddService("I3InjectorFactory<I3CorsikaThinnedInjector>", "particle-injector",
                      FileNameList = input,
                      RandomServiceName = 'random_inj',
                      NumSamples = samples,     # <-- Number of re-samples of the same shower
                      RelocationX = x,  # <-- x-coordinate of core or resampling center (if Relocation R > 0)
                      RelocationY = y, # <-- y-coordinate or core or resampling center (if Relocation R > 0)
                      RelocationR = r,   # <-- Re-sampling radius (if zero --> fixed core location)
                      )
            else:
                raise ValueError("unknown injector option")

    if response == 'g4':
        from icecube import g4_tankresponse
        tray.AddService("I3IceTopResponseFactory<I3G4TankResponse>", "topresponse",
                        RandomServiceName =  "random_resp",
                        ChargeScale =  1.02
                        )
    elif response == 'param':
        tray.AddService("I3IceTopResponseFactory<I3ParamTankResponse>", "topresponse",
                        RandomServiceName =  "random_resp",
                        UseSnowParam = True
                        )
    else:
        raise ValueError("Unknown IceTop tank response: " + response)

    tray.AddModule("I3InfiniteSource", "source",
                   prefix = gcd,
                   stream = icetray.I3Frame.DAQ )

    time = get_time(dataio.I3File(gcd))
    tray.AddModule("I3MCEventHeaderGenerator","time-gen",
                   Year = time.utc_year,
                   DAQTime = time.utc_daq_time)

    if new:
        tray.AddSegment(SimulateNew, 'new_simulation',
                        InjectorServiceName = "particle-injector",
                        ResponseServiceName = "topresponse",
                        RandomServiceName = "random_other",
                        InIceMCTreeName = '',
                        Tanks = tanks,
                        CompressPEs=pecompress
                        )
    else:
        tray.AddSegment(SimulateOld, 'old_simulation',
                        InjectorServiceName = "particle-injector",
                        ResponseServiceName = "topresponse",
                        InIceMCTreeName = '',
                        Tanks = tanks
                        )

    if calibrate:
        from icecube import topsimulator
        tray.AddSegment(CalibrateAndExtract, 'CalibrateExtract',
                        Launches = 'IceTopRawData',
                        )
        tray.AddModule('I3TopAddComponentWaveforms', 'AddComponentWaveforms')

    if output is not None:  # writing of output is requested
        if output.endswith(".h5") or output.endswith(".root"):
            # write tables

            keep_keys = ['I3EventHeader',
                         'MCTopCherenkovPulses',
                         'MCTopHitSeriesMap',
                         'IceTopPulses_HLC',
                         'IceTopPulses_SLC',
                         'IceTopHLCVEMPulses',
                         'IceTopSLCVEMPulses']

            if custom_injector:
                keep_keys += ['I3MCTreeIT',
                              'MCTopPulses']
            else:
                keep_keys += ['MCPrimary',
                              'MCPrimaryInfo',
                              'SamplingWeight',
                              'Samples']

            tray.AddModule(DummySubEventSplit, 'split')

            from icecube.tableio import I3TableWriter
            if output.endswith('.h5'):
                from icecube.hdfwriter import I3HDFTableService
                hdf_service = I3HDFTableService(output)

                tray.AddModule(I3TableWriter, "writer",
                               Keys = keep_keys,
                               TableService = [ hdf_service ],
                               SubEventStreams = ['IceTop'],
                               )
            elif output.endswith('.root'):
                from icecube.rootwriter import I3ROOTTableService
                root_service = I3ROOTTableService(output)

                tray.AddModule(I3TableWriter, "writer",
                               Keys = keep_keys,
                               TableService = [ root_service ],
                               SubEventStreams = ['IceTop'],
                               )
        else:
            # write standard output format i3
            tray.AddModule("I3Writer", "i3-writer",
                           Filename = output,
                           streams = [icetray.I3Frame.DAQ]
                           )
    else:
        w,le = numpy.histogram(times,range=(TMIN,TMAX),bins=nbins)
        t = [t0+(options.binwidth/2.0) for t0 in le]        
else:
    w = list()
    t = times

tray = I3Tray()

tray.AddModule("I3InfiniteSource", "source",\
               prefix = options.gcd_file , \
               stream = icetray.I3Frame.DAQ ) 

from icecube import dataio
from icecube.sim_services.sim_utils.gcd_utils import get_time
time = get_time(dataio.I3File(options.gcd_file))
tray.AddModule("I3MCEventHeaderGenerator","time-gen")(
        ("Year",time.utc_year),
        ("DAQTime",time.utc_daq_time),
        ("RunNumber",999)
        )

tray.AddService("I3SPRNGRandomServiceFactory","random")(
	("Seed",1),
	("NStreams",2),
 	("StreamNum",1))

tray.AddModule(StressTestPEGenerator ,"pes",\
               Streams = [icetray.I3Frame.DAQ],\
               hit_times = t, weights = w )
    else:
        w, le = numpy.histogram(times, range=(TMIN, TMAX), bins=nbins)
        t = [t0 + (options.binwidth / 2.0) for t0 in le]
else:
    w = list()
    t = times

tray = I3Tray()

tray.AddModule("I3InfiniteSource", "source",\
               prefix = options.gcd_file , \
               stream = icetray.I3Frame.DAQ )

from icecube import dataio
from icecube.sim_services.sim_utils.gcd_utils import get_time
time = get_time(dataio.I3File(options.gcd_file))
tray.AddModule("I3MCEventHeaderGenerator",
               "time-gen")(("Year", time.utc_year),
                           ("DAQTime", time.utc_daq_time), ("RunNumber", 999))

tray.AddService("I3SPRNGRandomServiceFactory",
                "random")(("Seed", 1), ("NStreams", 2), ("StreamNum", 1))

tray.AddModule(StressTestPEGenerator ,"pes",\
               Streams = [icetray.I3Frame.DAQ],\
               hit_times = t, weights = w )

tray.AddModule("Vuvuzela", "noise", SimulateNewDOMs=True)

tray.AddModule("PMTResponseSimulator", "pmt")
def GenerateIceTopShowers(tray,
                          name,
                          Files=None,
                          GCDFile=None,
                          NSamples=1,
                          TankResponse="g4",
                          KeepMCHits=False,
                          x=0,
                          y=0,
                          r=0,
                          ResponseRandomService="I3RandomService",
                          InjectorRandomService="I3RandomService",
                          UnthinRadius=0,
                          TankSamplingRadius=25 * I3Units.m,
                          RunID=0,
                          RaiseObservationLevel=0):
    """
	Read CORSIKA files, simulate IceTop response, and populate I3MCTree with penetrating components (neutrinos and muons) using topsimulator's injector.

	:param Files: list of CORSIKA files to read
	:param GCDFile: path to GCD file to read first
	:param NSampless: Number of samples of a single CORSIKA shower
	:param TankResponse: Method used to simulate IceTop response: 'param' for parameterization, 'g4' for GEANT4
	:param KeepMCHits: keep IceTop MCHits (needed only for the PMTSimulator-based simulation)
	:param x: x-coordinate of the point around which the CORSIKA origin is randomly placed
	:param y: y-coordinate of the point around which the CORSIKA origin is randomly placed
	:param r: radius of the circle in which the CORSIKA origin is randomly placed
	:param ResponseRandomService: name of the I3RandomService used for tank response
	:param InjectorRandomService: name of the I3RandomService used for particle injection
	:param UnthinRadius: radius of unthinning sampling area
	:param TankSamplingRadius: the radius around tanks where all particles are considered for propagation (>=UnthinRadius)
	:param RunID: the ID to store in the header (normally that of the corsika run)
	"""

    from icecube import icetray, dataio
    from icecube import topsimulator
    import os

    # we compres CORSIKA files now. We need to change our reader to handle this. Meanwhile...
    # this assumes we are copying the file before, for this reason I added a line to check the relative path
    missing = []
    for f in Files:
        if not os.path.dirname(os.path.relpath(f)):
            if os.path.exists('%s.bz2' % f):
                rc = os.system("bzip2 -d '" + f + ".bz2' >&2")
            if os.path.exists('%s.gz' % f):
                rc = os.system("gzip -d '" + f + ".gz' >&2")
        if not os.path.exists(f):
            missing.append(f)
    if missing:
        raise Exception("Missing input files: %s" % str(missing))

    tray.AddModule("I3InfiniteSource",
                   "source",
                   prefix=GCDFile,
                   stream=icetray.I3Frame.DAQ)

    from icecube.sim_services.sim_utils.gcd_utils import get_time
    time = get_time(dataio.I3File(GCDFile))

    # topsimulator overrides the given I3EventHeader with this time... (?)
    def DrivingTime(frame, t=time):
        if "DrivingTime" in frame:
            del frame["DrivingTime"]
        frame.Put("DrivingTime", t)

    tray.AddModule(DrivingTime, "dt", Streams=[icetray.I3Frame.DAQ])

    tray.AddModule("I3MCEventHeaderGenerator",
                   "time-gen",
                   Year=time.utc_year,
                   DAQTime=time.utc_daq_time,
                   RunNumber=RunID,
                   IncrementEventID=True)

    if TankResponse.lower() == "g4":
        from icecube import g4_tankresponse
        tray.AddService(
            "I3IceTopResponseFactory<I3G4TankResponse>",
            name + "_topresponse",
            RandomServiceName=ResponseRandomService,
            ChargeScale=
            1.02,  # From Arne. Javier doesn't believe this is exactly right...
            TankSamplingRadius=TankSamplingRadius,
        )
    elif TankResponse.lower() == 'param':
        tray.AddService(
            "I3IceTopResponseFactory<I3ParamTankResponse>",
            name + "_topresponse",
            RandomServiceName=ResponseRandomService,
            UseSnowParam=True,
            TankSamplingRadius=TankSamplingRadius,
        )
    else:
        raise Exception('Unknown tank response ' + str(TankResponse))

    tray.AddService("I3InjectorFactory<I3CorsikaInjector>",
                    name + "_topinjector",
                    FileNameList=Files,
                    RandomServiceName=InjectorRandomService,
                    NumSamples=NSamples,
                    RelocationX=x,
                    RelocationY=y,
                    RelocationR=r,
                    UnThinRadius=UnthinRadius,
                    IgnoreParticleTypes=[75, 76, 85, 86, 95, 96],
                    RaiseObservationLevel=RaiseObservationLevel)

    tray.AddModule(
        "I3TopSimulator",
        name + "I3TopSimulator",
        InIceMCTreeName="I3MCTree",
        IceTopMCTreeName="IceTopMCTree",
        ResponseServiceName=name + "_topresponse",
        InjectorServiceName=name + "_topinjector",
        PrimaryName='MCPrimary',
        IceTopHitSeriesName='IceTopMCHits',
        MuonEnergyCutOff=
        0.,  # this is done by I3InIceCORSIKATrimmer, so it can be anything.
        CompressPEs=1,
        UseInjectorComponents=True)

    tray.AddModule(
        "I3EventCounter",
        "top_simulator_counter",
        physicscountername="Generated Events",
        CounterStep=1,
    )

    if not KeepMCHits:
        tray.Add("Delete", Keys=['IceTopMCHits'])

    tray.Add('I3InIceCORSIKATrimmer', FilterMode=False)