% both Substrate and Enzyme Limiting -- no conditions to guide the road
% indirect mapping from reaction to EC via enzymes's ecClass
% terminology -- catINcreased, catDEcreased





catalyzed_by_ECclass(ReactionID,EC_Num):-
	catalyzed_by(ReactionID,EnzID,'IMPD'),
	part_of_catalyzing_class(EnzID,EnzClassID,'IMPD'),!,
	concept_accession(EnzClassID,'EC',EC_Num,false).


/* current Lycocyc file don't have this
catalyzed_by_ECclass2(ReactionID,EC_Number):-
	part_of_catalyzing_class(ReactionID,EC_Number,'IMPD').

ec:-
	findall(RID,
	(reaction(ReactionID,'','','LycoCyc2.0.1','IMPD'),
	catalyzed_by_ECclass1(ReactionID,EC_Number1),catalyzed_by_ECclass2(ReactionID,EC_Number2),	
	EC_Number1\==EC_Number2
	),
	RIDs),
	write(RIDs).
*/


%enzyme_state(EC_Number,no_change):- \+enzyme_state(EC_Number,inhibited).






concentration(X,Change,Time,VisitedNodes):-	% using other examples
	write('try to use old'),
	ex(EI,concentration(X,Change,Time),1),!,write('-=-=-=-=-=-=-=-=-old do exit-----------------'),
	write('***using this example***'), writeq(EI-X), write(' and '), write(VisitedNodes),nl.
% won't be used in reasoning, but used in T for excluding those useless

concentration(X,Change,Time,VisitedNodes):- 
	length(VisitedNodes,K),K>1,
	threeStatesOpposite(Change,Opp1,Opp2),
	(ex(EI,concentration(X,Opp1,Time),1);ex(EI,concentration(X,Opp2,Time),1)),
	write('!!! this metabolite is measured to be '), ex0(EI,concentration(Xname,ActualChange,Time),1),write({Xname,ActualChange}),nl,
	!,
	fail.





/****************** Direct Effect ******************/
/*---------- Blocked/Slower down ----------*/
% 12,15,18 enzyme inhibited
concentration(PID,down,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataDecreased,Time).
	%enzyme_state(EC_Number,inhibited),portray_clause(VisitedNodes),write({EC_Number,inhibited}).


% enzyme inhibited
concentration(SID,up,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataDecreased,Time).
	%enzyme_state(EC_Number,inhibited),portray_clause(VisitedNodes),write(' weird if long effect'),write({EC_Number,inhibited}).



/*---------- Speeded Up ----------*/
% 10,13,16 enzyme activated
concentration(PID,up,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataIncreased,Time).


% enzyme activated
concentration(SID,down,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataIncreased,Time).


/*---------- No change----------*/
concentration(PID,no_change,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).	


concentration(SID,no_change,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).

concentration(SID,no_change,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	\+produced_by(SID,ReactionID_Any,'IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).
	

/****************** Indirect Effect -- Substrate Limiting ******************/

% S up
concentration(PID,up,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,substrateLimiting,sUp,Time),
	consumed_by(SID,ReactionID,'IMPD'),\+member(SID,VisitedNodes),
	concentration(SID,up,Time,[SID|VisitedNodes]).

% S down
concentration(PID,down,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,substrateLimiting,sDown,Time),
	consumed_by(SID,ReactionID,'IMPD'),\+member(SID,VisitedNodes),
	concentration(SID,down,Time,[SID|VisitedNodes]).


/*% S no change
concentration(PID,no_change,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,substrateLimiting,*,Time),
	consumed_by(SID,ReactionID,'IMPD'),\+member(SID,VisitedNodes),
	concentration(SID,no_change,Time,[SID|VisitedNodes]).
*/




/************ Integrity Constraint **************/
integrityConstraint:-
	reaction_state(ReactionID,LimitingType1,Change1,Time),reaction_state(ReactionID,LimitingType2,Change2,Time),
	Change1\==Change2. % this include the case that their limiting types are different.


/****************** Simple direct rules ******************/
%This integrity constraint can be put into top theory directly.
/* this can be transform into integrity constraint 
enzyme_state(EC_Number,activated):- concentration_enzClass(EC_Number,up).
enzyme_state(EC_Number,no_change):- concentration_enzClass(EC_Number,no_change).
enzyme_state(EC_Number,inhibited):- concentration_enzClass(EC_Number,down).
*/

set(specificScore,yes).

scoreSpecific(T,Coverage,Score):-
	tCompScore(T,TComplex),
	%Score is TComplex+Coverage.
	CoverageScore is 2*Coverage,
	Score is TComplex+CoverageScore.


tCompScore([],0).
tCompScore([ClaI|T],NTScore):-
	tCompScore(T,TScore), 
	nl,write(ClaI),nl,
	(ClaI=[enzyme_state-{EC_Number,no_change}]->
		NTScore=TScore;
		claInterpreter(ClaI,Cla),
		length(Cla,HL),
		NTScore is TScore+HL
	).	


