From a25575eeee66089ff2d0d8827024ed27d98e93c5 Mon Sep 17 00:00:00 2001 From: Peter Willendrup Date: Mon, 27 Jan 2025 15:29:17 +0100 Subject: [PATCH 1/8] Make hidden numpy dependency explicit also on Debian --- tools/Python/mcrun/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Python/mcrun/CMakeLists.txt b/tools/Python/mcrun/CMakeLists.txt index 3a1cb20a84..7ea4355ead 100644 --- a/tools/Python/mcrun/CMakeLists.txt +++ b/tools/Python/mcrun/CMakeLists.txt @@ -51,7 +51,7 @@ set(CPACK_NSIS_DISPLAY_NAME "${NSIS_NAME}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${NSIS_NAME}") # Debian -set(CPACK_DEBIAN_PACKAGE_DEPENDS "${FLAVOR}, python3-yaml") +set(CPACK_DEBIAN_PACKAGE_DEPENDS "${FLAVOR}, python3-yaml, python3-numpy") set(CPACK_DEBIAN_PACKAGE_REPLACES "${FLAVOR}-tools-python-${P}run-3.5.1") # RPM From 979d28df58f13b39d5f83a201bf0d6bfff3baddf Mon Sep 17 00:00:00 2001 From: Peter Willendrup Date: Tue, 28 Jan 2025 14:11:42 +0100 Subject: [PATCH 2/8] Silence warning from printf (nSegments should be integer in any case) --- mcstas-comps/optics/Elliptic_guide_gravity.comp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcstas-comps/optics/Elliptic_guide_gravity.comp b/mcstas-comps/optics/Elliptic_guide_gravity.comp index 4b4434cde5..69508e80b2 100644 --- a/mcstas-comps/optics/Elliptic_guide_gravity.comp +++ b/mcstas-comps/optics/Elliptic_guide_gravity.comp @@ -140,7 +140,7 @@ SETTING PARAMETERS (xwidth = 0,yheight = 0,l, string verbose = "on", enableGravity = 1.0, curvature=0, - nSegments=-1, + int nSegments=-1, vector mvaluesright=NULL, vector mvaluesleft=NULL, vector mvaluestop=NULL, vector mvaluesbottom=NULL, vector seglength=NULL) From 6249b6621b8d308ee391ca5c94c3cd8992c27ca2 Mon Sep 17 00:00:00 2001 From: Peter Willendrup Date: Tue, 28 Jan 2025 14:14:04 +0100 Subject: [PATCH 3/8] Use filenames for datafiles in these warnings --- mcstas-comps/optics/Pol_mirror.comp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcstas-comps/optics/Pol_mirror.comp b/mcstas-comps/optics/Pol_mirror.comp index beebdabb3e..ba615bb8b4 100644 --- a/mcstas-comps/optics/Pol_mirror.comp +++ b/mcstas-comps/optics/Pol_mirror.comp @@ -111,7 +111,7 @@ INITIALIZE if (strlen(rUpData) && strcmp(rUpData,"NULL")){ if (Table_Read(&rUpTable, rUpData, 1) <= 0) { fprintf(stderr,"Pol_mirror: %s: can not read file %s\n", - NAME_CURRENT_COMP, rUpPar); + NAME_CURRENT_COMP, rUpData); exit(1); } rUpTableFlag=1; @@ -121,7 +121,7 @@ INITIALIZE if (strlen(rUpData) && strcmp(rUpData,"NULL")){ if (Table_Read(&rDownTable, rDownData, 1) <= 0) { fprintf(stderr,"Pol_mirror: %s: can not read file %s\n", - NAME_CURRENT_COMP, rDownPar); + NAME_CURRENT_COMP, rDownData); exit(1); } rDownTableFlag=1; From 72b3ef51157b7f0d6ca9ff09f125081b8222deea Mon Sep 17 00:00:00 2001 From: Peter Willendrup Date: Tue, 28 Jan 2025 16:05:12 +0100 Subject: [PATCH 4/8] Add make() function in the generated .py script --- mcstas/src/pygen.c.in | 189 ++++++++++++++++++++++-------------------- 1 file changed, 98 insertions(+), 91 deletions(-) diff --git a/mcstas/src/pygen.c.in b/mcstas/src/pygen.c.in index e8a0abd107..8103cd1867 100644 --- a/mcstas/src/pygen.c.in +++ b/mcstas/src/pygen.c.in @@ -328,22 +328,22 @@ int cogen_decls(struct instr_def *instr) if (verbose) fprintf(stderr, "Writing instrument '%s' and components DECLARE\n", instr->name); cout(""); - cout("# *****************************************************************************"); - coutf("# * instrument '%s' and components DECLARE", instr->name); - cout("# *****************************************************************************"); + cout(" # *****************************************************************************"); + coutf(" # * instrument '%s' and components DECLARE", instr->name); + cout(" # *****************************************************************************"); cout(""); /* 1. particle definition */ /* moved to cogen_header, as this is needed in mccode-r */ /* 2. Global variables for instrument parameters. */ - cout("# Instrument parameters:"); + cout(" # Instrument parameters:"); cout(""); int numipar=0; if (!list_len(instr->formals)) { - coutf("# Instrument %s has_no_parameters!", instr->name); + coutf(" # Instrument %s has_no_parameters!", instr->name); } else { liter = list_iterate(instr->formals); while((i_formal = list_next(liter))) @@ -367,13 +367,13 @@ int cogen_decls(struct instr_def *instr) if (i_formal->type == instr_type_string) { type="string"; - coutf("%s = instr.add_parameter('%s', '%s', value='%s', comment='Parameter type (string) added by McCode py-generator')", pyid, type, i_formal->id, exp_tostring(i_formal->default_value)); + coutf(" %s = instr.add_parameter('%s', '%s', value='%s', comment='Parameter type (string) added by McCode py-generator')", pyid, type, i_formal->id, exp_tostring(i_formal->default_value)); } else if (i_formal->type == instr_type_int) { type="int"; - coutf("%s = instr.add_parameter('%s', '%s', value=%s, comment='Parameter type (int) added by McCode py-generator')", pyid, type, i_formal->id, exp_tostring(i_formal->default_value)); + coutf(" %s = instr.add_parameter('%s', '%s', value=%s, comment='Parameter type (int) added by McCode py-generator')", pyid, type, i_formal->id, exp_tostring(i_formal->default_value)); } else if (i_formal->type == instr_type_double) { type="double"; - coutf("%s = instr.add_parameter('%s', '%s', value=%s, comment='Parameter type (double) added by McCode py-generator')", pyid, type, i_formal->id, exp_tostring(i_formal->default_value)); + coutf(" %s = instr.add_parameter('%s', '%s', value=%s, comment='Parameter type (double) added by McCode py-generator')", pyid, type, i_formal->id, exp_tostring(i_formal->default_value)); } else { type=""; fprintf(stderr,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); @@ -381,7 +381,7 @@ int cogen_decls(struct instr_def *instr) fprintf(stderr,"!!! an undefined type (i.e. not string, int or double). !!!\n"); fprintf(stderr,"!!! Compilation will likely fail... !!!\n"); fprintf(stderr,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - coutf("%s = instr.add_parameter('%s', '%s', value=%s, comment='Parameter of undefined type added by McCode py-generator')", pyid, type, i_formal->id, exp_tostring(i_formal->default_value)); + coutf(" %s = instr.add_parameter('%s', '%s', value=%s, comment='Parameter of undefined type added by McCode py-generator')", pyid, type, i_formal->id, exp_tostring(i_formal->default_value)); } numipar++; @@ -396,29 +396,29 @@ int cogen_decls(struct instr_def *instr) Symtab_handle component_metadata_handle = symtab_iterate(component_metadata); struct Symtab_entry * one_component_metadata; /* To start, just write a tuple of (str, str, str) tuples */ - coutf("component_definition_metadata = {"); + coutf(" component_definition_metadata = {"); struct metadata_struct * metadataStruct; while ((one_component_metadata = symtab_next(component_metadata_handle))) { - coutf("'%s': {", one_component_metadata->name); + coutf(" '%s': {", one_component_metadata->name); liter = list_iterate(one_component_metadata->val); while (metadataStruct = list_next(liter)) { - coutf("'%s': ('%s', ", metadataStruct->name, metadataStruct->type); + coutf(" '%s': ('%s', ", metadataStruct->name, metadataStruct->type); triple_escaped_lines_out(metadataStruct->lines); - coutf("), "); + coutf(" ), "); } list_iterate_end(liter); - coutf("}, "); + coutf(" }, "); } - coutf("}"); + coutf(" }"); symtab_iterate_end(component_metadata_handle); symtab_free(component_metadata, NULL); - cout("instr.append_declare(r'''"); + cout(" instr.append_declare(r'''"); codeblock_out(instr->decls); - cout("''')\n\n"); - cout("instr.append_initialize(r'''"); + cout(" ''')\n\n"); + cout(" instr.append_initialize(r'''"); codeblock_out(instr->inits); - cout("''')\n\n"); + cout(" ''')\n\n"); return(warnings); } /* cogen_decls */ @@ -434,7 +434,7 @@ void def_uservars(struct instr_def *instr) char *tpe; while((var = list_next(liter))) { tpe = list_next(liter2); - coutf("uv_%s = instr.add_user_var(\"%s\", \"%s\", comment=\"USERVAR added by McCode py-generator\")",var,tpe,var); + coutf(" uv_%s = instr.add_user_var(\"%s\", \"%s\", comment=\"USERVAR added by McCode py-generator\")",var,tpe,var); } list_iterate_end(liter); list_iterate_end(liter2); @@ -477,10 +477,10 @@ int cogen_raytrace(struct instr_def *instr) // write the raytrace function // - cout("# *****************************************************************************"); - coutf("# * instrument '%s' %s", instr->name, "TRACE"); - cout("# *****************************************************************************"); - cout(""); + cout(" # *****************************************************************************"); + coutf(" # * instrument '%s' %s", instr->name, "TRACE"); + cout(" # *****************************************************************************"); + cout(" "); liter = list_iterate(instr->complist); while((comp = list_next(liter)) != NULL) { @@ -507,74 +507,74 @@ int cogen_raytrace(struct instr_def *instr) ry = exp_tostring(comp->pos->orientation.y); rz = exp_tostring(comp->pos->orientation.z); - coutf("# Comp instance %s, placement and parameters", comp->name); + coutf(" # Comp instance %s, placement and parameters", comp->name); /* Case 1, both AT and ROTATED in absolute coordinates */ if (!strcmp(poslabel, "ABSOLUTE") && !strcmp(rotlabel, "ABSOLUTE")) { if (strcmp(rx,"0.0") || strcmp(ry,"0.0") || strcmp(rz,"0.0")) { - coutf("%s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], ROTATED=['%s', '%s', '%s'])", + coutf(" %s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], ROTATED=['%s', '%s', '%s'])", comp->name, comp->name, comp->def->name, x, y, z, rx, ry, rz); } else if (strcmp(x,"0") || strcmp(y,"0") || strcmp(z,"0")) { - coutf("%s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'])", comp->name, comp->name, comp->def->name, x, y, z); + coutf(" %s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'])", comp->name, comp->name, comp->def->name, x, y, z); } else { - coutf("%s = instr.add_component('%s','%s')", comp->name, comp->name, comp->def->name); + coutf(" %s = instr.add_component('%s','%s')", comp->name, comp->name, comp->def->name); } } else if (!strcmp(poslabel, "ABSOLUTE")) { if (strcmp(rx,"0.0") || strcmp(ry,"0.0") || strcmp(rz,"0.0")) { - coutf("%s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], ROTATED=['%s', '%s', '%s'], ROTATED_RELATIVE='%s')", + coutf(" %s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], ROTATED=['%s', '%s', '%s'], ROTATED_RELATIVE='%s')", comp->name, comp->name, comp->def->name, x, y, z, rx, ry, rz, rotlabel); } else if (strcmp(x,"0") || strcmp(y,"0") || strcmp(z,"0")) { - coutf("%s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'])", comp->name, comp->name, comp->def->name, x, y, z); + coutf(" %s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'])", comp->name, comp->name, comp->def->name, x, y, z); } else { - coutf("%s = instr.add_component('%s','%s')", comp->name, comp->name, comp->def->name); + coutf(" %s = instr.add_component('%s','%s')", comp->name, comp->name, comp->def->name); } } else if (!strcmp(rotlabel, "ABSOLUTE")) { if (strcmp(rx,"0.0") || strcmp(ry,"0.0") || strcmp(rz,"0.0")) { - coutf("%s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], AT_RELATIVE='%s', ROTATED=['%s', '%s', '%s'])", + coutf(" %s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], AT_RELATIVE='%s', ROTATED=['%s', '%s', '%s'])", comp->name, comp->name, comp->def->name, x, y, z, poslabel, rx, ry, rz); } else { - coutf("%s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], AT_RELATIVE='%s',)", comp->name, comp->name, comp->def->name, x, y, z, poslabel); + coutf(" %s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], AT_RELATIVE='%s',)", comp->name, comp->name, comp->def->name, x, y, z, poslabel); } } else { - coutf("%s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], AT_RELATIVE='%s', ROTATED=['%s', '%s', '%s'], ROTATED_RELATIVE='%s')", + coutf(" %s = instr.add_component('%s','%s', AT=['%s', '%s', '%s'], AT_RELATIVE='%s', ROTATED=['%s', '%s', '%s'], ROTATED_RELATIVE='%s')", comp->name, comp->name, comp->def->name, x, y, z, poslabel, rx, ry, rz, rotlabel); } if (comp->split) { - coutf("# SPLIT %s times at %s", exp_tostring(comp->split) ,comp->name); - coutf("%s.set_SPLIT('%s')",comp->name, exp_tostring(comp->split)); + coutf(" # SPLIT %s times at %s", exp_tostring(comp->split) ,comp->name); + coutf(" %s.set_SPLIT('%s')",comp->name, exp_tostring(comp->split)); } if (list_len(comp->jump) > 0) { - coutf("# JUMP at %s", comp->name); + coutf(" # JUMP at %s", comp->name); struct jump_struct *this_jump; List_handle literJ = list_iterate(comp->jump); while((this_jump = list_next(literJ))) { char *exp = exp_tostring(this_jump->condition); if(this_jump->iterate) { - coutf("%s.set_JUMP('%s ITERATE %s')",comp->name,this_jump->target,exp); + coutf(" %s.set_JUMP('%s ITERATE %s')",comp->name,this_jump->target,exp); } else { - coutf("%s.set_JUMP('%s WHEN %s')",comp->name,this_jump->target,exp); + coutf(" %s.set_JUMP('%s WHEN %s')",comp->name,this_jump->target,exp); } } list_iterate_end(literJ); } if (comp->when) { - coutf("# WHEN %s at %s", exp_tostring(comp->when) ,comp->name); - coutf("%s.set_WHEN('%s')",comp->name, exp_tostring(comp->when)); + coutf(" # WHEN %s at %s", exp_tostring(comp->when) ,comp->name); + coutf(" %s.set_WHEN('%s')",comp->name, exp_tostring(comp->when)); } if (comp->group) { - coutf("# %s is in GROUP %s",comp->name, comp->group->name); - coutf("%s.set_GROUP('%s')",comp->name, comp->group->name); + coutf(" # %s is in GROUP %s",comp->name, comp->group->name); + coutf(" %s.set_GROUP('%s')",comp->name, comp->group->name); } if (list_len(comp->extend->lines) > 0) { - coutf("# EXTEND at %s", comp->name); - coutf("%s.append_EXTEND(r'''",comp->name); + coutf(" # EXTEND at %s", comp->name); + coutf(" %s.append_EXTEND(r'''",comp->name); codeblock_out(comp->extend); - cout("''')\n\n"); + cout(" ''')\n\n"); } if (list_len(comp->metadata)) { @@ -582,14 +582,14 @@ int cogen_raytrace(struct instr_def *instr) for (int lit=0; litmetadata); ++lit){ l_ptr = (struct metadata_struct *) list_access(comp->metadata, lit); if (l_ptr->instance) { - coutf("%s.append_METADATA(type='%s', name='%s', lines=", comp->name, l_ptr->type, l_ptr->name); + coutf(" %s.append_METADATA(type='%s', name='%s', lines=", comp->name, l_ptr->type, l_ptr->name); triple_escaped_lines_out(l_ptr->lines); - coutf(")"); + coutf(" )"); } } } - cout(""); + cout(" "); List_handle piter; struct comp_iformal *par; struct Symtab_entry *entry; @@ -599,10 +599,10 @@ int cogen_raytrace(struct instr_def *instr) // get parameter value from component parameters name-value structure entry = symtab_lookup(comp->setpar, par->id); val = exp_tostring(entry->val); - coutf("%s.%s = '%s'",comp->name, par->id, val); + coutf(" %s.%s = '%s'",comp->name, par->id, val); } list_iterate_end(piter); - cout(""); + cout(" "); } list_iterate_end(liter); @@ -648,13 +648,15 @@ cogen_header(struct instr_def *instr, char *output_name) cout(""); #if MCCODE_PROJECT == 1 /* neutron */ cout("# Python McStas instrument description"); - coutf("instr = ms.McStas_instr(\"%s_generated\", author = \"McCode Py-Generator\", origin = \"ESS DMSC\")",instr->name); + cout("def make():"); + coutf(" instr = ms.McStas_instr(\"%s_generated\", author = \"McCode Py-Generator\", origin = \"ESS DMSC\")",instr->name); #elif MCCODE_PROJECT == 2 /* xray */ cout("# Python McXtrace instrument description"); - coutf("instr = ms.McXtrace_instr(\"%s_generated\", author = \"McCode Py-Generator\", origin = \"ESS DMSC\")",instr->name); + cout("def make():"); + coutf(" instr = ms.McXtrace_instr(\"%s_generated\", author = \"McCode Py-Generator\", origin = \"ESS DMSC\")",instr->name); #endif - cout("\n# Add collected DEPENDENCY strings"); - coutf("instr.set_dependency('%s')",instr->dependency); + cout(" \n# Add collected DEPENDENCY strings"); + coutf(" instr.set_dependency('%s')",instr->dependency); /* handles Windows '\' chararcters for embedding sys_dir into source code */ if (MC_PATHSEP_C != '\\') strcpy(pathsep, MC_PATHSEP_S); else strcpy(pathsep, "\\\\"); @@ -675,10 +677,10 @@ cogen_header(struct instr_def *instr, char *output_name) int uvlist = get_codeblock_vars(instr->vars, instr->user_vars, instr->user_vars_types, "USERVARS", "EXTEND"); cout(""); - cout("# *****************************************************************************"); - coutf("# * Start of instrument '%s' generated code", instr->name); - cout("# *****************************************************************************"); - coutf("# " MCCODE_LIBENV " system dir is \"%s%s\"", sysdir_new,pathsep); + cout(" # *****************************************************************************"); + coutf(" # * Start of instrument '%s' generated code", instr->name); + cout(" # *****************************************************************************"); + coutf(" # " MCCODE_LIBENV " system dir is \"%s%s\"", sysdir_new,pathsep); cout(""); @@ -979,40 +981,45 @@ cogen(char *output_name, struct instr_def *instr) warnings += cogen_raytrace(instr); - cout("# Instruct McStasscript not to 'check everythng'"); - cout("instr.settings(checks=False)"); + cout(" # Instruct McStasscript not to 'check everythng'"); + cout(" instr.settings(checks=False)"); + cout(" return instr"); + cout(""); + cout(""); + cout("if __name__ == '__main__':"); if (!lint) { - cout("# (also, this is where one can add e.g. seed=1000, ncount=1e7, mpi=8, openacc=True, force_compile=False etc.)"); - cout("\n\n# Show diagram"); - cout("instr.show_diagram()"); - cout("\n\n# Visualise with default parameters."); - cout("instr.show_instrument()"); - cout("\n\n# Generate a dataset with default parameters."); - cout("data = instr.backengine()"); - cout("\n# Overview plot:"); - cout("ms.make_sub_plot(data)"); - cout("\n\n# Other useful commands follow..."); - cout("\n# One plot pr. window"); - cout("#ms.make_plot(data)"); - cout("\n# Load another dataset"); - cout("#data2 = ms.load_data('some_other_folder')"); - cout("\n# Adjusting a specific plot"); - cout("#ms.name_plot_options(\"PSD_4PI\", data, log=1, colormap=\"hot\", orders_of_mag=5)"); - cout("\n\n# Bring up the 'interface' - only relevant in Jupyter"); - cout("#%matplotlib widget"); - cout("#import mcstasscript.jb_interface as ms_widget"); - cout("#ms_widget.show(data)"); - cout("\n\n# Bring up the simulation 'interface' - only relevant in Jupyter"); - cout("%matplotlib widget"); - cout("import mcstasscript.jb_interface as ms_widget"); - cout("sim_widget = ms_widget.SimInterface(instr)"); - cout("sim_widget.show_interface()"); - cout("\n\n# Acessing data from the interface"); - cout("data = sim_widget.get_data()"); + cout(" instr=make()"); + cout(" # Use instr.settings() to add e.g. seed=1000, ncount=1e7, mpi=8, openacc=True, force_compile=False etc.)"); + cout(" \n\n# Show diagram"); + cout(" instr.show_diagram()"); + cout(" \n\n# Visualise with default parameters (defaults to 'window'/pyqtgraph visualisation)"); + cout(" instr.show_instrument(format='window')"); + cout(" \n\n# Generate a dataset with default parameters."); + cout(" data = instr.backengine()"); + cout(" \n# Overview plot:"); + cout(" ms.make_sub_plot(data)"); + cout(" \n\n# Other useful commands follow..."); + cout(" \n# One plot pr. window"); + cout(" #ms.make_plot(data)"); + cout(" \n# Load another dataset"); + cout(" #data2 = ms.load_data('some_other_folder')"); + cout(" \n# Adjusting a specific plot"); + cout(" #ms.name_plot_options(\"PSD_4PI\", data, log=1, colormap=\"hot\", orders_of_mag=5)"); + cout(" \n\n# Bring up the 'interface' - only relevant in Jupyter"); + cout(" #%matplotlib widget"); + cout(" #import mcstasscript.jb_interface as ms_widget"); + cout(" #ms_widget.show(data)"); + cout(" \n\n# Bring up the simulation 'interface' - only relevant in Jupyter"); + cout(" #%matplotlib widget"); + cout(" #import mcstasscript.jb_interface as ms_widget"); + cout(" #sim_widget = ms_widget.SimInterface(instr)"); + cout(" #sim_widget.show_interface()"); + cout(" \n\n# Acessing data from the interface"); + cout(" #data = sim_widget.get_data()"); } else { - cout("instr.check_for_relative_errors()"); - cout("\n\n# Show diagram"); - cout("instr.show_diagram()"); + cout(" instr.check_for_relative_errors()"); + cout("\n\n # Show diagram"); + cout(" instr.show_diagram()"); } coutf("\n\n# end of generated Python code %s ", output_name); From b3ad9972640598494715e08b0a01b58f99148f4a Mon Sep 17 00:00:00 2001 From: Peter Willendrup Date: Tue, 28 Jan 2025 16:27:55 +0100 Subject: [PATCH 5/8] Use template .ipynb from jupylab script --- tools/Python/mcrun/CMakeLists.txt | 4 +- tools/Python/mcrun/jupylab.in | 3 +- tools/Python/mcrun/template.ipynb.in | 159 +++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 tools/Python/mcrun/template.ipynb.in diff --git a/tools/Python/mcrun/CMakeLists.txt b/tools/Python/mcrun/CMakeLists.txt index 7ea4355ead..36c76f2f12 100644 --- a/tools/Python/mcrun/CMakeLists.txt +++ b/tools/Python/mcrun/CMakeLists.txt @@ -90,8 +90,8 @@ install( RENAME "${P}run.py" ) -# Other .py infrastructure -foreach(NAME "__init__.py" "log.py" "mccode.py" "optimisation.py" "mcsplit.py") +# Copy in place .py and other infrastructure +foreach(NAME "__init__.py" "log.py" "mccode.py" "optimisation.py" "mcsplit.py" "template.ipynb.in") install( FILES "${PROJECT_SOURCE_DIR}/${NAME}" DESTINATION "${DEST_TOOLDIR}/${TOOLS_NAME}" diff --git a/tools/Python/mcrun/jupylab.in b/tools/Python/mcrun/jupylab.in index c8b82d20d8..98a3f48a73 100755 --- a/tools/Python/mcrun/jupylab.in +++ b/tools/Python/mcrun/jupylab.in @@ -33,10 +33,9 @@ canrun() { if ( canrun ); then INSTR=$1 # We can actually assume a single input here BASE=`basename ${INSTR} .instr` - PYINSTR="${BASE}_generated.py" JUPYBK="${BASE}_generated.ipynb" @FLAVOR@-pygen ${INSTR} - jupytext --to ipynb ${PYINSTR} + sed s/@INSTR@/${INSTR}g ${UTILDIR}/template.ipynb.in > ${JUPYBK} jupyter lab ${JUPYBK} else @FLAVOR@_errmsg Failed to run Python ${TOOL} - permissions or missing dependencies\? diff --git a/tools/Python/mcrun/template.ipynb.in b/tools/Python/mcrun/template.ipynb.in new file mode 100644 index 0000000000..a564132142 --- /dev/null +++ b/tools/Python/mcrun/template.ipynb.in @@ -0,0 +1,159 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import mcstasscript as ms\n", + "from @INSTR@_generated import make" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "instr=make()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Use instr.settings() to add e.g. seed=1000, ncount=1e7, mpi=8, openacc=True, force_compile=False etc.)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Show diagram\n", + "instr.show_diagram()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Visualise with default parameters (defaults to 'window'/pyqtgraph visualisation)\n", + "instr.show_instrument(format='window')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Generate a dataset with default parameters.\n", + "data = instr.backengine()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Overview plot:\n", + "ms.make_sub_plot(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Other useful commands follow...\n", + "# One plot pr. window\n", + "#ms.make_plot(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load another dataset\n", + "#data2 = ms.load_data('some_other_folder')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Adjusting a specific plot\n", + "#ms.name_plot_options(\\\"PSD_4PI\\\", data, log=1, colormap=\\\"hot\\\", orders_of_mag=5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Bring up the 'interface' - only relevant in Jupyter\n", + "#%matplotlib widget\n", + "#import mcstasscript.jb_interface as ms_widget\n", + "#ms_widget.show(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Bring up the simulation 'interface' - only relevant in Jupyter\n", + "#%matplotlib widget\n", + "#import mcstasscript.jb_interface as ms_widget\n", + "#sim_widget = ms_widget.SimInterface(instr)\n", + "#sim_widget.show_interface()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Acessing data from the interface\n", + "#data = sim_widget.get_data()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 6b5ea2e6bf3c43477a8c5e2fcc6750cc90641994 Mon Sep 17 00:00:00 2001 From: Peter Willendrup Date: Tue, 28 Jan 2025 16:35:46 +0100 Subject: [PATCH 6/8] Corrections --- tools/Python/mcrun/jupylab.in | 2 +- tools/Python/mcrun/template.ipynb.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/Python/mcrun/jupylab.in b/tools/Python/mcrun/jupylab.in index 98a3f48a73..1f5fe7c3be 100755 --- a/tools/Python/mcrun/jupylab.in +++ b/tools/Python/mcrun/jupylab.in @@ -35,7 +35,7 @@ if ( canrun ); then BASE=`basename ${INSTR} .instr` JUPYBK="${BASE}_generated.ipynb" @FLAVOR@-pygen ${INSTR} - sed s/@INSTR@/${INSTR}g ${UTILDIR}/template.ipynb.in > ${JUPYBK} + sed s/INSTRUMENT/${BASE}/g ${UTILDIR}/template.ipynb.in > ${JUPYBK} jupyter lab ${JUPYBK} else @FLAVOR@_errmsg Failed to run Python ${TOOL} - permissions or missing dependencies\? diff --git a/tools/Python/mcrun/template.ipynb.in b/tools/Python/mcrun/template.ipynb.in index a564132142..1deeaba4de 100644 --- a/tools/Python/mcrun/template.ipynb.in +++ b/tools/Python/mcrun/template.ipynb.in @@ -7,7 +7,7 @@ "outputs": [], "source": [ "import mcstasscript as ms\n", - "from @INSTR@_generated import make" + "from INSTRUMENT_generated import make" ] }, { From 81e4fd1e39fb1449dbd7147c37193c98f07ce8f6 Mon Sep 17 00:00:00 2001 From: Peter Willendrup Date: Tue, 28 Jan 2025 19:03:02 +0100 Subject: [PATCH 7/8] Try using sed also on windows --- cmake/support/run-scripts/labenv.bat.in | 5 +++-- meta-pkgs/windows/environment.yml | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cmake/support/run-scripts/labenv.bat.in b/cmake/support/run-scripts/labenv.bat.in index eaab053d4e..e62865e217 100755 --- a/cmake/support/run-scripts/labenv.bat.in +++ b/cmake/support/run-scripts/labenv.bat.in @@ -13,8 +13,9 @@ SET EXT=%%~xi @IF "%EXT%"==".instr" ( @FLAVOR@-pygen %INSTRUMENT% - SET INSTRUMENT="%BASE%_generated.py" - goto :JupyText + sed s/INSTRUMENT/%BASE%/g %BINDIR%\@MCCODE_RELPATH_BINDIR2TOOLDIR@\Python\@MCCODE_PREFIX@run\template.ipynb.in > %BASE%_generated.ipynb + SET INSTRUMENT="%BASE%_generated.ipynb" + goto :JupyLaunch ) ELSE IF "%EXT%"==".py" ( goto :JupyLaunch ) ELSE IF "%EXT%"==".ipynb" ( diff --git a/meta-pkgs/windows/environment.yml b/meta-pkgs/windows/environment.yml index ef54df2263..cb05f582da 100644 --- a/meta-pkgs/windows/environment.yml +++ b/meta-pkgs/windows/environment.yml @@ -6,6 +6,8 @@ channels: dependencies: - m2-msys2-runtime + - m2-which + - m2-sed - m2w64-gcc - m2w64-gsl - msmpi From d4b1caedd51bd1d54054f407ac810a3be32982f6 Mon Sep 17 00:00:00 2001 From: Peter Willendrup Date: Tue, 28 Jan 2025 21:48:32 +0100 Subject: [PATCH 8/8] Disable inclusion of (currently failing) MCPL cross-compile buils --- meta-pkgs/windows/McStas-metapackage64.iss | 2 -- meta-pkgs/windows/McXtrace-metapackage64.iss | 2 -- 2 files changed, 4 deletions(-) diff --git a/meta-pkgs/windows/McStas-metapackage64.iss b/meta-pkgs/windows/McStas-metapackage64.iss index fd9d39ff07..4319057f8f 100644 --- a/meta-pkgs/windows/McStas-metapackage64.iss +++ b/meta-pkgs/windows/McStas-metapackage64.iss @@ -53,7 +53,6 @@ Source: "dist\mcstas-tools-python-mcdisplay-pyqtgraph-NSIS64-@VERSION@-mingw64.e Source: "dist\mcstas-tools-python-mcdisplay-matplotlib-NSIS64-@VERSION@-mingw64.exe"; DestDir: "{tmp}" Source: "dist\mcstas-tools-python-mcdisplay-mantid-NSIS64-@VERSION@-mingw64.exe"; DestDir: "{tmp}" Source: "dist\mcstas-tools-python-mcdoc-NSIS64-@VERSION@-mingw64.exe"; DestDir: "{tmp}" -Source: "dist\mcstas-mcpl-NSIS64-@VERSION@-mingw64.exe"; DestDir: "{tmp}" Source: "Support\Miniforge3-Windows-x86_64.exe"; DestDir: "{tmp}" [Run] @@ -76,7 +75,6 @@ Filename: "{tmp}\mcstas-tools-python-mcdisplay-pyqtgraph-NSIS64-@VERSION@-mingw6 Filename: "{tmp}\mcstas-tools-python-mcdisplay-matplotlib-NSIS64-@VERSION@-mingw64.exe"; Parameters: "/S" Filename: "{tmp}\mcstas-tools-python-mcdisplay-mantid-NSIS64-@VERSION@-mingw64.exe"; Parameters: "/S" Filename: "{tmp}\mcstas-tools-python-mcdoc-NSIS64-@VERSION@-mingw64.exe"; Parameters: "/S" -Filename: "{tmp}\mcstas-mcpl-NSIS64-@VERSION@-mingw64.exe"; Parameters: "/S" Filename: "{tmp}\docupdate.bat"; ; NOTE: Don't use "Flags: ignoreversion" on any shared system files diff --git a/meta-pkgs/windows/McXtrace-metapackage64.iss b/meta-pkgs/windows/McXtrace-metapackage64.iss index 2d03e3d1cf..44c5f15b03 100644 --- a/meta-pkgs/windows/McXtrace-metapackage64.iss +++ b/meta-pkgs/windows/McXtrace-metapackage64.iss @@ -48,7 +48,6 @@ Source: "dist\mcxtrace-tools-python-mxdisplay-webgl-NSIS64-@VERSION@-mingw64.exe Source: "dist\mcxtrace-tools-python-mxdisplay-pyqtgraph-NSIS64-@VERSION@-mingw64.exe"; DestDir: "{tmp}" Source: "dist\mcxtrace-tools-python-mxdisplay-matplotlib-NSIS64-@VERSION@-mingw64.exe"; DestDir: "{tmp}" Source: "dist\mcxtrace-tools-python-mxdoc-NSIS64-@VERSION@-mingw64.exe"; DestDir: "{tmp}" -Source: "dist\mcxtrace-mcpl-NSIS64-@VERSION@-mingw64.exe"; DestDir: "{tmp}" Source: "Support\Miniforge3-Windows-x86_64.exe"; DestDir: "{tmp}" [Run] @@ -66,7 +65,6 @@ Filename: "{tmp}\mcxtrace-tools-python-mxdisplay-webgl-NSIS64-@VERSION@-mingw64. Filename: "{tmp}\mcxtrace-tools-python-mxdisplay-pyqtgraph-NSIS64-@VERSION@-mingw64.exe"; Parameters: "/S" Filename: "{tmp}\mcxtrace-tools-python-mxdisplay-matplotlib-NSIS64-@VERSION@-mingw64.exe"; Parameters: "/S" Filename: "{tmp}\mcxtrace-tools-python-mxdoc-NSIS64-@VERSION@-mingw64.exe"; Parameters: "/S" -Filename: "{tmp}\mcxtrace-mcpl-NSIS64-@VERSION@-mingw64.exe"; Parameters: "/S" Filename: "{tmp}\docupdate.bat"; ; NOTE: Don't use "Flags: ignoreversion" on any shared system files