/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package inr.numass.actions; import hep.dataforge.actions.OneToOneAction; import hep.dataforge.context.Context; import hep.dataforge.description.TypedActionDef; import hep.dataforge.io.reports.Reportable; import hep.dataforge.meta.Laminate; import hep.dataforge.meta.Meta; import inr.numass.storage.NMPoint; import inr.numass.storage.NumassData; import inr.numass.storage.RawNMPoint; import inr.numass.utils.PileUpSimulator; import java.time.Instant; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * Simulate pileup * * @author Alexander Nozik */ @TypedActionDef(name = "simulatePileup", inputType = NumassData.class, outputType = Map.class) public class PileupSimulationAction extends OneToOneAction> { @Override protected Map execute(Context context, Reportable log, String name, Laminate inputMeta, NumassData input) { int lowerChannel = inputMeta.getInt("lowerChannel", 0); int upperChannel = inputMeta.getInt("upperChannel", RawNMPoint.MAX_CHANEL); List generated = new ArrayList<>(); List registered = new ArrayList<>(); List firstIteration = new ArrayList<>(); List pileup = new ArrayList<>(); double crScale = inputMeta.getDouble("crScale",1d); input.getNMPoints().forEach(point -> { PileUpSimulator simulator = new PileUpSimulator(crScale * point.getCountRate(lowerChannel, upperChannel, 0), point.getLength()) .withGenerator(point, lowerChannel, upperChannel) .generate(); //second iteration to exclude pileup overlap NMPoint pileupPoint = simulator.pileup(); firstIteration.add(simulator.registered()); simulator = new PileUpSimulator(crScale * point.getCountRate(lowerChannel, upperChannel, 0), point.getLength()) .withGenerator(point, pileupPoint, lowerChannel, upperChannel) .generate(); generated.add(simulator.generated()); registered.add(simulator.registered()); pileup.add(simulator.pileup()); }); Map res = new LinkedHashMap<>(); res.put("original", input); res.put("generated", new SimulatedPoint("generated", generated)); res.put("registered", new SimulatedPoint("registered", registered)); res.put("firstIteration", new SimulatedPoint("firstIteration", firstIteration)); res.put("pileup", new SimulatedPoint("pileup", pileup)); return res; } private static class SimulatedPoint implements NumassData { private final String name; private final List points; public SimulatedPoint(String name, List points) { this.name = name; this.points = points; } @Override public String getDescription() { return name; } @Override public Meta meta() { return Meta.empty(); } @Override public List getNMPoints() { return points; } @Override public boolean isEmpty() { return points.isEmpty(); } @Override public Instant startTime() { return Instant.EPOCH; } @Override public String getName() { return name; } } }