from Gaudi.Configuration import *
import os
  
from GaudiKernel.DataObjectHandleBase import DataObjectHandleBase
from Configurables import ApplicationMgr, EICDataSvc, PodioOutput, GeoSvc
from GaudiKernel import SystemOfUnits as units

detector_name = "topside"
if "JUGGLER_DETECTOR" in os.environ :
  detector_name = str(os.environ["JUGGLER_DETECTOR"])

if "JUGGLER_DETECTOR_PATH" in os.environ :
  detector_name = str(os.environ["JUGGLER_DETECTOR_PATH"]) + "/" + detector_name

# get sampling fraction from system environment variable, 1.0 by default
sf = 1.0
if "CB_EMCAL_SAMP_FRAC" in os.environ :
  sf = str(os.environ["CB_EMCAL_SAMP_FRAC"])

# todo add checks
input_sim_file  = str(os.environ["JUGGLER_SIM_FILE"])
output_rec_file = str(os.environ["JUGGLER_REC_FILE"])
n_events = str(os.environ["JUGGLER_N_EVENTS"])

geo_service  = GeoSvc("GeoSvc", detectors=["{}.xml".format(detector_name)])
podioevent   = EICDataSvc("EventDataSvc", inputs=[input_sim_file])

from Configurables import PodioInput
from Configurables import Jug__Base__InputCopier_dd4pod__Geant4ParticleCollection_dd4pod__Geant4ParticleCollection_ as MCCopier
from Configurables import Jug__Base__InputCopier_dd4pod__CalorimeterHitCollection_dd4pod__CalorimeterHitCollection_ as CalCopier

# from Configurables import Jug__Digi__HadronicCalDigi as HadCalorimeterDigi
from Configurables import Jug__Digi__CalorimeterHitDigi as HadCalorimeterDigi
from Configurables import Jug__Digi__EMCalorimeterDigi as EMCalorimeterDigi
from Configurables import Jug__Digi__CrystalEndcapsDigi as CrystalEndcapsDigi

from Configurables import Jug__Reco__CrystalEndcapsReco as CrystalEndcapsReco
from Configurables import Jug__Reco__EMCalReconstruction as EMCalReconstruction
# from Configurables import Jug__Reco__HCalReconstruction as HCalReconstruction
from Configurables import Jug__Reco__EcalTungstenSamplingReco as HCalReconstruction
from Configurables import Jug__Reco__CalorimeterHitsMerger as CalorimeterHitsMerger

# from Configurables import Jug__Reco__SimpleClustering as SimpleClustering
from Configurables import Jug__Reco__TopologicalCellCluster as TopoCluster
from Configurables import Jug__Reco__CalorimeterIslandCluster as IslandCluster
from Configurables import Jug__Reco__ClusterRecoCoG as RecoCoG

podioinput = PodioInput("PodioReader", collections=["mcparticles","HcalBarrelHits"], OutputLevel=DEBUG)

## copiers to get around input --> output copy bug. Note the "2" appended to the output collection.
copier = MCCopier("MCCopier", 
        inputCollection="mcparticles", 
        outputCollection="mcparticles2") 

##raw hits


calcopier = CalCopier("CalCopier", 
        inputCollection="HcalBarrelHits", 
        outputCollection="HcalBarrelHits2") 

#digitized hits

hcaldigi = HadCalorimeterDigi("hcal_barrel_digi",
         inputHitCollection="HcalBarrelHits",
         outputHitCollection="RawHcalBarrelHits",
         inputEnergyUnit=units.GeV,
         inputTimeUnit=units.ns,
         energyResolutions=[0.0, 0., 0.],
         dynamicRangeADC=50.*units.MeV,
         capacityADC=32768,
         pedestalMean=400,
         pedestalSigma=10,
         OutputLevel=DEBUG                     
         )

#reconstructed hits

hcal_reco = HCalReconstruction("hcal_reco",
        inputHitCollection="RawHcalBarrelHits",
        outputHitCollection="RecHcalBarrelHits",
        dynamicRangeADC=50.*units.MeV,
        capacityADC=32768,
        pedestalMean=400,
        pedestalSigma=10,
        thresholdFactor=5.0,
        OutputLevel=DEBUG)

#clusters
xymerger = CalorimeterHitsMerger("hcal_xy_merger",                             
          fields=["layer", "slice"],
          inputHitCollection="RecHcalBarrelHits",
          outputHitCollection="RecHcalBarrelHitsXY")

hcal_barrel_cluster = IslandCluster("hcal_barrel_cluster", 
        inputHitCollection="RecHcalBarrelHitsXY", 
        outputClusterCollection="HcalBarrelClusters",
        minClusterCenterEdep=30*units.MeV, 
        groupRange=2.0,
        OutputLevel=DEBUG)


# finalizing clustering (center-of-gravity step)

hcal_barrel_clusterreco = RecoCoG("hcal_barrel_clusterreco",
        clusterCollection="HcalBarrelClusters", 
        logWeightBase=6.2,
        samplingFraction=sf,
        OutputLevel=DEBUG) 

out = PodioOutput("out", filename=output_rec_file)

out.outputCommands = ["keep *"]

ApplicationMgr(
    TopAlg = [podioinput, copier, calcopier,
              hcaldigi,
              hcal_reco,
              xymerger,
              hcal_barrel_cluster,
              hcal_barrel_clusterreco,
              out],
    EvtSel = 'NONE',
    EvtMax   = n_events,
    ExtSvc = [podioevent],
    OutputLevel=DEBUG
 )