@PluginVariant(
      requiredParameterLabels = {0, 1, 2, 3},
      variantLabel = "PerformanceDetailsSettingsWithMarking")
  // @Plugin(name = "PerformanceDetailsSettingsWithMarking", returnLabels = { "Performance Total" },
  // returnTypes = { TotalPerformanceResult.class }, parameterLabels = {}, userAccessible = true)
  // @UITopiaVariant(affiliation = "Department of Computer Science University of Pisa", author =
  // "R.Guanciale,G.Spagnolo et al.", email = "*****@*****.**", pack =
  // "PetriNetReplayAnalysis")
  public TotalPerformanceResult getPerformanceDetails(
      PluginContext context,
      XLog log,
      Petrinet net,
      ReplayFitnessSetting setting,
      Marking marking,
      XEventClassifier classif) {

    TotalPerformanceResult performance = new TotalPerformanceResult();

    XEventClasses classes = getEventClasses(log, classif);
    if (map == null) {
      // Map<Transition, XEventClass>
      map = getMapping(classes, net);
    }

    context
        .getConnectionManager()
        .addConnection(new LogPetrinetConnectionImpl(log, classes, net, map));

    PetrinetSemantics semantics = PetrinetSemanticsFactory.regularPetrinetSemantics(Petrinet.class);

    Replayer<ReplayFitnessCost> replayer =
        new Replayer<ReplayFitnessCost>(
            context, net, semantics, map, ReplayFitnessCost.addOperator);

    int replayedTraces = 0;
    context.getProgress().setMinimum(0);
    context.getProgress().setMaximum(log.size());
    for (XTrace trace : log) {
      List<XEventClass> list = getList(trace, classes);
      try {
        System.out.println("Replay :" + replayedTraces);
        List<Transition> sequence;

        sequence = replayer.replayTrace(marking, list, setting);
        if (sequence != null) {
          sequence = sortHiddenTransection(net, sequence, map);
          String tracename = getTraceName(trace);
          updatePerformance(net, marking, sequence, semantics, trace, performance, map, tracename);
          replayedTraces++;
          context.getProgress().inc();
          System.out.println("Replayed");
        }

      } catch (Exception ex) {
        System.out.println("Failed");
        context.log("Replay of trace " + trace + " failed: " + ex.getMessage());
      }
    }

    context.log(
        "(based on a successful replay of "
            + replayedTraces
            + " out of "
            + log.size()
            + " traces)");

    ReplayAnalysisConnection connection = new ReplayAnalysisConnection(performance, log, net);
    context.getConnectionManager().addConnection(connection);

    return performance;
  }