/**
  * Helper method for making synapse producers, since it happens in a few different places and is
  * important to be consistent about.
  *
  * @param component network component
  * @param synapse the synapse that will "produce" strengths
  * @param methodName the name of the method called by this producer
  * @return the synapse producer
  */
 public static PotentialProducer getSynapseProducer(
     NetworkComponent component, Synapse synapse, String methodName) {
   PotentialProducer producer =
       component.getAttributeManager().createPotentialProducer(synapse, methodName, double.class);
   producer.setCustomDescription(synapse.getId() + ":" + methodName);
   return producer;
 }
 /**
  * Helper method for making neuron group producers, since it happens in a few different places and
  * is important to be consistent about.
  *
  * @param component network component
  * @param group the neuron group that will produce activations
  * @param methodName the name of the method called by this producer
  * @return the neuron group producer
  */
 public static PotentialProducer getNeuronGroupProducer(
     NetworkComponent component, NeuronGroup group, String methodName) {
   PotentialProducer producer =
       component.getAttributeManager().createPotentialProducer(group, methodName, double[].class);
   producer.setCustomDescription(group.getId() + ":" + methodName);
   return producer;
 }
  @Override
  public List<PotentialProducer> getPotentialProducers() {
    List<PotentialProducer> returnList = new ArrayList<PotentialProducer>();
    for (AttributeType type : getVisibleProducerTypes()) {
      if (type.getTypeName().startsWith("Neuron ")) {
        if (type.getTypeName().equalsIgnoreCase("Neuron Activation")) {
          for (Neuron neuron : network.getFlatNeuronList()) {
            returnList.add(getNeuronProducer(this, neuron, type.getMethodName()));
          }
        } else {
          for (Neuron neuron : network.getFlatNeuronList()) {
            String description = type.getDescription(neuron.getId());
            PotentialProducer producer =
                getAttributeManager().createPotentialProducer(neuron, type);
            producer.setCustomDescription(description);
            returnList.add(producer);
          }
        }
      } else if (type.getTypeName().equalsIgnoreCase("Synapse")) {
        for (Synapse synapse : network.getFlatSynapseList()) {
          String description = type.getDescription(synapse.getId());
          PotentialProducer producer = getAttributeManager().createPotentialProducer(synapse, type);
          producer.setCustomDescription(description);
          returnList.add(producer);
        }
      } else if (type.getTypeName().equalsIgnoreCase("NeuronGroupActivations")) {
        for (Group group : network.getFlatGroupList()) {
          if (group instanceof NeuronGroup) {
            returnList.add(getNeuronGroupProducer(this, (NeuronGroup) group, type.getMethodName()));
          }
        }
      } else if (type.getTypeName().equalsIgnoreCase("NeuronGroupSpikes")) {
        for (Group group : network.getFlatGroupList()) {
          if (group instanceof NeuronGroup) {
            returnList.add(getNeuronGroupProducer(this, (NeuronGroup) group, type.getMethodName()));
          }
        }
      } else if (type.getTypeName().equalsIgnoreCase("SynapseGroup")) {
        // Handle SynapseGroup attributes
        for (Group group : network.getFlatGroupList()) {
          if (group instanceof SynapseGroup) {
            PotentialProducer producer =
                getAttributeManager()
                    .createPotentialProducer(group, "getWeightVector", double[].class);
            producer.setCustomDescription("Synapse Group: " + group.getLabel());
            returnList.add(producer);
          }
        }
      }
    }

    return returnList;
  }