diff --git a/examples/analysis_example.py b/examples/analysis_example.py index ccfd2767ea..f8dd7655d1 100644 --- a/examples/analysis_example.py +++ b/examples/analysis_example.py @@ -4,9 +4,10 @@ from argparse import ArgumentParser import ROOT -import rootUtils as ut -from experimental import analysis_toolkit -from backports import tdirectory634 + +import fairship.utils.root as ut +from fairship.experimental import analysis_toolkit +from fairship.backports import tdirectory634 def main(): diff --git a/geometry/config_tester.py b/geometry/config_tester.py index b1d7b1f784..4bc86a6d95 100755 --- a/geometry/config_tester.py +++ b/geometry/config_tester.py @@ -1,10 +1,11 @@ #!/usr/bin/env python import os import json -from ShipGeoConfig import ConfigRegistry import logging import argparse +from fairship.ShipGeoConfig import ConfigRegistry + logging.info("") logger = logging.getLogger() logger.setLevel(logging.INFO) diff --git a/geometry/geometry_config.py b/geometry/geometry_config.py index dfe3db108f..9a1bd954a3 100644 --- a/geometry/geometry_config.py +++ b/geometry/geometry_config.py @@ -1,8 +1,9 @@ import os -import shipunit as u import yaml -from ShipGeoConfig import AttrDict, ConfigRegistry + +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import AttrDict, ConfigRegistry # the following params should be passed through 'ConfigRegistry.loadpy' method # nuTargetPassive = 1 #0 = with active layers, 1 = only passive diff --git a/macro/ShipAna.py b/macro/ShipAna.py index 0565955cd0..bca36d17d3 100644 --- a/macro/ShipAna.py +++ b/macro/ShipAna.py @@ -3,16 +3,18 @@ import sys import ROOT import ctypes -import rootUtils as ut -import shipunit as u -from ShipGeoConfig import ConfigRegistry, load_from_root_file -import shipRoot_conf -from backports import tdirectory634 from argparse import ArgumentParser -import decorators + +import fairship.utils.root as ut +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import ConfigRegistry +from fairship.utils.rootpy_pickler import Unpickler +from fairship.utils.root_decorators import apply_decorators +import fairship.shipRoot_conf as shipRoot_conf +from fairship.backports import tdirectory634 shipRoot_conf.configure() -decorators.apply_decorators() +apply_decorators() PDG = ROOT.TDatabasePDG.Instance() chi2CutOff = 4. @@ -47,7 +49,7 @@ dy = ShipGeo.Yheight/u.m # -----Create geometry---------------------------------------------- -import shipDet_conf +import fairship.shipDet_conf as shipDet_conf run = ROOT.FairRunSim() run.SetName("TGeant4") # Transport engine run.SetSink(ROOT.FairRootFileSink(ROOT.TMemFile('output', 'recreate'))) # Dummy output file @@ -56,7 +58,7 @@ # -----Create geometry---------------------------------------------- modules = shipDet_conf.configure(run,ShipGeo) -import geomGeant4 +import fairship.geomGeant4 as geomGeant4 if hasattr(ShipGeo.Bfield,"fieldMap"): fieldMaker = geomGeant4.addVMCFields(ShipGeo, '', True, withVirtualMC = False) else: @@ -77,7 +79,7 @@ i+=1 # prepare veto decisions -import shipVeto +import fairship.shipVeto as shipVeto veto = shipVeto.Task(sTree) vetoDets={} log={} @@ -120,7 +122,7 @@ ut.bookHist(h,'nrtracks','nr of tracks in signal selected',10,-0.5,9.5) ut.bookHist(h,'nrSBT','nr of hits in SBT',100,-0.5,99.5) -import TrackExtrapolateTool +from fairship.utils.track_extrapolate import extrapolateToPlane def VertexError(t1,t2,PosDir,CovMat,scalFac): # with improved Vx x,y resolution @@ -246,7 +248,7 @@ def checkFiducialVolume(sTree,tkey,dy): inside = True if not fiducialCut: return True fT = sTree.FitTracks[tkey] - rc,pos,mom = TrackExtrapolateTool.extrapolateToPlane(fT,ShipGeo.Bfield.z) + rc,pos,mom = extrapolateToPlane(fT,ShipGeo.Bfield.z) if not rc: return False if not dist2InnerWall(pos.X(),pos.Y(),pos.Z())>0: return False return inside @@ -637,7 +639,7 @@ def myEventLoop(n): # check extrapolation to TimeDet if exists if hasattr(ShipGeo,"TimeDet"): for fT in sTree.FitTracks: - rc,pos,mom = TrackExtrapolateTool.extrapolateToPlane(fT,ShipGeo.TimeDet.z) + rc,pos,mom = extrapolateToPlane(fT,ShipGeo.TimeDet.z) if rc: for aPoint in sTree.TimeDetPoint: h['extrapTimeDetX'].Fill(pos.X()-aPoint.GetX()) diff --git a/macro/ShipReco.py b/macro/ShipReco.py index a0d5563887..e0990434cf 100644 --- a/macro/ShipReco.py +++ b/macro/ShipReco.py @@ -17,11 +17,12 @@ def mem_monitor(): print("memory: virtual = %5.2F MB physical = %5.2F MB"%(vmsize/1.0E3,pmsize/1.0E3)) import ROOT,os,sys -import global_variables -import rootUtils as ut -import shipunit as u -import shipRoot_conf -from backports import tdirectory634 + +import fairship.core.global_variables as global_variables +import fairship.utils.root as ut +import fairship.core.shipunit as u +import fairship.shipRoot_conf as shipRoot_conf +from fairship.backports import tdirectory634 shipRoot_conf.configure() @@ -78,7 +79,9 @@ def mem_monitor(): fgeo = ROOT.TFile.Open(options.geoFile) geoMat = ROOT.genfit.TGeoMaterialInterface() # if only called in ShipDigiReco -> crash, reason unknown -from ShipGeoConfig import ConfigRegistry, load_from_root_file +from fairship.ShipGeoConfig import ConfigRegistry, load_from_root_file +from fairship.utils.rootpy_pickler import Unpickler + #load Shipgeo dictionary ShipGeo = load_from_root_file(fgeo, 'ShipGeo') @@ -91,7 +94,7 @@ def mem_monitor(): ut.bookHist(h, 'nmeas', 'nr measurments', 100, 0., 50.) ut.bookHist(h,'chi2','Chi2/DOF',100,0.,20.) -import shipDet_conf +import fairship.shipDet_conf as shipDet_conf run = ROOT.FairRunSim() run.SetName("TGeant4") # Transport engine run.SetSink(ROOT.FairRootFileSink(ROOT.TMemFile('output', 'recreate'))) # Dummy output file @@ -101,7 +104,7 @@ def mem_monitor(): modules = shipDet_conf.configure(run,ShipGeo) # run.Init() fgeo["FAIRGeom"] -import geomGeant4 +import fairship.geomGeant4 as geomGeant4 if hasattr(ShipGeo.Bfield,"fieldMap"): fieldMaker = geomGeant4.addVMCFields(ShipGeo, '', True,withVirtualMC = False) @@ -121,7 +124,7 @@ def mem_monitor(): global_variables.iEvent = 0 # import reco tasks -import shipDigiReco +import fairship.shipDigiReco as shipDigiReco SHiP = shipDigiReco.ShipDigiReco(outFile,fgeo) options.nEvents = min(SHiP.sTree.GetEntries(),options.nEvents) diff --git a/macro/checkZpositions.py b/macro/checkZpositions.py index 6c202a9240..693a40f13c 100644 --- a/macro/checkZpositions.py +++ b/macro/checkZpositions.py @@ -1,5 +1,9 @@ -import ROOT,sys -from ShipGeoConfig import load_from_root_file +import ROOT +import sys + +from fairship.ShipGeoConfig import load_from_root_file +from fairship.utils.rootpy_pickler import Unpickler + badBoys={} f1,f2 = sys.argv[1], sys.argv[2] fgeoOld=ROOT.TFile(f1) diff --git a/macro/create_field_perturbation.py b/macro/create_field_perturbation.py index 22094e74fb..7ac7918e48 100644 --- a/macro/create_field_perturbation.py +++ b/macro/create_field_perturbation.py @@ -1,13 +1,13 @@ import ROOT as r -import shipunit as u -import geomGeant4 -from ShipGeoConfig import ConfigRegistry -import shipDet_conf -import saveBasicParameters import os -import ShieldUtils from argparse import ArgumentParser +import fairship.shipunit as u +import fairship.shipDet_conf as shipDet_conf +from fairship.utils.shield import find_shield_center +from fairship.geomGeant4 import addVMCFields +from fairship.ShipGeoConfig import ConfigRegistry + globalDesigns = {'dy': 10., 'dv': 6, 'ds': 9, 'nud': 3, 'caloDesign': 3, 'strawDesign': 10} @@ -42,9 +42,9 @@ def create_csv_field_map(options): run.SetGenerator(primGen) run.SetStoreTraj(r.kFALSE) run.Init() - fieldMaker = geomGeant4.addVMCFields(ship_geo, '', True) + fieldMaker = addVMCFields(ship_geo, '', True) - field_center, shield_half_length = ShieldUtils.find_shield_center(ship_geo) + field_center, shield_half_length = find_shield_center(ship_geo) print("SHIELD ONLY: CENTER: {}, HALFLENGTH: {}, half_X: {}, half_Y: {}".format(field_center, shield_half_length, ship_geo.muShield.half_X_max, diff --git a/macro/dumpEvent.py b/macro/dumpEvent.py index 3376e8f16f..e9f76acc57 100644 --- a/macro/dumpEvent.py +++ b/macro/dumpEvent.py @@ -1,8 +1,10 @@ # example for dumping an MC event import ROOT,os,sys -import rootUtils as ut -import shipunit as u -import ShipGeoConfig + +import fairship.utils.root as ut +import fairship.core.shipunit as u +import fairship.ShipGeoConfig as ShipGeoConfig + ship_geo = ShipGeoConfig.Config().loadpy("$FAIRSHIP/geometry/geometry_config.py") PDG = ROOT.TDatabasePDG.Instance() diff --git a/macro/evd_addParticleFollower.py b/macro/evd_addParticleFollower.py index ad7bcd7c43..3056061c5c 100644 --- a/macro/evd_addParticleFollower.py +++ b/macro/evd_addParticleFollower.py @@ -1,6 +1,7 @@ import ROOT,evd_fillEnergy gEve=ROOT.gEve import eveGlobal + def execute(): if not gEve.GetViewers().FindChild('Bar Embedded Viewer side'): slot = ROOT.TEveWindow.CreateWindowInTab(gEve.GetBrowser().GetTabRight()) diff --git a/macro/evd_fillEnergy.py b/macro/evd_fillEnergy.py index 7614311646..aef877237e 100644 --- a/macro/evd_fillEnergy.py +++ b/macro/evd_fillEnergy.py @@ -1,7 +1,7 @@ import ROOT -import shipunit as u -import eveGlobal +import eveGlobal +import fairship.core.shipunit as u def collect_hits(lsOfGlobals, checked_muons): MUON = 13 diff --git a/macro/eventDisplay.py b/macro/eventDisplay.py index 1e38e03099..72e2c93492 100644 --- a/macro/eventDisplay.py +++ b/macro/eventDisplay.py @@ -1,22 +1,23 @@ -#!/usr/bin/env python -i +#!/us/bin/env python -i import ROOT import os import tkinter import atexit +from argparse import ArgumentParser +from array import array ROOT.gROOT.ProcessLine('#include "FairEventHeader.h"') # only helps if class version in FairEventHeader.h is increased -from argparse import ArgumentParser -from ShipGeoConfig import ConfigRegistry, load_from_root_file -from array import array -import shipunit as u -import shipRoot_conf -import shipDet_conf -import decorators +from fairship.ShipGeoConfig import ConfigRegistry +from fairship.utils.rootpy_pickler import Unpickler +from fairship.utils.root_decorators import apply_decorators +import fairship.core.shipunit as u +import fairship.shipRoot_conf as shipRoot_conf +import fairship.shipDet_conf as shipDet_conf shipRoot_conf.configure() -decorators.apply_decorators() +apply_decorators() def evExit(): @@ -499,7 +500,7 @@ def DrawFittedTracks(self, option=""): pid = fstate.getPDG() zs = self.z_start for i in range(self.niter): - rc, newpos, newmom = TrackExtrapolateTool.extrapolateToPlane(fT, zs) + rc, newpos, newmom = extrapolateToPlane(fT, zs) if rc: DTrack.SetNextPoint(newpos.X(), newpos.Y(), newpos.Z()) else: @@ -1180,7 +1181,11 @@ def debugStraw(n): # ----Load the default libraries------ -from basiclibs import * +from fairship.utils.basiclibs import load_basic_libs +load_basic_libs() + +# ----- Reconstruction run ------------------------------------------- +fRun = ROOT.FairRunAna() if options.geoFile: fRun.SetGeomFile(options.geoFile) @@ -1291,7 +1296,7 @@ def debugStraw(n): fM = ROOT.genfit.FieldManager.getInstance() fM.init(bfield) -import TrackExtrapolateTool +from fairship.utils.track_extrapolate import extrapolateToPlane br = gEve.GetBrowser() br.HideBottomTab() # make more space for graphics diff --git a/macro/flux_map.py b/macro/flux_map.py index 2d0224f0d6..84647c96c8 100755 --- a/macro/flux_map.py +++ b/macro/flux_map.py @@ -2,10 +2,11 @@ import argparse import numpy as np import ROOT as r -import shipunit as u -import rootUtils as ut import logger as log +import fairship.core.shipunit as u +import fairship.utils.root as ut + def main(): parser = argparse.ArgumentParser(description='Script to create flux maps.') diff --git a/macro/inspectGeant4Geo.py b/macro/inspectGeant4Geo.py index f1a5ebdff3..93baa79b61 100644 --- a/macro/inspectGeant4Geo.py +++ b/macro/inspectGeant4Geo.py @@ -1,7 +1,10 @@ import sys import ROOT -from ShipGeoConfig import load_from_root_file -import shipRoot_conf + +from fairship.ShipGeoConfig import load_from_root_file +from fairship.utils.rootpy_pickler import Unpickler +import fairship.shipRoot_conf as shipRoot_conf + shipRoot_conf.configure() fname = 'geofile_full.10.0.Pythia8-TGeant4.root' @@ -10,7 +13,7 @@ fgeo = ROOT.TFile(fname) sGeo = fgeo.Get("FAIRGeom") -import shipDet_conf +import fairship.shipDet_conf as shipDet_conf run = ROOT.FairRunSim() ShipGeo = load_from_root_file(fgeo, 'ShipGeo') modules = shipDet_conf.configure(run, ShipGeo) @@ -19,6 +22,6 @@ run.SetSink(ROOT.FairRootFileSink(ROOT.TMemFile('output', 'recreate'))) run.Init() run.Run(0) -import geomGeant4 +import fairship.geomGeant4 as geomGeant4 geomGeant4.printVMCFields() geomGeant4.printWeightsandFields() diff --git a/macro/makeCascade.py b/macro/makeCascade.py index 6f2af5321e..cab26a1d41 100644 --- a/macro/makeCascade.py +++ b/macro/makeCascade.py @@ -1,6 +1,7 @@ import ROOT,time,os,sys,random,copy,argparse from array import array -import rootUtils as ut + +import fairship.utils.root as ut ROOT.gROOT.LoadMacro("$VMCWORKDIR/gconfig/basiclibs.C") ROOT.basiclibs() diff --git a/macro/makeDecay.py b/macro/makeDecay.py index 0fc325886a..21d1456ae3 100644 --- a/macro/makeDecay.py +++ b/macro/makeDecay.py @@ -1,7 +1,9 @@ #Use Pythia8 to decay the signals (Charm/Beauty) as produced by makeCascade. #Output is an ntuple with muon/neutrinos import ROOT,time,os,sys,random,getopt -import rootUtils as ut + +import fairship.utils.root as ut + ROOT.gROOT.LoadMacro("$VMCWORKDIR/gconfig/basiclibs.C") ROOT.basiclibs() diff --git a/macro/makeGenieEvents.py b/macro/makeGenieEvents.py index 0ccff54756..53219a3810 100644 --- a/macro/makeGenieEvents.py +++ b/macro/makeGenieEvents.py @@ -36,9 +36,9 @@ from collections.abc import Mapping, Sequence from pathlib import Path +import fairship.shipRoot_conf as shipRoot_conf import ROOT # type: ignore -import shipRoot_conf -from genie_interface import ( +from fairship.utils.genie_interface import ( add_hists, generate_genie_events, get_1D_flux_name, @@ -65,6 +65,7 @@ NUPDGLIST = [16, -16, 14, -14, 12, -12] # ------------------------------ Helpers --------------------------------------- +shipRoot_conf.configure() def extract_nu_over_nubar( diff --git a/macro/mergeMbias.py b/macro/mergeMbias.py index 6b891a0d6e..c4be2257c3 100644 --- a/macro/mergeMbias.py +++ b/macro/mergeMbias.py @@ -1,7 +1,8 @@ import ROOT,os,random -import shipunit as u -import rootUtils as ut -from ShipGeoConfig import ConfigRegistry + +import fairship.core.shipunit as u +import fairship.utils.root as ut +from fairship.ShipGeoConfig import ConfigRegistry from array import array pdg = ROOT.TDatabasePDG() diff --git a/macro/runPythia8.py b/macro/runPythia8.py index 8d25f87824..3b1bde5686 100644 --- a/macro/runPythia8.py +++ b/macro/runPythia8.py @@ -1,12 +1,14 @@ import ROOT -import rootUtils as ut +from argparse import ArgumentParser from array import array + +import fairship.utils.root as ut + theSeed = 0 h = {} ROOT.gRandom.SetSeed(theSeed) ROOT.gSystem.Load("libpythia8") -from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument("-b", "--heartbeat", dest="heartbeat", type=int, help="progress report", default=10000) parser.add_argument("-n", "--pot", dest="NPoT", type=int, help="protons on target", default=1000000) diff --git a/macro/run_simEcal.py b/macro/run_simEcal.py index 71d4482e54..3b522beab7 100755 --- a/macro/run_simEcal.py +++ b/macro/run_simEcal.py @@ -1,9 +1,10 @@ #!/usr/bin/env python momentum = 1 import ROOT,os,sys,time -import shipunit as u -import shipRoot_conf -import ShipGeoConfig + +import fairship.core.shipunit as u +import fairship.shipRoot_conf as shipRoot_conf +import fairship.ShipGeoConfig as ShipGeoConfig mcEngine = "TGeant3" simEngine = "Pythia8" # "Genie" # Ntuple @@ -48,7 +49,7 @@ run.SetSink(ROOT.FairRootFileSink(outFile)) # Output file rtdb = run.GetRuntimeDb() # -----Create geometry---------------------------------------------- -import shipDet_conf +import fairship.shipDet_conf as shipDet_conf shipDet_conf.configure(run) # -----Create PrimaryGenerator-------------------------------------- primGen=ROOT.FairPrimaryGenerator() diff --git a/macro/run_simScript.py b/macro/run_simScript.py index e4c002332f..20b9af2c7b 100755 --- a/macro/run_simScript.py +++ b/macro/run_simScript.py @@ -2,14 +2,17 @@ import os import sys import ROOT - -import shipunit as u -import shipRoot_conf -import rootUtils as ut -from ShipGeoConfig import ConfigRegistry from argparse import ArgumentParser from array import array -from backports import tdirectory634 + +import fairship.core.shipunit as u +import fairship.shipRoot_conf as shipRoot_conf +import fairship.utils.root as ut +from fairship.ShipGeoConfig import ConfigRegistry +from fairship.backports import tdirectory634 +from fairship.utils.basic_parameters import save_basic_parameters +from fairship.utils.magnetic_fields import check_magnetic_fields + DownScaleDiMuon = False # Default HNL parameters @@ -320,7 +323,7 @@ # -----Create geometry---------------------------------------------- # import shipMuShield_only as shipDet_conf # special use case for an attempt to convert active shielding geometry for use with FLUKA # import shipTarget_only as shipDet_conf -import shipDet_conf +import fairship.shipDet_conf as shipDet_conf modules = shipDet_conf.configure(run,ship_geo) # -----Create PrimaryGenerator-------------------------------------- @@ -590,7 +593,7 @@ trajFilter.SetStoreSecondaries(ROOT.kTRUE) # The VMC sets the fields using the "/mcDet/setIsLocalMagField true" option in "gconfig/g4config.in" -import geomGeant4 +import fairship.geomGeant4 as geomGeant4 # geomGeant4.setMagnetField() # replaced by VMC, only has effect if /mcDet/setIsLocalMagField false @@ -624,9 +627,8 @@ # ------------------------------------------------------------------------ run.CreateGeometryFile(f"{options.outputDir}/geofile_full.{tag}.root") # save ShipGeo dictionary in geofile -import saveBasicParameters -saveBasicParameters.execute(f"{options.outputDir}/geofile_full.{tag}.root",ship_geo) +save_basic_parameters(f"{options.outputDir}/geofile_full.{tag}.root",ship_geo) # checking for overlaps if options.check_overlaps: @@ -763,11 +765,9 @@ f_output.Close() # ------------------------------------------------------------------------ -import checkMagFields - def visualizeMagFields(): - checkMagFields.run() + check_magnetic_fields() def checkOverlapsWithGeant4(): # after /run/initialize, but prints warning messages, problems with TGeo volume mygMC = ROOT.TGeant4.GetMC() diff --git a/muonDIS/make_nTuple_SBT.py b/muonDIS/make_nTuple_SBT.py index 1fa39d4e9f..f0fc39361f 100644 --- a/muonDIS/make_nTuple_SBT.py +++ b/muonDIS/make_nTuple_SBT.py @@ -7,9 +7,10 @@ import os import ROOT as r -import shipunit as u from tabulate import tabulate +import fairship.core.shipunit as u + pdg = r.TDatabasePDG.Instance() diff --git a/muonDIS/make_nTuple_Tr.py b/muonDIS/make_nTuple_Tr.py index 87d8070a28..c979f440f6 100644 --- a/muonDIS/make_nTuple_Tr.py +++ b/muonDIS/make_nTuple_Tr.py @@ -7,9 +7,10 @@ import os import ROOT as r -import shipunit as u from tabulate import tabulate +import fairship.core.shipunit as u + pdg = r.TDatabasePDG.Instance() diff --git a/muonShieldOptimization/ana_ShipMuon.py b/muonShieldOptimization/ana_ShipMuon.py index 46cb78c34f..7bc6973edb 100644 --- a/muonShieldOptimization/ana_ShipMuon.py +++ b/muonShieldOptimization/ana_ShipMuon.py @@ -1,7 +1,10 @@ # analyze muon background /media/Data/HNL/PythiaGeant4Production/pythia8_Geant4_total.root import os,ROOT import multiprocessing as mp -from ShipGeoConfig import load_from_root_file + +from fairship.ShipGeoConfig import load_from_root_file +from fairship.utils.rootpy_pickler import Unpickler + ROOT.gInterpreter.ProcessLine('typedef double Double32_t') local = False if not os.uname()[1].lower().find('ubuntu')< 0: local = True @@ -347,10 +350,10 @@ inputFile1 = inputFile inputFile2 = inputFile.replace('.root','_D.root') -import rootUtils as ut -import shipunit as u +import fairship.utils.root as ut +import fairship.core.shipunit as u PDG = ROOT.TDatabasePDG.Instance() -from ShipGeoConfig import ConfigRegistry +from fairship.ShipGeoConfig import ConfigRegistry # init geometry and mag. field if not fgeo.FindKey('ShipGeo'): # old geofile, missing Shipgeo dictionary @@ -361,7 +364,7 @@ ShipGeo = load_from_root_file(fgeo, 'ShipGeo') # -----Create geometry---------------------------------------------- -import shipDet_conf +import fairship.shipDet_conf as shipDet_conf run = ROOT.FairRunSim() modules = shipDet_conf.configure(run,ShipGeo) diff --git a/muonShieldOptimization/compactingBackgroundProduction.py b/muonShieldOptimization/compactingBackgroundProduction.py index df62744c8d..f95ace4d09 100644 --- a/muonShieldOptimization/compactingBackgroundProduction.py +++ b/muonShieldOptimization/compactingBackgroundProduction.py @@ -1,5 +1,6 @@ import os,ROOT,sys,subprocess,pickle,time,datetime -import rootUtils as ut + +import fairship.utils.root as ut pdg = ROOT.TDatabasePDG() charm = False diff --git a/muonShieldOptimization/extractMuonsAndUpdateWeight.py b/muonShieldOptimization/extractMuonsAndUpdateWeight.py index 561dab9207..46ffedef93 100644 --- a/muonShieldOptimization/extractMuonsAndUpdateWeight.py +++ b/muonShieldOptimization/extractMuonsAndUpdateWeight.py @@ -1,5 +1,7 @@ import os,ROOT -import rootUtils as ut + +import fairship.utils.root as ut + path = '/eos/experiment/ship/data/Mbias/background-prod-2018/' # functions, should extract events with muons, update weight based on process/decay and PoT diff --git a/muonShieldOptimization/extractNeutrinosAndUpdateWeight.py b/muonShieldOptimization/extractNeutrinosAndUpdateWeight.py index 17f94360fe..1a23196901 100644 --- a/muonShieldOptimization/extractNeutrinosAndUpdateWeight.py +++ b/muonShieldOptimization/extractNeutrinosAndUpdateWeight.py @@ -1,5 +1,7 @@ import os,ROOT -import rootUtils as ut + +import fairship.utils.root as ut + path = '/eos/experiment/ship/data/Mbias/background-prod-2018/' # should fill hisograms with neutrinos, for mbias, exclude neutrinos from charm @@ -22,7 +24,7 @@ # for 10GeV beauty Production 5336 Billion PoT equivalent, weight = 9.37 weightBeauty = 9.37 -import rootUtils as ut +import fairship.utils.root as ut h={} PDG = ROOT.TDatabasePDG.Instance() for idnu in range(12,17,2): diff --git a/muonShieldOptimization/g4Ex_gap.py b/muonShieldOptimization/g4Ex_gap.py index 32d777acd4..61177ea3e8 100644 --- a/muonShieldOptimization/g4Ex_gap.py +++ b/muonShieldOptimization/g4Ex_gap.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import os -import saveBasicParameters + +from fairship.utils.basic_parameters import save_basic_parameters local = False if not os.uname()[1].find('ubuntu')<0: local = True @@ -572,8 +573,7 @@ def ConstructGeom(): logger.info("output directory: %s" % work_dir) # save arguments and GIT tags -import saveBasicParameters -saveBasicParameters.execute(f,args,'SHiP-Params') +save_basic_parameters(f,args,'SHiP-Params') if local: wrld = snoopyPhys.GetMotherLogical() diff --git a/muonShieldOptimization/g4Ex_gap_mergeFiles.py b/muonShieldOptimization/g4Ex_gap_mergeFiles.py index e624610ebf..9a2f92dd84 100644 --- a/muonShieldOptimization/g4Ex_gap_mergeFiles.py +++ b/muonShieldOptimization/g4Ex_gap_mergeFiles.py @@ -11,7 +11,9 @@ import ROOT,os from array import array from ROOT import TDatabasePDG,TMath,gDirectory -from rootUtils import * + +from fairship.utils.root import * + pdg = TDatabasePDG() mu = pdg.GetParticle(13) Mmu = mu.Mass() diff --git a/muonShieldOptimization/muDIS_mergeFiles.py b/muonShieldOptimization/muDIS_mergeFiles.py index c44372d0d0..a17d551bee 100644 --- a/muonShieldOptimization/muDIS_mergeFiles.py +++ b/muonShieldOptimization/muDIS_mergeFiles.py @@ -1,5 +1,7 @@ import ROOT,os -import rootUtils as ut + +import fairship.utils.root as ut + h={} def merge(): sTree = ROOT.TChain('DIS') diff --git a/muonShieldOptimization/run_fixedTarget.py b/muonShieldOptimization/run_fixedTarget.py index 1a938e8136..f465bd534d 100644 --- a/muonShieldOptimization/run_fixedTarget.py +++ b/muonShieldOptimization/run_fixedTarget.py @@ -1,9 +1,9 @@ #!/usr/bin/env python -import ROOT,os,sys,time,shipRoot_conf -import shipunit as u -from ShipGeoConfig import ConfigRegistry from backports import tdirectory634 - +import ROOT,os,sys,time +import fairship.shipRoot_conf as shipRoot_conf +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import ConfigRegistry mcEngine = "TGeant4" simEngine = "Pythia8" @@ -220,9 +220,10 @@ def get_work_dir(run_number,tag=None): fStack = gMC.GetStack() fStack.SetMinPoints(1) fStack.SetEnergyCut(-1.) -# -import AddDiMuonDecayChannelsToG4 -AddDiMuonDecayChannelsToG4.Initialize(P8gen.GetPythia()) + + +from fairship.utils.muon_decay_channels import add_muon_decay_channels_to_g4 +add_muon_decay_channels_to_g4(P8gen.GetPythia()) # boost gamma2muon conversion if args.boostFactor > 1: diff --git a/muonShieldOptimization/run_reco.py b/muonShieldOptimization/run_reco.py index 69208525bf..ad73c004e0 100644 --- a/muonShieldOptimization/run_reco.py +++ b/muonShieldOptimization/run_reco.py @@ -1,5 +1,7 @@ import os, subprocess,ROOT,time,getpass,multiprocessing -import rootUtils as ut + +import fairship.utils.root as ut + ncores = min(multiprocessing.cpu_count(),4) user = getpass.getuser() # support for eos, assume: eosmount $HOME/eos diff --git a/muonShieldOptimization/study_GammaConv.py b/muonShieldOptimization/study_GammaConv.py index 3b949aaed6..a2afce955f 100644 --- a/muonShieldOptimization/study_GammaConv.py +++ b/muonShieldOptimization/study_GammaConv.py @@ -1,10 +1,13 @@ #!/usr/bin/env python -import ROOT,os,sys,time,shipRoot_conf +import ROOT,os,sys,time + +import fairship.shipRoot_conf as shipRoot_conf + ROOT.gROOT.ProcessLine('#include "FairModule.h"') -time.sleep(20) +time.sleep(20) # should have a comment with why -import shipunit as u -from ShipGeoConfig import ConfigRegistry +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import ConfigRegistry mcEngine = "TGeant4" runnr = 1 @@ -122,7 +125,7 @@ def makeSensitive(self,sensPlane): emP = ROOT.G4EmParameters.Instance() emP.Dump() -import rootUtils as ut +import fairship.utils.root as ut f=ROOT.gROOT.GetListOfFiles()[0] h={} diff --git a/muonShieldOptimization/study_muEloss.py b/muonShieldOptimization/study_muEloss.py index e7be4742ef..e1d634117a 100644 --- a/muonShieldOptimization/study_muEloss.py +++ b/muonShieldOptimization/study_muEloss.py @@ -1,10 +1,13 @@ #!/usr/bin/env python -import ROOT,os,sys,time,shipRoot_conf +import ROOT,os,sys,time + +import fairship.shipRoot_conf as shipRoot_conf + ROOT.gROOT.ProcessLine('#include "FairModule.h"') -time.sleep(20) +time.sleep(20) # should have a comment with why -import shipunit as u -from ShipGeoConfig import ConfigRegistry +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import ConfigRegistry mcEngine = "TGeant4" runnr = 1 @@ -41,7 +44,7 @@ theSeed = 0 ecut = 0.0 -import rootUtils as ut +import fairship.utils.root as ut h={} def run(): diff --git a/muonShieldOptimization/study_muMSC.py b/muonShieldOptimization/study_muMSC.py index efe4612507..277a5792db 100644 --- a/muonShieldOptimization/study_muMSC.py +++ b/muonShieldOptimization/study_muMSC.py @@ -1,10 +1,13 @@ #!/usr/bin/env python -import ROOT,os,sys,time,shipRoot_conf +import ROOT,os,sys,time + +import fairship.shipRoot_conf as shipRoot_conf + ROOT.gROOT.ProcessLine('#include "FairModule.h"') -time.sleep(20) +time.sleep(20) # should have a comment with why -import shipunit as u -from ShipGeoConfig import ConfigRegistry +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import ConfigRegistry mcEngine = "TGeant4" runnr = 1 @@ -108,7 +111,7 @@ def InitParContainers(): emP = ROOT.G4EmParameters.Instance() emP.Dump() -import rootUtils as ut +import fairship.utils.root as ut f=ROOT.gROOT.GetListOfFiles()[0] h={} diff --git a/muonShieldOptimization/study_thinTarget.py b/muonShieldOptimization/study_thinTarget.py index a22ce756f0..88c22d538d 100644 --- a/muonShieldOptimization/study_thinTarget.py +++ b/muonShieldOptimization/study_thinTarget.py @@ -1,10 +1,13 @@ #!/usr/bin/env python -import ROOT,os,sys,time,shipRoot_conf +import ROOT,os,sys,time + +import fairship.shipRoot_conf as shipRoot_conf + ROOT.gROOT.ProcessLine('#include "FairModule.h"') -time.sleep(20) +time.sleep(20) # should have a comment with why -import shipunit as u -from ShipGeoConfig import ConfigRegistry +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import ConfigRegistry mcEngine = "TGeant4" runnr = 1 @@ -100,7 +103,7 @@ def InitParContainers(): # -----Start Analysis--------------- -import rootUtils as ut +import fairship.utils.root as ut f=ROOT.TFile('TLV.root') pdg = ROOT.TDatabasePDG.Instance() diff --git a/python/basiclibs.py b/python/basiclibs.py deleted file mode 100644 index 8500e33c4a..0000000000 --- a/python/basiclibs.py +++ /dev/null @@ -1,16 +0,0 @@ -# Macro for loading basic libraries used with both Geant3 and Geant4 -from ROOT import gSystem -#gSystem.Load("libEventDisplay.so") -#gSystem.Load("libRIO.so") -#gSystem.Load("libGeom.so") -#gSystem.Load("libGeomPainter.so") -#gSystem.Load("libVMC.so") -#gSystem.Load("libEG.so") -gSystem.Load("libEGPythia6.so") -gSystem.Load("libPythia6.so") -#gSystem.Load("libPhysics.so") -#gSystem.Load("libNet.so") -#gSystem.Load("libTree.so") -#gSystem.Load("libMinuit.so") -#gSystem.Load("libMathMore.so") -gSystem.Load("libpythia8.so") diff --git a/python/DecaySelection.conf b/python/data/DecaySelection.conf similarity index 100% rename from python/DecaySelection.conf rename to python/data/DecaySelection.conf diff --git a/python/alpha_s.dat b/python/data/alpha_s.dat similarity index 100% rename from python/alpha_s.dat rename to python/data/alpha_s.dat diff --git a/python/darkphotonDecaySelection.conf b/python/data/darkphotonDecaySelection.conf similarity index 100% rename from python/darkphotonDecaySelection.conf rename to python/data/darkphotonDecaySelection.conf diff --git a/python/hnl_production.yaml b/python/data/hnl_production.yaml similarity index 100% rename from python/hnl_production.yaml rename to python/data/hnl_production.yaml diff --git a/python/pyproject.toml b/python/pyproject.toml new file mode 100644 index 0000000000..f45e8dbdcb --- /dev/null +++ b/python/pyproject.toml @@ -0,0 +1,18 @@ +[project] +name = "fairship" +version = "0.1.0" +description = "" +#readme = "README.md" +authors = [] +requires-python = ">=3.6" +dependencies = [] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[dependency-groups] +dev = [ + "pre-commit>=2.1.1", + "pytest>=7.0.1", +] diff --git a/python/ShipGeo.py b/python/src/fairship/ShipGeo.py similarity index 97% rename from python/ShipGeo.py rename to python/src/fairship/ShipGeo.py index d9fefed7d7..cad1e61700 100644 --- a/python/ShipGeo.py +++ b/python/src/fairship/ShipGeo.py @@ -1,5 +1,7 @@ -import shipunit as u import ROOT + +import fairship.core.shipunit as u + fDesign = 2 class ShipGeo(): def __init__(self,z=0): diff --git a/python/ShipGeoConfig.py b/python/src/fairship/ShipGeoConfig.py similarity index 100% rename from python/ShipGeoConfig.py rename to python/src/fairship/ShipGeoConfig.py diff --git a/python/global_variables.py b/python/src/fairship/__init__.py similarity index 100% rename from python/global_variables.py rename to python/src/fairship/__init__.py diff --git a/python/src/fairship/backports/__init__.py b/python/src/fairship/backports/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/python/backports/tdirectory634.py b/python/src/fairship/backports/tdirectory634.py similarity index 100% rename from python/backports/tdirectory634.py rename to python/src/fairship/backports/tdirectory634.py diff --git a/python/src/fairship/branching/__init__.py b/python/src/fairship/branching/__init__.py new file mode 100644 index 0000000000..a3470ca10e --- /dev/null +++ b/python/src/fairship/branching/__init__.py @@ -0,0 +1,3 @@ +""" +Module with classes to compute lifetimes and branching ratios. +""" diff --git a/python/darkphoton.py b/python/src/fairship/branching/darkphoton.py similarity index 95% rename from python/darkphoton.py rename to python/src/fairship/branching/darkphoton.py index 0661114551..2822a1097d 100644 --- a/python/darkphoton.py +++ b/python/src/fairship/branching/darkphoton.py @@ -1,11 +1,10 @@ import math import os -import ROOT as r +import ROOT -#from settings import * -#from functions import * -from hnl import mass -from hnl import PDGname +#from fairship.settings import * +#from fairship.functions import * +from fairship.branching.hnl import mass, PDGName # constants alphaQED = 1./137. @@ -26,8 +25,8 @@ def __init__(self, mass, eps): def readPDGtable(self): """ Returns R data from PDG in a easy to use format """ - ecm=r.vector('double')() - ratio=r.vector('double')() + ecm=ROOT.vector('double')() + ratio=ROOT.vector('double')() """ecm,ratio = [],[]""" with open(os.path.expandvars('$FAIRSHIP/input/rpp2012-hadronicrpp_page1001.dat')) as f: for line in f: @@ -54,7 +53,7 @@ def readPDGtable(self): def interpolatePDGtable(self): """ Find the best value for R for the given center-of-mass energy """ - fun = r.Math.Interpolator(self.dataEcm.size(),r.Math.Interpolation.kLINEAR) + fun = ROOT.Math.Interpolator(self.dataEcm.size(),ROOT.Math.Interpolation.kLINEAR) fun.SetData(self.dataEcm,self.dataR); return fun diff --git a/python/hnl.py b/python/src/fairship/branching/hnl.py similarity index 96% rename from python/hnl.py rename to python/src/fairship/branching/hnl.py index aea0db58a5..ea1364ccfb 100644 --- a/python/hnl.py +++ b/python/src/fairship/branching/hnl.py @@ -1,34 +1,32 @@ """ -# ================================================================== -# Python module -# -# This module provides methods to compute the lifetime and -# branching ratio of HNLs given its mass and couplings as -# input parameters. -# -# Created: 30/11/2014 Elena Graverini (elena.graverini@cern.ch) -# -# Updated: 07/10/2017 Kyrylo Bondarenko (bondarenko@lorentz.leidenuniv.nl) -# -# Sample usage: -# ipython -i hnl.py -# In [1]: b = HNL(1.,[1.e-8, 2.e-8, 1.e-9],True) -# HNLbranchings instance initialized with couplings: -# U2e = 1e-08 -# U2mu = 2e-08 -# U2tau = 1e-09 -# and mass: -# m = 1.0 GeV -# In [2]: b.computeNLifetime() -# Out[2]: 4.777721453160521e-05 -# In [3]: b.findBranchingRatio('N -> pi mu') -# Out[3]: 0.11826749348890987 -# -# ================================================================== +This module provides methods to compute the lifetime and +branching ratio of HNLs given its mass and couplings as +input parameters. + +Created: 30/11/2014 Elena Graverini (elena.graverini@cern.ch) + +Updated: 07/10/2017 Kyrylo Bondarenko (bondarenko@lorentz.leidenuniv.nl) + +Sample usage: + ipython -i hnl.py + In [1]: b = HNL(1.,[1.e-8, 2.e-8, 1.e-9],True) + HNLbranchings instance initialized with couplings: + U2e = 1e-08 + U2mu = 2e-08 + U2tau = 1e-09 + and mass: + m = 1.0 GeV + In [2]: b.computeNLifetime() + Out[2]: 4.777721453160521e-05 + In [3]: b.findBranchingRatio('N -> pi mu') + Out[3]: 0.11826749348890987 """ + import math -import ROOT, os -import shipunit as u +import os +import ROOT + +import fairship.core.shipunit as u # Load PDG database pdg = ROOT.TDatabasePDG.Instance() @@ -191,7 +189,7 @@ def QCD_correction(self): """ Returns 3-loops QCD correction to HNL decay width into quarks """ - alpha_s = ROOT.TGraph( os.path.expandvars('$FAIRSHIP/python/alpha_s.dat') ) + alpha_s = ROOT.TGraph( os.path.expandvars('$FAIRSHIP/python/data/alpha_s.dat') ) a_s = alpha_s.Eval(self.MN) qcd_corr = a_s / math.pi qcd_corr += 5.2 * (a_s / math.pi)**2. @@ -599,8 +597,6 @@ def allowedChannels(self): return allowedDecays - - class HNL(HNLbranchings): """ HNL physics according to the nuMSM diff --git a/python/rpvsusy.py b/python/src/fairship/branching/rpvsusy.py similarity index 94% rename from python/rpvsusy.py rename to python/src/fairship/branching/rpvsusy.py index 106e9b84ec..daa0dde80d 100644 --- a/python/rpvsusy.py +++ b/python/src/fairship/branching/rpvsusy.py @@ -1,37 +1,33 @@ r""" -# ================================================================== -# Python module -# -# This module provides methods to compute the lifetime and -# branching ratio of SUSY RPV neutralino given its mass and couplings as -# input parameters. -# -# Created: 30/04/2016 Konstantinos A. Petridis (konstantinos.petridis@cern.ch) -# -# Sample usage: -# ipython -i rpvsusy.py -# In [1]: b = RPVSYSY(1.,[1, 1],1e3,1,True) -# HNLbranchings instance initialized with couplings: -# \lambda_{production} = 1GeV -# \lambda_{decay} = 1GeV -# universal sfermion mass = 1e3GeV -# -# benchmark scenario: -# 1 (values between 1 and 5) -# and mass: -# m = 1.0 GeV -# In [2]: b.computeNLifetime() -# Out[2]: 0.0219634078804 -# In [3]: b.findBranchingRatio('N -> K+ mu-') -# Out[3]: 0.11826749348890987 -# -# ================================================================== +This module provides methods to compute the lifetime and +branching ratio of SUSY RPV neutralino given its mass and couplings as +input parameters. + +Created: 30/04/2016 Konstantinos A. Petridis (konstantinos.petridis@cern.ch) + +Sample usage: + ipython -i rpvsusy.py + In [1]: b = RPVSYSY(1.,[1, 1],1e3,1,True) + HNLbranchings instance initialized with couplings: + \lambda_{production} = 1GeV + \lambda_{decay} = 1GeV + universal sfermion mass = 1e3GeV + + benchmark scenario: + 1 (values between 1 and 5) + and mass: + m = 1.0 GeV + In [2]: b.computeNLifetime() + Out[2]: 0.0219634078804 + In [3]: b.findBranchingRatio('N -> K+ mu-') + Out[3]: 0.11826749348890987 """ import re import math import ROOT -import shipunit as u + +import fairship.core.shipunit as u # Load PDG database pdg = ROOT.TDatabasePDG.Instance() diff --git a/python/src/fairship/configure/__init__.py b/python/src/fairship/configure/__init__.py new file mode 100644 index 0000000000..86c64c64eb --- /dev/null +++ b/python/src/fairship/configure/__init__.py @@ -0,0 +1 @@ +"""Module to manage setup of other software stacks for fairship usage.""" diff --git a/python/CMBG_conf.py b/python/src/fairship/configure/cmbg.py similarity index 93% rename from python/CMBG_conf.py rename to python/src/fairship/configure/cmbg.py index 4f27dfb898..f5f333a82d 100644 --- a/python/CMBG_conf.py +++ b/python/src/fairship/configure/cmbg.py @@ -1,5 +1,7 @@ -import ROOT, os -import shipunit as u +import os +import ROOT + +import fairship.core.shipunit as u def configure(CMBG, ship_geo): #handles external variables for the Cosmic Muon Background Generator within FairShip diff --git a/python/configGenieGenerator.py b/python/src/fairship/configure/genie_generator.py similarity index 99% rename from python/configGenieGenerator.py rename to python/src/fairship/configure/genie_generator.py index f356e1a82b..d91f410caf 100644 --- a/python/configGenieGenerator.py +++ b/python/src/fairship/configure/genie_generator.py @@ -1,4 +1,5 @@ import ROOT + # configure the GenieGenerator def config(GenieGen): fGeo = ROOT.gGeoManager diff --git a/python/pythia8_conf.py b/python/src/fairship/configure/pythia8.py similarity index 95% rename from python/pythia8_conf.py rename to python/src/fairship/configure/pythia8.py index ef5442b4a6..d54b8b40ab 100644 --- a/python/pythia8_conf.py +++ b/python/src/fairship/configure/pythia8.py @@ -1,12 +1,13 @@ import ROOT import os import yaml -import shipunit as u -import hnl -import rpvsusy -from pythia8_conf_utils import * -from method_logger import MethodLogger -import readDecayTable + +from fairship.utils.pythia8 import * +from fairship.core.method_logger import MethodLogger +from fairship.utils.decay_table import addHNLdecayChannels +from fairship.branching.hnl import HNL +from fairship.branching.rpvsusy import RPVSUSY +import fairship.core.shipunit as u def configurerpvsusy(P8gen, mass, couplings, sfermionmass, benchmark, inclusive, deepCopy=False, debug=True): # configure pythia8 for Ship usage @@ -29,7 +30,7 @@ def configurerpvsusy(P8gen, mass, couplings, sfermionmass, benchmark, inclusive, if inclusive=="c": P8gen.SetParameters("HardQCD::hardccbar = on") # add RPVSUSY - rpvsusy_instance = rpvsusy.RPVSUSY(mass, couplings, sfermionmass, benchmark, debug=True) + rpvsusy_instance = RPVSUSY(mass, couplings, sfermionmass, benchmark, debug=True) ctau = rpvsusy_instance.computeNLifetime(system="FairShip") * u.c_light * u.cm print("RPVSUSY ctau ",ctau) P8gen.SetParameters(f"9900015:new = N2 N2 2 0 0 {mass:.12} 0.0 0.0 0.0 {ctau/u.mm:.12} 0 1 0 1 0") @@ -80,7 +81,7 @@ def configurerpvsusy(P8gen, mass, couplings, sfermionmass, benchmark, inclusive, if inclusive=="b": P8gen.SetParameters("HardQCD::hardbbbar = on") # add RPVSUSY - rpvsusy_instance = rpvsusy.RPVSUSY(mass, couplings, sfermionmass, benchmark, debug=True) + rpvsusy_instance = RPVSUSY(mass, couplings, sfermionmass, benchmark, debug=True) ctau = rpvsusy_instance.computeNLifetime(system="FairShip") * u.c_light * u.cm P8gen.SetParameters(f"9900015:new = N2 N2 2 0 0 {mass:.12} 0.0 0.0 0.0 {ctau/u.mm:.12} 0 1 0 1 0") P8gen.SetParameters("9900015:isResonance = false") @@ -269,13 +270,13 @@ def configure(P8gen, mass, production_couplings, decay_couplings, process_select def add_hnl(P8gen, mass, decay_couplings): "Adds the HNL to Pythia and ROOT" - hnl_instance = hnl.HNL(mass, decay_couplings, debug=True) + hnl_instance = HNL(mass, decay_couplings, debug=True) ctau = hnl_instance.computeNLifetime(system="FairShip") * u.c_light * u.cm print(f"HNL ctau {ctau}") P8gen.SetParameters(f"9900015:new = N2 N2 2 0 0 {mass:.12} 0.0 0.0 0.0 {ctau/u.mm:.12} 0 1 0 1 0") P8gen.SetParameters("9900015:isResonance = false") # Configuring decay modes... - readDecayTable.addHNLdecayChannels(P8gen, hnl_instance, conffile=os.path.expandvars('$FAIRSHIP/python/DecaySelection.conf'), verbose=False) + addHNLdecayChannels(P8gen, hnl_instance, conffile=os.path.expandvars('$FAIRSHIP/python/DecaySelection.conf'), verbose=False) # Finish HNL setup... P8gen.SetParameters("9900015:mayDecay = on") P8gen.SetHNLId(9900015) diff --git a/python/pythia8darkphoton_conf.py b/python/src/fairship/configure/pythia8_darkphoton.py similarity index 93% rename from python/pythia8darkphoton_conf.py rename to python/src/fairship/configure/pythia8_darkphoton.py index 3c8ca885d6..c0e960bfa2 100644 --- a/python/pythia8darkphoton_conf.py +++ b/python/src/fairship/configure/pythia8_darkphoton.py @@ -1,9 +1,12 @@ -import ROOT, os, sys -import shipunit as u -import readDecayTable -import darkphoton -import proton_bremsstrahlung -from method_logger import MethodLogger +import ROOT +import os +import sys + +from fairship.utils.decay_table import addDarkPhotondecayChannels +from fairship.branching.darkphoton import DarkPhoton +from fairship.core.method_logger import MethodLogger +import fairship.core.shipunit as u +import fairship.proton_bremsstrahlung as proton_bremsstrahlung # Boundaries for production in meson decays # mass of the mesons @@ -145,7 +148,7 @@ def configure(P8gen, mass, epsilon, inclusive, motherMode, deepCopy=False, debug P8gen.SetPbrem(proton_bremsstrahlung.hProdPDF(mass, epsilon, norm, 350, 1500)) #Define dark photon - DP_instance = darkphoton.DarkPhoton(mass,epsilon) + DP_instance = DarkPhoton(mass,epsilon) ctau = DP_instance.cTau() print('ctau p8dpconf file =%3.6f cm'%ctau) print('Initial particle parameters for PDGID %d :'%P8gen.GetDPId()) @@ -173,7 +176,7 @@ def configure(P8gen, mass, epsilon, inclusive, motherMode, deepCopy=False, debug P8gen.SetParameters("Next:numberCount = 0") # Configuring decay modes... - readDecayTable.addDarkPhotondecayChannels(P8gen, mass, DP_instance, conffile=os.path.expandvars('$FAIRSHIP/python/darkphotonDecaySelection.conf'), verbose=True) + addDarkPhotondecayChannels(P8gen, mass, DP_instance, conffile=os.path.expandvars('$FAIRSHIP/python/darkphotonDecaySelection.conf'), verbose=True) # Finish DP setup... P8gen.SetParameters(f"{P8gen.GetDPId()}:mayDecay = on") #P8gen.SetDPId(P8gen.GetDPId()) diff --git a/python/src/fairship/core/__init__.py b/python/src/fairship/core/__init__.py new file mode 100644 index 0000000000..c52d55d981 --- /dev/null +++ b/python/src/fairship/core/__init__.py @@ -0,0 +1,5 @@ +""" +Module with core types, variables and functions. + +These are reused frequently throughout fairship project. +""" diff --git a/python/src/fairship/core/global_variables.py b/python/src/fairship/core/global_variables.py new file mode 100644 index 0000000000..644fafa66a --- /dev/null +++ b/python/src/fairship/core/global_variables.py @@ -0,0 +1,20 @@ +""" +Module with global variables reused across the project. + +An antipattern, but useful to set quick changes here and there. +Should be swapped out for a proper settings structure, for example +pydantic: https://docs.pydantic.dev/latest/concepts/pydantic_settings/ +""" + +debug = False +h = dict() +modules = dict() +ShipGeo = None +EcalDebugDraw = None +ecalGeoFile = None +fieldMaker = None +pidProton = None +realPR = None +vertexing = None +withNoStrawSmearing = None +withT0 = None diff --git a/python/hepunit.py b/python/src/fairship/core/hepunit.py similarity index 91% rename from python/hepunit.py rename to python/src/fairship/core/hepunit.py index f59477da56..006128f642 100644 --- a/python/hepunit.py +++ b/python/src/fairship/core/hepunit.py @@ -1,19 +1,13 @@ """ -# ================================================================== -# Python module -# -# This module defines physical units and constants used in HEP, -# which are imported from CLHEP library. -# -# Q, 2005 -# ================================================================== -""" -#$Id: hepunit.py 66892 2013-01-17 10:57:59Z gunter $ +This module defines physical units and constants used in HEP, +which are imported from CLHEP library. +Q, 2005 -# ================================================================== -# imported from "SystemOfUnits.h" -# ================================================================== +$Id: hepunit.py 66892 2013-01-17 10:57:59Z gunter $ + +imported from "SystemOfUnits.h" +""" millimeter = 1. millimeter2 = millimeter*millimeter millimeter3 = millimeter*millimeter*millimeter diff --git a/python/logger.py b/python/src/fairship/core/logger.py similarity index 100% rename from python/logger.py rename to python/src/fairship/core/logger.py diff --git a/python/method_logger.py b/python/src/fairship/core/method_logger.py similarity index 100% rename from python/method_logger.py rename to python/src/fairship/core/method_logger.py diff --git a/python/shipunit.py b/python/src/fairship/core/shipunit.py similarity index 90% rename from python/shipunit.py rename to python/src/fairship/core/shipunit.py index ee74cbbc1c..f1063d5192 100644 --- a/python/shipunit.py +++ b/python/src/fairship/core/shipunit.py @@ -1,20 +1,17 @@ """ -# ================================================================== -# Python module -# -# This module defines physical units and constants used in HEP, -# which are imported from CLHEP library, matched to be used for -# FAIROOT -# centimeter = 1 -# GeV = 1 -# Q, 2005 -# ================================================================== +This module defines physical units and constants used in HEP, which are imported +from CLHEP library, matched to be used for FAIROOT. + +centimeter = 1 +GeV = 1 + +Q, 2005 + +$Id: hepunit.py 66892 2013-01-17 10:57:59Z gunter $ + +Units imported from "SystemOfUnits.h". """ -#$Id: hepunit.py 66892 2013-01-17 10:57:59Z gunter $ -# ================================================================== -# imported from "SystemOfUnits.h" -# ================================================================== millimeter = 1./10. # TR 1. millimeter2 = millimeter*millimeter millimeter3 = millimeter*millimeter*millimeter diff --git a/python/detectors/MTCDetector.py b/python/src/fairship/detectors/MTCDetector.py similarity index 97% rename from python/detectors/MTCDetector.py rename to python/src/fairship/detectors/MTCDetector.py index ac6c0295ca..3f6769b67d 100644 --- a/python/detectors/MTCDetector.py +++ b/python/src/fairship/detectors/MTCDetector.py @@ -1,7 +1,7 @@ import ROOT -import global_variables -from BaseDetector import BaseDetector -import SciFiMapping +import fairship.global_variables as global_variables +from fairship.detectors import BaseDetector +import fairship.SciFiMapping class MTCDetector(BaseDetector): def __init__(self, name, intree, branchType = 'TClonesArray', branchName = None): diff --git a/python/detectors/SBTDetector.py b/python/src/fairship/detectors/SBTDetector.py similarity index 94% rename from python/detectors/SBTDetector.py rename to python/src/fairship/detectors/SBTDetector.py index 92df9cecb1..5a492747b1 100644 --- a/python/detectors/SBTDetector.py +++ b/python/src/fairship/detectors/SBTDetector.py @@ -1,6 +1,6 @@ import ROOT -import global_variables -from BaseDetector import BaseDetector +import fairship.global_variables as global_variables +from fairship.detectors import BaseDetector class SBTDetector(BaseDetector): diff --git a/python/detectors/UpstreamTaggerDetector.py b/python/src/fairship/detectors/UpstreamTaggerDetector.py similarity index 86% rename from python/detectors/UpstreamTaggerDetector.py rename to python/src/fairship/detectors/UpstreamTaggerDetector.py index bdc622b8b2..746e44a5c9 100644 --- a/python/detectors/UpstreamTaggerDetector.py +++ b/python/src/fairship/detectors/UpstreamTaggerDetector.py @@ -1,6 +1,6 @@ import ROOT -import global_variables -from BaseDetector import BaseDetector +import fairship.global_variables as global_variables +from fairship.detectors import BaseDetector class UpstreamTaggerDetector(BaseDetector): diff --git a/python/BaseDetector.py b/python/src/fairship/detectors/__init__.py similarity index 100% rename from python/BaseDetector.py rename to python/src/fairship/detectors/__init__.py diff --git a/python/detectors/muonDetector.py b/python/src/fairship/detectors/muonDetector.py similarity index 89% rename from python/detectors/muonDetector.py rename to python/src/fairship/detectors/muonDetector.py index e7aa666922..e562e98fbe 100644 --- a/python/detectors/muonDetector.py +++ b/python/src/fairship/detectors/muonDetector.py @@ -1,6 +1,6 @@ import ROOT -import global_variables -from BaseDetector import BaseDetector +import fairship.global_variables as global_variables +from fairship.detectors import BaseDetector class muonDetector(BaseDetector): diff --git a/python/detectors/timeDetector.py b/python/src/fairship/detectors/timeDetector.py similarity index 91% rename from python/detectors/timeDetector.py rename to python/src/fairship/detectors/timeDetector.py index 369281be22..a660b65764 100644 --- a/python/detectors/timeDetector.py +++ b/python/src/fairship/detectors/timeDetector.py @@ -1,6 +1,6 @@ import ROOT -import global_variables -from BaseDetector import BaseDetector +import fairship.global_variables as global_variables +from fairship.detectors import BaseDetector class timeDetector(BaseDetector): def __init__(self, name, intree): diff --git a/python/dpProductionRates.py b/python/src/fairship/dpProductionRates.py similarity index 96% rename from python/dpProductionRates.py rename to python/src/fairship/dpProductionRates.py index 36cef65c01..4c4a9ccde5 100644 --- a/python/dpProductionRates.py +++ b/python/src/fairship/dpProductionRates.py @@ -1,6 +1,10 @@ -import ROOT,os,sys,math -import shipunit as u -import proton_bremsstrahlung +import ROOT +import os +import sys +import math + +import fairship.core.shipunit as u +import fairship.proton_bremsstrahlung as proton_bremsstrahlung PDG = ROOT.TDatabasePDG.Instance() diff --git a/python/experimental/__init__.py b/python/src/fairship/experimental/__init__.py similarity index 100% rename from python/experimental/__init__.py rename to python/src/fairship/experimental/__init__.py diff --git a/python/experimental/analysis_toolkit.py b/python/src/fairship/experimental/analysis_toolkit.py similarity index 98% rename from python/experimental/analysis_toolkit.py rename to python/src/fairship/experimental/analysis_toolkit.py index 661738e8f9..4a0f731132 100644 --- a/python/experimental/analysis_toolkit.py +++ b/python/src/fairship/experimental/analysis_toolkit.py @@ -2,12 +2,12 @@ """Toolkit for Analysis.""" import numpy as np -import pythia8_conf import ROOT -import shipunit as u import yaml -from ShipGeoConfig import AttrDict, load_from_root_file +from fairship.ShipGeoConfig import AttrDict, load_from_root_file from tabulate import tabulate +import fairship.core.shipunit as u +from fairship.configure.pythia8 import addHNLtoROOT class selection_check: @@ -326,7 +326,7 @@ class event_inspector: def __init__(self): """Initialize ROOT PDG database.""" self.pdg = ROOT.TDatabasePDG.Instance() - pythia8_conf.addHNLtoROOT() + addHNLtoROOT() def dump_event(self, event, mom_threshold=0): """Dump the MCtruth of the event.""" diff --git a/python/experimental/check_overlaps.py b/python/src/fairship/experimental/check_overlaps.py similarity index 100% rename from python/experimental/check_overlaps.py rename to python/src/fairship/experimental/check_overlaps.py diff --git a/python/experimental/compare_histograms.py b/python/src/fairship/experimental/compare_histograms.py similarity index 100% rename from python/experimental/compare_histograms.py rename to python/src/fairship/experimental/compare_histograms.py diff --git a/python/geomGeant4.py b/python/src/fairship/geomGeant4.py similarity index 98% rename from python/geomGeant4.py rename to python/src/fairship/geomGeant4.py index afa3a47f7e..325363a4ce 100644 --- a/python/geomGeant4.py +++ b/python/src/fairship/geomGeant4.py @@ -1,8 +1,10 @@ -import shipunit as u from array import array -import hepunit as G4Unit -import ShieldUtils import ROOT + +from fairship.utils.shield import find_shield_center +import fairship.core.shipunit as u +import fairship.core.hepunit as G4Unit + ROOT.gROOT.ProcessLine('#include "Geant4/G4TransportationManager.hh"') ROOT.gROOT.ProcessLine('#include "Geant4/G4FieldManager.hh"') ROOT.gROOT.ProcessLine('#include "Geant4/G4UIterminal.hh"') @@ -157,7 +159,7 @@ def addVMCFields(shipGeo, controlFile = '', verbose = False, withVirtualMC = Tru fieldsList.append('HadronAbsorberMap') if not shipGeo.muShield.WithConstField: - field_center, _ = ShieldUtils.find_shield_center(shipGeo) + field_center, _ = find_shield_center(shipGeo) fieldMaker.defineFieldMap('muonShieldField', 'files/MuonShieldField.root', ROOT.TVector3(0.0, 0.0, field_center), ROOT.TVector3(0.0, 0.0, 0.0), True) fieldsList.append('muonShieldField') diff --git a/python/proton_bremsstrahlung.py b/python/src/fairship/proton_bremsstrahlung.py similarity index 95% rename from python/proton_bremsstrahlung.py rename to python/src/fairship/proton_bremsstrahlung.py index 3c1af767be..b50c68db58 100644 --- a/python/proton_bremsstrahlung.py +++ b/python/src/fairship/proton_bremsstrahlung.py @@ -1,10 +1,11 @@ import numpy as np -import ROOT as r +import ROOT import math -import os,sys +import os +import sys from scipy.integrate import quad, dblquad -from darkphoton import * +from fairship.branching.darkphoton import alphaQED # proton mass mProton = 0.938272081 # GeV/c - PDG2016 @@ -167,16 +168,16 @@ def hProdPDF(mDarkPhoton, epsilon, norm, binsp, binstheta, tmin = -0.5 * math.pi anglestep = 2.*(tmax - tmin)/binstheta momentumStep = (pMax(mDarkPhoton)-pMin(mDarkPhoton))/(binsp-1) momenta = np.linspace(pMin(mDarkPhoton),pMax(mDarkPhoton),binsp,endpoint=False).tolist() - hPDF = r.TH2F("hPDF_eps%s_m%s"%(epsilon,mDarkPhoton) ,"hPDF_eps%s_m%s"%(epsilon,mDarkPhoton), + hPDF = ROOT.TH2F("hPDF_eps%s_m%s"%(epsilon,mDarkPhoton) ,"hPDF_eps%s_m%s"%(epsilon,mDarkPhoton), binsp,pMin(mDarkPhoton)-0.5*momentumStep,pMax(mDarkPhoton)-0.5*momentumStep, binstheta,tmin-0.5*anglestep,tmax-0.5*anglestep) hPDF.SetTitle("PDF for A' production (m_{A'}=%s GeV, #epsilon =%s)"%(mDarkPhoton,epsilon)) hPDF.GetXaxis().SetTitle("P_{A'} [GeV]") hPDF.GetYaxis().SetTitle("#theta_{A'} [rad]") - hPDFtheta = r.TH1F("hPDFtheta_eps%s_m%s"%(epsilon,mDarkPhoton), + hPDFtheta = ROOT.TH1F("hPDFtheta_eps%s_m%s"%(epsilon,mDarkPhoton), "hPDFtheta_eps%s_m%s"%(epsilon,mDarkPhoton), binstheta,tmin-0.5*anglestep,tmax-0.5*anglestep) - hPDFp = r.TH1F("hPDFp_eps%s_m%s"%(epsilon,mDarkPhoton), + hPDFp = ROOT.TH1F("hPDFp_eps%s_m%s"%(epsilon,mDarkPhoton), "hPDFp_eps%s_m%s"%(epsilon,mDarkPhoton), binsp,pMin(mDarkPhoton)-0.5*momentumStep,pMax(mDarkPhoton)-0.5*momentumStep) hPDFp.GetXaxis().SetTitle("P_{A'} [GeV]") @@ -188,7 +189,7 @@ def hProdPDF(mDarkPhoton, epsilon, norm, binsp, binstheta, tmin = -0.5 * math.pi hPDFtheta.Fill(theta,w) hPDFp.Fill(p,w) hPdfFilename = sys.modules['__main__'].options.outputDir+"/ParaPhoton_eps%s_m%s%s.root"%(epsilon,mDarkPhoton,suffix) - outfile = r.TFile(hPdfFilename,"recreate") + outfile = ROOT.TFile(hPdfFilename,"recreate") #weight = hPDF.Integral("width") #print "Weight = %3.3f"%weight #hPDF.Scale(1./weight) diff --git a/python/SciFiMapping.py b/python/src/fairship/scifi_mapping.py similarity index 99% rename from python/SciFiMapping.py rename to python/src/fairship/scifi_mapping.py index efa1c4200c..64425b5b54 100644 --- a/python/SciFiMapping.py +++ b/python/src/fairship/scifi_mapping.py @@ -1,13 +1,14 @@ """Mapping between detector modules and SciFi channels.""" import argparse - -import matplotlib.patches as patches -import matplotlib.pyplot as plt import numpy as np +import matplotlib.pyplot as plt +import matplotlib.patches as patches import ROOT -import shipDet_conf -from ShipGeoConfig import load_from_root_file + +import fairship.shipDet_conf as shipDet_conf +from fairship.ShipGeoConfig import load_from_root_file +from fairship.utils.rootpy_pickler import Unpickler class SciFiMapping: diff --git a/python/PythiaList.py b/python/src/fairship/scripts/PythiaList.py similarity index 100% rename from python/PythiaList.py rename to python/src/fairship/scripts/PythiaList.py diff --git a/python/TTCluster.py b/python/src/fairship/scripts/TTCluster.py similarity index 99% rename from python/TTCluster.py rename to python/src/fairship/scripts/TTCluster.py index bb43fc12e9..37a4c2a8ca 100644 --- a/python/TTCluster.py +++ b/python/src/fairship/scripts/TTCluster.py @@ -1,14 +1,14 @@ #!/usr/bin/python import ROOT +from ROOT.TMath import Landau, Gaus, Poisson import numpy as np import math from math import exp, sqrt, log, ceil import random import matplotlib.pyplot as plt -from ROOT.TMath import Landau, Gaus, Poisson -from ShipGeoConfig import ConfigRegistry +from fairship.ShipGeoConfig import ConfigRegistry ##################################################### ########## GLOBAL VALUES AND PARAMETERS ############ diff --git a/python/src/fairship/scripts/__init__.py b/python/src/fairship/scripts/__init__.py new file mode 100644 index 0000000000..832ed4631b --- /dev/null +++ b/python/src/fairship/scripts/__init__.py @@ -0,0 +1,9 @@ +""" +Module with python scripts intended to be run directly. + +Created as a transition before moving the scripts into a better structure. +Ideally scripts should be defined as functions, and then added to pyproject.toml +as console_scripts: + +https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#creating-executable-scripts +""" diff --git a/python/goliath2root.py b/python/src/fairship/scripts/goliath2root.py similarity index 86% rename from python/goliath2root.py rename to python/src/fairship/scripts/goliath2root.py index 259b5ee497..7230aff8df 100644 --- a/python/goliath2root.py +++ b/python/src/fairship/scripts/goliath2root.py @@ -2,11 +2,13 @@ # file to convert goliath fieldmap text file to root # EvH 11/4/2018 +import ROOT +import os +import sys -import ROOT,os,sys -import rootUtils as ut -import shipunit as u -import shipRoot_conf +import fairship.utils.root as ut +import fairship.core.shipunit as u +import fairship.shipRoot_conf as shipRoot_conf h={} # new limits x: -1118.6, 1241.4 (59); y: -411.40, 768.60 (20); z: -2512.7, 2537.3 (101) diff --git a/python/shipStrawTracking.py b/python/src/fairship/scripts/shipStrawTracking.py similarity index 98% rename from python/shipStrawTracking.py rename to python/src/fairship/scripts/shipStrawTracking.py index 287e26fdb2..f6cadc9430 100644 --- a/python/shipStrawTracking.py +++ b/python/src/fairship/scripts/shipStrawTracking.py @@ -2,18 +2,18 @@ import ROOT import numpy +import math from argparse import ArgumentParser # For ShipGeo -from ShipGeoConfig import ConfigRegistry, load_from_root_file +from fairship.ShipGeoConfig import ConfigRegistry, load_from_root_file +from fairship.utils.rootpy_pickler import Unpickler # For modules -import shipDet_conf -import global_variables - -# For track pattern recognition - +import fairship.utils.root as ut +import fairship.shipDet_conf as shipDet_conf +import fairship.core.global_variables as global_variables def get_n_hits(hits): return len(hits) @@ -62,7 +62,7 @@ def run_track_pattern_recognition(input_file, geo_file, output_file, method): ############################################# Load SHiP modules #################################################### - import shipDet_conf + import fairship.shipDet_conf as shipDet_conf run = ROOT.FairRunSim() run.SetName("TGeant4") # Transport engine # Create dummy output file as the input file is updated directly and @@ -81,7 +81,7 @@ def run_track_pattern_recognition(input_file, geo_file, output_file, method): ######################################### Load SHiP magnetic field ################################################# - import geomGeant4 + import fairship.geomGeant4 as geomGeant4 if hasattr(ShipGeo.Bfield,"fieldMap"): fieldMaker = geomGeant4.addVMCFields(ShipGeo, '', True, withVirtualMC = False) else: @@ -113,7 +113,7 @@ def run_track_pattern_recognition(input_file, geo_file, output_file, method): h = init_book_hist() ########################################## Start Track Pattern Recognition ######################################### - import shipPatRec + import fairship.shipPatRec as shipPatRec # Init book of hists for the quality measurements metrics = {'n_hits': [], @@ -795,11 +795,6 @@ def getPtruthFirst(sTree, mcPartKey): ################################################################################################################################# ################################################################################################################################# -import ROOT -import numpy -import rootUtils as ut -import math - ################################################ Helping functions ##################################################### diff --git a/python/shipDet_conf.py b/python/src/fairship/shipDet_conf.py similarity index 99% rename from python/shipDet_conf.py rename to python/src/fairship/shipDet_conf.py index befbab78e6..d59fffae55 100644 --- a/python/shipDet_conf.py +++ b/python/src/fairship/shipDet_conf.py @@ -1,12 +1,13 @@ #!/usr/bin/env python import ROOT import os -import shipunit as u -from ShipGeoConfig import AttrDict, ConfigRegistry -from ShieldUtils import find_shield_center from array import array import yaml +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import AttrDict, ConfigRegistry +from fairship.utils.shield import find_shield_center + detectorList = [] diff --git a/python/shipDigiReco.py b/python/src/fairship/shipDigiReco.py similarity index 95% rename from python/shipDigiReco.py rename to python/src/fairship/shipDigiReco.py index d54937f434..d5efb40da1 100644 --- a/python/shipDigiReco.py +++ b/python/src/fairship/shipDigiReco.py @@ -1,17 +1,22 @@ -import os,ROOT,shipVertex,shipDet_conf -import global_variables -import shipPatRec -import shipunit as u -import rootUtils as ut +import os from array import array import sys from math import fabs -from backports import tdirectory634 -from detectors.muonDetector import muonDetector -from detectors.timeDetector import timeDetector -from detectors.MTCDetector import MTCDetector -from detectors.SBTDetector import SBTDetector -from detectors.UpstreamTaggerDetector import UpstreamTaggerDetector +import ROOT +from fairship.detectors.muonDetector import muonDetector +from fairship.detectors.timeDetector import timeDetector +from fairship.detectors.MTCDetector import MTCDetector +from fairship.detectors.SBTDetector import SBTDetector +from fairship.detectors.UpstreamTaggerDetector import UpstreamTaggerDetector +from fairship.backports import tdirectory634 +import fairship.shipVertex as shipVertex +import fairship.shipDet_conf as shipDet_conf +import fairship.core.shipunit as u +import fairship.utils.root as ut +import fairship.core.global_variables as global_variables +import fairship.shipPatRec as shipPatRec +from fairship.scifi_mapping import SciFiMapping + stop = ROOT.TVector3() start = ROOT.TVector3() @@ -52,13 +57,13 @@ def __init__(self,fout,fgeo): os.system('cp '+rawFile +' '+fout) self.fn = ROOT.TFile(fout,'update') self.sTree = self.fn["cbmsim"] -# + # if self.sTree.GetBranch("GeoTracks"): self.sTree.SetBranchStatus("GeoTracks",0) -# prepare for output -# event header + # prepare for output + # event header self.header = ROOT.FairEventHeader() self.eventHeader = self.sTree.Branch("ShipEventHeader",self.header,32000,-1) -# fitted tracks + # fitted tracks self.fGenFitArray = ROOT.TClonesArray("genfit::Track") self.fGenFitArray.BypassStreamer(ROOT.kFALSE) self.fitTrack2MC = ROOT.std.vector('int')() @@ -68,7 +73,7 @@ def __init__(self,fout,fgeo): self.goodTracksBranch = self.sTree.Branch("goodTracks",self.goodTracksVect,32000,-1) self.fTrackletsArray = ROOT.TClonesArray("Tracklet") self.Tracklets = self.sTree.Branch("Tracklets", self.fTrackletsArray,32000,-1) -# + # self.digiStraw = ROOT.std.vector("strawtubesHit")() self.digiStrawBranch = self.sTree.Branch("Digi_StrawtubesHits",self.digiStraw,32000,-1) @@ -83,36 +88,46 @@ def __init__(self,fout,fgeo): self.muonDetector = muonDetector("muon", self.sTree) -# for the digitizing step + # for the digitizing step self.v_drift = global_variables.modules["Strawtubes"].StrawVdrift() self.sigma_spatial = global_variables.modules["Strawtubes"].StrawSigmaSpatial() -# optional if present, splitcalCluster + # optional if present, splitcalCluster if self.sTree.GetBranch("splitcalPoint"): self.digiSplitcal = ROOT.TClonesArray("splitcalHit") self.digiSplitcalBranch=self.sTree.Branch("Digi_SplitcalHits",self.digiSplitcal,32000,-1) self.recoSplitcal = ROOT.TClonesArray("splitcalCluster") self.recoSplitcalBranch=self.sTree.Branch("Reco_SplitcalClusters",self.recoSplitcal,32000,-1) -# prepare vertexing + # add MTC module to the list of globals to use it later in the MTCDetHit class. Consistent with SND@LHC approach. + # make SiPM to fibre mapping + if self.sTree.GetBranch("MTCDetPoint"): + lsOfGlobals = ROOT.gROOT.GetListOfGlobals() + if global_variables.modules["MTC"] not in lsOfGlobals: + lsOfGlobals.Add(global_variables.modules["MTC"]) + mapping = SciFiMapping(global_variables.modules) + mapping.make_mapping() + self.sipm_to_fibre_map_U, self.sipm_to_fibre_map_V = mapping.get_sipm_to_fibre_map() + + # prepare vertexing self.Vertexing = shipVertex.Task(global_variables.h, self.sTree) -# setup random number generator + # setup random number generator self.random = ROOT.TRandom() ROOT.gRandom.SetSeed(13) self.PDG = ROOT.TDatabasePDG.Instance() -# access ShipTree + # access ShipTree self.sTree.GetEvent(0) -# -# init geometry and mag. field + # + # init geometry and mag. field gMan = ROOT.gGeoManager self.geoMat = ROOT.genfit.TGeoMaterialInterface() -# + # self.bfield = ROOT.genfit.FairShipFields() self.bfield.setField(global_variables.fieldMaker.getGlobalField()) self.fM = ROOT.genfit.FieldManager.getInstance() self.fM.init(self.bfield) ROOT.genfit.MaterialEffects.getInstance().init(self.geoMat) - # init fitter, to be done before importing shipPatRec + # init fitter, to be done before importing shipPatRec #fitter = ROOT.genfit.KalmanFitter() #fitter = ROOT.genfit.KalmanFitterRefTrack() self.fitter = ROOT.genfit.DAF() @@ -121,7 +136,7 @@ def __init__(self,fout,fgeo): self.fitter.setDebugLvl(1) # produces lot of printout #set to True if "real" pattern recognition is required also -# for 'real' PatRec + # for 'real' PatRec shipPatRec.initialize(fgeo) def reconstruct(self): diff --git a/python/shipPatRec.py b/python/src/fairship/shipPatRec.py similarity index 99% rename from python/shipPatRec.py rename to python/src/fairship/shipPatRec.py index 701ee4cee2..eb48fdf6a3 100644 --- a/python/shipPatRec.py +++ b/python/src/fairship/shipPatRec.py @@ -1,7 +1,6 @@ -__author__ = 'Mikhail Hushchyn' - import numpy as np -import global_variables + +import fairship.core.global_variables as global_variables # Globals ReconstructibleMCTracks = [] diff --git a/python/src/fairship/shipPid.py b/python/src/fairship/shipPid.py new file mode 100644 index 0000000000..f0f74eeb45 --- /dev/null +++ b/python/src/fairship/shipPid.py @@ -0,0 +1,361 @@ +import ROOT +import sys +import math as m +import ctypes + +from fairship.utils.track_extrapolate import extrapolateToPlane +import fairship.core.shipunit as u +import fairship.utils.root as ut +import fairship.shipDet_conf as shipDet_conf + +class Task: + "initialize" + + def __init__(self,main): + print("****************************************") + print("*** You are using PID version 18.1.0 ***") + print("****************************************") + self.sTree = main.sTree + self.fpidArray = ROOT.TClonesArray("pid") + if not self.sTree.GetBranch("pid"): + self.pID = self.sTree.Branch("Pid", self.fpidArray,32000,-1) + else: + self.pID = self.sTree.pid + self.reps,self.states,self.newPosDir = {},{},{} + self.PDG = ROOT.TDatabasePDG.Instance() + fGeo = ROOT.gGeoManager + top = fGeo.GetTopVolume() + dv = top.GetNode('DecayVolume_1') + ns = dv.GetNodes() + self.zpositions = {} + self.parallelToZ = ROOT.TVector3(0., 0., 1.) + hadron = top.GetNode("Hcal_1") + hvol = hadron.GetVolume() + self.zpositions['hcal'] = hadron.GetMatrix().GetTranslation()[2] + ecal = top.GetNode("Ecal_1") + evol = ecal.GetVolume() + self.zpositions['ecal'] = ecal.GetMatrix().GetTranslation()[2] + x = sys.modules['__main__'] + ShipGeo = x.ShipGeo + for i in range(4): + muonDet = top.GetNode('MuonDetector_'+str(i+1)) + if muonDet: self.zpositions['muon'+str(i)] = muonDet.GetMatrix().GetTranslation()[2] + else: self.zpositions['muon'+str(i)] = ShipGeo['MuonStation'+str(i)].z + self.hcal = sys.modules['__main__']. modules['Hcal'] + self.pad_size_x = 5 #cm + self.pad_size_y = 5 #cm + self.dimensions_x = 300 #cm half width # TODO take from geo? + self.dimensions_y = 600 #cm half width # TODO take from geo? + self.rx=250 + self.ry=500 + self.muly_acceptance = 50.0 + self.ncells_x=m.floor((2*self.dimensions_x)/self.pad_size_x) + self.ncells_y=m.floor((2*self.dimensions_y)/self.pad_size_y) + self.threshold_pad_energy = 0.2 + self.Ecal_dx = 15 #cm + self.Ecal_dy = 15 #cm + self.Ecal_EP_threshold_min = 0.92 #acceptance region for E over P in Ecal > self.Ecal_EP_threshold_min + self.Ecal_EP_threshold_max = 10 + self.Hit_number_threshold=3 #number of pad-hits around the extrapolated tracks in MuonDet + self.hitlimit_x,self.hitlimit_y=5,5 #x-y area to check the number of pad-hits + self.cutNdf = 25 + + self.P_min00,self.P_max00,self.dx00_min,self.dx00_max,self.dy00_min,self.dy00_max=-99,-99,-99,-99,-99,-99 + self.P_min01,self.P_max01,self.dx01_min,self.dx01_max,self.dy01_min,self.dy01_max=-99,-99,-99,-99,-99,-99 + self.P_min02,self.P_max02,self.dx02_min,self.dx02_max,self.dy02_min,self.dy02_max=-99,-99,-99,-99,-99,-99 + self.P_min03,self.P_max03,self.dx03_min,self.dx03_max,self.dy03_min,self.dy03_max=-99,-99,-99,-99,-99,-99 + + self.P_min10,self.P_max10,self.dx10_min,self.dx10_max,self.dy10_min,self.dy10_max= 0, 8, -5, 5, -5, 5 + self.P_min11,self.P_max11,self.dx11_min,self.dx11_max,self.dy11_min,self.dy11_max=-99,-99,-99,-99,-99,-99 + self.P_min12,self.P_max12,self.dx12_min,self.dx12_max,self.dy12_min,self.dy12_max=-99,-99,-99,-99,-99,-99 + self.P_min13,self.P_max13,self.dx13_min,self.dx13_max,self.dy13_min,self.dy13_max=-99,-99,-99,-99,-99,-99 + + self.P_min20,self.P_max20,self.dx20_min,self.dx20_max,self.dy20_min,self.dy20_max= 8, 13, -5, 5, -5, 5 + self.P_min21,self.P_max21,self.dx21_min,self.dx21_max,self.dy21_min,self.dy21_max= 13, 20, -3, 3, -3, 3 + self.P_min22,self.P_max22,self.dx22_min,self.dx22_max,self.dy22_min,self.dy22_max=-99,-99,-99,-99,-99,-99 + + self.P_min30,self.P_max30,self.dx30_min,self.dx30_max,self.dy30_min,self.dy30_max= 20,999, -4, 4, -4, 4 + self.P_min31,self.P_max31,self.dx31_min,self.dx31_max,self.dy31_min,self.dy31_max=-99,-99,-99,-99,-99,-99 + + def execute(self): + ## make particles persistent ## + self.PID() + self.pID.Fill() + + def HcalHits(self): + ## hcalPoint hits ## + self.hcal1 = [] + self.hcal2 = [] + self.new_hcal2 = [] + if not hasattr(self.sTree,'HcalPointLite'): return + for chit in self.sTree.HcalPointLite: + if not chit.GetEnergyLoss()>0: continue + detID = chit.GetDetectorID() + x = ctypes.c_float() + y = ctypes.c_float() + section = ctypes.c_int() + self.hcal.GetCellCoordInf(detID,x,y,section) + ELoss = chit.GetEnergyLoss()/u.MeV + if ELoss>0: self.hcal1.append([x.value,y.value,section.value,ELoss]) + + def muonDigitHit(self): + ## merging muonPoint hits inside each pad ## + self.list1 = [] + self.list2 = [] + self.new_list2 = [] +# print 'numer of hites = ', self.sTree.muonPoint.GetEntries() + for ahit in self.sTree.muonPoint: + if not ahit.GetEnergyLoss()>0: continue + detID = ahit.GetDetectorID() + if m.fabs(ahit.GetZ()-self.zpositions['muon0'])self.P_min00 and self.Pself.dx00_min and delta_x0self.dy00_min and delta_y0self.P_min01 and self.Pself.dx01_min and delta_x0self.dy01_min and delta_y0self.P_min02 and self.Pself.dx02_min and delta_x0self.dy02_min and delta_y0self.P_min03 and self.Pself.dx03_min and delta_x0self.dy03_min and delta_y0self.P_min00 and self.P=self.Hit_number_threshold: overhit=True + if Mull==1: + delta_x1 = X-self.pos_pad_x1 + delta_y1 = Y-self.pos_pad_y1 + if (self.P>self.P_min10 and self.Pself.dx10_min and delta_x1self.dy10_min and delta_y1self.P_min11 and self.Pself.dx11_min and delta_x1self.dy11_min and delta_y1self.P_min12 and self.Pself.dx12_min and delta_x1self.dy12_min and delta_y1self.P_min13 and self.Pself.dx13_min and delta_x1self.dy13_min and delta_y1self.P_min20 and self.Pself.dx20_min and delta_x2self.dy20_min and delta_y2self.P_min21 and self.Pself.dx21_min and delta_x2self.dy21_min and delta_y2self.P_min22 and self.Pself.dx22_min and delta_x2self.dy22_min and delta_y2self.P_min30 and self.Pself.dx30_min and delta_x3self.dy30_min and delta_y3self.P_min31 and self.Pself.dx31_min and delta_x3self.dy31_min and delta_y35 and (self.pid10==False and self.pid20==False and self.pid21==False and self.pid30==False): + chmu1=m.fabs((22.67-self.E_tot_h1)/22.67) + chmu2=m.fabs((55.75-self.E_tot_h2)/55.75) + if (chmu1<0.5 and chmu2<0.5): + self.pid_mu=True + check_vol_mu1=(m.pow(self.extrap_X_mu1,2)/m.pow(self.rx,2))+(m.pow(self.extrap_Y_mu1,2)/m.pow(self.ry,2)) + if check_vol_mu1>1: + self.vol_mu1=True + + def elec_ID(self): + if self.det == 'ecal': + self.extrap_X_ecal = self.extrapStates[self.det][0] + self.extrap_Y_ecal = self.extrapStates[self.det][1] + extrap_Z_ecal = self.extrapStates[self.det][2] + + def run_elec_ID(self): + for aClus in self.sTree.EcalReconstructed: + x1_Clus, y1_Clus, Ene1_Clus = aClus.X(), aClus.Y(), aClus.RecoE() + Ecal_delta_x=x1_Clus - self.extrap_X_ecal + Ecal_delta_y=y1_Clus - self.extrap_Y_ecal + EP=Ene1_Clus/self.P + if (EP>self.Ecal_EP_threshold_min and EP1: + self.vol_ecal=True + + def hcal_ID(self): + if self.det == 'hcal': + self.extrap_X_hcal = self.extrapStates[self.det][0] + self.extrap_Y_hcal = self.extrapStates[self.det][1] + extrap_Z_hcal = self.extrapStates[self.det][2] + + def run_hcal_ID(self): + N1,N2,M,E_est,E_totale=0,0,0,0.,0. + self.E_tot_h1,self.E_tot_h2,self.E_tot=0.,0.,0. + for i in range(len(self.hcal1)): + x,y,s,E= self.hcal1[i][0], self.hcal1[i][1], self.hcal1[i][2], self.hcal1[i][3] + delta_x = x-self.extrap_X_hcal + delta_y = y-self.extrap_Y_hcal + if (m.pow(delta_x,2)+m.pow(delta_y,2))<2500 and s==0: + self.E_tot_h1+=E + if (m.pow(delta_x,2)+m.pow(delta_y,2))<2500 and s==1: + self.E_tot_h2+=E + E_totale+=E + self.E_tot = self.E_tot_h1+self.E_tot_h2 + check_vol_hcal=(m.pow(self.extrap_X_hcal,2)/m.pow(self.rx,2))+(m.pow(self.extrap_Y_hcal,2)/m.pow(self.ry,2)) + if check_vol_hcal>1: + self.vol_hcal=True diff --git a/python/shipRoot_conf.py b/python/src/fairship/shipRoot_conf.py similarity index 97% rename from python/shipRoot_conf.py rename to python/src/fairship/shipRoot_conf.py index 0c055f8d40..e2da62c43f 100644 --- a/python/shipRoot_conf.py +++ b/python/src/fairship/shipRoot_conf.py @@ -2,8 +2,9 @@ import atexit import sys import os -from pythia8_conf_utils import addHNLtoROOT -from pythia8darkphoton_conf import addDPtoROOT + +from fairship.utils.pythia8 import addHNLtoROOT +from fairship.configure.pythia8_darkphoton import addDPtoROOT if os.environ.get('FAIRSHIP_ROOT', '') == '': print("FairShip environment not found, quitting.") diff --git a/python/shipVertex.py b/python/src/fairship/shipVertex.py similarity index 99% rename from python/shipVertex.py rename to python/src/fairship/shipVertex.py index 54278bce93..be387403be 100644 --- a/python/shipVertex.py +++ b/python/src/fairship/shipVertex.py @@ -1,13 +1,16 @@ # simple vertex reconstruction with errors -import ROOT,sys,os -import global_variables -import shipunit as u -import rootUtils as ut +import ROOT +import sys +import os import numpy as np import math import ctypes from array import array +import fairship.core.global_variables as global_variables +import fairship.core.shipunit as u +import fairship.utils.root as ut + class Task: "initialize" def __init__(self,hp,sTree): diff --git a/python/shipVeto.py b/python/src/fairship/shipVeto.py similarity index 99% rename from python/shipVeto.py rename to python/src/fairship/shipVeto.py index 295a14c544..da109dc6af 100644 --- a/python/shipVeto.py +++ b/python/src/fairship/shipVeto.py @@ -1,8 +1,9 @@ # utility to simulate response of the veto systems import ROOT -import shipunit as u from array import array +import fairship.core.shipunit as u + class Task: "initialize and give response of the veto systems" def __init__(self,t): diff --git a/python/src/fairship/utils/__init__.py b/python/src/fairship/utils/__init__.py new file mode 100644 index 0000000000..1c532c68fc --- /dev/null +++ b/python/src/fairship/utils/__init__.py @@ -0,0 +1,6 @@ +""" +Module with helper functions and definitions. + +Intended to separate out utilities from business/main logic, though it can be +tricky to define sometimes. +""" diff --git a/python/saveBasicParameters.py b/python/src/fairship/utils/basic_parameters.py similarity index 83% rename from python/saveBasicParameters.py rename to python/src/fairship/utils/basic_parameters.py index 50525b3bbb..646b0f4016 100644 --- a/python/saveBasicParameters.py +++ b/python/src/fairship/utils/basic_parameters.py @@ -1,10 +1,35 @@ -from ShipGeoConfig import AttrDict -from ShipGeoConfig import ConfigRegistry import ROOT import os import subprocess -def retrieveGitTags(o): - # record some basic information about version of software: + +from fairship.utils.rootpy_pickler import Pickler +from fairship.ShipGeoConfig import AttrDict, ConfigRegistry + +def save_basic_parameters(f, ox, name='ShipGeo'): + """Save geometry configuration to ROOT file as JSON string""" + if type(ox) == str: + ox = ConfigRegistry.register_config("basic") + o = _retrieveGitTags(ox) + + if type(f) == str: + fg = ROOT.TFile.Open(f, 'update') + else: + fg = f + + # Serialize to JSON + json_str = o.dumps_json() + + # Save as std::string in ROOT file + fg.cd() + config_str = ROOT.std.string(json_str) + fg.WriteObject(config_str, name) + fg.Flush() + + if type(f) == str: + fg.Close() + +def _retrieveGitTags(o): + """Record some basic information about version of fairship software.""" if "FAIRSHIP_HASH" in os.environ: o.FairShip = os.environ['FAIRSHIP_HASH'] o.FairRoot = os.environ['FAIRROOT_HASH'] @@ -26,25 +51,3 @@ def retrieveGitTags(o): x = subprocess.check_output(['more',tmp]).replace('\n','') o.FairRoot = AttrDict(master=x) return o -def execute(f, ox, name='ShipGeo'): - """Save geometry configuration to ROOT file as JSON string""" - if type(ox) == str: - ox = ConfigRegistry.register_config("basic") - o = retrieveGitTags(ox) - - if type(f) == str: - fg = ROOT.TFile.Open(f, 'update') - else: - fg = f - - # Serialize to JSON - json_str = o.dumps_json() - - # Save as std::string in ROOT file - fg.cd() - config_str = ROOT.std.string(json_str) - fg.WriteObject(config_str, name) - fg.Flush() - - if type(f) == str: - fg.Close() diff --git a/python/src/fairship/utils/basiclibs.py b/python/src/fairship/utils/basiclibs.py new file mode 100644 index 0000000000..e8fa48c84d --- /dev/null +++ b/python/src/fairship/utils/basiclibs.py @@ -0,0 +1,17 @@ +def load_basic_libs(): + """Loading basic libraries used with both Geant3 and Geant4""" + from ROOT import gSystem + #gSystem.Load("libEventDisplay.so") + #gSystem.Load("libRIO.so") + #gSystem.Load("libGeom.so") + #gSystem.Load("libGeomPainter.so") + #gSystem.Load("libVMC.so") + #gSystem.Load("libEG.so") + gSystem.Load("libEGPythia6.so") + gSystem.Load("libPythia6.so") + #gSystem.Load("libPhysics.so") + #gSystem.Load("libNet.so") + #gSystem.Load("libTree.so") + #gSystem.Load("libMinuit.so") + #gSystem.Load("libMathMore.so") + gSystem.Load("libpythia8.so") diff --git a/python/readDecayTable.py b/python/src/fairship/utils/decay_table.py similarity index 88% rename from python/readDecayTable.py rename to python/src/fairship/utils/decay_table.py index 9b39e34f21..b63ea39507 100644 --- a/python/readDecayTable.py +++ b/python/src/fairship/utils/decay_table.py @@ -1,18 +1,15 @@ """ -# ================================================================== -# Python module -# -# This module provides methods to read a configuration file -# storing on/off (yes/no) flags for the HNL decay channels -# and to pass the configured decay table to a Pythia8 generator. -# -# Created: 30/12/2014 Elena Graverini (elena.graverini@cern.ch) -# -# ================================================================== +This module provides methods to read a configuration file +storing on/off (yes/no) flags for the HNL decay channels +and to pass the configured decay table to a Pythia8 generator. + +Created: 30/12/2014 Elena Graverini (elena.graverini@cern.ch) """ -import ROOT, os, csv -from hnl import PDGname -from darkphoton import * +import ROOT +import os +import csv + +from fairship.branching.hnl import PDGname pdg = ROOT.TDatabasePDG.Instance() @@ -25,7 +22,7 @@ def PDGcode(particle): return int(tPart.PdgCode()) -def load(conffile = os.path.expandvars('$FAIRSHIP/python/DecaySelection.conf'), verbose=True): +def load(conffile = os.path.expandvars('$FAIRSHIP/python/data/DecaySelection.conf'), verbose=True): f = open(conffile) reader = csv.reader(f, delimiter=':') configuredDecays = {} @@ -43,7 +40,7 @@ def load(conffile = os.path.expandvars('$FAIRSHIP/python/DecaySelection.conf'), print('\t'+channel) return configuredDecays -def addHNLdecayChannels(P8Gen, hnl, conffile=os.path.expandvars('$FAIRSHIP/python/DecaySelection.conf'), verbose=True): +def addHNLdecayChannels(P8Gen, hnl, conffile=os.path.expandvars('$FAIRSHIP/python/data/DecaySelection.conf'), verbose=True): """ Configures the HNL decay table in Pythia8 Inputs: @@ -74,7 +71,7 @@ def addHNLdecayChannels(P8Gen, hnl, conffile=os.path.expandvars('$FAIRSHIP/pytho P8Gen.SetParameters(f'9900015:addChannel = 1 {BR:.12} 0 {codes}') # print "debug readdecay table",particles,children,BR -def addDarkPhotondecayChannels(P8gen, mDP, DP,conffile=os.path.expandvars('$FAIRSHIP/python/darkphotonDecaySelection.conf'), verbose=True): +def addDarkPhotondecayChannels(P8gen, mDP, DP,conffile=os.path.expandvars('$FAIRSHIP/python/data/darkphotonDecaySelection.conf'), verbose=True): """ Configures the DP decay table in Pythia8 diff --git a/python/genie_interface.py b/python/src/fairship/utils/genie_interface.py similarity index 100% rename from python/genie_interface.py rename to python/src/fairship/utils/genie_interface.py diff --git a/python/checkMagFields.py b/python/src/fairship/utils/magnetic_fields.py similarity index 95% rename from python/checkMagFields.py rename to python/src/fairship/utils/magnetic_fields.py index b29879770e..8b168df623 100644 --- a/python/checkMagFields.py +++ b/python/src/fairship/utils/magnetic_fields.py @@ -1,9 +1,12 @@ -import ROOT,sys -import rootUtils as ut -import shipunit as u +import sys +import ROOT -def run(): +import fairship.utils.root as ut +import fairship.core.shipunit as u + +def check_magnetic_fields(): fGeo = ROOT.gGeoManager + # Some arcane magic here.. run = sys.modules['__main__'].run if hasattr(sys.modules['__main__'],'h'): h = sys.modules['__main__'].h else: h={} diff --git a/python/AddDiMuonDecayChannelsToG4.py b/python/src/fairship/utils/muon_decay_channels.py similarity index 87% rename from python/AddDiMuonDecayChannelsToG4.py rename to python/src/fairship/utils/muon_decay_channels.py index c958d4c200..bb36961eb8 100644 --- a/python/AddDiMuonDecayChannelsToG4.py +++ b/python/src/fairship/utils/muon_decay_channels.py @@ -3,8 +3,12 @@ ROOT.gROOT.ProcessLine('#include "Geant4/G4DecayTable.hh"') ROOT.gROOT.ProcessLine('#include "Geant4/G4PhaseSpaceDecayChannel.hh"') -def Initialize(p8): -# take decay and branching ratios from Pythia8 +def add_muon_decay_channels_to_g4(p8): + """ + Adds muon decay channels to Geant4. + + Takes decay and branching ratios from Pythia8. + """ pt = ROOT.G4ParticleTable.GetParticleTable() for vreso in [223,333,113]: particleG4 = pt.FindParticle(vreso) diff --git a/python/src/fairship/utils/pi0.py b/python/src/fairship/utils/pi0.py new file mode 100644 index 0000000000..9576674670 --- /dev/null +++ b/python/src/fairship/utils/pi0.py @@ -0,0 +1,38 @@ +import ROOT +import os + +import fairship.core.shipunit as u +import fairship.utils.root as ut + + +def findPi0(sTree,secVertex): + pdg = ROOT.TDatabasePDG.Instance() + mPi0 = pdg.GetParticle(111).Mass() + L = ROOT.TLorentzVector() + V = ROOT.TVector3() + top = ROOT.gGeoManager.GetTopVolume() + z_ecal = top.GetNode('Ecal_1').GetMatrix().GetTranslation()[2] + + recoGammas = {} + pi0List = [] + listOfGammas = None + for aClu in sTree.EcalReconstructed: +# short cut to exclude ecal clusters of charged tracks +# would need another routine to extrapolate tracks to ecal and exclude matched showers + mc = aClu.MCTrack() + if mc<0: continue + gamma = sTree.MCTrack[mc] + if gamma.GetPdgCode()!=22: continue + if gamma.GetMotherId()<0: continue + P = aClu.RecoE() + direction = ROOT.TVector3(aClu.X()-secVertex.X(),aClu.Y()-secVertex.Y(),z_ecal-secVertex.Z()) + norm = direction.Mag() + recoGammas[gamma] = ROOT.TLorentzVector(direction.X()/norm*P,direction.Y()/norm*P,direction.Z()/norm*P,P) + sTree.MCTrack[mc].GetStartVertex(V) + if len(recoGammas)==0: return [] + listOfGammas=list(recoGammas.values()) + for g1 in range(len(listOfGammas)-1): + for g2 in range(g1+1,len(listOfGammas)): + pi0 = listOfGammas[g1] + listOfGammas[g2] + pi0List.append(pi0) + return pi0List diff --git a/python/pythia8_conf_utils.py b/python/src/fairship/utils/pythia8.py similarity index 99% rename from python/pythia8_conf_utils.py rename to python/src/fairship/utils/pythia8.py index f3866ea246..791a124ad3 100644 --- a/python/pythia8_conf_utils.py +++ b/python/src/fairship/utils/pythia8.py @@ -4,7 +4,8 @@ import numpy as np import scipy.interpolate import ROOT -import shipunit as u + +import fairship.core.shipunit as u def addHNLtoROOT(pid=9900015 ,m = 1.0, g=3.654203020370371E-21): pdg = ROOT.TDatabasePDG.Instance() diff --git a/python/rootUtils.py b/python/src/fairship/utils/root.py similarity index 98% rename from python/rootUtils.py rename to python/src/fairship/utils/root.py index 1974f0f813..74fc5ffd70 100644 --- a/python/rootUtils.py +++ b/python/src/fairship/utils/root.py @@ -1,15 +1,16 @@ -#---Enable Tab completion----------------------------------------- +from ROOT import TFile,gROOT,TH3D,TH2D,TH1D,TCanvas,TProfile,gSystem +import os +import sys +import operator + try: + #---Enable Tab completion----------------------------------------- import rlcompleter, readline readline.parse_and_bind( 'tab: complete' ) readline.parse_and_bind( 'set show-all-if-ambiguous On' ) except: pass - -from ROOT import TFile,gROOT,TH3D,TH2D,TH1D,TCanvas,TProfile,gSystem -import os,sys - def readHists(h,fname,wanted=[]): if fname[0:4] == "/eos": eospath = gSystem.Getenv("EOSSHIP")+fname @@ -108,7 +109,6 @@ def setAttributes(pyl,leaves,printout=False): class PyListOfLeaves(dict) : pass -import operator def container_sizes(sTree,perEvent=False): counter = {} print("name ZipBytes[MB] TotBytes[MB] TotalSize[MB]") diff --git a/python/decorators.py b/python/src/fairship/utils/root_decorators.py similarity index 98% rename from python/decorators.py rename to python/src/fairship/utils/root_decorators.py index f22b0a3db6..41a49105c1 100644 --- a/python/decorators.py +++ b/python/src/fairship/utils/root_decorators.py @@ -1,7 +1,8 @@ from ctypes import c_double import ROOT -import shipunit as u + +import fairship.core.shipunit as u def MCPointPrintOut(x): diff --git a/python/src/fairship/utils/rootpy_pickler.py b/python/src/fairship/utils/rootpy_pickler.py new file mode 100644 index 0000000000..3d9f8893b2 --- /dev/null +++ b/python/src/fairship/utils/rootpy_pickler.py @@ -0,0 +1,356 @@ +# Copyright 2012 the rootpy developers +# distributed under the terms of the GNU General Public License +# Original author: Scott Snyder scott.snyder(a)cern.ch, 2004. + +# copied and modified by T.Ruf for the standalone use in FAIRSHIP +"""Pickle python data into a ROOT file, preserving references to ROOT objects. + +This module allows pickling python objects into a ROOT file. The python +objects may contain references to named ROOT objects. If one has set up a +structure of python objects to hold ROOT histograms, this provides a convenient +way of saving and restoring your histograms. The pickled python data are +stored in an additional string object in the ROOT file; any ROOT objects are +stored as usual. (Thus, ROOT files written by the pickler can be read just +like any other ROOT file if you don't care about the python data.) + +Here's an example of writing a pickle:: + +from fairship.utils.rootpyPickler import Pickler +pkl=Pickler(file) +pkl.dump(ShipGeo,'ShipGeo') + +from fairship.utils.rootpyPickler import Unpickler +upkl = Unpickler(f) +ShipGeo = upkl.load('ShipGeo') + +The following additional notes apply: + +* Pickling may not always work correctly for the case of python objects + deriving from ROOT objects. It will probably also not work for the case of + ROOT objects which do not derive from TObject. + +* When the pickled data are being read, if a class doesn't exist, + a dummy class with no methods will be used instead. This is different + from the standard pickle behavior (where it would be an error), but it + simplifies usage in the common case where the class is being used to hold + histograms, and its methods are entirely concerned with filling the + histograms. + +* When restoring a reference to a ROOT object, the default behavior + is to not read the ROOT object itself, but instead to create a proxy. The + ROOT object will then be read the first time the proxy is accessed. This can + help significantly with time and memory usage if you're only accessing a + small fraction of the ROOT objects, but it does mean that you need to keep + the ROOT file open. Pass use_proxy=0 to disable this behavior. + +""" + +import sys +from io import StringIO + +# need subclassing ability in 2.x +import pickle + +import ROOT + +string_types = str, +integer_types = (int,) + +__all__ = [ + 'dump', + 'load', + 'compat_hooks', +] + + +_compat_hooks = None +xdict = {} +xserial = 0 + +""" +Argh! We can't store NULs in TObjStrings. +But pickle protocols > 0 are binary protocols, and will get corrupted +if we truncate at a NUL. +So, when we save the pickle data, make the mappings: + + 0x00 -> 0xff 0x01 + 0xff -> 0xff 0xfe + +""" + + +def _protect(s): + return s.replace(b'\377', b'\377\376').replace(b'\000', b'\377\001') + + +def _restore(s): + return s.replace(b'\377\001', b'\000').replace(b'\377\376', b'\377') + + +class IO_Wrapper: + def __init__(self): + return self.reopen() + + def write(self, s): + return self.__s.write(_protect(s).decode('utf-8')) + + def read(self, i): + return self.__s.read(i).encode('utf-8') + + def readline(self): + return self.__s.readline().encode('utf-8') + + def getvalue(self): + return self.__s.getvalue() + + def setvalue(self, s): + self.__s = StringIO(_restore(s.encode('utf-8')).decode('utf-8')) + return + + def reopen(self): + self.__s = StringIO() + return + + +class ROOT_Proxy: + def __init__(self, f, pid): + self.__f = f + self.__pid = pid + self.__o = None + + def __getattr__(self, a): + if self.__o is None: + self.__o = self.__f.Get(self.__pid) + if self.__o.__class__.__module__ != 'ROOT': + self.__o.__class__.__module__ = 'ROOT' + return getattr(self.__o, a) + + def __obj(self): + if self.__o is None: + self.__o = self.__f.Get(self.__pid) + if self.__o.__class__.__module__ != 'ROOT': + self.__o.__class__.__module__ = 'ROOT' + return self.__o + + +class Pickler(pickle.Pickler): + def __init__(self, file, proto=0): + """Create a root pickler. + `file` should be a ROOT TFile. `proto` is the python pickle protocol + version to use. The python part will be pickled to a ROOT + TObjString called _pickle; it will contain references to the + ROOT objects. + """ + self.__file = file + self.__keys = file.GetListOfKeys() + self.__io = IO_Wrapper() + self.__pmap = {} + super().__init__(self.__io, proto) + + def dump(self, obj, key=None): + """Write a pickled representation of obj to the open TFile.""" + if key is None: + key = '_pickle' + if 1>0: + self.__file.cd() + super().dump(obj) + s = ROOT.TObjString(self.__io.getvalue()) + self.__io.reopen() + s.Write(key) + self.__file.GetFile().Flush() + self.__pmap.clear() + + def clear_memo(self): + """Clears the pickler's internal memo.""" + self.__pickle.memo.clear() + + def persistent_id(self, obj): + if hasattr(obj, '_ROOT_Proxy__obj'): + obj = obj._ROOT_Proxy__obj() + if isinstance(obj, ROOT.TObject): + """ + Write the object, and return the resulting NAME;CYCLE. + We used to do this:: + + o.Write() + k = self.__file.GetKey(o.GetName()) + pid = "{0};{1:d}".format(k.GetName(), k.GetCycle()) + + It turns out, though, that destroying the python objects + referencing the TKeys is quite expensive (O(logN) where N is the + total number of pyroot objects?). Although we want to allow for + the case of saving multiple objects with the same name, the most + common case is that the name has not already been written to the + file. So we optimize for that case, doing the key lookup before we + write the object, not after. (Note further: GetKey() is very slow + if the key does not actually exist, as it does a linear search of + the key list. We use FindObject instead for the initial + lookup, which is a hashed lookup, but it is not guaranteed to + find the highest cycle. So if we do find an existing key, we + need to look up again using GetKey. + """ + nm = obj.GetName() + key = self.__keys.FindObject(nm) + obj.Write() + if key: + key = self.__file.GetKey(nm) + pid = f'{nm};{key.GetCycle():d}' + else: + pid = nm + ';1' + return pid + + +class Unpickler(pickle.Unpickler): + def __init__(self, root_file, use_proxy=True, use_hash=False): + """Create a ROOT unpickler. + `file` should be a ROOT TFile. + """ + global xserial + xserial += 1 + self.__use_proxy = use_proxy + self.__file = root_file + self.__io = IO_Wrapper() + self.__n = 0 + self.__serial = f'{xserial:d}-'.encode() + xdict[self.__serial] = root_file + super().__init__(self.__io) + + if use_hash: + htab = {} + ctab = {} + for k in root_file.GetListOfKeys(): + nm = k.GetName() + cy = k.GetCycle() + htab[(nm, cy)] = k + if cy > ctab.get(nm, 0): + ctab[nm] = cy + htab[(nm, 9999)] = k + root_file._htab = htab + oget = root_file.Get + + def xget(nm0): + nm = nm0 + ipos = nm.find(';') + if ipos >= 0: + cy = nm[ipos+1] + if cy == '*': + cy = 10000 + else: + cy = int(cy) + nm = nm[:ipos - 1] + else: + cy = 9999 + ret = htab.get((nm, cy), None) + if not ret: + print(("warning didn't find {0} {1} {2}",nm, cy, len(htab) )) + return oget(nm0) + #ctx = ROOT.TDirectory.TContext(file) + ret = ret.ReadObj() + #del ctx + return ret + root_file.Get = xget + + def load(self, key=None): + """Read a pickled object representation from the open file.""" + if key is None: + key = '_pickle' + obj = None + if _compat_hooks: + save = _compat_hooks[0]() + try: + self.__n += 1 + s = self.__file.Get(key + f';{self.__n:d}') + self.__io.setvalue(s.GetName()) + obj = super().load() + self.__io.reopen() + finally: + if _compat_hooks: + save = _compat_hooks[1](save) + return obj + + def persistent_load(self, pid): + if self.__use_proxy: + obj = ROOT_Proxy(self.__file, pid.decode('utf-8')) + else: + obj = self.__file.Get(pid) + #log.debug("load {0} {1}".format(pid, obj)) + xdict[self.__serial + pid] = obj + return obj + + def find_class(self, module, name): + try: + try: + ## Employ very nasty hack to get around error during + ## unpicklying of files. + ## `copy_reg` and `__builtin__` comes from PY2, + ## for some reason that I don't understand, they are now + ## in the files we try to unpickle + if sys.version_info[0] > 2: + if module == 'copy_reg': module = 'copyreg' + if module == '__builtin__': module = 'builtins' + __import__(module) + mod = sys.modules[module] + except ImportError: + #log.info("Making dummy module {0}".format(module)) + + class DummyModule: + pass + + mod = DummyModule() + sys.modules[module] = mod + klass = getattr(mod, name) + return klass + except AttributeError: + #log.info("Making dummy class {0}.{1}".format(module, name)) + mod = sys.modules[module] + + class Dummy: + pass + + setattr(mod, name, Dummy) + return Dummy + + +def compat_hooks(hooks): + """Set compatibility hooks. + If this is set, then hooks[0] is called before loading, and hooks[1] is + called after loading. hooks[1] is called with the return value of hooks[0] + as an argument. This is useful for backwards compatibility in some + situations. + """ + global _compat_hooks + _compat_hooks = hooks + + +def dump(obj, root_file, proto=0, key=None): + """Dump an object into a ROOT TFile. + + `root_file` may be an open ROOT file or directory, or a string path to an + existing ROOT file. + """ + if isinstance(root_file, string_types): + root_file = ROOT.TFile.Open(root_file, 'recreate') + own_file = True + else: + own_file = False + ret = Pickler(root_file, proto).dump(obj, key) + if own_file: + root_file.Close() + return ret + + +def load(root_file, use_proxy=1, key=None): + """Load an object from a ROOT TFile. + + `root_file` may be an open ROOT file or directory, or a string path to an + existing ROOT file. + """ + if isinstance(root_file, string_types): + root_file = ROOT.TFile.Open(root_file) + own_file = True + else: + own_file = False + obj = Unpickler(root_file, use_proxy).load(key) + if own_file: + root_file.Close() + return obj diff --git a/python/ShieldUtils.py b/python/src/fairship/utils/shield.py similarity index 100% rename from python/ShieldUtils.py rename to python/src/fairship/utils/shield.py diff --git a/python/ShipStyle.py b/python/src/fairship/utils/style.py similarity index 99% rename from python/ShipStyle.py rename to python/src/fairship/utils/style.py index 7918282604..029efe5410 100644 --- a/python/ShipStyle.py +++ b/python/src/fairship/utils/style.py @@ -1,6 +1,5 @@ -# Global scope variables from ROOT import * -from ROOT import Double + lhcbstyle = TStyle() # general lhcb style lhcbName = TPaveText() # standard lhcb text for plot lhcbLabel = TText # style for Ttext diff --git a/python/TrackExtrapolateTool.py b/python/src/fairship/utils/track_extrapolate.py similarity index 97% rename from python/TrackExtrapolateTool.py rename to python/src/fairship/utils/track_extrapolate.py index 44a2391b04..f6b3327cea 100644 --- a/python/TrackExtrapolateTool.py +++ b/python/src/fairship/utils/track_extrapolate.py @@ -1,5 +1,6 @@ import ROOT -import shipunit as u + +import fairship.core.shipunit as u def cmp(a, b): return (a > b) - (a < b) @@ -12,6 +13,7 @@ def cmp(a, b): else: print("TrackExtraploate tool: Error, no calo present") z_ecal = 100*u.m + def extrapolateToPlane(fT,z): # etrapolate to a plane perpendicular to beam direction (z) rc,pos,mom = False,None,None diff --git a/python/tests/__init__.py b/python/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/python/test_shipGeoConfig.py b/python/tests/test_shipGeoConfig.py old mode 100755 new mode 100644 similarity index 92% rename from python/test_shipGeoConfig.py rename to python/tests/test_shipGeoConfig.py index 51021f4d10..7da744c29c --- a/python/test_shipGeoConfig.py +++ b/python/tests/test_shipGeoConfig.py @@ -1,8 +1,8 @@ -#!/usr/bin/env python import unittest -import shipunit as u import os -from ShipGeoConfig import AttrDict, ConfigRegistry + +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import AttrDict, ConfigRegistry class TestSingleConfig(unittest.TestCase): @@ -61,8 +61,8 @@ class TestStringSingleConfig(unittest.TestCase): def setUp(self): self.key = "basic" config = """ -import shipunit as u -from ShipGeoConfig import AttrDict, ConfigRegistry +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import AttrDict, ConfigRegistry with ConfigRegistry.register_config("basic") as c: c.vetoStation = AttrDict(z=-2390.*u.cm) @@ -108,8 +108,8 @@ class TestStringConditionalConfig(unittest.TestCase): def setUp(self): self.key = "basic" self.config = """ -import shipunit as u -from ShipGeoConfig import AttrDict, ConfigRegistry +import fairship.core.shipunit as u +from fairship.ShipGeoConfig import AttrDict, ConfigRegistry with ConfigRegistry.register_config("basic") as c: c.vetoStation = AttrDict(z=-2390.*u.cm) @@ -160,7 +160,7 @@ def tearDown(self): class TestStringNewLine(unittest.TestCase): def setUp(self): self.key = "basic" - self.config = """import shipunit as u\r\nfrom ShipGeoConfig import AttrDict, ConfigRegistry\r\nwith ConfigRegistry.register_config("basic") as c:\r + self.config = """import fairship.core.shipunit as u\r\nfrom fairship.ShipGeoConfig import AttrDict, ConfigRegistry\r\nwith ConfigRegistry.register_config("basic") as c:\r c.vetoStation = AttrDict(z=-2390.*u.cm)\r\n""" self.filename = "x.py" fh = open(self.filename, "w") diff --git a/python/uv.lock b/python/uv.lock new file mode 100644 index 0000000000..429dbd189e --- /dev/null +++ b/python/uv.lock @@ -0,0 +1,1054 @@ +version = 1 +revision = 2 +requires-python = ">=3.6" +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", + "python_full_version == '3.7.*'", + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] + +[[package]] +name = "atomicwrites" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11", size = 14227, upload-time = "2022-07-08T18:31:40.459Z" } + +[[package]] +name = "attrs" +version = "22.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/31/3f468da74c7de4fcf9b25591e682856389b3400b4b62f201e65f15ea3e07/attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99", size = 215900, upload-time = "2022-12-21T09:48:51.773Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/6e/6f83bf616d2becdf333a1640f1d463fef3150e2e926b7010cb0f81c95e88/attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", size = 60018, upload-time = "2022-12-21T09:48:49.401Z" }, +] + +[[package]] +name = "cfgv" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/12/49/d6e4ad499b94966eeb03a064010a3a5d3ed0d3e8f623be5cbe7e83d0c7a6/cfgv-3.0.0.tar.gz", hash = "sha256:04b093b14ddf9fd4d17c53ebfd55582d27b76ed30050193c14e560770c5360eb", size = 7518, upload-time = "2020-02-10T19:12:25.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/b8/1b9626e940bf80cc5a19a19e6b4c99282aa88f438cbcd2d86d7a2a666974/cfgv-3.0.0-py2.py3-none-any.whl", hash = "sha256:f22b426ed59cd2ab2b54ff96608d846c33dfb8766a67f0b4a6ce130ce244414f", size = 7260, upload-time = "2020-02-10T19:12:23.441Z" }, +] + +[[package]] +name = "cfgv" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/bf/d0d622b660d414a47dc7f0d303791a627663f554345b21250e39e7acb48b/cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736", size = 7864, upload-time = "2021-08-25T14:18:49.905Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/82/0a0ebd35bae9981dea55c06f8e6aaf44a49171ad798795c72c6f64cba4c2/cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426", size = 7312, upload-time = "2021-08-25T14:18:47.77Z" }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload-time = "2024-10-09T18:35:47.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "typing-extensions", version = "4.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, +] + +[[package]] +name = "fairship" +version = "0.1.0" +source = { editable = "." } + +[package.dev-dependencies] +dev = [ + { name = "pre-commit", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.6.1'" }, + { name = "pre-commit", version = "2.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, + { name = "pre-commit", version = "2.21.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "pre-commit", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pre-commit", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pytest", version = "7.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, + { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "pre-commit", specifier = ">=2.1.1" }, + { name = "pytest", specifier = ">=7.0.1" }, +] + +[[package]] +name = "filelock" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/38/9df45cc0be41e596be759d952711d0e540f149019d18f747ec2ade7c8807/filelock-3.4.1.tar.gz", hash = "sha256:0f12f552b42b5bf60dba233710bf71337d35494fc8bdd4fd6d9f6d082ad45e06", size = 206768, upload-time = "2021-12-26T14:18:39.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/ce/8916d10ef537f3f3b046843255f9799504aa41862bfa87844b9bdc5361cd/filelock-3.4.1-py3-none-any.whl", hash = "sha256:a4bc51381e01502a30e9f06dd4fa19a1712eab852b6fb0f84fd7cce0793d8ca3", size = 9852, upload-time = "2021-12-26T14:18:38.969Z" }, +] + +[[package]] +name = "filelock" +version = "3.12.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/00/0b/c506e9e44e4c4b6c89fcecda23dc115bf8e7ff7eb127e0cb9c114cbc9a15/filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81", size = 12441, upload-time = "2023-06-12T22:02:09.617Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/45/ec3407adf6f6b5bf867a4462b2b0af27597a26bd3cd6e2534cb6ab029938/filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec", size = 10923, upload-time = "2023-06-12T22:02:08.03Z" }, +] + +[[package]] +name = "filelock" +version = "3.16.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037, upload-time = "2024-09-17T19:02:01.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163, upload-time = "2024-09-17T19:02:00.268Z" }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, +] + +[[package]] +name = "identify" +version = "1.6.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/27/6121caf3fe2413ba557937dab97c07a42a2de4bc3b73813fc5a6954c009a/identify-1.6.2.tar.gz", hash = "sha256:1c2014f6985ed02e62b2e6955578acf069cb2c54859e17853be474bfe7e13bed", size = 98583, upload-time = "2021-03-01T15:06:25.656Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/cd/4eee2b8809ba71dcf2145538ac42871a1be44c3af02223e28db73e76b01f/identify-1.6.2-py2.py3-none-any.whl", hash = "sha256:8f9879b5b7cca553878d31548a419ec2f227d3328da92fe8202bc5e546d5cbc3", size = 98044, upload-time = "2021-03-01T15:06:23.565Z" }, +] + +[[package]] +name = "identify" +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/82/c7/750d9467e90be6c8c8ff94a7aff029ed1229f2d53843ddf8d2b142051c88/identify-2.4.4.tar.gz", hash = "sha256:6b4b5031f69c48bf93a646b90de9b381c6b5f560df4cbe0ed3cf7650ae741e4d", size = 98756, upload-time = "2022-01-13T23:47:21.152Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/1a/93ac674fee1a5af11bdbc1cd895895a8710aa49402558bf91ec3523f0214/identify-2.4.4-py2.py3-none-any.whl", hash = "sha256:aa68609c7454dbcaae60a01ff6b8df1de9b39fe6e50b1f6107ec81dcda624aa6", size = 98400, upload-time = "2022-01-13T23:47:19.648Z" }, +] + +[[package]] +name = "identify" +version = "2.5.24" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/f8/498e13e408d25ee6ff04aa0acbf91ad8e9caae74be91720fc0e811e649b7/identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4", size = 98886, upload-time = "2023-05-03T14:45:38.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/fd/2c46fba2bc032ba4c970bb8de59d25187087d7138a0ebf7c1dcc91d94f01/identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d", size = 98826, upload-time = "2023-05-03T14:45:34.823Z" }, +] + +[[package]] +name = "identify" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/29/bb/25024dbcc93516c492b75919e76f389bac754a3e4248682fba32b250c880/identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98", size = 99097, upload-time = "2024-09-14T23:50:32.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/0c/4ef72754c050979fdcc06c744715ae70ea37e734816bb6514f79df77a42f/identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0", size = 98972, upload-time = "2024-09-14T23:50:30.747Z" }, +] + +[[package]] +name = "identify" +version = "2.6.12" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload-time = "2025-05-23T20:37:53.3Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload-time = "2025-05-23T20:37:51.495Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "4.8.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +dependencies = [ + { name = "typing-extensions", version = "4.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, + { name = "zipp", version = "3.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/ed/e65128cc5cb1580f22ee3009d9187ecdfcc43ffb3b581fe854b24e87d8e7/importlib_metadata-4.8.3.tar.gz", hash = "sha256:766abffff765960fcc18003801f7044eb6755ffae4521c8e8ce8e83b9c9b0668", size = 41979, upload-time = "2021-12-16T14:42:26.577Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/a1/b153a0a4caf7a7e3f15c2cd56c7702e2cf3d89b1b359d1f1c5e59d68f4ce/importlib_metadata-4.8.3-py3-none-any.whl", hash = "sha256:65a9576a5b2d58ca44d133c42a241905cc45e34d2c06fd5ba2bafa221e5d7b5e", size = 17978, upload-time = "2021-12-16T14:42:25.457Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "zipp", version = "3.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569, upload-time = "2023-06-18T21:44:35.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934, upload-time = "2023-06-18T21:44:33.441Z" }, +] + +[[package]] +name = "importlib-resources" +version = "5.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", version = "3.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/eb/9a21e2ae696a0530c73304f9d1d3c063065f82d3562822b55466c6ef62ef/importlib_resources-5.2.3.tar.gz", hash = "sha256:203d70dda34cfbfbb42324a8d4211196e7d3e858de21a5eb68c6d1cdd99e4e98", size = 30055, upload-time = "2021-10-17T19:36:29.732Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/8e/84a6a778a1160cefcef1192a7bd26e4e6689981553aff13c2b2b6f1c352f/importlib_resources-5.2.3-py3-none-any.whl", hash = "sha256:ae35ed1cfe8c0d6c1a53ecd168167f01fa93b893d51a62cdf23aea044c67211b", size = 27859, upload-time = "2021-10-17T19:36:27.463Z" }, +] + +[[package]] +name = "iniconfig" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/23/a2/97899f6bd0e873fed3a7e67ae8d3a08b21799430fb4da15cfedf10d6e2c2/iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32", size = 8104, upload-time = "2020-10-14T10:20:18.572Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/dd/b3c12c6d707058fa947864b67f0c4e0c39ef8610988d7baea9578f3c48f3/iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", size = 4990, upload-time = "2020-10-16T17:37:23.05Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload-time = "2023-01-07T11:08:11.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + +[[package]] +name = "packaging" +version = "21.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +dependencies = [ + { name = "pyparsing", version = "3.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.6.8'" }, + { name = "pyparsing", version = "3.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.6.8' and python_full_version < '3.7'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/9e/d1a7217f69310c1db8fdf8ab396229f55a699ce34a203691794c5d1cad0c/packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", size = 84848, upload-time = "2021-11-18T00:39:13.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/8e/8de486cbd03baba4deef4142bd643a3e7bbe954a784dc1bb17142572d127/packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522", size = 40750, upload-time = "2021-11-18T00:39:10.932Z" }, +] + +[[package]] +name = "packaging" +version = "24.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", size = 147882, upload-time = "2024-03-10T09:39:28.33Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", size = 53488, upload-time = "2024-03-10T09:39:25.947Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "platformdirs" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/96/d70b9462671fbeaacba4639ff866fb4e9e558580853fc5d6e698d0371ad4/platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", size = 24051, upload-time = "2021-09-25T20:46:06.59Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/78/dcfd84d3aabd46a9c77260fb47ea5d244806e4daef83aa6fe5d83adb182c/platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d", size = 14400, upload-time = "2021-09-25T20:46:05.161Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/28/e40d24d2e2eb23135f8533ad33d582359c7825623b1e022f9d460def7c05/platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731", size = 19914, upload-time = "2023-11-10T16:43:08.316Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/16/70be3b725073035aa5fc3229321d06e22e73e3e09f6af78dcfdf16c7636c/platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b", size = 17562, upload-time = "2023-11-10T16:43:06.949Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302, upload-time = "2024-09-17T19:06:50.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439, upload-time = "2024-09-17T19:06:49.212Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, +] + +[[package]] +name = "pluggy" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +dependencies = [ + { name = "importlib-metadata", version = "4.8.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/16/db2d7de3474b6e37cbb9c008965ee63835bba517e22cdb8c35b5116b5ce1/pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", size = 51510, upload-time = "2021-08-25T16:26:02.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/01/f38e2ff29715251cf25532b9082a1589ab7e4f571ced434f98d0139336dc/pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3", size = 13667, upload-time = "2021-08-25T16:25:59.674Z" }, +] + +[[package]] +name = "pluggy" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +dependencies = [ + { name = "importlib-metadata", version = "6.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/42/8f2833655a29c4e9cb52ee8a2be04ceac61bcff4a680fb338cbd3d1e322d/pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3", size = 61613, upload-time = "2023-06-21T09:12:28.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/32/4a79112b8b87b21450b066e102d6608907f4c885ed7b04c3fdb085d4d6ae/pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", size = 17695, upload-time = "2023-06-21T09:12:27.397Z" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pre-commit" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.6.1'", +] +dependencies = [ + { name = "cfgv", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.6.1'" }, + { name = "identify", version = "1.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.6.1'" }, + { name = "importlib-metadata", version = "4.8.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.6.1'" }, + { name = "importlib-resources", marker = "python_full_version < '3.6.1'" }, + { name = "nodeenv", marker = "python_full_version < '3.6.1'" }, + { name = "pyyaml", version = "6.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.6.1'" }, + { name = "toml", marker = "python_full_version < '3.6.1'" }, + { name = "virtualenv", version = "20.16.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.6.1'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/a0/27fcad6672877be9d75fc42fe571bdfb5051017cdeb69d8df14be6cdc59f/pre_commit-2.1.1.tar.gz", hash = "sha256:f8d555e31e2051892c7f7b3ad9f620bd2c09271d87e9eedb2ad831737d6211eb", size = 147942, upload-time = "2020-02-24T17:05:03.969Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/42/3f6698ff1bf3297eb5ba586635ce1a4b93f9012b1a181e09fd874790bcbb/pre_commit-2.1.1-py2.py3-none-any.whl", hash = "sha256:09ebe467f43ce24377f8c2f200fe3cd2570d328eb2ce0568c8e96ce19da45fa6", size = 170410, upload-time = "2020-02-24T17:05:01.891Z" }, +] + +[[package]] +name = "pre-commit" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", +] +dependencies = [ + { name = "cfgv", version = "3.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, + { name = "identify", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, + { name = "importlib-metadata", version = "4.8.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, + { name = "importlib-resources", marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, + { name = "nodeenv", marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, + { name = "pyyaml", version = "6.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, + { name = "toml", marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, + { name = "virtualenv", version = "20.16.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.6.1' and python_full_version < '3.7'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/ea/13bb25c70e6d04b5788c42e0d3fcc82b06bc89f5d44c3c5606ef1af5a7cc/pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a", size = 170517, upload-time = "2022-01-18T18:38:19.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/a0/9c06353771c8dae6db437dd513a885eccdb1566cb332569130484eddf4e7/pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616", size = 195663, upload-time = "2022-01-18T18:38:17.981Z" }, +] + +[[package]] +name = "pre-commit" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +dependencies = [ + { name = "cfgv", version = "3.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "identify", version = "2.5.24", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "importlib-metadata", version = "6.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "nodeenv", marker = "python_full_version == '3.7.*'" }, + { name = "pyyaml", version = "6.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "virtualenv", version = "20.26.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/00/1637ae945c6e10838ef5c41965f1c864e59301811bb203e979f335608e7c/pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658", size = 174966, upload-time = "2022-12-25T22:53:01.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/6b/6cfe3a8b351b54f4b6c6d2ad4286804e3367f628dce379c603d3b96635f4/pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad", size = 201938, upload-time = "2022-12-25T22:52:59.649Z" }, +] + +[[package]] +name = "pre-commit" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "cfgv", version = "3.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "identify", version = "2.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "nodeenv", marker = "python_full_version == '3.8.*'" }, + { name = "pyyaml", version = "6.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "virtualenv", version = "20.31.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/b3/4ae08d21eb097162f5aad37f4585f8069a86402ed7f5362cc9ae097f9572/pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32", size = 177079, upload-time = "2023-10-13T15:57:48.334Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/75/526915fedf462e05eeb1c75ceaf7e3f9cde7b5ce6f62740fe5f7f19a0050/pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660", size = 203698, upload-time = "2023-10-13T15:57:46.378Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +dependencies = [ + { name = "cfgv", version = "3.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "identify", version = "2.6.12", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "nodeenv", marker = "python_full_version >= '3.9'" }, + { name = "pyyaml", version = "6.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "virtualenv", version = "20.31.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload-time = "2025-03-18T21:35:20.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload-time = "2025-03-18T21:35:19.343Z" }, +] + +[[package]] +name = "py" +version = "1.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", size = 207796, upload-time = "2021-11-04T17:17:01.377Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", size = 98708, upload-time = "2021-11-04T17:17:00.152Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.0.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/60/9bed18f43275b34198eb9720d4c1238c68b3755620d20df0afd89424d32b/pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea", size = 884709, upload-time = "2022-01-21T05:41:34.625Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/c1/23fd82ad3121656b585351aba6c19761926bb0db2ebed9e4ff09a43a3fcc/pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484", size = 98049, upload-time = "2022-01-21T05:41:33.032Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.1.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", +] +sdist = { url = "https://files.pythonhosted.org/packages/83/08/13f3bce01b2061f2bbd582c9df82723de943784cf719a35ac886c652043a/pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032", size = 900231, upload-time = "2024-08-25T15:00:47.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", size = 104100, upload-time = "2024-08-25T15:00:45.361Z" }, +] + +[[package]] +name = "pytest" +version = "7.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +dependencies = [ + { name = "atomicwrites", marker = "python_full_version < '3.7' and sys_platform == 'win32'" }, + { name = "attrs", marker = "python_full_version < '3.7'" }, + { name = "colorama", marker = "python_full_version < '3.7' and sys_platform == 'win32'" }, + { name = "importlib-metadata", version = "4.8.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, + { name = "iniconfig", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, + { name = "packaging", version = "21.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, + { name = "pluggy", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, + { name = "py", marker = "python_full_version < '3.7'" }, + { name = "tomli", version = "1.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/2c/a67ad48759051c7abf82ce182a4e6d766de371b183182d2dde03089e8dfb/pytest-7.0.1.tar.gz", hash = "sha256:e30905a0c131d3d94b89624a1cc5afec3e0ba2fbdb151867d8e0ebd49850f171", size = 1249154, upload-time = "2022-02-11T18:47:58.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/93/c7c0bd1e932b287fb948eb9ce5a3d6307c9fc619db1e199f8c8bc5dad95f/pytest-7.0.1-py3-none-any.whl", hash = "sha256:9ce3ff477af913ecf6321fe337b93a2c0dcf2a0a1439c43f5452112c1e4280db", size = 296985, upload-time = "2022-02-11T18:47:56.328Z" }, +] + +[[package]] +name = "pytest" +version = "7.4.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.7.*' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.7.*'" }, + { name = "importlib-metadata", version = "6.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "iniconfig", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "pluggy", version = "1.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8", size = 325287, upload-time = "2023-12-31T12:00:13.963Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.8.*' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.8.*'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "packaging", version = "25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "tomli", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.9' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "packaging", version = "25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pygments", marker = "python_full_version >= '3.9'" }, + { name = "tomli", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload-time = "2025-06-18T05:48:06.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload-time = "2025-06-18T05:48:03.955Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", size = 125201, upload-time = "2023-07-18T00:00:23.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", size = 189447, upload-time = "2023-07-17T23:57:04.325Z" }, + { url = "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f", size = 169264, upload-time = "2023-07-17T23:57:07.787Z" }, + { url = "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", size = 677003, upload-time = "2023-07-17T23:57:13.144Z" }, + { url = "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", size = 699070, upload-time = "2023-07-17T23:57:19.402Z" }, + { url = "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", size = 705525, upload-time = "2023-07-17T23:57:25.272Z" }, + { url = "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", size = 707514, upload-time = "2023-08-28T18:43:20.945Z" }, + { url = "https://files.pythonhosted.org/packages/b6/a0/b6700da5d49e9fed49dc3243d3771b598dad07abb37cc32e524607f96adc/PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", size = 130488, upload-time = "2023-07-17T23:57:28.144Z" }, + { url = "https://files.pythonhosted.org/packages/24/97/9b59b43431f98d01806b288532da38099cc6f2fea0f3d712e21e269c0279/PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", size = 145338, upload-time = "2023-07-17T23:57:31.118Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", size = 187867, upload-time = "2023-07-17T23:57:34.35Z" }, + { url = "https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", size = 167530, upload-time = "2023-07-17T23:57:36.975Z" }, + { url = "https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", size = 732244, upload-time = "2023-07-17T23:57:43.774Z" }, + { url = "https://files.pythonhosted.org/packages/06/92/e0224aa6ebf9dc54a06a4609da37da40bb08d126f5535d81bff6b417b2ae/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", size = 752871, upload-time = "2023-07-17T23:57:51.921Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", size = 757729, upload-time = "2023-07-17T23:57:59.865Z" }, + { url = "https://files.pythonhosted.org/packages/03/5c/c4671451b2f1d76ebe352c0945d4cd13500adb5d05f5a51ee296d80152f7/PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", size = 748528, upload-time = "2023-08-28T18:43:23.207Z" }, + { url = "https://files.pythonhosted.org/packages/73/9c/766e78d1efc0d1fca637a6b62cea1b4510a7fb93617eb805223294fef681/PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", size = 130286, upload-time = "2023-07-17T23:58:02.964Z" }, + { url = "https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", size = 144699, upload-time = "2023-07-17T23:58:05.586Z" }, + { url = "https://files.pythonhosted.org/packages/bc/06/1b305bf6aa704343be85444c9d011f626c763abb40c0edc1cad13bfd7f86/PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", size = 178692, upload-time = "2023-08-28T18:43:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/84/02/404de95ced348b73dd84f70e15a41843d817ff8c1744516bf78358f2ffd2/PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", size = 165622, upload-time = "2023-08-28T18:43:26.54Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4c/4a2908632fc980da6d918b9de9c1d9d7d7e70b2672b1ad5166ed27841ef7/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", size = 696937, upload-time = "2024-01-18T20:40:22.92Z" }, + { url = "https://files.pythonhosted.org/packages/b4/33/720548182ffa8344418126017aa1d4ab4aeec9a2275f04ce3f3573d8ace8/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", size = 724969, upload-time = "2023-08-28T18:43:28.56Z" }, + { url = "https://files.pythonhosted.org/packages/4f/78/77b40157b6cb5f2d3d31a3d9b2efd1ba3505371f76730d267e8b32cf4b7f/PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", size = 712604, upload-time = "2023-08-28T18:43:30.206Z" }, + { url = "https://files.pythonhosted.org/packages/2e/97/3e0e089ee85e840f4b15bfa00e4e63d84a3691ababbfea92d6f820ea6f21/PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", size = 126098, upload-time = "2023-08-28T18:43:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/fbade56564ad486809c27b322d0f7e6a89c01f6b4fe208402e90d4443a99/PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", size = 138675, upload-time = "2023-08-28T18:43:33.613Z" }, + { url = "https://files.pythonhosted.org/packages/02/74/b2320ebe006b6a521cf929c78f12a220b9db319b38165023623ed195654b/PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", size = 189453, upload-time = "2023-07-17T23:58:08.684Z" }, + { url = "https://files.pythonhosted.org/packages/03/f7/4f8b71f3ce8cfb2c06e814aeda5b26ecc62ecb5cf85f5c8898be34e6eb6a/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", size = 669628, upload-time = "2023-07-17T23:58:14.456Z" }, + { url = "https://files.pythonhosted.org/packages/fe/88/def2e57fe740544f2eefb1645f1d6e0094f56c00f4eade708140b6137ead/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", size = 694933, upload-time = "2023-07-17T23:58:21.839Z" }, + { url = "https://files.pythonhosted.org/packages/62/2a/df7727c52e151f9e7b852d7d1580c37bd9e39b2f29568f0f81b29ed0abc2/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", size = 677167, upload-time = "2023-07-17T23:58:29.298Z" }, + { url = "https://files.pythonhosted.org/packages/41/9a/1c4c51f1a0d2b6fd805973701ab0ec84d5e622c5aaa573b0e1157f132809/PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", size = 137460, upload-time = "2023-07-17T23:58:32.604Z" }, + { url = "https://files.pythonhosted.org/packages/27/d5/fb4f7a3c96af89c214387af42c76117d2c2a0a40576e217632548a6e1aff/PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", size = 153098, upload-time = "2023-07-17T23:58:36.359Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d1/02baa09d39b1bb1ebaf0d850d106d1bdcb47c91958557f471153c49dc03b/PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", size = 189627, upload-time = "2023-07-17T23:58:40.188Z" }, + { url = "https://files.pythonhosted.org/packages/e5/31/ba812efa640a264dbefd258986a5e4e786230cb1ee4a9f54eb28ca01e14a/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", size = 658438, upload-time = "2023-07-17T23:58:48.34Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f1/08f06159739254c8947899c9fc901241614195db15ba8802ff142237664c/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", size = 680304, upload-time = "2023-07-17T23:58:57.396Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/db62b0df635b9008fe90aa68424e99cee05e68b398740c8a666a98455589/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", size = 670140, upload-time = "2023-07-17T23:59:04.291Z" }, + { url = "https://files.pythonhosted.org/packages/cc/5c/fcabd17918348c7db2eeeb0575705aaf3f7ab1657f6ce29b2e31737dd5d1/PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", size = 137577, upload-time = "2023-07-17T23:59:07.267Z" }, + { url = "https://files.pythonhosted.org/packages/1e/ae/964ccb88a938f20ece5754878f182cfbd846924930d02d29d06af8d4c69e/PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", size = 153248, upload-time = "2023-07-17T23:59:10.608Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5d/2779ea035ba1e533c32ed4a249b4e0448f583ba10830b21a3cddafe11a4e/PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", size = 191734, upload-time = "2023-07-17T23:59:13.869Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a1/27bfac14b90adaaccf8c8289f441e9f76d94795ec1e7a8f134d9f2cb3d0b/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", size = 723767, upload-time = "2023-07-17T23:59:20.686Z" }, + { url = "https://files.pythonhosted.org/packages/c1/39/47ed4d65beec9ce07267b014be85ed9c204fa373515355d3efa62d19d892/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", size = 749067, upload-time = "2023-07-17T23:59:28.747Z" }, + { url = "https://files.pythonhosted.org/packages/c8/6b/6600ac24725c7388255b2f5add93f91e58a5d7efaf4af244fdbcc11a541b/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", size = 736569, upload-time = "2023-07-17T23:59:37.216Z" }, + { url = "https://files.pythonhosted.org/packages/0d/46/62ae77677e532c0af6c81ddd6f3dbc16bdcc1208b077457354442d220bfb/PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", size = 787738, upload-time = "2023-08-28T18:43:35.582Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6a/439d1a6f834b9a9db16332ce16c4a96dd0e3970b65fe08cbecd1711eeb77/PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", size = 139797, upload-time = "2023-07-17T23:59:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/29/0f/9782fa5b10152abf033aec56a601177ead85ee03b57781f2d9fced09eefc/PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", size = 157350, upload-time = "2023-07-17T23:59:42.94Z" }, + { url = "https://files.pythonhosted.org/packages/57/c5/5d09b66b41d549914802f482a2118d925d876dc2a35b2d127694c1345c34/PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", size = 197846, upload-time = "2023-07-17T23:59:46.424Z" }, + { url = "https://files.pythonhosted.org/packages/0e/88/21b2f16cb2123c1e9375f2c93486e35fdc86e63f02e274f0e99c589ef153/PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", size = 174396, upload-time = "2023-07-17T23:59:49.538Z" }, + { url = "https://files.pythonhosted.org/packages/ac/6c/967d91a8edf98d2b2b01d149bd9e51b8f9fb527c98d80ebb60c6b21d60c4/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", size = 731824, upload-time = "2023-07-17T23:59:58.111Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4b/c71ef18ef83c82f99e6da8332910692af78ea32bd1d1d76c9787dfa36aea/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", size = 754777, upload-time = "2023-07-18T00:00:06.716Z" }, + { url = "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", size = 738883, upload-time = "2023-07-18T00:00:14.423Z" }, + { url = "https://files.pythonhosted.org/packages/40/da/a175a35cf5583580e90ac3e2a3dbca90e43011593ae62ce63f79d7b28d92/PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", size = 750294, upload-time = "2023-08-28T18:43:37.153Z" }, + { url = "https://files.pythonhosted.org/packages/24/62/7fcc372442ec8ea331da18c24b13710e010c5073ab851ef36bf9dacb283f/PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", size = 136936, upload-time = "2023-07-18T00:00:17.167Z" }, + { url = "https://files.pythonhosted.org/packages/84/4d/82704d1ab9290b03da94e6425f5e87396b999fd7eb8e08f3a92c158402bf/PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", size = 152751, upload-time = "2023-07-18T00:00:19.939Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199, upload-time = "2024-08-06T20:31:40.178Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758, upload-time = "2024-08-06T20:31:42.173Z" }, + { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463, upload-time = "2024-08-06T20:31:44.263Z" }, + { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280, upload-time = "2024-08-06T20:31:50.199Z" }, + { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239, upload-time = "2024-08-06T20:31:52.292Z" }, + { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802, upload-time = "2024-08-06T20:31:53.836Z" }, + { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527, upload-time = "2024-08-06T20:31:55.565Z" }, + { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052, upload-time = "2024-08-06T20:31:56.914Z" }, + { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774, upload-time = "2024-08-06T20:31:58.304Z" }, + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, + { url = "https://files.pythonhosted.org/packages/74/d9/323a59d506f12f498c2097488d80d16f4cf965cee1791eab58b56b19f47a/PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", size = 183218, upload-time = "2024-08-06T20:33:06.411Z" }, + { url = "https://files.pythonhosted.org/packages/74/cc/20c34d00f04d785f2028737e2e2a8254e1425102e730fee1d6396f832577/PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", size = 728067, upload-time = "2024-08-06T20:33:07.879Z" }, + { url = "https://files.pythonhosted.org/packages/20/52/551c69ca1501d21c0de51ddafa8c23a0191ef296ff098e98358f69080577/PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", size = 757812, upload-time = "2024-08-06T20:33:12.542Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7f/2c3697bba5d4aa5cc2afe81826d73dfae5f049458e44732c7a0938baa673/PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", size = 746531, upload-time = "2024-08-06T20:33:14.391Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ab/6226d3df99900e580091bb44258fde77a8433511a86883bd4681ea19a858/PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", size = 800820, upload-time = "2024-08-06T20:33:16.586Z" }, + { url = "https://files.pythonhosted.org/packages/a0/99/a9eb0f3e710c06c5d922026f6736e920d431812ace24aae38228d0d64b04/PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", size = 145514, upload-time = "2024-08-06T20:33:22.414Z" }, + { url = "https://files.pythonhosted.org/packages/75/8a/ee831ad5fafa4431099aa4e078d4c8efd43cd5e48fbc774641d233b683a9/PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", size = 162702, upload-time = "2024-08-06T20:33:23.813Z" }, + { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777, upload-time = "2024-08-06T20:33:25.896Z" }, + { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318, upload-time = "2024-08-06T20:33:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891, upload-time = "2024-08-06T20:33:28.974Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614, upload-time = "2024-08-06T20:33:34.157Z" }, + { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360, upload-time = "2024-08-06T20:33:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006, upload-time = "2024-08-06T20:33:37.501Z" }, + { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577, upload-time = "2024-08-06T20:33:39.389Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593, upload-time = "2024-08-06T20:33:46.63Z" }, + { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312, upload-time = "2024-08-06T20:33:49.073Z" }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, +] + +[[package]] +name = "tomli" +version = "1.2.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/2e/d0a8276b0cf9b9e34fd0660c330acc59656f53bb2209adc75af863a3582d/tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f", size = 15094, upload-time = "2021-12-13T22:25:06.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e4/74f9440db36734d7ba83c574c1e7024009ce849208a41f90e94a134dc6d1/tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c", size = 12122, upload-time = "2021-12-13T22:25:05.02Z" }, +] + +[[package]] +name = "tomli" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164, upload-time = "2022-02-08T10:54:04.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757, upload-time = "2022-02-08T10:54:02.017Z" }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/5a/8b5fbb891ef3f81fc923bf3cb4a578c0abf9471eb50ce0f51c74212182ab/typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42", size = 26694, upload-time = "2022-02-14T03:19:57.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/6b/44f7f8f1e110027cf88956b59f2fad776cca7e1704396d043f89effd3a0e/typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2", size = 26844, upload-time = "2022-02-14T03:19:55.773Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876, upload-time = "2023-07-02T14:20:55.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232, upload-time = "2023-07-02T14:20:53.275Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.16.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +dependencies = [ + { name = "distlib", marker = "python_full_version < '3.7'" }, + { name = "filelock", version = "3.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, + { name = "importlib-metadata", version = "4.8.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, + { name = "importlib-resources", marker = "python_full_version < '3.7'" }, + { name = "platformdirs", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/17/5a822952d90f791947f9d1d11c84c055ffc3b7a315c2552d4f46a0d6cd12/virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db", size = 12217706, upload-time = "2022-07-27T21:54:18.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/5e/1c73595c491b4cceffcb1aebf87eb54b9a5d48cc5226409ccf0ea96aeb91/virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3", size = 8801059, upload-time = "2022-07-27T21:53:47.076Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.26.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +dependencies = [ + { name = "distlib", marker = "python_full_version == '3.7.*'" }, + { name = "filelock", version = "3.12.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "importlib-metadata", version = "6.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, + { name = "platformdirs", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.7.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3f/40/abc5a766da6b0b2457f819feab8e9203cbeae29327bd241359f866a3da9d/virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48", size = 9372482, upload-time = "2024-09-27T16:28:57.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2", size = 5999862, upload-time = "2024-09-27T16:28:54.798Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.31.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "distlib", marker = "python_full_version >= '3.8'" }, + { name = "filelock", version = "3.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "filelock", version = "3.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "platformdirs", version = "4.3.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316, upload-time = "2025-05-08T17:58:23.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982, upload-time = "2025-05-08T17:58:21.15Z" }, +] + +[[package]] +name = "zipp" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.6.8' and python_full_version < '3.7'", + "python_full_version >= '3.6.1' and python_full_version < '3.6.8'", + "python_full_version < '3.6.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/02/bf/0d03dbdedb83afec081fefe86cae3a2447250ef1a81ac601a9a56e785401/zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832", size = 13047, upload-time = "2021-09-29T15:34:01.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/df/d4a4974a3e3957fd1c1fa3082366d7fff6e428ddb55f074bf64876f8e8ad/zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc", size = 5313, upload-time = "2021-09-29T15:34:00.831Z" }, +] + +[[package]] +name = "zipp" +version = "3.15.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.7.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/00/27/f0ac6b846684cecce1ee93d32450c45ab607f65c2e0255f0092032d91f07/zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", size = 18454, upload-time = "2023-02-25T02:17:22.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556", size = 6758, upload-time = "2023-02-25T02:17:20.807Z" }, +]