Skip to content
Snippets Groups Projects
reconstruction.raw.py 11.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • from Gaudi.Configuration import *
    
    from Configurables import ApplicationMgr, AuditorSvc, EICDataSvc, PodioOutput, GeoSvc
    from GaudiKernel import SystemOfUnits as units
    from GaudiKernel.SystemOfUnits import MeV, GeV, mm, cm, mrad
    
    import json
    
    detector_name = "athena"
    if "JUGGLER_DETECTOR" in os.environ :
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        detector_name = str(os.environ["JUGGLER_DETECTOR"])
    
    
    detector_path = ""
    if "DETECTOR_PATH" in os.environ :
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        detector_path = str(os.environ["DETECTOR_PATH"])
    
    detector_version = 'default'
    if "JUGGLER_DETECTOR_VERSION" in os.environ:
        env_version = str(os.environ["JUGGLER_DETECTOR_VERSION"])
        if 'acadia' in env_version:
            detector_version = 'acadia'
    
    
    compact_path = os.path.join(detector_path, detector_name)
    
    # RICH reconstruction
    qe_data = [(1.0, 0.25), (7.5, 0.25),]
    
    
    # input calorimeter DAQ info
    calo_daq = {}
    with open('{}/calibrations/calo_digi_{}.json'.format(detector_path, detector_version)) as f:
        calo_config = json.load(f)
        ## add proper ADC capacity based on bit depth
        for sys in calo_config:
            cfg = calo_config[sys]
            calo_daq[sys] = {
                'dynamicRangeADC': eval(cfg['dynamicRange']),
                'capacityADC': 2**int(cfg['capacityBitsADC']),
                'pedestalMean': int(cfg['pedestalMean']),
                'pedestalSigma': float(cfg['pedestalSigma'])
            }
    print(calo_daq)
    
    
    # input and output
    input_sims = [f.strip() for f in str.split(os.environ["JUGGLER_SIM_FILE"], ",") if f.strip()]
    output_rec = str(os.environ["JUGGLER_REC_FILE"])
    n_events = int(os.environ["JUGGLER_N_EVENTS"])
    
    # services
    services = []
    # auditor service
    services.append(AuditorSvc("AuditorSvc", Auditors=['ChronoAuditor', 'MemStatAuditor']))
    # geometry service
    services.append(GeoSvc("GeoSvc", detectors=["{}.xml".format(compact_path)], OutputLevel=WARNING))
    # data service
    services.append(EICDataSvc("EventDataSvc", inputs=input_sims, OutputLevel=WARNING))
    
    # juggler components
    from Configurables import PodioInput
    
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    from Configurables import Jug__Digi__SimTrackerHitsCollector as SimTrackerHitsCollector
    
    from Configurables import Jug__Digi__PhotoMultiplierDigi as PhotoMultiplierDigi
    from Configurables import Jug__Digi__CalorimeterHitDigi as CalHitDigi
    from Configurables import Jug__Digi__SiliconTrackerDigi as TrackerDigi
    
    # branches needed from simulation root file
    sim_coll = [
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
        'MCParticles',
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        'EcalEndcapNHits',
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        'EcalEndcapPHits',
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        'EcalBarrelHits',
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        'HcalBarrelHits',
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        'HcalEndcapPHits',
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        'HcalEndcapNHits',
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        'DRICHHits',
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    
    
    ecal_barrel_scfi_collections = [
        'EcalBarrelScFiHits',
        'EcalBarrelScFiHitsContributions'
    ]
    if 'athena' in detector_name:
        sim_coll += ecal_barrel_scfi_collections
    
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    forward_romanpot_collections = [
        'ForwardRomanPotHits1',
        'ForwardRomanPotHits2'
    ]
    forward_offmtracker_collections = [
        'ForwardOffMTrackerHits1',
        'ForwardOffMTrackerHits2',
        'ForwardOffMTrackerHits3',
        'ForwardOffMTrackerHits4'
    ]
    sim_coll += forward_romanpot_collections + forward_offmtracker_collections
    
    tracker_endcap_collections = [
        'TrackerEndcapHits1',
        'TrackerEndcapHits2',
        'TrackerEndcapHits3',
        'TrackerEndcapHits4',
        'TrackerEndcapHits5',
        'TrackerEndcapHits6'
    ]
    tracker_barrel_collections = [
        'TrackerBarrelHits'
    ]
    vertex_barrel_collections = [
        'VertexBarrelHits'
    ]
    gem_endcap_collections = [
        'GEMTrackerEndcapHits1',
        'GEMTrackerEndcapHits2',
        'GEMTrackerEndcapHits3'
    ]
    sim_coll += tracker_endcap_collections + tracker_barrel_collections + vertex_barrel_collections + gem_endcap_collections
    
    
    vertex_endcap_collections = [
        'VertexEndcapHits'
    ]
    mpgd_barrel_collections = [
        'MPGDTrackerBarrelHits1',
        'MPGDTrackerBarrelHits2'
    ]
    
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
    if 'acadia' in detector_version:
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
        sim_coll += vertex_endcap_collections
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        sim_coll.append('MRICHHits')
    else:
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
        sim_coll += mpgd_barrel_collections
    
    
    # list of algorithms
    algorithms = []
    
    # input
    podin = PodioInput("PodioReader", collections=sim_coll)
    algorithms.append(podin)
    
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    ffi_romanpot_coll = SimTrackerHitsCollector("ffi_romanpot_coll",
            inputSimTrackerHits = forward_romanpot_collections,
            outputSimTrackerHits = "ForwardRomanPotAllHits")
    algorithms.append(ffi_romanpot_coll)
    
    ffi_romanpot_digi = TrackerDigi("ffi_romanpot_digi",
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
            inputHitCollection = ffi_romanpot_coll.outputSimTrackerHits,
    
            outputHitCollection = "ForwardRomanPotRawHits",
            timeResolution = 8)
    algorithms.append(ffi_romanpot_digi)
    
    ## Off momentum tracker
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    ffi_offmtracker_coll = SimTrackerHitsCollector("ffi_offmtracker_coll",
            inputSimTrackerHits = forward_offmtracker_collections,
            outputSimTrackerHits = "ForwardOffMTrackerAllHits")
    algorithms.append(ffi_offmtracker_coll)
    
    ffi_offmtracker_digi = TrackerDigi("ffi_offmtracker_digi",
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
            inputHitCollection = ffi_offmtracker_coll.outputSimTrackerHits,
    
            outputHitCollection = "ForwardOffMTrackerRawHits",
            timeResolution = 8)
    algorithms.append(ffi_offmtracker_digi)
    
    ## B0 tracker
    trk_b0_digi = TrackerDigi("trk_b0_digi",
            inputHitCollection="B0TrackerHits",
            outputHitCollection="B0TrackerRawHits",
            timeResolution=8)
    algorithms.append(trk_b0_digi)
    
    
    # Crystal Endcap Ecal
    
    ce_ecal_daq = calo_daq['ecal_neg_endcap']
    
    
    ce_ecal_digi = CalHitDigi("ce_ecal_digi",
            inputHitCollection="EcalEndcapNHits",
            outputHitCollection="EcalEndcapNRawHits",
            energyResolutions=[0., 0.02, 0.],
            **ce_ecal_daq)
    algorithms.append(ce_ecal_digi)
    
    # Endcap Sampling Ecal
    
    ci_ecal_daq = calo_daq['ecal_pos_endcap']
    
    
    ci_ecal_digi = CalHitDigi("ci_ecal_digi",
            inputHitCollection="EcalEndcapPHits",
            outputHitCollection="EcalEndcapPRawHits",
            **ci_ecal_daq)
    algorithms.append(ci_ecal_digi)
    
    
    # Central Barrel Ecal
    if 'athena' in detector_name:
        # Central ECAL Imaging Calorimeter
        img_barrel_daq = calo_daq['ecal_barrel_imaging']
    
        img_barrel_digi = CalHitDigi("img_barrel_digi",
    
            inputHitCollection="EcalBarrelHits",
            outputHitCollection="EcalBarrelImagingRawHits",
            energyResolutions=[0., 0.02, 0.],   # 2% flat resolution
            **img_barrel_daq)
    
        algorithms.append(img_barrel_digi)
    
        # Central ECAL SciFi
        scfi_barrel_daq = calo_daq['ecal_barrel_scfi']
    
        scfi_barrel_digi = CalHitDigi("scfi_barrel_digi",
    
            inputHitCollection="EcalBarrelScFiHits",
            outputHitCollection="EcalBarrelScFiRawHits",
            **scfi_barrel_daq)
    
        algorithms.append(scfi_barrel_digi)
    else:
        # SciGlass calorimeter
        sciglass_ecal_daq = calo_daq['ecal_barrel_sciglass']
    
        sciglass_ecal_digi = CalHitDigi("sciglass_ecal_digi",
            inputHitCollection="EcalBarrelHits",
            outputHitCollection="EcalBarrelHitsDigi",
            energyResolutions=[0., 0.02, 0.],   # 2% flat resolution
            **sciglass_ecal_daq)
        algorithms.append(sciglass_ecal_digi)
    
    
    # Central Barrel Hcal
    
    cb_hcal_daq = calo_daq['hcal_barrel']
    
    
    cb_hcal_digi = CalHitDigi("cb_hcal_digi",
             inputHitCollection="HcalBarrelHits",
             outputHitCollection="HcalBarrelRawHits",
             **cb_hcal_daq)
    algorithms.append(cb_hcal_digi)
    
    # Hcal Hadron Endcap
    
    ci_hcal_daq = calo_daq['hcal_pos_endcap']
    
    
    ci_hcal_digi = CalHitDigi("ci_hcal_digi",
             inputHitCollection="HcalEndcapPHits",
             outputHitCollection="HcalEndcapPRawHits",
             **ci_hcal_daq)
    algorithms.append(ci_hcal_digi)
    
    # Hcal Electron Endcap
    
    ce_hcal_daq = calo_daq['hcal_neg_endcap']
    
    
    ce_hcal_digi = CalHitDigi("ce_hcal_digi",
            inputHitCollection="HcalEndcapNHits",
            outputHitCollection="HcalEndcapNRawHits",
            **ce_hcal_daq)
    algorithms.append(ce_hcal_digi)
    
    # Tracking
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    trk_b_coll = SimTrackerHitsCollector("trk_b_coll",
            inputSimTrackerHits = tracker_barrel_collections,
            outputSimTrackerHits = "TrackerBarrelAllHits")
    algorithms.append( trk_b_coll )
    
    
    trk_b_digi = TrackerDigi("trk_b_digi",
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
            inputHitCollection = trk_b_coll.outputSimTrackerHits,
            outputHitCollection = "TrackerBarrelRawHits",
    
            timeResolution=8)
    algorithms.append(trk_b_digi)
    
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    trk_ec_coll = SimTrackerHitsCollector("trk_ec_coll",
            inputSimTrackerHits = tracker_endcap_collections,
            outputSimTrackerHits = "TrackerEndcapAllHits")
    algorithms.append( trk_ec_coll )
    
    
    trk_ec_digi = TrackerDigi("trk_ec_digi",
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
            inputHitCollection = trk_ec_coll.outputSimTrackerHits,
            outputHitCollection = "TrackerEndcapRawHits",
    
            timeResolution=8)
    algorithms.append(trk_ec_digi)
    
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    vtx_b_coll = SimTrackerHitsCollector("vtx_b_coll",
            inputSimTrackerHits = vertex_barrel_collections,
            outputSimTrackerHits = "VertexBarrelAllHits")
    algorithms.append( vtx_b_coll )
    
    
    vtx_b_digi = TrackerDigi("vtx_b_digi",
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
            inputHitCollection = vtx_b_coll.outputSimTrackerHits,
            outputHitCollection = "VertexBarrelRawHits",
    
            timeResolution=8)
    algorithms.append(vtx_b_digi)
    
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
    if 'acadia' in detector_version:
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
        vtx_ec_coll = SimTrackerHitsCollector("vtx_ec_coll",
                inputSimTrackerHits = vertex_endcap_collections,
                outputSimTrackerHits = "VertexEndcapAllHits")
        algorithms.append( vtx_ec_coll )
    
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        vtx_ec_digi = TrackerDigi("vtx_ec_digi", 
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
                inputHitCollection = vtx_ec_coll.outputSimTrackerHits,
                outputHitCollection = "VertexEndcapRawHits",
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
                timeResolution=8)
        algorithms.append( vtx_ec_digi )
    else:
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
        mm_b_coll = SimTrackerHitsCollector("mm_b_coll",
                inputSimTrackerHits = mpgd_barrel_collections,
                outputSimTrackerHits = "MPGDTrackerBarrelAllHits")
        algorithms.append( mm_b_coll )
    
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
        mm_b_digi = TrackerDigi("mm_b_digi", 
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
                inputHitCollection = mm_b_coll.outputSimTrackerHits,
                outputHitCollection = "MPGDTrackerBarrelRawHits",
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
                timeResolution=8)
        algorithms.append( mm_b_digi )
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    gem_ec_coll = SimTrackerHitsCollector("gem_ec_coll",
            inputSimTrackerHits = gem_endcap_collections,
            outputSimTrackerHits = "GEMTrackerEndcapAllHits")
    algorithms.append( gem_ec_coll )
    
    
    gem_ec_digi = TrackerDigi("gem_ec_digi",
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
            inputHitCollection = gem_ec_coll.outputSimTrackerHits,
            outputHitCollection = "GEMTrackerEndcapRawHits",
    
            timeResolution=10)
    
    Wouter Deconinck's avatar
    Wouter Deconinck committed
    algorithms.append( gem_ec_digi )
    
    
    # DRICH
    drich_digi = PhotoMultiplierDigi("drich_digi",
            inputHitCollection="DRICHHits",
            outputHitCollection="DRICHRawHits",
            quantumEfficiency=[(a*units.eV, b) for a, b in qe_data])
    algorithms.append(drich_digi)
    
    # MRICH
    
    Sylvester Joosten's avatar
    Sylvester Joosten committed
    if 'acadia' in detector_version:
        mrich_digi = PhotoMultiplierDigi("mrich_digi",
                inputHitCollection="MRICHHits",
                outputHitCollection="MRICHRawHits",
                quantumEfficiency=[(a*units.eV, b) for a, b in qe_data])
        algorithms.append(mrich_digi)
    
    
    # Output
    podout = PodioOutput("out", filename=output_rec)
    podout.outputCommands = [
            "keep *",
            "drop *Hits",
            "keep *Layers",
            "keep *Clusters",
            "drop *ProtoClusters",
            "drop outputParticles",
            "drop InitTrackParams",
            ] + [
            "drop " + c for c in sim_coll
            ] + [
            "keep *RawHits"
            ]
    algorithms.append(podout)
    
    ApplicationMgr(
        TopAlg = algorithms,
        EvtSel = 'NONE',
        EvtMax = n_events,
        ExtSvc = services,
        OutputLevel = WARNING,
        AuditAlgorithms = True
     )