code: public static Pattern controlsStateChangeThroughControllerSmallMolecule(Blacklist blacklist)
  	{
  		Pattern p = new Pattern(SequenceEntityReference.class, "upper controller ER");
  		p.add(linkedER(true), "upper controller ER", "upper controller generic ER");
  		p.add(erToPE(), "upper controller generic ER", "upper controller simple PE");
  		p.add(linkToComplex(), "upper controller simple PE", "upper controller PE");
  		p.add(peToControl(), "upper controller PE", "upper Control");
  		p.add(controlToConv(), "upper Control", "upper Conversion");
  		p.add(new NOT(participantER()), "upper Conversion", "upper controller ER");
  		p.add(new Participant(RelType.OUTPUT, blacklist), "upper Conversion", "controller PE");
  		p.add(type(SmallMolecule.class), "controller PE");
  		if (blacklist != null) p.add(new NonUbique(blacklist), "controller PE");
  
  		// the linker small mol is at also an input
  		p.add(new NOT(new ConstraintChain(
  			new ConversionSide(ConversionSide.Type.OTHER_SIDE), linkToSpecific())),
  			"controller PE", "upper Conversion", "controller PE");
  
  		p.add(peToControl(), "controller PE", "Control");
  		p.add(controlToConv(), "Control", "Conversion");
  		p.add(equal(false), "upper Conversion", "Conversion");
  
  //		p.add(nextInteraction(), "upper Conversion", "Conversion");
  
  		stateChange(p, "Control");
  
  		p.add(type(SequenceEntityReference.class), "changed ER");
  		p.add(equal(false), "upper controller ER", "changed ER");
  		p.add(new NOT(participantER()), "Conversion", "upper controller ER");
  
  		return p;
  	}
docs: Pattern for an entity is producing a small molecule, and the small molecule controls state
  change of another molecule.
  
  @param blacklist a skip-list of ubiquitous molecules
  @return the pattern