diff --git a/numass-core/src/main/java/inr/numass/NumassProperties.java b/numass-core/src/main/java/inr/numass/NumassProperties.java index 6ccdf66e..cd6e733d 100644 --- a/numass-core/src/main/java/inr/numass/NumassProperties.java +++ b/numass-core/src/main/java/inr/numass/NumassProperties.java @@ -21,7 +21,7 @@ import java.util.Properties; public class NumassProperties { private static File getNumassPropertiesFile() throws IOException { - File file = new File(Global.Companion.instance().getUserDirectory(), "numass"); + File file = new File(Global.INSTANCE.getUserDirectory(), "numass"); if (!file.exists()) { file.mkdirs(); } @@ -54,7 +54,7 @@ public class NumassProperties { } props.store(new FileOutputStream(store), ""); } catch (IOException ex) { - Global.Companion.instance().getLogger().error("Failed to save numass properties", ex); + Global.INSTANCE.getLogger().error("Failed to save numass properties", ex); } } } diff --git a/numass-core/src/main/java/inr/numass/data/api/SimpleNumassPoint.java b/numass-core/src/main/java/inr/numass/data/api/SimpleNumassPoint.java index a8361c87..3a6b52ec 100644 --- a/numass-core/src/main/java/inr/numass/data/api/SimpleNumassPoint.java +++ b/numass-core/src/main/java/inr/numass/data/api/SimpleNumassPoint.java @@ -23,9 +23,9 @@ public class SimpleNumassPoint extends MetaHolder implements NumassPoint { * @param blocks */ public SimpleNumassPoint(double voltage, Collection blocks) { + super(new MetaBuilder("point").setValue(HV_KEY, voltage)); this.blocks = new ArrayList<>(blocks); this.blocks.sort(Comparator.comparing(NumassBlock::getStartTime)); - super.setMeta(new MetaBuilder("point").setValue(HV_KEY, voltage)); } public SimpleNumassPoint(Meta meta, Collection blocks) { diff --git a/numass-core/src/main/java/inr/numass/data/storage/NumassDataFactory.java b/numass-core/src/main/java/inr/numass/data/storage/NumassDataFactory.java index 9e792b40..23b295c6 100644 --- a/numass-core/src/main/java/inr/numass/data/storage/NumassDataFactory.java +++ b/numass-core/src/main/java/inr/numass/data/storage/NumassDataFactory.java @@ -27,7 +27,7 @@ public class NumassDataFactory extends DataFactory { @Override protected void fill(DataTree.Builder builder, Context context, Meta meta) { Meta newMeta = meta.getBuilder().setValue("type", "numass"); - Storage storage = context.loadFeature("hep.dataforge:storage", StorageManager.class).buildStorage(newMeta); + Storage storage = context.load(StorageManager.class, Meta.empty()).buildStorage(newMeta); StorageUtils.loaderStream(storage).forEach(loader -> { if (loader instanceof NumassSet) { builder.putStatic(loader.getFullName().toUnescaped(), (NumassSet) loader); diff --git a/numass-core/src/main/java/inr/numass/data/storage/NumassStorageFactory.java b/numass-core/src/main/java/inr/numass/data/storage/NumassStorageFactory.java index 488e5cf0..34964130 100644 --- a/numass-core/src/main/java/inr/numass/data/storage/NumassStorageFactory.java +++ b/numass-core/src/main/java/inr/numass/data/storage/NumassStorageFactory.java @@ -29,13 +29,13 @@ public class NumassStorageFactory implements StorageType { */ @NotNull public static FileStorage buildLocal(Context context, Path file, boolean readOnly, boolean monitor) { - StorageManager manager = context.loadFeature("hep.dataforge:storage", StorageManager.class); + StorageManager manager = context.load(StorageManager.class, Meta.empty()); return (FileStorage) manager.buildStorage(buildStorageMeta(file.toUri(), readOnly, monitor)); } @NotNull public static FileStorage buildLocal(Context context, String path, boolean readOnly, boolean monitor) { - Path file = context.getIo().getDataFile(path); + Path file = context.getIo().getDataDir().resolve(path); return buildLocal(context, file, readOnly, monitor); } diff --git a/numass-main/src/main/groovy/inr/numass/LaunchGrindShell.groovy b/numass-main/src/main/groovy/inr/numass/LaunchGrindShell.groovy index a21f7263..a892385a 100644 --- a/numass-main/src/main/groovy/inr/numass/LaunchGrindShell.groovy +++ b/numass-main/src/main/groovy/inr/numass/LaunchGrindShell.groovy @@ -31,5 +31,5 @@ try { } catch (Exception ex) { ex.printStackTrace(); } finally { - Global.terminate(); + Global.INSTANCE.terminate(); } diff --git a/numass-main/src/main/groovy/inr/numass/scripts/models/TristanModel.groovy b/numass-main/src/main/groovy/inr/numass/scripts/models/TristanModel.groovy index b8850782..d21db35b 100644 --- a/numass-main/src/main/groovy/inr/numass/scripts/models/TristanModel.groovy +++ b/numass-main/src/main/groovy/inr/numass/scripts/models/TristanModel.groovy @@ -13,7 +13,6 @@ import hep.dataforge.stat.fit.ParamSet import hep.dataforge.stat.models.XYModel import hep.dataforge.stat.parametric.ParametricFunction import hep.dataforge.tables.Table -import inr.numass.NumassIOKt import inr.numass.NumassPlugin import inr.numass.data.SpectrumAdapter import inr.numass.data.SpectrumGenerator @@ -23,7 +22,6 @@ import inr.numass.models.misc.ModGauss import inr.numass.models.sterile.NumassBeta import inr.numass.utils.DataModelUtils -import static hep.dataforge.grind.Grind.morph Context ctx = Global.instance() ctx.getPluginManager().load(FXPlotManager) diff --git a/numass-main/src/main/java/hep/dataforge/plotfit/PlotFitResultAction.java b/numass-main/src/main/java/hep/dataforge/plotfit/PlotFitResultAction.java index 780f5956..55c8d42e 100644 --- a/numass-main/src/main/java/hep/dataforge/plotfit/PlotFitResultAction.java +++ b/numass-main/src/main/java/hep/dataforge/plotfit/PlotFitResultAction.java @@ -48,7 +48,7 @@ public class PlotFitResultAction extends OneToOneAction { NavigableValuesSource data = input.getData(); if (!(state.getModel() instanceof XYModel)) { - context.getChronicle(name).reportError("The fit model should be instance of XYModel for this action. Action failed!"); + context.getHistory().getChronicle(name).reportError("The fit model should be instance of XYModel for this action. Action failed!"); return input; } XYModel model = (XYModel) state.getModel(); diff --git a/numass-main/src/main/java/inr/numass/Main.java b/numass-main/src/main/java/inr/numass/Main.java index 68ea48fb..6796709c 100644 --- a/numass-main/src/main/java/inr/numass/Main.java +++ b/numass-main/src/main/java/inr/numass/Main.java @@ -19,7 +19,6 @@ import hep.dataforge.actions.ActionUtils; import hep.dataforge.context.Context; import hep.dataforge.context.Global; import hep.dataforge.context.IOManager; -import hep.dataforge.data.FileDataFactory; import hep.dataforge.io.MetaFileReader; import hep.dataforge.meta.Meta; import org.apache.commons.cli.*; @@ -34,7 +33,6 @@ import java.io.FileNotFoundException; import java.nio.file.Files; import java.util.Locale; -import static hep.dataforge.context.Global.out; import static inr.numass.Numass.printDescription; import static java.util.Locale.setDefault; @@ -52,7 +50,7 @@ public class Main { public static void run(Context context, String[] args) throws Exception { if(context == null){ - context = Global.Companion.instance(); + context = Global.INSTANCE; } Logger logger = LoggerFactory.getLogger("numass-main"); @@ -78,7 +76,7 @@ public class Main { if (args.length == 0) { HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("java -jar DataReader.jar [OPTIONS]", options); - Companion.out().println("Trying to use default config location..."); + System.out.println("Trying to use default config location..."); } if (line.hasOption("c")) { @@ -88,7 +86,7 @@ public class Main { return; } - java.nio.file.Path configFile = context.getIo().getFile(cfgPath); + java.nio.file.Path configFile = context.getIo().getRootDir().resolve(cfgPath); if (!Files.exists(configFile)) { throw new FileNotFoundException("Configuration file not found"); @@ -119,7 +117,7 @@ public class Main { dataDir = new File(workDir, dataPath); } if (dataDir.exists() && dataDir.isDirectory()) { - context.setValue(FileDataFactory.Companion.getDATA_DIR_KEY(), dataDir.getAbsolutePath()); + context.setValue(IOManager.DATA_DIRECTORY_CONTEXT_KEY, dataDir.getAbsolutePath()); } else { throw new FileNotFoundException("Data directory not found"); } @@ -134,7 +132,7 @@ public class Main { if (!outDir.exists()) { outDir.mkdirs(); } - context.setValue(NumassIO.Companion.getNUMASS_OUTPUT_CONTEXT_KEY(), outDir.toString()); + context.setValue(IOManager.WORK_DIRECTORY_CONTEXT_KEY, outDir.toString()); } } diff --git a/numass-main/src/main/java/inr/numass/Numass.java b/numass-main/src/main/java/inr/numass/Numass.java index 7b41c4cf..79864090 100644 --- a/numass-main/src/main/java/inr/numass/Numass.java +++ b/numass-main/src/main/java/inr/numass/Numass.java @@ -17,6 +17,7 @@ package inr.numass; import hep.dataforge.actions.ActionManager; import hep.dataforge.context.Context; +import hep.dataforge.context.ContextBuilder; import hep.dataforge.context.Global; import hep.dataforge.description.ActionDescriptor; import hep.dataforge.description.Descriptors; @@ -31,14 +32,14 @@ import hep.dataforge.meta.Meta; public class Numass { public static Context buildContext(Context parent, Meta meta) { - return Context.Companion.builder("NUMASS", parent) + return new ContextBuilder("NUMASS", parent) .properties(meta) .plugin(NumassPlugin.class) .build(); } public static Context buildContext() { - return buildContext(Global.Companion.instance(), Meta.empty()); + return buildContext(Global.INSTANCE, Meta.empty()); } public static void printDescription(Context context) throws DescriptorException { @@ -66,6 +67,6 @@ public class Numass { builder.text("***End of actions list***", "red"); - context.getIo().getMarkupRenderer().render(builder.build()); + context.getIo().getOutput().push(builder.build(), Meta.empty()); } } diff --git a/numass-main/src/main/java/inr/numass/actions/MonitorCorrectAction.java b/numass-main/src/main/java/inr/numass/actions/MonitorCorrectAction.java index 9a632437..15ef9024 100644 --- a/numass-main/src/main/java/inr/numass/actions/MonitorCorrectAction.java +++ b/numass-main/src/main/java/inr/numass/actions/MonitorCorrectAction.java @@ -58,7 +58,7 @@ public class MonitorCorrectAction extends OneToOneAction { TreeMap index = getMonitorIndex(monitor, sourceData); if (index.isEmpty()) { - context.getChronicle(name).reportError("No monitor points found"); + context.getHistory().getChronicle(name).reportError("No monitor points found"); return sourceData; } double norm = 0; @@ -129,7 +129,7 @@ public class MonitorCorrectAction extends OneToOneAction { // } Table res = new ListTable(dataList); - output(context, name, stream -> NumassUtils.INSTANCE.write(stream, meta, res)); + context.getIo().output(name, getName()).push(NumassUtils.INSTANCE.wrap(res, meta), Meta.empty()); return res; } @@ -194,7 +194,7 @@ public class MonitorCorrectAction extends OneToOneAction { String monitorFileName = meta.getString("monitorFile", "monitor"); ListTable data = new ListTable(monitorPoints); - output(context, monitorFileName, stream -> NumassUtils.INSTANCE.write(stream, meta, data)); + context.getIo().output(monitorFileName, getName()).push(NumassUtils.INSTANCE.wrap(data, meta), Meta.empty()); // ColumnedDataWriter.writeTable(stream, TableTransform.sort(data, "Timestamp", true), "Monitor points", monitorNames); } } diff --git a/numass-main/src/main/java/inr/numass/actions/SubstractSpectrumAction.java b/numass-main/src/main/java/inr/numass/actions/SubstractSpectrumAction.java index 7b2ecd59..8f6aecb1 100644 --- a/numass-main/src/main/java/inr/numass/actions/SubstractSpectrumAction.java +++ b/numass-main/src/main/java/inr/numass/actions/SubstractSpectrumAction.java @@ -10,6 +10,7 @@ import hep.dataforge.context.Context; import hep.dataforge.description.TypedActionDef; import hep.dataforge.io.ColumnedDataReader; import hep.dataforge.meta.Laminate; +import hep.dataforge.meta.Meta; import hep.dataforge.tables.ListTable; import hep.dataforge.tables.Table; import hep.dataforge.tables.ValueMap; @@ -30,7 +31,7 @@ public class SubstractSpectrumAction extends OneToOneAction { protected Table execute(Context context, String name, Table input, Laminate inputMeta) { try { String referencePath = inputMeta. getString("file", "empty.dat"); - Path referenceFile = context.getIo().getFile(referencePath); + Path referenceFile = context.getIo().getRootDir().resolve(referencePath); Table referenceTable = new ColumnedDataReader(referenceFile).toTable(); ListTable.Builder builder = new ListTable.Builder(input.getFormat()); input.getRows().forEach(point -> { @@ -47,7 +48,8 @@ public class SubstractSpectrumAction extends OneToOneAction { }); Table res = builder.build(); - output(context,name, stream -> NumassUtils.INSTANCE.write(stream,inputMeta,res)); + + context.getIo().output(name, getName()).push(NumassUtils.INSTANCE.wrap(res, inputMeta), Meta.empty()); return res; } catch (IOException ex) { throw new RuntimeException("Could not read reference file", ex); diff --git a/numass-main/src/main/java/inr/numass/data/MonitorCorrector.java b/numass-main/src/main/java/inr/numass/data/MonitorCorrector.java deleted file mode 100644 index 8181b9d1..00000000 --- a/numass-main/src/main/java/inr/numass/data/MonitorCorrector.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2015 Alexander Nozik. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package inr.numass.data; - -import hep.dataforge.context.Global; - -import java.io.BufferedReader; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.text.ParseException; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static java.time.temporal.ChronoUnit.SECONDS; - -/** - * Заплатка для задания поправки на масс-спектрометр - * - * @author Darksnake - */ -public class MonitorCorrector { - - private final double average; - private final List list; - - public MonitorCorrector(String path) throws ParseException, IOException { - this(Global.Companion.instance().getIo().getFile(path)); - } - - public MonitorCorrector(Path monitorFile) throws ParseException, IOException { - list = new ArrayList<>(); - - BufferedReader reader = new BufferedReader(Files.newBufferedReader(monitorFile)); -// Scanner sc = new Scanner(monitorFile); - - double sum = 0; - String str = reader.readLine(); - while ((str!=null)&&(!str.isEmpty())) { - MonitorPoint point = new MonitorPoint(str); - str = reader.readLine(); - list.add(point); - sum += point.getMonitorValue(); - } - average = sum / list.size(); - } - - /** - * возвращает ближайшую по времени точку - * - * @param time - * @return - */ - public MonitorPoint findNearestMonitorPoint(LocalDateTime time) { - MonitorPoint nearest = this.list.get(0); - for (MonitorPoint point : this.list) { - if (Math.abs(point.getTime().until(time, SECONDS)) - < Math.abs(nearest.getTime().until(time, SECONDS))) { - nearest = point; - } - } - return nearest; - - } - - public double getCorrection(LocalDateTime start, double length) { - LocalDateTime finish = start.plusSeconds((long) length); - - return (findNearestMonitorPoint(start).getMonitorValue() + findNearestMonitorPoint(finish).getMonitorValue()) / 2 / average; - } - - public double getCorrectionError(LocalDateTime start, double length) { - LocalDateTime finish = start.plusSeconds((long) length); - - return (findNearestMonitorPoint(start).getMonitorError() + findNearestMonitorPoint(finish).getMonitorError()) / 2 / average; - } - -} diff --git a/numass-main/src/main/java/inr/numass/models/TransmissionInterpolator.java b/numass-main/src/main/java/inr/numass/models/TransmissionInterpolator.java index 0013fb88..7b4c108d 100644 --- a/numass-main/src/main/java/inr/numass/models/TransmissionInterpolator.java +++ b/numass-main/src/main/java/inr/numass/models/TransmissionInterpolator.java @@ -40,7 +40,7 @@ public class TransmissionInterpolator implements UnivariateFunction { public static TransmissionInterpolator fromFile(Context context, String path, String xName, String yName, int nSmooth, double w, double border) { try { - Path dataFile = context.getIo().getFile(path); + Path dataFile = context.getIo().getRootDir().resolve(path); ColumnedDataReader reader = new ColumnedDataReader(Files.newInputStream(dataFile)); return new TransmissionInterpolator(reader, xName, yName, nSmooth, w, border); } catch (IOException ex) { diff --git a/numass-main/src/main/java/inr/numass/utils/OldDataReader.java b/numass-main/src/main/java/inr/numass/utils/OldDataReader.java index b296d5e6..4ee0612c 100644 --- a/numass-main/src/main/java/inr/numass/utils/OldDataReader.java +++ b/numass-main/src/main/java/inr/numass/utils/OldDataReader.java @@ -40,7 +40,7 @@ public class OldDataReader { public static Table readConfig(String path) throws IOException { String[] list = {"X", "time", "ushift"}; ListTable.Builder res = new ListTable.Builder(list); - Path file = Global.Companion.instance().getIo().getFile(path); + Path file = Global.INSTANCE.getIo().getRootDir().resolve(path); Scanner sc = new Scanner(file); sc.nextLine(); @@ -62,7 +62,7 @@ public class OldDataReader { public static Table readData(String path, double Elow) { SpectrumAdapter factory = new SpectrumAdapter(Meta.empty()); ListTable.Builder res = new ListTable.Builder(Adapters.getFormat(factory)); - Path file = Global.Companion.instance().getIo().getFile(path); + Path file = Global.INSTANCE.getIo().getRootDir().resolve(path); double x; int count; int time; @@ -114,7 +114,7 @@ public class OldDataReader { public static Table readDataAsGun(String path, double Elow) { SpectrumAdapter factory = new SpectrumAdapter(Meta.empty()); ListTable.Builder res = new ListTable.Builder(Adapters.getFormat(factory)); - Path file = Global.Companion.instance().getIo().getFile(path); + Path file = Global.INSTANCE.getIo().getRootDir().resolve(path); double x; long count; int time; @@ -147,7 +147,7 @@ public class OldDataReader { public static Table readSpectrumData(String path) { SpectrumAdapter factory = new SpectrumAdapter(Meta.empty()); ListTable.Builder res = new ListTable.Builder(Adapters.getFormat(factory)); - Path file = Global.Companion.instance().getIo().getFile(path); + Path file = Global.INSTANCE.getIo().getRootDir().resolve(path); double x; double count; double time; diff --git a/numass-main/src/main/kotlin/inr/numass/NumassIO.kt b/numass-main/src/main/kotlin/inr/numass/NumassIO.kt deleted file mode 100644 index b21c4d68..00000000 --- a/numass-main/src/main/kotlin/inr/numass/NumassIO.kt +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright 2015 Alexander Nozik. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package inr.numass - -import ch.qos.logback.classic.LoggerContext -import ch.qos.logback.classic.encoder.PatternLayoutEncoder -import ch.qos.logback.classic.spi.ILoggingEvent -import ch.qos.logback.core.Appender -import ch.qos.logback.core.FileAppender -import hep.dataforge.context.Context -import hep.dataforge.context.DefaultIOManager -import hep.dataforge.context.IOManager -import hep.dataforge.fx.plots.plusAssign -import hep.dataforge.meta.Meta -import hep.dataforge.names.Name -import hep.dataforge.plots.PlotUtils -import hep.dataforge.plots.XYFunctionPlot -import hep.dataforge.plots.data.DataPlot -import hep.dataforge.stat.fit.FitResult -import hep.dataforge.stat.models.XYModel -import hep.dataforge.tables.Adapters -import hep.dataforge.utils.ReferenceRegistry -import org.apache.commons.io.output.TeeOutputStream -import org.slf4j.LoggerFactory -import java.io.File -import java.io.IOException -import java.io.OutputStream -import java.nio.file.Files -import java.nio.file.Path -import java.util.* - -/** - * @author Darksnake - */ -class NumassIO : DefaultIOManager() { - - internal var registry = ReferenceRegistry() - // FileAppender appender; - - - override fun attach(context: Context) { - super.attach(context) - } - - override fun createLoggerAppender(): Appender { - val lc = LoggerFactory.getILoggerFactory() as LoggerContext - val ple = PatternLayoutEncoder() - - ple.pattern = "%date %level [%thread] %logger{10} [%file:%line] %msg%n" - ple.context = lc - ple.start() - val appender = FileAppender() - appender.file = File(workDir.toFile(), meta.getString("logFileName", "numass.log")).toString() - appender.encoder = ple - return appender - } - - override fun detach() { - super.detach() - registry.forEach { it -> - try { - it.close() - } catch (e: IOException) { - LoggerFactory.getLogger(javaClass).error("Failed to close output", e) - } - } - } - - private fun getExtension(type: String): String { - return when (type) { - IOManager.DEFAULT_OUTPUT_TYPE -> ".out" - else -> "." + type - } - } - - override fun out(stage: Name?, name: Name, type: String): OutputStream { - val tokens = ArrayList() - if (context.hasValue("numass.path")) { - val path = context.getString("numass.path") - if (path.contains(".")) { - tokens.addAll(Arrays.asList(*path.split(".".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray())) - } else { - tokens.add(path) - } - } - - if (stage != null && stage.length != 0) { - tokens.addAll(Arrays.asList(*stage.asArray())) - } - - val dirName = tokens.joinToString(File.separator) - val fileName = name.toString() + getExtension(type) - val out = buildOut(workDir, dirName, fileName) - registry.add(out) - return out - } - - private fun buildOut(parentDir: Path, dirName: String?, fileName: String): OutputStream { - val outputFile: Path - - if (!Files.exists(parentDir)) { - throw RuntimeException("Working directory does not exist") - } - try { - val dir = if (dirName.isNullOrEmpty()) { - parentDir - } else { - parentDir.resolve(dirName).also { - Files.createDirectories(it) - } - } - - // String output = source.meta().getString("output", this.meta().getString("output", fileName + ".onComplete")); - outputFile = dir.resolve(fileName) - - return if (context.getBoolean("numass.consoleOutput", false)) { - TeeOutputStream(Files.newOutputStream(outputFile), System.out) - } else { - Files.newOutputStream(outputFile) - } - } catch (ex: IOException) { - throw RuntimeException(ex) - } - - } - - companion object { - - val NUMASS_OUTPUT_CONTEXT_KEY = "numass.outputDir" - } -} - -fun FitResult.display(context: Context, stage: String = "fit") { - val model = optModel(context).get() as XYModel - - val adapter = model.adapter - - val frame = PlotUtils.getPlotManager(context) - .getPlotFrame(stage, "plot", Meta.empty()) - - val func = { x: Double -> model.spectrum.value(x, parameters) } - - val fit = XYFunctionPlot("fit",func) - fit.density = 100 - // ensuring all data points are calculated explicitly - data.rows.map { dp -> Adapters.getXValue(adapter, dp).doubleValue() }.sorted().forEach { fit.calculateIn(it) } - - frame.add(fit) - - frame.add(DataPlot.plot("data", adapter, data)) - - val residualsFrame = PlotUtils.getPlotManager(context) - .getPlotFrame(stage, "residuals", Meta.empty()) - - val residual = DataPlot("residuals"); - - data.rows.forEach { - val x = Adapters.getXValue(adapter, it).doubleValue() - val y = Adapters.getYValue(adapter, it).doubleValue() - val err = Adapters.optYError(adapter,it).orElse(1.0) - residual += Adapters.buildXYDataPoint(x, (y - func(x)) / err, 1.0) - } - - residualsFrame.add(residual) - -} diff --git a/numass-main/src/main/kotlin/inr/numass/NumassPlugin.kt b/numass-main/src/main/kotlin/inr/numass/NumassPlugin.kt index ec80a164..7359b87f 100644 --- a/numass-main/src/main/kotlin/inr/numass/NumassPlugin.kt +++ b/numass-main/src/main/kotlin/inr/numass/NumassPlugin.kt @@ -41,7 +41,7 @@ import org.apache.commons.math3.util.FastMath @PluginDef( group = "inr.numass", name = "numass", - dependsOn = arrayOf("hep.dataforge:math", "hep.dataforge:MINUIT", "hep.dataforge:actions"), + dependsOn = arrayOf("hep.dataforge:math", "hep.dataforge:MINUIT", "hep.dataforge:actions", "hep.dataforge:io.dir"), support = false, info = "Numass data analysis tools" ) @@ -50,8 +50,7 @@ class NumassPlugin : BasicPlugin() { override fun attach(context: Context) { // StorageManager.buildFrom(context); super.attach(context) - context.pluginManager.load(NumassIO()) - loadModels(context.get(ModelManager::class.java)) + loadModels(context[ModelManager::class.java]) loadMath(MathPlugin.buildFrom(context)) context.get(ActionManager::class.java).apply { @@ -266,10 +265,8 @@ class NumassPlugin : BasicPlugin() { } } - class Factory : PluginFactory { - override fun type(): Class { - return NumassPlugin::class.java - } + class Factory : PluginFactory() { + override val type: Class = NumassPlugin::class.java override fun build(meta: Meta): Plugin { return NumassPlugin() diff --git a/numass-main/src/main/kotlin/inr/numass/NumassUtils.kt b/numass-main/src/main/kotlin/inr/numass/NumassUtils.kt index b381eae0..12b52f4e 100644 --- a/numass-main/src/main/kotlin/inr/numass/NumassUtils.kt +++ b/numass-main/src/main/kotlin/inr/numass/NumassUtils.kt @@ -19,6 +19,7 @@ import hep.dataforge.context.Context import hep.dataforge.data.DataNode import hep.dataforge.data.DataSet import hep.dataforge.data.binary.Binary +import hep.dataforge.fx.plots.plusAssign import hep.dataforge.io.envelopes.DefaultEnvelopeType import hep.dataforge.io.envelopes.Envelope import hep.dataforge.io.envelopes.EnvelopeBuilder @@ -28,7 +29,13 @@ import hep.dataforge.io.markup.SimpleMarkupRenderer import hep.dataforge.kodex.nullable import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaBuilder +import hep.dataforge.plots.PlotUtils +import hep.dataforge.plots.XYFunctionPlot +import hep.dataforge.plots.data.DataPlot import hep.dataforge.plots.jfreechart.JFreeChartFrame +import hep.dataforge.stat.fit.FitResult +import hep.dataforge.stat.models.XYModel +import hep.dataforge.tables.Adapters import hep.dataforge.tables.ListTable import hep.dataforge.tables.Table import hep.dataforge.tables.ValueMap @@ -132,11 +139,11 @@ object NumassUtils { } - fun write(stream: OutputStream, meta: Meta, something: Markedup) { - writeEnvelope(stream, meta) { out -> - SimpleMarkupRenderer(out).render(something.markup(meta)) - } - } +// fun write(stream: OutputStream, meta: Meta, something: Markedup) { +// writeEnvelope(stream, meta) { out -> +// SimpleMarkupRenderer(out).render(something.markup(meta)) +// } +// } /** * Convert numass set to DataNode @@ -261,4 +268,39 @@ fun Values.unbox(): Map { res.put(field, obj) } return res -} \ No newline at end of file +} + +fun FitResult.display(context: Context, stage: String = "fit") { + val model = optModel(context).get() as XYModel + + val adapter = model.adapter + + val frame = PlotUtils.getPlotManager(context) + .getPlotFrame(stage, "plot", Meta.empty()) + + val func = { x: Double -> model.spectrum.value(x, parameters) } + + val fit = XYFunctionPlot("fit",func) + fit.density = 100 + // ensuring all data points are calculated explicitly + data.rows.map { dp -> Adapters.getXValue(adapter, dp).doubleValue() }.sorted().forEach { fit.calculateIn(it) } + + frame.add(fit) + + frame.add(DataPlot.plot("data", adapter, data)) + + val residualsFrame = PlotUtils.getPlotManager(context) + .getPlotFrame(stage, "residuals", Meta.empty()) + + val residual = DataPlot("residuals"); + + data.rows.forEach { + val x = Adapters.getXValue(adapter, it).doubleValue() + val y = Adapters.getYValue(adapter, it).doubleValue() + val err = Adapters.optYError(adapter,it).orElse(1.0) + residual += Adapters.buildXYDataPoint(x, (y - func(x)) / err, 1.0) + } + + residualsFrame.add(residual) + +} diff --git a/numass-main/src/main/kotlin/inr/numass/actions/MergeDataAction.kt b/numass-main/src/main/kotlin/inr/numass/actions/MergeDataAction.kt index 8084386e..519666e2 100644 --- a/numass-main/src/main/kotlin/inr/numass/actions/MergeDataAction.kt +++ b/numass-main/src/main/kotlin/inr/numass/actions/MergeDataAction.kt @@ -28,7 +28,6 @@ import hep.dataforge.values.Values import inr.numass.NumassUtils import inr.numass.data.analyzers.NumassAnalyzer import inr.numass.data.api.NumassPoint - import java.util.* /** @@ -57,7 +56,8 @@ class MergeDataAction : ManyToOneAction() { } override fun afterGroup(context: Context, groupName: String, outputMeta: Meta, output: Table) { - output(context, groupName) { stream -> NumassUtils.write(stream, outputMeta, output) } + context.io.output(groupName, name).push(NumassUtils.wrap(output, outputMeta)) + super.afterGroup(context, groupName, outputMeta, output) } private fun mergeDataPoints(dp1: Values?, dp2: Values?): Values? { diff --git a/numass-main/src/main/kotlin/inr/numass/actions/SummaryAction.kt b/numass-main/src/main/kotlin/inr/numass/actions/SummaryAction.kt index 9eff67f6..88ce4dbc 100644 --- a/numass-main/src/main/kotlin/inr/numass/actions/SummaryAction.kt +++ b/numass-main/src/main/kotlin/inr/numass/actions/SummaryAction.kt @@ -85,7 +85,7 @@ class SummaryAction : ManyToOneAction() { weights[i] += weight } values[values.size - 1] = Value.of(value.chi2) - val point = ValueMap.of(names, *values as Array) + val point = ValueMap.of(names, *values) res.row(point) } @@ -98,13 +98,13 @@ class SummaryAction : ManyToOneAction() { averageValues[2 * i + 2] = Value.of(1 / Math.sqrt(weights[i])) } - res.row(ValueMap.of(names, *averageValues as Array)) + res.row(ValueMap.of(names, *averageValues)) return res.build() } override fun afterGroup(context: Context, groupName: String, outputMeta: Meta, output: Table) { - output(context, groupName) { stream -> NumassUtils.write(stream, outputMeta, output) } + context.io.output(groupName, name).push(NumassUtils.wrap(output, outputMeta)) super.afterGroup(context, groupName, outputMeta, output) } diff --git a/numass-main/src/main/kotlin/inr/numass/actions/TransformDataAction.kt b/numass-main/src/main/kotlin/inr/numass/actions/TransformDataAction.kt index bf2f9a62..a87828e9 100644 --- a/numass-main/src/main/kotlin/inr/numass/actions/TransformDataAction.kt +++ b/numass-main/src/main/kotlin/inr/numass/actions/TransformDataAction.kt @@ -99,7 +99,7 @@ class TransformDataAction : OneToOneAction() { val res = table.addColumn(ListColumn.build(table.getColumn(COUNT_RATE_KEY).format, cr.stream())) .addColumn(ListColumn.build(table.getColumn(COUNT_RATE_ERROR_KEY).format, crErr.stream())) - output(context, name) { stream -> NumassUtils.write(stream, meta, res) } + context.io.output(name, name).push(NumassUtils.wrap(res, meta)) return res } diff --git a/numass-main/src/main/kotlin/inr/numass/models/mc/BetaSampler.kt b/numass-main/src/main/kotlin/inr/numass/models/mc/BetaSampler.kt index 85919d3a..466a48af 100644 --- a/numass-main/src/main/kotlin/inr/numass/models/mc/BetaSampler.kt +++ b/numass-main/src/main/kotlin/inr/numass/models/mc/BetaSampler.kt @@ -1,5 +1,6 @@ package inr.numass.models.mc +import hep.dataforge.context.Global import hep.dataforge.fx.plots.FXPlotManager import hep.dataforge.kodex.buildMeta import hep.dataforge.maths.chain.Chain @@ -34,7 +35,7 @@ fun main(args: Array) { .setPar("X", 0.0, 0.01, 0.0, java.lang.Double.POSITIVE_INFINITY) .setPar("trap", 1.0, 0.01, 0.0, java.lang.Double.POSITIVE_INFINITY) - val sp = SterileNeutrinoSpectrum(global, meta) + val sp = SterileNeutrinoSpectrum(Global, meta) val spectrumPlot = XYFunctionPlot.plot("spectrum", 14000.0, 18600.0, 500) { sp.value(it, allPars) diff --git a/numass-main/src/main/kotlin/inr/numass/scripts/utils/ScanTree.kt b/numass-main/src/main/kotlin/inr/numass/scripts/utils/ScanTree.kt index 9cd0e2af..411fa0c8 100644 --- a/numass-main/src/main/kotlin/inr/numass/scripts/utils/ScanTree.kt +++ b/numass-main/src/main/kotlin/inr/numass/scripts/utils/ScanTree.kt @@ -1,8 +1,8 @@ package inr.numass.scripts.utils +import hep.dataforge.context.Global import hep.dataforge.io.XMLMetaWriter import hep.dataforge.kodex.buildMeta -import hep.dataforge.kodex.global import hep.dataforge.kodex.useValue import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaBuilder @@ -14,7 +14,7 @@ import java.io.File import java.nio.file.Paths private fun createSummaryNode(storage: Storage): MetaBuilder { - global.logger.info("Reading content of shelf {}", storage.fullName) + Global.logger.info("Reading content of shelf {}", storage.fullName) val builder = MetaBuilder("shelf") .setValue("name", storage.name) @@ -24,7 +24,7 @@ private fun createSummaryNode(storage: Storage): MetaBuilder { } storage.loaders().filterIsInstance(NumassDataLoader::class.java).forEach { set -> - global.logger.info("Reading content of set {}", set.fullName) + Global.logger.info("Reading content of set {}", set.fullName) val setBuilder = MetaBuilder("set") .setValue("name", set.name) @@ -83,14 +83,14 @@ fun main(args: Array) { output.createNewFile() - val storage = NumassStorageFactory.buildLocal(global, path, true, false) + val storage = NumassStorageFactory.buildLocal(Global, path, true, false) val summary = createSummaryNode(storage) - global.logger.info("Writing output meta") + Global.logger.info("Writing output meta") output.outputStream().use { XMLMetaWriter().write(it, summary) } - global.logger.info("Calculating statistics") + Global.logger.info("Calculating statistics") val statistics = MetaBuilder("statistics") (14000..18600).step(100).map { it.toDouble() }.forEach { statistics.putNode(calculateStatistics(summary, it)) diff --git a/numass-main/src/main/kotlin/inr/numass/tasks/NumassFitScanSummaryTask.kt b/numass-main/src/main/kotlin/inr/numass/tasks/NumassFitScanSummaryTask.kt index 733fa300..5efeea99 100644 --- a/numass-main/src/main/kotlin/inr/numass/tasks/NumassFitScanSummaryTask.kt +++ b/numass-main/src/main/kotlin/inr/numass/tasks/NumassFitScanSummaryTask.kt @@ -69,7 +69,7 @@ class NumassFitScanSummaryTask : AbstractTask() { pars.getValue("trap")) } val res = TableTransform.sort(builder.build(), "m", true) - output(context, nodeName) { stream -> NumassUtils.write(stream, meta, res) } + context.io.output(nodeName, stage = name).push(NumassUtils.wrap(res, meta)) return res } diff --git a/numass-main/src/main/kotlin/inr/numass/tasks/NumassTasks.kt b/numass-main/src/main/kotlin/inr/numass/tasks/NumassTasks.kt index 25025248..241904bf 100644 --- a/numass-main/src/main/kotlin/inr/numass/tasks/NumassTasks.kt +++ b/numass-main/src/main/kotlin/inr/numass/tasks/NumassTasks.kt @@ -80,20 +80,17 @@ val monitorTableTask = task("monitor") { } plots + DataPlot.plot(name, Adapters.buildXYAdapter("timestamp", "cr", "crErr"), res) }.also { frame -> - if (frame is JFreeChartFrame) { - //add set markers - addSetMarkers(frame, data.values) - } - context.io.out("numass.monitor", name, "dfp").use { - NumassUtils.writeEnvelope(it, PlotFrame.Wrapper().wrap(frame)) - } - } + if (frame is JFreeChartFrame) { + //add set markers + addSetMarkers(frame, data.values) + } + context.io.output(name, stage = "numass.monitor", type = "dfp").push(PlotFrame.Wrapper().wrap(frame)) + + } } } - context.io.out("numass.monitor", name).use { - NumassUtils.write(it, meta, res) - } + context.io.output(name, stage = "numass.monitor").push(NumassUtils.wrap(res, meta)) return@join res; } @@ -107,9 +104,7 @@ val analyzeTask = task("analyze") { pipe { set -> SmartAnalyzer().analyzeSet(set, meta).also { res -> val outputMeta = meta.builder.putNode("data", set.meta) - context.io.out("numass.analyze", name).use { - NumassUtils.write(it, outputMeta, res) - } + context.io.output(name, stage = "numass.analyze").push(NumassUtils.wrap(res, outputMeta)) } } } @@ -175,9 +170,7 @@ val subtractEmptyTask = task("dif") { res.goal.onComplete { r, _ -> if (r != null) { - context.io.out("numass.merge", input.name + "_subtract").use { - NumassUtils.write(it, resMeta, r) - } + context.io.output(input.name + "_subtract", stage = "numass.merge").push(NumassUtils.wrap(r,resMeta)) } } @@ -228,7 +221,7 @@ val fitTask = task("fit") { configure(meta.getMeta("fit")) } pipe { data -> - context.io.out("numass.fit", name).use { out -> + context.io.stream(name, "numass.fit").use { out -> val writer = PrintWriter(out) writer.printf("%n*** META ***%n") writer.println(meta.toString()) diff --git a/numass-main/src/test/java/inr/numass/models/TransmissionInterpolatorTest.java b/numass-main/src/test/java/inr/numass/models/TransmissionInterpolatorTest.java index 618bc19f..77d34ac0 100644 --- a/numass-main/src/test/java/inr/numass/models/TransmissionInterpolatorTest.java +++ b/numass-main/src/test/java/inr/numass/models/TransmissionInterpolatorTest.java @@ -30,7 +30,7 @@ public class TransmissionInterpolatorTest { public static void main(String[] args) { JFreeChartFrame frame = NumassPluginKt.displayJFreeChart("TransmissionInterpolatorTest"); //JFreeChartFrame.drawFrame("TransmissionInterpolatorTest", null); - TransmissionInterpolator interpolator = TransmissionInterpolator.fromFile(Global.Companion.instance(), + TransmissionInterpolator interpolator = TransmissionInterpolator.fromFile(Global.INSTANCE, "d:\\sterile-new\\loss2014-11\\.dataforge\\merge\\empty_sum.onComplete", "Uset", "CR", 15, 0.8, 19002d); frame.add(DataPlot.plot("data", interpolator.getX(), interpolator.getY())); frame.add(XYFunctionPlot.Companion.plot("interpolated", interpolator.getXmin(), interpolator.getXmax(), 2000, interpolator::value));