diff --git a/DaVinciExamples/python/DaVinciExamples/tupling/example-tupling-basic.py b/DaVinciExamples/python/DaVinciExamples/tupling/example-tupling-basic.py index f3f3daf7cf2eb042d061fb0123a52faef13b0e1a..4033edef57ded1ae24dc118267667ff83aa92996 100644 --- a/DaVinciExamples/python/DaVinciExamples/tupling/example-tupling-basic.py +++ b/DaVinciExamples/python/DaVinciExamples/tupling/example-tupling-basic.py @@ -18,11 +18,13 @@ Example of a typical DaVinci job: __author__ = "Maurizio Martinelli" __date__ = "2021-03-16" -from PyConf.Algorithms import PrintDecayTree -from PyConf.Algorithms import FunTuple_Particles as FunTuple -from DaVinci import options, run_davinci, DVNode, DVHelper from DaVinci.standard_particles import make_detached_mumu +from DaVinci import options, run_davinci, DVNode, DVHelper from DaVinci.reco_objects import upfront_reconstruction_from_file as upfront_reconstruction +import Functors as F +from FunTuple import ParticleTupleProp, convert_to_parsable_objs +from PyConf.Algorithms import PrintDecayTree +from PyConf.Algorithms import FunTuple_Particles as FunTuple # print control flow and data flow graphs options.control_flow_file = 'control_flow.gv' @@ -42,29 +44,52 @@ print(options) # Prepare the node with the selection dimuons = make_detached_mumu() -# Prepare the node with the user algorithms -pdt = PrintDecayTree(name="PrintDimuons", Input=dimuons) - # Add a FUNTuple -decay_descriptors = [ - '[J/psi(1S) -> mu+ mu-]CC', '[J/psi(1S) -> ^mu+ mu-]CC', - '[J/psi(1S) -> mu+ ^mu-]CC' -] -branch_names = ['Jpsi', 'MuPlus', 'MuMinus'] -#for Jpsi store p, pt and mu+ store p and mu- store pt -functors = [['P', 'PT'], ['P'], ['PT']] -functor_branch_names = [['P', 'PT'], ['P'], ['PT']] +#FunTuple: define list of preambles for loki +loki_preamble = ['TRACK_MAX_PT = MAXTREE(ISBASIC & HASTRACK, PT, -1)'] + +#FunTuple: Jpsi info +ParticleJpsi = ParticleTupleProp( + branch_name_prefix="Jpsi", + decay_descriptor="J/psi(1S) -> mu+ mu-", + #Dict -> {name:functor} + particle_code_loki={ + 'LOKI_P': 'P', + 'LOKI_PT': 'PT', + 'LOKI_Muonp_PT': 'CHILD(PT, 1)', + 'LOKI_Muonm_PT': 'CHILD(PT, 2)', + 'LOKI_MAXPT': 'TRACK_MAX_PT', + 'LOKI_N_HIHGPT_TRCKS': 'NINTREE(ISBASIC & HASTRACK & (PT > 1500*MeV))' + }, + particle_code_thor={ + 'THOR_P': F.P, + 'THOR_PT': F.PT + }) + +#FunTuple: Mu plus info: Can also muon and make a seperate ParticleTupleProp object +ParticleMuPlus = ParticleTupleProp( + branch_name_prefix="MuPlus", + decay_descriptor="J/psi(1S) -> ^mu+ mu-", + particle_code_loki={'LOKI_P': 'P'}, + particle_code_thor={'THOR_P': F.P}) + +#FunTuple: Do not need to do this if a custom gaudi property for ParticleTupleProp is implemented +parsable_objs = convert_to_parsable_objs([ParticleJpsi, ParticleMuPlus]) + +#FunTuple: Configure FunTuple algorithm ftup = FunTuple( name="DimuonsTuple", tree_name="DecayTree", - decay_descriptors=decay_descriptors, - branch_names=branch_names, - functors=functors, - functor_branch_names=functor_branch_names, + branch_names_prefix=parsable_objs[0], + decay_descriptors=parsable_objs[1], + loki_functors=parsable_objs[2][0], + loki_functor_branch_names=parsable_objs[2][1], + thor_functors=parsable_objs[3][0], + thor_functor_branch_names=parsable_objs[3][1], + loki_preamble=loki_preamble, input_location=dimuons) dvh = DVHelper() dvh.add_selections_node("Selection1", upfront_reconstruction() + [dimuons]) -dvh.add_user_node('User1', [pdt]) dvh.add_tuples_node('Tuple1', [ftup]) dvh.run(options) diff --git a/DaVinciExamples/tests/qmtest/tupling.qms/test_example-tupling-basic.qmt b/DaVinciExamples/tests/qmtest/tupling.qms/test_example-tupling-basic.qmt index 9f80f416debd268e49c347e9ea5a7efaf186b589..ee15744a622575fd5bc4f65ab07b3a8c67f52563 100644 --- a/DaVinciExamples/tests/qmtest/tupling.qms/test_example-tupling-basic.qmt +++ b/DaVinciExamples/tests/qmtest/tupling.qms/test_example-tupling-basic.qmt @@ -18,16 +18,53 @@ </set></argument> <argument name="validator"><text> findReferenceBlock(""" -PrintDimuons.PrintDecayTreeTool INFO Name E M P Pt phi Vz P(C/K) PP(C/K) -PrintDimuons.PrintDecayTreeTool INFO MeV MeV MeV MeV mrad mm -PrintDimuons.PrintDecayTreeTool INFO J/psi(1S) 30155.22 4062.62 29880.30 3993.47 -3007.05 45.68 0/0 N/A -PrintDimuons.PrintDecayTreeTool INFO +-->mu+ 12777.17 105.66 12776.73 3572.06 -2747.17 45.41 1/99 2/99 -PrintDimuons.PrintDecayTreeTool INFO +-->mu- 17377.81 105.66 17377.49 1065.10 2238.10 43.82 1/54 2/54 -PrintDimuons.PrintDecayTreeTool INFO -PrintDimuons.PrintDecayTreeTool INFO Used TES locations :- -PrintDimuons.PrintDecayTreeTool INFO 0 = '/Event/CombineParticles/Particles' -PrintDimuons.PrintDecayTreeTool INFO 1 = '/Event/FunctionalParticleMaker/Particles' -PrintDimuons.PrintDecayTreeTool INFO 2 = '/Event/Rec/ProtoP/Charged' +RFileCnv INFO dumping contents of /NTUPLES/FILE1 +TFile: name=DV-example-tupling-basic-ntp.root, title=Gaudi Trees, option=CREATE +****************************************************************************** +*Tree :DecayTree : DecayTree * +*Entries : 3 : Total = 6907 bytes File Size = 2072 * +* : : Tree compression factor = 1.00 * +****************************************************************************** +*Br 0 :Jpsi_LOKI_N_HIHGPT_TRCKS : Jpsi_LOKI_N_HIHGPT_TRCKS/D * +*Entries : 3 : Total Size= 697 bytes File Size = 120 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 1 :Jpsi_LOKI_PT : Jpsi_LOKI_PT/D * +*Entries : 3 : Total Size= 637 bytes File Size = 108 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 2 :Jpsi_LOKI_MAXPT : Jpsi_LOKI_MAXPT/D * +*Entries : 3 : Total Size= 652 bytes File Size = 111 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 3 :Jpsi_LOKI_Muonp_PT : Jpsi_LOKI_Muonp_PT/D * +*Entries : 3 : Total Size= 667 bytes File Size = 114 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 4 :Jpsi_LOKI_Muonm_PT : Jpsi_LOKI_Muonm_PT/D * +*Entries : 3 : Total Size= 667 bytes File Size = 114 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 5 :Jpsi_LOKI_P : Jpsi_LOKI_P/D * +*Entries : 3 : Total Size= 632 bytes File Size = 107 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 6 :Jpsi_THOR_P : Jpsi_THOR_P/D * +*Entries : 3 : Total Size= 632 bytes File Size = 107 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 7 :Jpsi_THOR_PT : Jpsi_THOR_PT/D * +*Entries : 3 : Total Size= 637 bytes File Size = 108 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 8 :MuPlus_LOKI_P : MuPlus_LOKI_P/D * +*Entries : 3 : Total Size= 642 bytes File Size = 109 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* +*Br 9 :MuPlus_THOR_P : MuPlus_THOR_P/D * +*Entries : 3 : Total Size= 642 bytes File Size = 109 * +*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.00 * +*............................................................................* """, stdout, result, causes, signature_offset = 0) countErrorLines({"FATAL":0, "ERROR":0}) @@ -46,7 +83,7 @@ try: except IOError as err: raise IOError('Impossible to open file: ', err) except: - print('Unexpected error while opening file: ', sys.exc_info()[0]) + raise Exception('Unexpected error while opening file: ') <argument name="exit_code"><integer>1</integer></argument> </text></argument> -</extension> +</extension> \ No newline at end of file