//////////////////////////////////////////////////////////////////////////
//  PReaction Class implementation file
//
//  A PReaction object represents a complete reaction process,
//  made up of a sequence of PChannels, namely a succession of
//  particle decays. All the participating PParticles and PChannels 
//  must be instantiated before the PReaction is set up.
//
//                                  Author:  M.A. Kagarlis
//                                  Written: 03.02.99
//                                  Revised: 02/11/2005 by R. Holzmann
//                                  Revised: 2007-2009 I. Froehlich
////////////////////////////////////////////////////////////////////////
//
//  A few important variables explained:
//
//  nchan    = number of channels in reaction
//  ndpar    = number of produced particles
//  ntpar    = number of stable (tracked) particles in final state
//  nclones  = number of particles in reaction, incl. beam and target
//
//  cindex[nclones] = array holding for a given particle m the index j+1
//                    of its channel: cindex[m] = j+1 (note the +1!)
//
//  dindex[nchan-1] = array holding for a given decay channel k
//                    the index m of the parent, i.e. decaying particle:
//                    dindex[k] = m
//
////////////////////////////////////////////////////////////////////////

const char *EType[4] = {
    "PReaction: ok",
    "PReaction: invalid option (must be 0 or 1)",
    "PReaction: invalid channel address",
    "PReaction: too many events failed (> _system_max_failed_events)"
};

const char *RMessage[2] = {
    "PReaction: control external - user functions disabled",
    "PReaction: calculating widths in PData..."
};

const char *OType[2] = {
    "tracked particles on file",
    "all particles on file"
};

const char *percent="\%";

//#include "Api.h"
#include "PData.h"
#include "PReaction.h"
#include "PUtils.h"
#include "TStopwatch.h"
#include "PFilter.h"

#ifdef USE_PYTHIA6
#include "TPythia6.h"
#endif



Int_t passEvent(float eb, float bp, float ph, int n,  // passes event to HGEANT
		int *id, int *src, int *par, int *parindex, float *px, float *py, float *pz, 
		float *vx, float *vy, float *vz, float *vt, float *w);

Int_t CalledSelection(PParticle *p);
Int_t CalledAnalysis(PParticle **p, Int_t n);

TMethodCall *gMethodCall1;  // global pointer needed for user selection
TMethodCall *gMethodCall2;  // global pointer needed for user analysis

FILE *PReaction::asciif = NULL;
Int_t PReaction::globalEventCounter = 0;

TClonesArray *PReaction::evt[MAX_NUM_BRANCHES+1];
Int_t PReaction::activeCnt = 0;

ClassImp(PReaction)

// define option flags
const unsigned int PReaction::ff0=1;
const unsigned int PReaction::ff1=1<<1;
const unsigned int PReaction::ff2=1<<2;
const unsigned int PReaction::ff3=1<<3;
const unsigned int PReaction::ff4=1<<4;

PReaction::PReaction(PChannel **pchannel, const char *file_name, int n,
		     int f0, int f1, int f2, int f3, TTree *ttree) {
    // Reaction constructor by pointer to array of pointers to Channels,
    // output file name (see below), options (see below), pointer to external event tree
    // (if called from the decay manager).
    // Options: 
    //   f0: 0=Tracked, 1=All particles in ROOT output file_name.root
    //   f1: unused
    //   f2: 0=Do not calculate, 1=Calculate production vertices for product particles
    //   f3: 0=Do not produce, 1=Produce GEANT ascii output file_name.evt (tracked particles always)
    //   _________________________________________________________________
    //   Format of the ASCII output in file_name.evt:
    //   EvSeqNb NumPart Ebeam bPar phiEv flag <== number of particles in event
    //   E1 px1  py1  pz1  ID1  weight1      <-- 3-momentum components in GeV/c,
    //   E2 px2  py2  pz2  ID2  weight2        <-- GEANT particle ID,
    //   E3 px3  py3  pz3  ID3  weight3          <-- weight
    //   .    .    .    .   .    .   .   .   .   .  .   . 
    //   _________________________________________________________________
    // See also PProjector/PBatch for additional conventions if filters are used.
    //   _________________________________________________________________

    makeStdData()->fillDataBase();//init physics, if not yet done
    makeDistributionManager()->DisableAddWarning();
    makeDistributionManager()->ExecAll("init"); //init physics, if not yet done, and allow for didx-plugins

    if (!pchannel) 
	n = 0;
    sub_reaction = NULL;

    status = 0; 
    tree   = ttree;
    int check_options = (f0!=0&&f0!=1) + (f1!=0&&f1!=1)
	+ (f2!=0&&f2!=1) + (f3!=0&&f3!=1&&f3!=2);
    if (check_options) {
	status = 1;
	printf("%s\n", EType[status]);
	return;
    } else {
	allPARTICLES = f0;
	resetCHANNELS = 1-f1;
	getVERTEX = f2;
	asciiOUTPUT = f3;
	extTREE = tree!=NULL;
	ropt = 0 | ff0*allPARTICLES | ff1*resetCHANNELS | ff2*getVERTEX 
	    | ff3*(asciiOUTPUT>0)  | ff4*extTREE;
    }
    nchan = n;
    SetUp(pchannel);
    SetName(file_name);
}


PReaction::PReaction() {
    makeStdData()->fillDataBase();//init physics, if not yet done
    makeDistributionManager()->DisableAddWarning();
    makeDistributionManager()->ExecAll("init"); //init physics, if not yet done, and allow for didx-plugins
    sub_reaction = NULL;

    status        = 0;
    tree          = NULL;
    allPARTICLES  = 1;
    resetCHANNELS = 0;
    getVERTEX     = 1;
    asciiOUTPUT   = 0;
    extTREE       = 0;
    ropt          = 0;
    nchan         = 0;
    SetUp(NULL);
    SetName(NULL);
}


PReaction:: PReaction(const char *filename) {
    makeStdData()->fillDataBase();//init physics, if not yet done
    makeDistributionManager()->DisableAddWarning();
    makeDistributionManager()->ExecAll("init"); //init physics, if not yet done, and allow for didx-plugins
    sub_reaction = NULL;

    status        = 0;
    tree          = NULL;
    allPARTICLES  = 1;
    resetCHANNELS = 0;
    getVERTEX     = 1;
    asciiOUTPUT   = 0;
    extTREE       = 0;
    ropt          = 0;
    nchan         = 0;
    SetUp(NULL);
    SetName(filename);
}

PReaction::PReaction(PChannel **pchannel, int n, unsigned int ff, 
		     TTree *ttree, const char *file_name) {
    // same as above, but passing one unsigned int as flag
    // position of arguments shuffled to break ambiguity with previous constructor

    makeStdData()->fillDataBase();//init physics, if not yet done
    sub_reaction = NULL;

    status        = 0;
    tree          = ttree;
    allPARTICLES  = ((ff&ff0)==ff0);
    resetCHANNELS = 1-((ff&ff1)==ff1);
    getVERTEX     = ((ff&ff2)==ff2);
    asciiOUTPUT   = ((ff&ff3)==ff3);
    extTREE       = (tree!=NULL);
    ropt          = ff&(ff4*extTREE);
    nchan         = n;
    SetUp(pchannel);
    SetName(file_name);
}


PReaction::PReaction(Double_t momentum,
		     const char *beam, const char *target,
		     const char *reaction, const char *file_name,
		     Int_t f0, Int_t f1, Int_t f2, Int_t f3, TTree *ttree) {
    // build reaction completely from descriptor string
    
    char dummy[100];
    sprintf(dummy, "_P1=%lf", momentum);
    parse_script(dummy,
		 beam, target,
		 reaction, file_name,
		 f0, f1,f2, f3, ttree);
} 

PReaction::PReaction(const char *e,
		     const char *beam, const char *target,
		     const char *reaction, const char *file_name,
		     Int_t f0, Int_t f1, Int_t f2, Int_t f3, TTree *ttree) {
    // build reaction completely from descriptor string

    parse_script(e,
		 beam, target,
		 reaction, file_name,
		 f0, f1,f2, f3, ttree);
} 

Bool_t PReaction::parse_script(const char *command,
                      const char *beam, const char *target,
                      const char *reaction, const char *file_name,
                      Int_t f0, Int_t f1, Int_t f2, Int_t f3, TTree *ttree) {
    // Build "reaction" completely from descriptor string  (author: V. Hejny)
    // For "command, the batch script syntax is supported
    // to set the beam parameters. The following variables
    // can be used:
    // _T1, _T2, _P1, _P2 as kinetic beam energy/momentum 
    // for the beam/target (in GeV), and
    // _theta1, _theta2, _phi as beam inclination (in rad). 
    // It should be mentioned, that for the target, the
    // notation is opposite, i.e. theta2 has the opposite
    // rotation as theta1, and T2 goes into the opposite 
    // direction as T1
    //
    // If no variable is used, only T1 as the beam energy is
    // assumed
    //
    // Examples:
    // "2.2"               -> Beam energy is 2.2 GeV
    // "_T1=1.5; _T2=1.2"  -> Collider experiment
    // "_T1=1.5; _theta=2*TMath::DegToRad();"
    //                     -> Beam inclination of 2 deg

  
    r_beam = beam, r_target = target;
    reaction_string = reaction;
    makeDistributionManager()->DisableAddWarning();
    makeDistributionManager()->ExecAll("init"); //init physics, if not yet done, and allow for didx-plugins
    sub_reaction = NULL;

    char *newcommand = PUtils::NewString(command);
    PUtils::remove_spaces(&newcommand);
    if (strlen(newcommand)>0 && isdigit(newcommand[0])) {
	char *newe = new char[strlen(newcommand)+5];
	sprintf(newe, "_T1=%s", (char *)newcommand);
	newcommand = newe;
    }

    makeGlobalBatch()->SetVarList((char *)
				  "_T1;_T2;_P1;_P2;_theta1;_theta2;_phi;");
    makeGlobalBatch()->Execute(newcommand);
    makeGlobalBatch()->SetVarList(NULL);
    
    Double_t beam_energy1 = 0.;
    if (makeStaticData()->GetBatchValue("_T1",0)) {
	beam_energy1 = *(makeStaticData()->GetBatchValue("_T1",0));
    }
    Double_t beam_energy2 = -0.;
    if (makeStaticData()->GetBatchValue("_T2",0)) {
	beam_energy2 = *(makeStaticData()->GetBatchValue("_T2",0));
    }
    Double_t beam_momentum1 = -1.;
    if (makeStaticData()->GetBatchValue("_P1",0)) {
	beam_momentum1 = *(makeStaticData()->GetBatchValue("_P1",0));
    }
    Double_t beam_momentum2 = -1.;
    if (makeStaticData()->GetBatchValue("_P2",0)) {
	beam_momentum2 = *(makeStaticData()->GetBatchValue("_P2",0));
    }
    Double_t beam_theta1 = 0.;
    if (makeStaticData()->GetBatchValue("_theta1",0)) {
	beam_theta1 = *(makeStaticData()->GetBatchValue("_theta1",0));
    }
    Double_t beam_theta2 = 0.;
    if (makeStaticData()->GetBatchValue("_theta2",0)) {
	beam_theta2 = *(makeStaticData()->GetBatchValue("_theta2",0));
    }
    Double_t beam_phi1 = 0.;
    if (makeStaticData()->GetBatchValue("_phi",0)) {
	beam_phi1 = *(makeStaticData()->GetBatchValue("_phi",0));
    }
    // Double_t beam_phi2=0.;
    // if (makeStaticData()->GetBatchValue("_phi2",0)) {
    //   beam_phi2=*(makeStaticData()->GetBatchValue("_phi2",0));
    // }

    char *array[200];
    Int_t array_s = 200; 
    PUtils::Tokenize(reaction, ";", array, &array_s);

    Int_t total_channels = 0;
    TList plutoList;
   
    for (int i=0; i<array_s; i++) {
       
	PParticle pb,pt;

	Int_t n = 0;
	if (beam_momentum1 > 0) {
	    pb = PParticle(beam, 0, 0, beam_momentum1);  
	} else {
	    pb = PParticle(beam, beam_energy1);  
	}
	if (beam_momentum2 > 0) {
	    pt = PParticle(target, 0, 0, -beam_momentum2);  
	} else {
	    pt = PParticle(target, 0, 0, -sqrt(beam_energy2*beam_energy2+2*beam_energy2*
					       makeStaticData()->GetParticleMass(target)));  
	}
	pb.RotateY(beam_theta1);
	pb.RotateZ(beam_phi1);
	pt.RotateY(-beam_theta2);
	pt.RotateZ(beam_phi1);

	cout << "<Beam>" << endl;
	pb.Print();	
	cout << "<Target>" << endl;
	pt.Print();

	PParticle *q = new PParticle(pb+pt);

	plutoList.AddLast(q);
	ParseChannel(q,array[i], plutoList, n);

	total_channels += n;
    }

    PChannel **pchannel = new PChannel*[total_channels];
    TIter next(&plutoList);
    
    Int_t pos = 0;
    while (TObject *t = next()) {
	if (t->IsA() == PChannel::Class()) { 
	    pchannel[pos++] = (PChannel*) t;
	}
    }

    status = 0;
    tree   = ttree;
    int check_options = (f0!=0&&f0!=1) + (f1!=0&&f1!=1)
	+ (f2!=0&&f2!=1) + (f3!=0&&f3!=1&&f3!=2);
    if (check_options) {
	status = 1;
	printf("%s\n", EType[status]);
	return kFALSE;
    } else {
	allPARTICLES  = f0;
	resetCHANNELS = 1-f1;
	getVERTEX     = f2;
	asciiOUTPUT   = f3;
	extTREE       = tree!=NULL;
	ropt = 0 | ff0*allPARTICLES | ff1*resetCHANNELS | ff2*getVERTEX
	    | ff3*(asciiOUTPUT>0)  | ff4*extTREE;
    }
    nchan = total_channels;
    SetUp(pchannel);
    SetName(file_name); 
    return kTRUE;
} 

PReaction::PReaction(PParticle *q,
		     const char *reaction, const char *file_name,
		     Int_t f0, Int_t f1, Int_t f2, Int_t f3, TTree *ttree) {
    // build reaction completely from descriptor string  (author: V. Hejny)

    reaction_string = reaction;
    makeDistributionManager()->DisableAddWarning();
    makeDistributionManager()->ExecAll("init"); //init physics, if not yet done, and allow for didx-plugins
    sub_reaction = NULL;

    char *array[200];
    Int_t array_s = 200; 
    PUtils::Tokenize(reaction, ";", array, &array_s);

    Int_t total_channels = 0;
    TList plutoList;
   
    for (int i=0; i<array_s; i++) {
	Int_t n = 0;
	
	plutoList.AddLast(q);
	ParseChannel(q, array[i], plutoList, n);
	
	total_channels += n;
    }

    PChannel **pchannel = new PChannel*[total_channels];
    TIter next(&plutoList);
    
    Int_t pos = 0;
    while (TObject *t = next()) {
	if (t->IsA() == PChannel::Class()) { 
	    pchannel[pos++] = (PChannel*) t;
	}
    }


    status = 0;
    tree   = ttree;
    int check_options = (f0!=0&&f0!=1) + (f1!=0&&f1!=1)
	+ (f2!=0&&f2!=1) + (f3!=0&&f3!=1&&f3!=2);
    if (check_options) {
	status = 1;
	printf("%s\n", EType[status]);
	return;
    } else {
	allPARTICLES  = f0;
	resetCHANNELS = 1-f1;
	getVERTEX     = f2;
	asciiOUTPUT   = f3;
	extTREE       = tree!=NULL;
	ropt = 0 | ff0*allPARTICLES | ff1*resetCHANNELS | ff2*getVERTEX
	    | ff3*(asciiOUTPUT>0)  | ff4*extTREE;
    }
    nchan = total_channels;
    SetUp(pchannel);
    SetName(file_name); 
} 

void PReaction::AddReaction(const char *reaction) {
    if (sub_reaction) {
	sub_reaction->AddReaction(reaction);
    } else {

	if (original_filename == "")
	    ConvertFilename();

	if (strlen(filename) > 0)
	    sub_reaction = new PReaction((char*)"", r_beam, r_target,
					 reaction,(char*)original_filename.Data(),
					 allPARTICLES, 1-resetCHANNELS,
					 getVERTEX, asciiOUTPUT);	
	else
	    sub_reaction = new PReaction((char*)"", r_beam, r_target,
					 reaction, NULL,
					 allPARTICLES, 1-resetCHANNELS,
					 getVERTEX, asciiOUTPUT);
	sub_reaction->ConvertFilename();
    }
}

void PReaction::ConvertFilename(void) {
    if (strlen(filename) == 0) return;
    TString original_filename2 = filename;

    filename.Append("_to_");
    filename.Append(reaction_string);
    filename.ReplaceAll(" [ ",".");
    filename.ReplaceAll(" ] ","");
    filename.ReplaceAll(" [",".");
    filename.ReplaceAll(" ]","");
    filename.ReplaceAll("[ ",".");
    filename.ReplaceAll("] ","");

    filename.ReplaceAll("[",".");
    filename.ReplaceAll("]","");
    filename.ReplaceAll(" ","_");

    //spectator
    filename.ReplaceAll("(","_");
    filename.ReplaceAll(")","");

    SetName((char*)filename.Data());
    original_filename=original_filename2;
    
    cout << "New name: " << filename << endl;
}

PReaction::~PReaction() {
    // Reaction destructor

    cindex.~TArrayI(); 
    if (particle_stack)
	delete [] particle_stack;
    
    if (evt[0]) {
	delete evt[0];
	evt[0] = NULL;
    }
    for (int i=0; i<MAX_NUM_BRANCHES; i++) {
	if (evt[i+1]) {
	    delete evt[i+1];
	    evt[i+1] = NULL;
	}
    }
    
    if (dindex.GetArray()) dindex.~TArrayI();
    if (ftrack.GetArray()) ftrack.~TArrayI();
    if (!extTREE&&tree) delete tree;

    if (rootfile && !extTREE && (strlen(filename) > 0)) {
	rootfile=tree->GetCurrentFile(); // needed if a new file was opened by Root
	rootfile->Write();
	rootfile->Close();
	delete rootfile;
    }

    if (gMethodCall1) delete gMethodCall1;
    if (gMethodCall2) delete gMethodCall2;
}


PParticle *PReaction::MakeParticle(char *name) {
    //    cout << name << endl;
    int is_spec = -1;
    int len     = strlen(name)-1;
    if ((name[0]=='(') && (name[len]==')'))  { 
	is_spec = 1;
	PUtils::remove_brackets(&name, '(', ')');
    }
    if (name[0]=='(') { 
	is_spec = 2;
	name++;
    }
    if (name[len]==')') { 
	is_spec = 3;
	name[len]='\0';
    }

    PParticle *dummy = new PParticle(name);
    dummy->SetSpectator(is_spec);
    return dummy;
};

Int_t PReaction::ParseChannel(PParticle *parent, const char *channel,
			      TList &plutoList, Int_t &numChannels) {
    // parse reaction descriptor string  (author: V. Hejny)
    TList plist;
    Int_t num_parts = 0;
    PParticle *current = NULL;
    Int_t i = 0;
    Int_t start = i;
    while(1) {
	switch (channel[i]) {
	    case '[':
		if (!current) {
		    while(1) {
			if (channel[i]==']') { i++; break; }
			else if (channel[i]==0) break;
			else i++;
		    }
		    break;
		}
		i++;
		i += ParseChannel(current, &channel[i], plutoList, numChannels);
		if (channel[i]) i++;
		start = i;
		break; 
	    case 0:
	    case ']': {
		if (start!=i) {
		    TString name(&channel[start], i-start);
//		    current = new PParticle( (char*) name.Data());
		    current = MakeParticle( (char*) name.Data());
		    plist.AddLast(current);
		    plutoList.AddLast(current);
		    num_parts++;
		}
		if (!num_parts) return i;
		PParticle **ppl = new PParticle*[num_parts+1];
		ppl[0] = parent;
		Int_t pos = 1;
		TIter next(&plist);
		while (PParticle *p = (PParticle*) next()) {
		    ppl[pos++] = p;
		}
		PChannel *ch = new PChannel(ppl,num_parts);
		plutoList.AddFirst(ch);
		numChannels++;
		return i;
		break;
	    } 
	    case ' ': {
		if (start==i) { start = ++i; break; }
		TString name(&channel[start], i-start);
//		current = new PParticle( (char*) name.Data());
		current = MakeParticle( (char*) name.Data());
		plist.AddLast(current);
		plutoList.AddLast(current);
		num_parts++;
		i++;
		start = i;
		break;
	    }
	    default:
		i++;
	}
    }
}

//************Interfaces ***************


Bool_t PReaction::AddBulk(PBulkInterface *mybulk) {
    //Add a bulk interface to the list
    //Each bulk object will be executed during the event loop
    //after the normal decay
  
    if (bulkdecay_pos == MAX_BULKDECAY ) {
	Error("AddBulk", "MAX_BULKDECAY reached");
	return kFALSE;
    }
    if (bulkdecay_pos && (bulk[bulkdecay_pos-1]->GetPriority() > mybulk->GetPriority())) {
	bulk[bulkdecay_pos]   = bulk[bulkdecay_pos-1];
	bulk[bulkdecay_pos-1] = mybulk;
	bulkdecay_pos++;
    } else
	bulk[bulkdecay_pos++] = mybulk;
    if (sub_reaction) sub_reaction->AddBulk(mybulk);
    mybulk->SetSizeBranches(&size_branches);
    mybulk->SetKeysBranches(key_branches);
    return kTRUE;
}

Bool_t PReaction::AddPrologueBulk(PBulkInterface *mybulk) {
    //Add a bulk interface to the list
    //Each bulk object will be executed during the event loop
    //before the normal decay

    if (pro_bulkdecay_pos == MAX_BULKDECAY ) {
	Error("AddPrologueBulk", "MAX_BULKDECAY reached");
	return kFALSE;
    }
    
    if (pro_bulkdecay_pos && (pro_bulk[pro_bulkdecay_pos-1]->GetPriority() > mybulk->GetPriority())) {
	pro_bulk[pro_bulkdecay_pos]   = pro_bulk[pro_bulkdecay_pos-1];
	pro_bulk[pro_bulkdecay_pos-1] = mybulk;
	pro_bulkdecay_pos++;
    } else
	pro_bulk[pro_bulkdecay_pos++] = mybulk;
    if (sub_reaction) sub_reaction->AddPrologueBulk(mybulk);
    mybulk->SetSizeBranches(&size_branches);
    mybulk->SetKeysBranches(key_branches);
    return kTRUE;
}

void PReaction::SetReactionId() {
    // compute the reaction id from the list of product ids of 1st channel
    // (to be used in SetUp() as sourceId)

    PChannel *pch0 = channel[0];  // 1st channel in reaction
    Int_t n = pch0->GetNumPar();  // nb of decay products
    Int_t *ids = pch0->GetPids(); // array of product ids
    if (ids[0]/100 != 5) {
	Int_t fac = 1;
	reactionId = 0;
	if(n>5) n = 5;              // cannot handle more in 32 bits
	for (Int_t i=n; i>0; i--) {
	    reactionId += ids[i]*fac; // code reaction id
	    fac *= 100;
	}
	(pch0->GetParticles())[0]->SetSourceId(reactionId); // source id of 1st part. in 1st ch.
    } else reactionId = ids[0];   // this is a thermal source, dilepton generator, etc. 
}

void PReaction::SetUp(PChannel **pchannel) {
    // get the channels and particles, identify the physics, set up the defaults.

//    cout << "PReaction:: setUp called" << endl;
    
    int j, i, cnew, l=-1, m=-1, k, pcount;

    num_filters   = 0;
    reset_count   = 0;
    HGeant        = 0;
    rootfile      = NULL;
    userSelection = NULL;
    gMethodCall1  = NULL;
    userAnalysis  = NULL;
    gMethodCall2  = NULL;
    decayALL      = 0;
    fPythia       = NULL;
    nMaxBytes     = 0;
    nTrigCond     = 0;
    // thetaBeam=0.;
    // phiBeam=0.;
    // sigmaBeam=0.;
    writeINDEX        = 1;
    fileoutput_pos    = 0;
    bulkdecay_pos     = 0;
    pro_bulkdecay_pos = 0;
    makeDistributionManager()->LinkDB();
    weight_reset = 1;
    pre_heating  = 0;
    current_projector = NULL;
    is_inline = 0;
    doonce    = 0;
    size_branches = 0;
    evt[0] = NULL;

    for (int i=0; i<MAX_NUM_BRANCHES; i++) {
	key_branches[i] = -1;
	evt[i+1] = NULL;
    }

    makeGlobalBulk()->SetSizeBranches(&size_branches);
    makeGlobalBulk()->SetKeysBranches(key_branches);

    if (!makeStaticData()->GetBatchValue("_system_inactivate_decayed_particles",0))
	inactivate_decayed_particles = 0;
    else
	inactivate_decayed_particles = (Int_t)(*(makeStaticData()->GetBatchValue("_system_inactivate_decayed_particles")));

    if (makeDistributionManager()->GetLoopFilter()) {
	AddBulk(makeDistributionManager()->GetLoopFilter());
	//Add projector from command file
	//TODO: add dummy bulk for separation, otherwise
	//GetCurrentPorjector gets the global one
    }
    
    event_impact_param = (makeStaticData()->GetBatchValue("_event_impact_param"));
    event_plane        = (makeStaticData()->GetBatchValue("_event_plane"));
    vertex_x = makeStaticData()->GetBatchValue("_event_vertex_x");
    vertex_y = makeStaticData()->GetBatchValue("_event_vertex_y");
    vertex_z = makeStaticData()->GetBatchValue("_event_vertex_z");
    weight_version = makeStaticData()->GetBatchValue("_system_weight_version");

    if (!makeStaticData()->GetBatchValue("_system_particle_stacksize",0))
	stacksize = MIN_PARTICLE_STACKSIZE;
    else
	stacksize = (Int_t)(*(makeStaticData()->GetBatchValue("_system_particle_stacksize")));

    PParticle **pnew=NULL, **poth=NULL;

    particle_stack = new PParticle*[stacksize];
    //    stacksize = MIN_PARTICLE_STACKSIZE; //Default. BUGBUG: Can be extended later

    ndpar = 0;    // initialize total number of product particles
    //int quasi=0;
    channel = NULL;
    if (pchannel) {
	if (pchannel[0]->GetQuasi()) {
	    //Workaround for d+p quasi-construction 
	    //Simply move everything by one and fill in the scattering
	    channel = new PChannel*[nchan+1];
	    for (int j=0; j<nchan; ++j) {
		channel[j+1] = pchannel[j];
	    }
	    channel[0] = pchannel[0]->GetQuasi();
	    pchannel[0]->ClearQuasi();
	    nchan++;
	    //quasi=1;
	} else {
	    channel = pchannel;                     // address of the PChannel array
	}
    }
    dindex.Set(nchan-1);                    // indices of parents to channels after the 1st

    for (j=0; j<nchan; ++j) {                 // get number of product particles
	if (!channel[j]) {
	    status = 2;                           // error
	    printf("%s\n", EType[status]);
	    return;
	}

	ndpar += channel[j]->GetNumPar();     // update for this channel
    }
    // this assumes all sequential channels

    Int_t is_fireball = 0;

    if (nchan && (channel[0]->GetParticles()[0]->IsFireball())) {
	//cancel first PFireball, that it does not appear as an "unstable"
	//particle in the loop
	nclones     = ndpar;
	is_fireball = 1;
    } else
	nclones = ndpar + 1;                    // initialize number of clones for root tree
  
    for (j=0; j<nchan; ++j) {
	if (makeDistributionManager()->from_pdecaymanager == 0) {
//	    channel[j]->Print();
	    makeDistributionManager()->Attach(channel[j]); 

	} //if no DecayManager, do this by hand
    }

    for (j=0; j<nchan; ++j) {                 // loop over channels
	cnew = channel[j]->GetNumPar();       // number of particles produced in current channel

	pnew = channel[j]->GetParticles();    // address of the array of these particles
	pcount = 0;                           // reset decayed photon counter

	if (j == 0) {                           // for the entry channel:
	    particle = new PParticle*[nclones];
	    cindex.Set(nclones);                //    channel index of each reaction particle
	    ftrack.Set(nclones);                //    identifies whether particle is tracked or not
	    if (!is_fireball) {
		m = 0;
		particle[0] = pnew[0];       // the parent particle is fixed: first reaction particle
	    }

	    cindex[0] = 1;                      // channel index of 1st particle (or beam)
	    ftrack[0] = 0;
	}

	for (i=1; i<=cnew; ++i) {               // now loop over particles of current channel
	    ++m;                                // count of particles in reaction so far
	    particle[m] = pnew[i];              // the current particle
	    particle[m]->SetParent(pnew[0]);    // set pointer to parent
	    cindex[m] = j+1;                    // its channel index
	    int dcount = 0;                     // reset decayed-particle count
	    if (j != nchan-1) {                   // if this is not the last chanel:
		for (k=j+1; k<nchan; ++k) {         // loop over subsequent channels
		    poth=channel[k]->GetParticles();// address of that channels particle array
		    if (pnew[i] == poth[0]) {         // current particle decays at a later channel
			if (pnew[i]->Is("dilepton")) ++pcount;
			++dcount;	    
			dindex[k-1] = m;              // keep track which particle decays at which channel
		    }
		}
	    }
	    if (!dcount) {
//		tparticle[++l] = pnew[i];         // the present particle survives decay
		ftrack[m] = 1;                    // identify as tracked particle
	    } else {
		ftrack[m] = 0;                 // not a tracked particle
	    }
	}
    }
    ntpar = l+1;

    //PParticle* pParent=NULL;

    if (nchan > 0) SetReactionId();
    else nclones = 0;

    for (j=0; j<nclones; j++) {
//	particle[j]->Print();

	//pParent = particle[j]->GetParent();
	//if (pParent==NULL) cout << "ids= " << particle[j]->ID() << endl;
	//else cout << "ids= " << particle[j]->ID() <<" " << pParent->ID()<< endl;
	particle[j]->SetIndex(j);             // set index in array
	particle[j]->SetParentIndex(-1);      // parent not known yet
	particle[j]->SetDaughterIndex(-1);    // daughter(s) not known yet
	particle[j]->SetSiblingIndex(-1);     // sibling(s) not known yet
	particle[j]->SetSibling(NULL);
    }
  

    //initialize PChannels
    for (j=0; j<nchan; ++j) {
	channel[j]->SetDaughters();
    }
    for (j=0; j<nchan; ++j) {
	channel[j]->SetPrintTentative(0);
	channel[j]->Init();
	channel[j]->SetPrintTentative(1);
    }
}

void PReaction::InitChannels() {
    for (int j=0; j<nchan; ++j) {
	channel[j]->SetDaughters();
    }
    for (int j=0; j<nchan; ++j) {
	channel[j]->SetPrintTentative(0);
	channel[j]->Init();
	channel[j]->SetPrintTentative(1);
    }
}

void PReaction::SetName(const char *name) {
    // Sets up output file names

    if (extTREE&&reset_count) {
	printf("%s\n", RMessage[0]);
	return;
    }
    if (name) {
	filename = name;
	file2    = name;
	if (extTREE) 
	    file2 = tree->GetCurrentFile()->GetName();
	else file2 += ".root";  // root file name
    } else {
	//Do NOT write the event file to disc
	//This can be useful when projecting directly to
	//the histogram
	filename = "";
	file2    = "";
    }
    if (rootfile) {
	rootfile->Close();
	delete rootfile;
    }
    if (asciiOUTPUT && (strlen(filename) > 0) ) {      
	// ascii output required
	file1 = filename+".evt";
    }
//if (!extTREE && !HGeant) rootfile=new TFile(file2,"RECREATE",file2);
    loop_count = 0;          // reset loop counter
    original_filename = "";  //not yet needed
}

void PReaction::InitLoop() {
    // resets the dynamical objects of the reaction, creates tree and opens output files

    int size = ntpar;
    static int count = 0;

    if (!evt[0]) 
	evt[0] = new TClonesArray("PParticle", size);   // create on 1st time
    else return;

    reset_count = ++count;

    if (!extTREE && !HGeant && (strlen(filename) > 0)) {
	rootfile = new TFile(file2, "RECREATE", file2);
	rootfile->cd();
    }
    if (!extTREE && (strlen(filename) > 0))
	tree = new TTree("data", "event branch");

    if (allPARTICLES) size = nclones;

    if (tree) {
	if (extTREE && tree->GetBranch("Particles")) {     // reconnect branches
	    tree->SetBranchAddress("Npart",  &activeCnt);
	    tree->SetBranchAddress("Impact", event_impact_param);
	    tree->SetBranchAddress("Phi",    event_plane);
	    tree->SetBranchAddress("Particles", &(evt[0]));
	    if (size_branches) {
		Error("InitLoop", "Multiple branches not supported when using an external tree");
	    }
	} else {                                             // create branches 
	    tree->Branch("Npart",  &activeCnt, "Npart/I");
	    tree->Branch("Impact", event_impact_param, "Impact/D");
	    tree->Branch("Phi",    event_plane, "Phi/D");
	    tree->Branch("Particles", &(evt[0]),32000,99);
	    for (int br=0; br<size_branches; br++) {
		if (key_branches[br] != -1) {
		    if (!evt[br+1]) evt[br+1] = new TClonesArray("PParticle", size);
		    tree->Branch(makeDataBase()->GetName(key_branches[br]), &(evt[br+1]), 32000, 99);
		    makeDataBase()->SetParamInt(key_branches[br], "branch_idx", new Int_t(br));
		}
	    }
	}
    }

    if (asciiOUTPUT == 1) 
	asciif = fopen(file1, "w");

    if (nMaxBytes>0 && tree) tree->SetMaxTreeSize(nMaxBytes);

    Int_t listkey = -1;
    num_filters = 0;
    Int_t primary_key = makeDataBase()->GetEntry("batch_objects");
    
    if (primary_key >- 1)
	while (makeDataBase()->MakeListIterator(primary_key, NBATCH_NAME, LBATCH_NAME,
						&listkey)) {
	    //cout << makeDataBase()->GetName(listkey);
	    if ((*makeDataBase()->GetName(listkey) == '#') && 
		PUtils::ValidVariableName(makeDataBase()->GetName(listkey))) {
		//Filter found
		cout << "Found filter variable " << makeDataBase()->GetName(listkey) << endl;
		if (num_filters < MAX_REACTION_FILTERS) {
		    filter_keys[num_filters] = listkey;
		    filter_counter[num_filters] = 0;
		    if (!makeDataBase()->GetParamDouble(listkey, "batch_value", &filter_values[num_filters]))
			Warning("InitLoop", "Filter content variable not found");
		    num_filters++;
		} else {
		    Warning("InitLoop", "Too many filters (MAX_REACTION_FILTERS reached)");
		}
	    }
	} //end iterator
}

int PReaction::Loop(int nevents, int wf, int verbose) {
    // Simulate "nevents" events

    // double initialWeight = 1.;
    // if (channel) (channel[0]->GetParticles())[0]->W();

    if (weight_reset) PChannel::SetGlobalWeight(1./nevents);

    double t0 = -1;
    if (extTREE && reset_count&&verbose) printf("%s\n", RMessage[0]);

    if (!is_inline && !extTREE && reset_count>0) {
	Error("Loop", "Called a second time -> abort");
	return 0;  // prevent executing loop() more than once
    }
    // from one and the same PReaction object

    int i, j, k, error_count=0, error_count_failed=0, empty_count=0, good_event=0, 
	size, current_size_branches[MAX_NUM_BRANCHES],
	size_tracked;
    int percentevents = (nevents/100) * (*makeStaticData()->GetBatchValue("_system_printout_percent")), 
	cpc=1, ipc=cpc*percentevents;
    if (verbose) (*makeStaticData()->GetBatchValue("_system_total_events_to_sample")) = nevents;
    int system_printout_percent = int(*makeStaticData()->GetBatchValue("_system_printout_percent"));

    int error_count_array[100];
    for (int i=0; i<100; i++) error_count_array[i] = 0;

    double *events = makeStaticData()->GetBatchValue("_system_total_event_number");

    // PParticle **file_particle, **ascii_particle, **tree_particle; 
    // particles to be kept on file

    //Create additional particles for the bulk decay
    PParticle *p_array[stacksize];
    PParticle *stable_particle[stacksize];
    PParticle *p_array_branches[MAX_NUM_BRANCHES*stacksize];

    Double_t max_failed_events = 10000.;
    if (makeStaticData()->GetBatchValue("_system_max_failed_events", 0)) {
	max_failed_events = *(makeStaticData()->GetBatchValue("_system_max_failed_events",0));
    }

//    int decay_done[stacksize];

//    if ((bulkdecay_pos || pro_bulkdecay_pos) && !doonce) {
    if (!doonce) {
	doonce = 1;
	for (k=0;k<stacksize;k++) { 
	    p_array[k] = new PParticle("dummy");
	    particle_stack[k] = p_array[k];
	    for (int i=0; i<MAX_NUM_BRANCHES; i++) {
		p_array_branches[i*stacksize + k] = new PParticle("dummy");
	    }
	}
    } 
    //else {
	//Fix stack for the rest of reaction lifetime to save time
	//stacksize = nclones;
    //}

    ++loop_count;                            // initialized in setNAME
    InitLoop();                              // rebuild dynamic objects
    TClonesArray *pclone = (evt[0]);

    TStopwatch timer;                        // time loop
    timer.Start();

    Int_t print_welcome = 1;
    Int_t last_nonempty = -1;
    for (int bu =0; bu<pro_bulkdecay_pos; bu++) {
	pro_bulk[bu]->SetTree(tree);
	for (int i=0; i<MAX_NUM_BRANCHES; i++) {
	    pro_bulk[bu]->SetBranchArray(i, &(p_array_branches[i*stacksize]));
	    pro_bulk[bu]->SetBranchNum(i,   &(current_size_branches[i]));
	}
    }
    for (int bu =0; bu<bulkdecay_pos; bu++) {
	bulk[bu]->SetTree(tree);
	for (int i=0; i<MAX_NUM_BRANCHES; i++) {
	    bulk[bu]->SetBranchArray(i, &(p_array_branches[i*stacksize]));
	    bulk[bu]->SetBranchNum(i,   &(current_size_branches[i]));
	}
    }
    
    for (int i=0; i<MAX_NUM_BRANCHES; i++) {
	makeGlobalBulk()->SetBranchArray(i, &(p_array_branches[i*stacksize]));
	makeGlobalBulk()->SetBranchNum(i,   &(current_size_branches[i]));
    }
    
/////////////////////////////    Event loop    ////////////////////////////////

    if (verbose) printf("%s\n", RMessage[1]); //calculating widths in PData...

    makeDistributionManager()->Startup();

    for (i=0;(i<nevents) || (nevents<0);++i) {                // number of events to generate
	//l1=0;

	//In the prologue all particles are undecayed
	for (k=0; k<stacksize; k++) {
	    decay_done[k] = 0;
	}

	//Fill our stack with the particles from
	//the PChannel list
	for (k=0; k<nclones; k++) {
	    particle_stack[k] = particle[k];
	}	

	//First of all, the size is the filled size
	//(can also be 0)

	size = nclones;

	if (nevents > 0) {
	    // Timing:
	    if (print_welcome) {
		if (good_event == 1) {
		    t0=timer.RealTime();
		    if (verbose) printf("...widths calculated in %f sec\n", t0);
		    if (verbose) printf("New loop: %i events\n", nevents);
		    timer.Continue();
		}
		
		if (verbose && i==1000) {   // estimate total exec time from 1000 events
		    Double_t elaps = timer.RealTime()-t0;
		    printf("Expected execution time = %.3f sec\n", nevents*0.001*elaps);
		    timer.Continue();
		}
		print_welcome = 0;
	    }

#if 0	    
	    if (i == ipc) {
		if (verbose) printf(" %i%s done in %f sec\n", cpc*20, percent, timer.RealTime()-t0);
		++cpc;
		ipc = cpc*twentypercent;
		timer.Continue();
	    }
#endif
	}

	if (channel) {
	    for (j=0; j<nchan; j++) {
		(channel[j]->GetParticles())[0]->SetVertex(*vertex_x,
							   *vertex_y,
							   *vertex_z,0.);
		(channel[j]->GetParticles())[0]->clearDebugString();
	    } 
	}

	*event_impact_param = 0.0;             // reset reaction impact parameter
	*event_plane = 0.0;              // and event-plane angle

////////////////////////    Decay all particles (Prologue)  ////////////////////////////

	//BUGBUG: If Prologue modifier decay daughter of a PChannel, this should be skipped later

    repeat_empty:

	for (int ij=0; ij<MAX_NUM_BRANCHES; ij++) {
	    current_size_branches[ij] = 0;
	}

	Bool_t statusOfModify = kTRUE;
	for (int bu=0; bu<pro_bulkdecay_pos; bu++) {
	    int old_size = size;
	    pro_bulk[bu]->SetTree(tree);
	    if(!(statusOfModify = pro_bulk[bu]->Modify(particle_stack, 
						       decay_done, &size, stacksize))) { 
		break; 
	    }

	    for (int ii=old_size; ii<size; ii++) {
		//set index for "new" particles. 
		particle_stack[ii]->SetIndex(ii);		
	    }	
	    for (int ii=0; ii<size; ii++) {
		//check for decayed particles and set them inactive
		if (!allPARTICLES && decay_done[ii]) 
		    particle_stack[ii]->SetInActive();  // decayed particle
	    }
	}
	
        // if Modify failed we will stop the eventloop
	if(statusOfModify == kFALSE) {
	    if (nevents > 0)
		Warning("Loop()",
			"Bulk return kFALSE. Not full number of events calculated! nEvents = %i !", i);
	    break;
	}

////////////////////////    End of Prologue  ////////////////////////////

	//cout << "prosize " << size << endl;

	//Loop over all Particles and set the initial weight
	//This includes the particles from the prologue
	for (int ii=0; ii<size; ii++) {
	    if (*weight_version) {
		particle_stack[ii]->SetW(/* PChannel::GetGlobalWeight() * */ particle_stack[ii]->GetMultiplicity());
	    }
	    particle_stack[ii]->SetStatus(STATUS_NOT_DECAYED);
	    //cout << "set particle " << ii << " active" << endl;
	    particle_stack[ii]->SetActive(); //active by default, otherwise it is 
	    //un-initialized in PChannel::decay()
	}
	for (j=0; j<nchan; ++j) {
	    PParticle *parent = (channel[j]->GetParticles())[0];
	    if (*weight_version) 
		parent->SetW(PChannel::GetGlobalWeight() * parent->GetMultiplicity());
	    parent->SetGenW(1.);
	    parent->SetInvGenW(1.);
	    //parent->Print();
	}
	
	Int_t ret   = 0;
	Int_t start = 0;

    repeat:

	if (error_count_failed > max_failed_events-0.5) {
	    status = 3;
	    Error("Loop", "Stalled in one single event (_system_max_failed_events reached). Giving up....");
	    Info("Loop", "Last error code was: %i", ret);	    
	    break;
	}

    repeat2:

	for (j=start; j<nchan; ++j) {
	    if ( (ret=channel[j]->decay()) ) {    // execute steps in the reaction
		error_count++;
		error_count_failed++;
		error_count_array[ret]++;

		if (ret != 8) {
		    last_nonempty = i;
		    //cout << "goto repeat, code=" << ret << ", event nr=" << *events << endl;
		    goto repeat;            // FAILED, repeat event
		}
	    } 

	    //Clear status flag for the parent particle
	    (channel[j]->GetParticles())[0]->SetStatus(ret);

	} // end of channel loop

	error_count_failed = 0;

	for (j=0; j<nchan; ++j) {
	    if (channel[j]->GetNumNotFinalized()) {
		// cout << channel[j]->GetNumNotFinalized() << endl;
		for (int k=0; k<channel[j]->GetNumNotFinalized(); k++) {
		    if (!channel[j]->GetDistributionNotFinalized(k)->EndOfChain()) {
			//		start=j;
			start = 0;
			++error_count;
			error_count_array[STATUS_REDO_CHAIN]++;
			goto repeat2;
		    }
		}
	    }
	}
	
	if (pre_heating) {
	    pre_heating--;
	    if (pre_heating == 1) Info("Loop()","Preheating done");
	    goto repeat2;            // dummy, repeat event
	}
	
	if (ret == 8) break;                // EOF in PChannel::readFileInput()

	Double_t my_global_weight = 1.;	

	if (*weight_version) {
	    
	    //BUGBUG: The following lines should go into a separate class:
#if 1
	    //Now starting to combine the individual weights
	    //to (at least) a chain weight
	    for (k=0; k<size; k++) { 
		particle_stack[k]->weight_divisor = 1.;
		//cout << particle_stack[k]->W() << endl;
	    }
	    
	    //Step1: Collect the divisors 
	    for (k=size-1; k>=0; k--) {
		if (particle_stack[k]->GetParent() && (particle_stack[k]->W()>0.)) {
		    particle_stack[k]->GetParent()->weight_divisor =
			particle_stack[k]->GetParent()->W() /
			particle_stack[k]->W();
		}
	    }
	    
	    //Step2: Combine the divisors 
	    for (k=size-1; k>=0; k--) {
		if (particle_stack[k]->GetParent())
		    particle_stack[k]->GetParent()->weight_divisor *=
			particle_stack[k]->weight_divisor;
	    }
	
	    //Step3: InitWeight
	    for (k=size-1; k>=0; k--) {
		particle_stack[k]->SetW(
		    particle_stack[k]->W() / (particle_stack[k]->weight_divisor));
	    }
	    
	    //Step4: Now we assume that the "Adam" has the correct weight
	    //       for all daughters. This will be copied, thus a
	    //       chain has the same weight
	    //
	    //       At the same time we collect already the "global" weight
	    
	    
	    for (k=size-1; k>=0; k--) {
		if (particle_stack[k]->GetParent()) {
		    particle_stack[k]->SetW(particle_stack[k]->GetParent()->W());
		} else //adam
		    my_global_weight *= particle_stack[k]->W();
	    }
	    
	    //cout << "W: "<< my_global_weight << endl;
	    
	    //Step5: (optional)
	    //Here, we give all particles the same weight (=event weight)
	    //BUGBUG: Problem when we have different chains and the default weight
	    //is the number of events???
	    for (k=size-1; k>=0; k--) 
		particle_stack[k]->SetW(my_global_weight);
#endif
	}


	(*events)++;
	if ((*events) == ipc) {
	    printf(" %i%c done in %f sec\n", cpc*system_printout_percent,
		   '%', timer.RealTime()-t0);
	    cpc++;
	    ipc = cpc*percentevents;
	    timer.Continue();
	}

	////////////////////////    Decay all particles (Epilogue)  ////////////////////////////

	//Set the decay flag of the original particles	
	for (k=0; k<size; k++) {
	    if ((particle_stack[k]->GetStatus()) == STATUS_OK)
		decay_done[k] = 1;
	    else
		decay_done[k] = 0;
	}
	
	//set the remaining particles to 0
	for (k=size; k<stacksize; k++) {
	    decay_done[k] = 0;
	}

	statusOfModify = kTRUE;

	if (inactivate_decayed_particles) {
	    for (int ii=0; ii<size; ii++) {
		//check for decayed particles and set them inactive ... to be consistent with below
		if (!allPARTICLES && decay_done[ii]) {		   
		    particle_stack[ii]->SetInActive();  // decayed particle
		}
	    }
	}

	for (int bu = 0; bu<bulkdecay_pos; bu++) {
	    int old_size = size;
	    //cout << "size is: " << size << endl;
	    //BUGBUG: Preliminary (see above)
	    bulk[bu]->SetWeight(my_global_weight);
//  	    for (k=0;k<size;++k) {
// 		particle_stack[k]->Print();
//  		//cout << "act: " << particle_stack[k]->IsActive() << endl;
// 	    }

//	    bulk[bu]->Print();
	    if(!(statusOfModify = bulk[bu]->Modify(particle_stack, 
						   decay_done, &size, stacksize))) { break; }
	    my_global_weight = bulk[bu]->GetWeight();
	    if (*weight_version) {
		for (k=size-1; k>=0; k--) 
		    particle_stack[k]->SetW(my_global_weight);
	    }

	    for (int ii=old_size; ii<size; ii++) {
		//set index for "new" particles. 
		particle_stack[ii]->SetIndex(ii);
	    }
	    for (int ii=0; ii<size; ii++) {
		//check for decayed particles and set them inactive
		if (!allPARTICLES && decay_done[ii]) {		   
		    //cout << "remove particle " << ii << endl;
		    particle_stack[ii]->SetInActive();  // decayed particle
		}
	    }
	}
#if 0
 	cout << "after EPI " << size << endl;
 	for (k=0;k<size;++k) {
	    if (particle_stack[k]->IsActive()) 
		particle_stack[k]->Print();
	    else 
		cout << "particle " << k << " inactive" << endl;
	}
#endif

        // if Modify failed we will stop the eventloop
	if(statusOfModify == kFALSE) {
	    if (nevents > 0)
		Warning("Loop()",
			"Bulk return kFALSE. Not full number of events calculated! nEvents = %i !",i);
	    break;
	}
    
	Int_t cnt0 = 0;         // check for empty event
	for (k=0; k<size; ++k) {
//     	    cout << "act: " << particle_stack[k]->IsActive() << "done: " <<decay_done[k]<< 
//     		":" << particle_stack[k]->ID() << endl;
	    if (particle_stack[k]->IsActive()==kTRUE) cnt0++;
	}
	if (cnt0==0 && nchan != 0) {
	    empty_count++;
	    error_count++;
	    if (last_nonempty < i) {
		//firts time here....
		error_count_array[STATUS_EMPTY_EVENT]++;		
	    } else {
		//passed already
		error_count_array[STATUS_PSEUDO_EMPTY_EVENT]++;
	    }
	    goto repeat_empty; 
	} else {
	    last_nonempty = i;
	}



//-------------------------------------------------------------------------------------

// 	Double_t xSave = tree_particle[0]->Px(); // save momenta of 1st particle 
// 	Double_t ySave = tree_particle[0]->Py();
// 	Double_t zSave = tree_particle[0]->Pz();

// This should go into BeamSmearing: (BUGBUG)
// 	if (thetaBeam>0. || sigmaBeam>0.) {    // we have a skewed and/or smeared beam axis
// 	    Double_t thB=0.;
// 	    Double_t phB=0.;
// 	    if (sigmaBeam>0.) {   // gaussian smearing of beam axis
// 		//  thB = TMath::Abs(PUtils::sampleGaus(0.,sigmaBeam));
// 		//  phB = 6.283185308*PUtils::sampleFlat();
// 		Double_t thx = PUtils::sampleGaus(0.,sigmaBeam);   // this gives better results
// 		Double_t thy = PUtils::sampleGaus(0.,sigmaBeam);
// 		thB = sqrt(thx*thx+thy*thy);
// 		phB = TMath::ACos(thx/thB);
// 		if (thy<0.) phB = 6.283185308-phB;
// 	    }
// 	    TVector3 beamAxis(TMath::Sin(thB)*TMath::Cos(phB),
// 			      TMath::Sin(thB)*TMath::Sin(phB),
// 			      TMath::Cos(thB));
// 	    if (thetaBeam>0.) {   // skewing of beam axis (i.e. average beam is off z axis)
// 		TVector3 skew(TMath::Sin(thetaBeam)*TMath::Cos(phiBeam),
// 			      TMath::Sin(thetaBeam)*TMath::Sin(phiBeam),
// 			      TMath::Cos(thetaBeam));
// 		beamAxis.RotateUz(skew);
// 	    }

// 	    for (k=0;k<size;k++) {  // rotate now all active particles
// 		if (treepar[k]->IsActive()) treepar[k]->RotateUz(beamAxis);
// 	    }
// 	}

/////////////////////////    User selection    ////////////////////////////////
//
// A user selection is implemented via a C++ function
// Int_t userSelect(PParticle*) returning 0 on failure and >0 on success.
//
// From a macro, the user selection (and analysis) can be used in 2 ways:
//
// 1) CINT interpreted function
//
// .
// .
// .
// gROOT->ProcessLine(".L userSelect.C");
// r->SetUserSelection(userSelect);
// r->loop(1000);
//
//
// 2) or ACLIC compiled function
//
// .
// .
// .
// gROOT->ProcessLine(".L userSelect.C+");  // or .L userSelect.C++
// r->SetUserSelection(userSelect);
// r->loop(1000); 
//
//
// 3) true compiled function (i.e. embedded into Pluto code)
//
// .
// .
// .
// r->SetUserSelection(userSelect);
// r->loop(1000); 
// 
// Remark:
// A select function explicitely compiled into the code (e.g. in PReaction.cc)
// has to be Set directly with userSelection = select in SetUserSelection(f),
// and not with via TMethodCall. In addition, to be set from the interpreter, select
// has to made known to Cint via an entry in the LinkDef.h file.
// 
///////////////////////////////////////////////////////////////////////////////

	if (userSelection) {  // test user selection function
	    Int_t nTrig = 0;
	    Int_t ret = 0;
	    for (k=0;k<size;k++) {  // loop over all particles
		if (particle_stack[k]->IsActive()) {
		    if ( (ret=userSelection(particle_stack[k])) > 0) nTrig+=ret;
		    else particle_stack[k]->SetInActive();
		}
	    }
	    if (nTrig < nTrigCond) continue;   // skip event
	}

///////////////////////////    Analyze data    ////////////////////////////////
	Int_t retVal=1;
	if (userAnalysis) retVal = userAnalysis(particle_stack,size);  // call analysis
	if (!retVal) continue;

///////////////////////////    Analyze #filters ////////////////////////////////

	Int_t filters_sum = 0;
	for (k=0; k<num_filters; k++) {
	    //	    cout << makeDataBase()->GetName(filter_keys[k]) << ":" << 
	    //		*(filter_values[k]) << endl;
	    
	    if (*(filter_values[k]) < PUtils::sampleFlat()) {
		//Random variable failed
		filter_counter[k]++;
		filters_sum++;
	    }
	}

	if (filters_sum) continue;

	good_event++;
	PReaction::globalEventCounter++;  // count events across several PReaction::loop() calls



///////////////////////////    Output data    /////////////////////////////////

	size_tracked = 0;

	//Write size_tracked
	for (k=0; k<size; k++) {  // loop over all particles
	    if (!decay_done[k]) {
		stable_particle[size_tracked] = particle_stack[k];
		size_tracked++;
//		cout << "found stable: " << particle_stack[k]->ID() << endl;
	    }
	}

	// Output:
	Int_t cnt = 0;
	if (HGeant) {                           // pass event to HGeant and execute
	    int id_tmp[1000], src_tmp[1000], par_tmp[1000], ind_tmp[1000];
	    float px_tmp[1000], py_tmp[1000], pz_tmp[1000], w_tmp[1000];
	    float vx_tmp[1000], vy_tmp[1000], vz_tmp[1000], vt_tmp[1000];
	    cnt = 0;
	    for(k=0; k<size_tracked; ++k) {
		PParticle *pt = stable_particle[k];
		if (pt->IsActive()==kFALSE) continue; // skip inactive particles
		id_tmp[cnt] = pt->ID();
		px_tmp[cnt] = pt->Px();
		py_tmp[cnt] = pt->Py();
		pz_tmp[cnt] = pt->Pz();

		if (getVERTEX) {
		    vx_tmp[cnt] = pt->X();        // vertex in mm
		    vy_tmp[cnt] = pt->Y();
		    vz_tmp[cnt] = pt->Z();
		    vt_tmp[cnt] = pt->T()/300.;  // decay time in nanoseconds
		}
		else vx_tmp[cnt] = vy_tmp[cnt] = vz_tmp[cnt] = vt_tmp[cnt] = 0.;

		w_tmp[cnt]   = pt->W();
		src_tmp[cnt] = pt->GetSourceId();
		par_tmp[cnt] = pt->GetParentId();
		ind_tmp[cnt] = pt->GetParentIndex();
		cnt++;
		if(cnt == 1000) break;
	    }
	    float Ebeam = channel[0]->GetBT();
	    float bpar  = *event_impact_param;
	    float phiEv = 57.29578 * (*event_plane);   // go to degrees
	    passEvent(Ebeam, bpar, phiEv, cnt, id_tmp, src_tmp, par_tmp, ind_tmp,
		      px_tmp, py_tmp, pz_tmp, vx_tmp, vy_tmp, vz_tmp, vt_tmp, w_tmp);
	    gROOT->ProcessLine("doGeant(\"trigger 1\");"); 
	} 

	if (asciiOUTPUT) {                      // write event to ASCII file
      
	    if (!getVERTEX) {
		cnt = 0;
		for(k=0; k<size_tracked; ++k)  
		    if (stable_particle[k]->IsActive()==kTRUE) cnt++;
		if (writeINDEX == 0) {
		    fprintf(asciif," %i %i %f %f 2\n",
			    PReaction::globalEventCounter,cnt,
			    channel[0]->GetBT(),*event_impact_param);
		} else { 
		    if (channel) fprintf(asciif," %i %i %f %f -2\n",
					 PReaction::globalEventCounter, cnt,
					 channel[0]->GetBT(), *event_impact_param);
		    else fprintf(asciif," %i %i %f %f -2\n",
				 PReaction::globalEventCounter, cnt,
				 0., *event_impact_param);
		}
		for (k=0; k<size_tracked; ++k) {               // tracked particles only
		    PParticle *pt = stable_particle[k];
		    if (pt->IsActive() == kFALSE) continue; // skip inactive particles
		    if(writeINDEX == 0) {
			fprintf(asciif," %e %e %e %e %i %i %i %e\n",
				pt->E(), pt->Px(), pt->Py(), pt->Pz(),
				pt->ID(), pt->GetSourceId(), pt->GetParentId(), pt->W());
		    } else {
			fprintf(asciif," %e %e %e %e %i %i %i %i %e\n",
				pt->E(), pt->Px(), pt->Py(), pt->Pz(),
				pt->ID(), pt->GetSourceId(), pt->GetParentId(), pt->GetParentIndex(), pt->W());
		    }
		}
	    } else {
		cnt = 0;
		for(k=0; k<size_tracked; ++k)  
		    if (stable_particle[k]->IsActive()==kTRUE) cnt++;
		if (writeINDEX==0) {
		    fprintf(asciif, " %i %i %f %f 4\n",
			    PReaction::globalEventCounter, cnt,
			    channel[0]->GetBT(), *event_impact_param);
		} else {
		    if(channel) {
		    fprintf(asciif, " %i %i %f %f -4\n",
			    PReaction::globalEventCounter,cnt,
			    channel[0]->GetBT(), *event_impact_param);
		    } else {
			fprintf(asciif, " %i %i %f %f -4\n",
				PReaction::globalEventCounter, cnt, 0., *event_impact_param);
		    }
		}
		for (k=0; k<size_tracked; ++k) {               // tracked particles only
		    PParticle *pt = stable_particle[k];
		    if (pt->IsActive() == kFALSE) continue; // skip inactive particles
		    if (writeINDEX == 0) {
			fprintf(asciif, " %e %e %e %e %e %e %e %e %i %i %i %e\n",
				pt->E(), pt->Px(), pt->Py(), pt->Pz(),
				pt->T()/300., pt->X(), pt->Y(), pt->Z(),
				pt->ID(), pt->GetSourceId(), pt->GetParentId(), pt->W());
		    } else {
			fprintf(asciif, " %e %e %e %e %e %e %e %e %i %i %i %i %e\n",
				pt->E(), pt->Px(), pt->Py(), pt->Pz(),
				pt->T()/300., pt->X(), pt->Y(), pt->Z(),
				pt->ID(), pt->GetSourceId(), pt->GetParentId(),
				pt->GetParentIndex(), pt->W());
		    }
		}
	    }
	}


	if (!HGeant) {
	    cnt    = 0;
	    pclone = evt[0];
	    pclone->Delete();

	    //Write standard particles into tree
	    for (k=0; k<size; ++k) {  // update TClonesArrays

		if (particle_stack[k]->IsActive() == kFALSE) 
		    continue; //skip inactive prtcls.
		if (!allPARTICLES && decay_done[k]) 
		    continue; //skip decayed prtcls.

		particle_stack[k]->SetT(particle_stack[k]->T()/300.);// go from mm/c to ns
		int save_sclone = particle_stack[k]->GetScatterClone();
		particle_stack[k]->SetScatterClone(0);
		(*pclone)[cnt] = new((*pclone)[cnt]) PParticle(*particle_stack[k]);
		particle_stack[k]->SetScatterClone(save_sclone);

		cnt++;
	    }
	    activeCnt = cnt;

	    //Count the number of particles in additional branches
	    for (int i=0; i<size_branches; i++) {
		pclone = evt[i+1];
		pclone->Delete();
		for (k=0; k<(current_size_branches[i]); k++) { 
		    (*pclone)[k] = new((*pclone)[k]) PParticle(*(p_array_branches[i*stacksize + k]));
		    cnt++;
		}
	    }

	    for (int z=0; z<fileoutput_pos; z++) {
		files[z]->SetHeader(cnt, allPARTICLES, getVERTEX, asciiOUTPUT, writeINDEX , channel, nchan);
		files[z]->WriteEventHeader();
		files[z]->SetBranchHeader(activeCnt, 0, "Particles");
		files[z]->WriteBranchHeader();
		files[z]->Modify(particle_stack, 
				 decay_done, &size, 
				 stacksize);

		//First write the standard particles
		for (k=0; k<size; ++k) {
		    if (particle_stack[k]->IsActive() == kFALSE) 
			continue; //skip inactive prtcls.
		    if (!allPARTICLES && decay_done[k]) 
			continue; //skip decayed prtcls.
		    files[z]->WriteParticle(particle_stack[k]);
		}

		//Now write the additional particles
		for (int i=0; i<size_branches; i++) {
		    files[z]->SetBranchHeader(current_size_branches[i], i+1, makeDataBase()->GetName(key_branches[i]));
		    files[z]->WriteBranchHeader();
		    for (k=0; k<(current_size_branches[i]); k++) { 
			files[z]->WriteParticle(p_array_branches[i*stacksize + k]);
		    }
		}
		files[z]->WriteEvent();
	    }

	    if ((tree) && ((strlen(filename)>0) || extTREE)) //otherwise memory leak
		tree->Fill();
	}
    
// 	if (thetaBeam>0. || sigmaBeam>0.) {    // Set 1st particle back to be ready for next event.
// 	    // This is needed because it is not resampled by
// 	    // PChannel::decay() and would cumulate successive rotations.
// 	    treepar[0]->SetPx(xSave);
// 	    treepar[0]->SetPy(ySave);
// 	    treepar[0]->SetPz(zSave);
// 	}


    } // <====================== End of event loop

#if 0
    if (bulkdecay_pos) {
	for (k=0;k<stacksize;k++) delete p_array[k];
    }
#endif

    timer.Stop();
    if (verbose) printf(" Event loop finished after %f sec\n CPU time %f sec\n",
			timer.RealTime()-t0,timer.CpuTime());
    if (wf && verbose) printf("\n Total of %i events processed (incl. repeated empty evts.)\n\n", PReaction::globalEventCounter+empty_count);
    //____________________________________________________________________________

    if (error_count && verbose) {
	printf(" %i aborted events were repeated, error codes:\n ",error_count);
	for (int i=0; i<100; i++)
	    if (error_count_array[i])
		printf("%i=%i ",i,error_count_array[i]);
	printf("\n");
    }

    for (i=0; i<num_filters; i++) 
	if (filter_counter[i]) printf(" %i events failed filter %s\n",filter_counter[i],
				      makeDataBase()->GetName(filter_keys[i]));
	
    if (asciiOUTPUT==1) fclose(asciif);
    if (tree) {
	if (!extTREE && (strlen(filename) > 0)) {
	    rootfile = tree->GetCurrentFile();
	    rootfile->Write();
	    rootfile->Close();
	    rootfile=NULL; //otherwise destructor crashes
	    //  delete tree;
	    tree=NULL;
	}
    }


    if (sub_reaction) {
	//Delete evt, otherwise next loop cannot start
	if (evt[0]) evt[0]=NULL;
	good_event+=sub_reaction->Loop(nevents, wf,  verbose);
    }
    return good_event;
}

void PReaction::SetFilter(int, PFilter *) {
    //outdated
    Error("SetFilter", "The PFilter class has been removed. Use PProjector instead");
}

void PReaction::Close() {
    // close root output file

    if (!extTREE && (strlen(filename) > 0)) 
	rootfile->Close();
    else printf("%s\n", RMessage[0]);
}

void PReaction::PrintReport() const {
    printf("   Reaction Channels:\n");
    for (int j=0; j<nchan; ++j) {
	printf("     %i. ",j+1);
	channel[j]->PrintReport();
    }
}

void PReaction::Print(const Option_t *delme) const {

    int ii=0, esize=nclones-ndpar, j=esize, iid;
    printf("\n Reaction of %i Particles interacting via %i Channels\n",nclones,nchan);
    printf("   Reaction Particles:\n");
    if (esize == 2) {                                    // composite particle at entry channel
	printf("     0. %s (beam)\n",particle[0]->Name());    // beam
	printf("     1. %s (target)\n",particle[1]->Name());  // target
    } else if (esize == 1) {                             // decay of elementary particle at entry channel
	printf("     0.");
	iid=particle[0]->ID();
	if (iid < 1000) {
	    if (particle[0]->IsFireball() )
		printf(" Fireball (%s) \n",makeStaticData()->GetParticleName(particle[0]->ID()-500));
	    else if (particle[0]->IsFileInput() )
		printf(" File Input (%s) \n",particle[0]->Name());
	    else if (particle[0]->IsDilepton() )
		printf(" Source of %ss \n",makeStaticData()->GetParticleName(particle[0]->ID()-500));
	    else
		printf(" %s (decay)\n",particle[0]->Name());
	} else {
	    printf(" quasi-particle (%s beam and %s target)\n",
		   makeStaticData()->GetParticleName(iid%1000),makeStaticData()->GetParticleName(iid/1000));
	}
    }	   
    for (;j<nclones; ++j) {
	printf("     %i. %s",j,makeStaticData()->GetParticleName(particle[j]->ID()));
	if ((!allPARTICLES||asciiOUTPUT)*ftrack[j]) {
	    printf(" (tracked particle %i)\n",ii);
	    ++ii;
	} else { printf("\n"); }
    }
    printf("   Reaction Channels:\n");
    for (j=0; j<nchan; ++j) {
	printf("     %i. ",j+1);
	channel[j]->Print(delme);
    }
    if (bulkdecay_pos || pro_bulkdecay_pos) {
	printf("   Bulk Classes:\n");
	if (pro_bulkdecay_pos) {
	    printf("     Prologue: ");
	    for (j=0; j<pro_bulkdecay_pos; j++) 
		cout << "<" << pro_bulk[j]->ClassName() << "> ";
	    cout << endl;
	}
	if (bulkdecay_pos) {
	    printf("     Epilogue: ");
	    for (j=0; j<bulkdecay_pos; j++) 
		cout << "<" << bulk[j]->ClassName() << "> ";
	    cout << endl;
	}
    }
 
    if (fileoutput_pos || strlen(filename)>0) {
	printf("   Output File(s):\n");
	if (strlen(filename) > 0) {
	    printf("     Root : '%s', %s", (const char*)file2, OType[allPARTICLES]);
	    if (getVERTEX) 
		printf(" including vertices.\n");
	    else 
		printf(".\n");
	    if (asciiOUTPUT) 
		printf("     ASCII: '%s', %s\n", (const char*)file1, OType[0]);
	
	}
	for (int i=0; i<fileoutput_pos; i++) {	    
	    printf("     User-file: '%s', %s\n", files[i]->GetFilename(), OType[allPARTICLES]);
	}
	if (size_branches) {
	    printf("   Output Branches(s):\n");
	    printf("     'Particles'\n");
	    for (int i=0; i<size_branches; i++) {
		printf("     '%s'\n", makeDataBase()->GetName(key_branches[i]));
	    }
	}
    }
    else
	printf("   *NO* output File\n");

    if (sub_reaction) {
	printf("++++++++++++++++++++");
	sub_reaction->Print();

    }
}

void PReaction::SetUserSelection(void *) {  // set user selection function

    Error("SetUserSelection", "Does not work in ROOT6");
#if 0
    userSelection = NULL;
    if (!f) return ;
    Int_t type =  G__isinterpretedp2f(f);     // determine type of funntion
    if (type==0 || type==3) {  // this is a precompiled global function
	userSelection = (int (*)(PParticle*))f;
	printf("\n>>> User selection ");
    } else { // this is an interpreted function or a method call
	char *funcname = G__p2f2funcname(f);      // modeled on TMinuit constructor 
	TMethodCall *fMethodCall = NULL;
	if (funcname) {
	    fMethodCall = new TMethodCall();
	    fMethodCall->InitWithPrototype(funcname, "PParticle*");
	} else {
	    printf("Function: %s cannot be compiled\n", funcname);
	    return;
	}
	gMethodCall1  = fMethodCall;
	userSelection = CalledSelection;
	printf("\n>>> User selection %s() ",funcname);
    }
    (*userSelection)((PParticle*)-1);       // call once for eventual init work
#endif
}

Int_t CalledSelection(PParticle*) { // interface for interactive user
                                      // selection function
    Error("CalledSelection", "Does not work in ROOT6");
#if 0

    Long_t args[1];
    args[0] = (Long_t)p;
    gMethodCall1->SetParamPtrs(args);  // pass parameter...
    Long_t result;
    gMethodCall1->Execute(result);     // ... and execute
    return (Int_t)result;
#endif
    return -1;
} 

void PReaction::SetUserAnalysis(void *) { // set user analysis function

    Error("SetUserAnalysis", "Does not work in ROOT6");
#if 0
    userAnalysis = NULL;
    if (!f) return ;
    Int_t type =  G__isinterpretedp2f(f);     // determine type of function
    if (type==0 || type==3) {  // this is a precompiled global function
	userAnalysis = (int (*)(PParticle**,int))f;
	printf("\n>>> User analysis ");
    } else { // this is an interpreted function or a method call
	char *funcname = G__p2f2funcname(f);      // modeled on TMinuit constructor 
	TMethodCall *fMethodCall=NULL;
	if (funcname) {
	    fMethodCall = new TMethodCall();
	    fMethodCall->InitWithPrototype(funcname, "PParticle**,Int_t");
	} else {
	    printf("Function: %s cannot be compiled\n", funcname);
	    return;
	}
	gMethodCall2 = fMethodCall;
	userAnalysis = CalledAnalysis;
	printf("\n>>> User analysis %s() ",funcname);
    }
    (*userAnalysis)((PParticle**)-1,0);      // call once for eventual init work
#endif
}

Int_t CalledAnalysis(PParticle **, Int_t) { // interface for user
                                               // analysis function
    Error("CalledAnalysis", "Does not work in ROOT6");
#if 0

    Long_t args[2];
    args[0] = (Long_t)p;
    args[1] = (Long_t)n;
    gMethodCall2->SetParamPtrs(args);  // pass parameter...
    Long_t result;
    gMethodCall2->Execute(result);     // ... and execute
    return (Int_t)result;
#endif
    return -1;
} 


//Int_t select(PParticle* p) {  // example of a user selection function
//
//  printf("Entering select %x\n",(UInt_t)p);
//  if ((int)p==-1) {
//    printf("= ok <<<\n");
//    return -1;
//  }
//
//  if (p->Charge() != 0.) {  // charged
//    printf("testing %i has %f %f %f\n",p->ID(),p->Px(),p->Py(),p->Pz());
//    return 1;
//  }
//  else return 0;
//
//}







 PReaction.cc:1
 PReaction.cc:2
 PReaction.cc:3
 PReaction.cc:4
 PReaction.cc:5
 PReaction.cc:6
 PReaction.cc:7
 PReaction.cc:8
 PReaction.cc:9
 PReaction.cc:10
 PReaction.cc:11
 PReaction.cc:12
 PReaction.cc:13
 PReaction.cc:14
 PReaction.cc:15
 PReaction.cc:16
 PReaction.cc:17
 PReaction.cc:18
 PReaction.cc:19
 PReaction.cc:20
 PReaction.cc:21
 PReaction.cc:22
 PReaction.cc:23
 PReaction.cc:24
 PReaction.cc:25
 PReaction.cc:26
 PReaction.cc:27
 PReaction.cc:28
 PReaction.cc:29
 PReaction.cc:30
 PReaction.cc:31
 PReaction.cc:32
 PReaction.cc:33
 PReaction.cc:34
 PReaction.cc:35
 PReaction.cc:36
 PReaction.cc:37
 PReaction.cc:38
 PReaction.cc:39
 PReaction.cc:40
 PReaction.cc:41
 PReaction.cc:42
 PReaction.cc:43
 PReaction.cc:44
 PReaction.cc:45
 PReaction.cc:46
 PReaction.cc:47
 PReaction.cc:48
 PReaction.cc:49
 PReaction.cc:50
 PReaction.cc:51
 PReaction.cc:52
 PReaction.cc:53
 PReaction.cc:54
 PReaction.cc:55
 PReaction.cc:56
 PReaction.cc:57
 PReaction.cc:58
 PReaction.cc:59
 PReaction.cc:60
 PReaction.cc:61
 PReaction.cc:62
 PReaction.cc:63
 PReaction.cc:64
 PReaction.cc:65
 PReaction.cc:66
 PReaction.cc:67
 PReaction.cc:68
 PReaction.cc:69
 PReaction.cc:70
 PReaction.cc:71
 PReaction.cc:72
 PReaction.cc:73
 PReaction.cc:74
 PReaction.cc:75
 PReaction.cc:76
 PReaction.cc:77
 PReaction.cc:78
 PReaction.cc:79
 PReaction.cc:80
 PReaction.cc:81
 PReaction.cc:82
 PReaction.cc:83
 PReaction.cc:84
 PReaction.cc:85
 PReaction.cc:86
 PReaction.cc:87
 PReaction.cc:88
 PReaction.cc:89
 PReaction.cc:90
 PReaction.cc:91
 PReaction.cc:92
 PReaction.cc:93
 PReaction.cc:94
 PReaction.cc:95
 PReaction.cc:96
 PReaction.cc:97
 PReaction.cc:98
 PReaction.cc:99
 PReaction.cc:100
 PReaction.cc:101
 PReaction.cc:102
 PReaction.cc:103
 PReaction.cc:104
 PReaction.cc:105
 PReaction.cc:106
 PReaction.cc:107
 PReaction.cc:108
 PReaction.cc:109
 PReaction.cc:110
 PReaction.cc:111
 PReaction.cc:112
 PReaction.cc:113
 PReaction.cc:114
 PReaction.cc:115
 PReaction.cc:116
 PReaction.cc:117
 PReaction.cc:118
 PReaction.cc:119
 PReaction.cc:120
 PReaction.cc:121
 PReaction.cc:122
 PReaction.cc:123
 PReaction.cc:124
 PReaction.cc:125
 PReaction.cc:126
 PReaction.cc:127
 PReaction.cc:128
 PReaction.cc:129
 PReaction.cc:130
 PReaction.cc:131
 PReaction.cc:132
 PReaction.cc:133
 PReaction.cc:134
 PReaction.cc:135
 PReaction.cc:136
 PReaction.cc:137
 PReaction.cc:138
 PReaction.cc:139
 PReaction.cc:140
 PReaction.cc:141
 PReaction.cc:142
 PReaction.cc:143
 PReaction.cc:144
 PReaction.cc:145
 PReaction.cc:146
 PReaction.cc:147
 PReaction.cc:148
 PReaction.cc:149
 PReaction.cc:150
 PReaction.cc:151
 PReaction.cc:152
 PReaction.cc:153
 PReaction.cc:154
 PReaction.cc:155
 PReaction.cc:156
 PReaction.cc:157
 PReaction.cc:158
 PReaction.cc:159
 PReaction.cc:160
 PReaction.cc:161
 PReaction.cc:162
 PReaction.cc:163
 PReaction.cc:164
 PReaction.cc:165
 PReaction.cc:166
 PReaction.cc:167
 PReaction.cc:168
 PReaction.cc:169
 PReaction.cc:170
 PReaction.cc:171
 PReaction.cc:172
 PReaction.cc:173
 PReaction.cc:174
 PReaction.cc:175
 PReaction.cc:176
 PReaction.cc:177
 PReaction.cc:178
 PReaction.cc:179
 PReaction.cc:180
 PReaction.cc:181
 PReaction.cc:182
 PReaction.cc:183
 PReaction.cc:184
 PReaction.cc:185
 PReaction.cc:186
 PReaction.cc:187
 PReaction.cc:188
 PReaction.cc:189
 PReaction.cc:190
 PReaction.cc:191
 PReaction.cc:192
 PReaction.cc:193
 PReaction.cc:194
 PReaction.cc:195
 PReaction.cc:196
 PReaction.cc:197
 PReaction.cc:198
 PReaction.cc:199
 PReaction.cc:200
 PReaction.cc:201
 PReaction.cc:202
 PReaction.cc:203
 PReaction.cc:204
 PReaction.cc:205
 PReaction.cc:206
 PReaction.cc:207
 PReaction.cc:208
 PReaction.cc:209
 PReaction.cc:210
 PReaction.cc:211
 PReaction.cc:212
 PReaction.cc:213
 PReaction.cc:214
 PReaction.cc:215
 PReaction.cc:216
 PReaction.cc:217
 PReaction.cc:218
 PReaction.cc:219
 PReaction.cc:220
 PReaction.cc:221
 PReaction.cc:222
 PReaction.cc:223
 PReaction.cc:224
 PReaction.cc:225
 PReaction.cc:226
 PReaction.cc:227
 PReaction.cc:228
 PReaction.cc:229
 PReaction.cc:230
 PReaction.cc:231
 PReaction.cc:232
 PReaction.cc:233
 PReaction.cc:234
 PReaction.cc:235
 PReaction.cc:236
 PReaction.cc:237
 PReaction.cc:238
 PReaction.cc:239
 PReaction.cc:240
 PReaction.cc:241
 PReaction.cc:242
 PReaction.cc:243
 PReaction.cc:244
 PReaction.cc:245
 PReaction.cc:246
 PReaction.cc:247
 PReaction.cc:248
 PReaction.cc:249
 PReaction.cc:250
 PReaction.cc:251
 PReaction.cc:252
 PReaction.cc:253
 PReaction.cc:254
 PReaction.cc:255
 PReaction.cc:256
 PReaction.cc:257
 PReaction.cc:258
 PReaction.cc:259
 PReaction.cc:260
 PReaction.cc:261
 PReaction.cc:262
 PReaction.cc:263
 PReaction.cc:264
 PReaction.cc:265
 PReaction.cc:266
 PReaction.cc:267
 PReaction.cc:268
 PReaction.cc:269
 PReaction.cc:270
 PReaction.cc:271
 PReaction.cc:272
 PReaction.cc:273
 PReaction.cc:274
 PReaction.cc:275
 PReaction.cc:276
 PReaction.cc:277
 PReaction.cc:278
 PReaction.cc:279
 PReaction.cc:280
 PReaction.cc:281
 PReaction.cc:282
 PReaction.cc:283
 PReaction.cc:284
 PReaction.cc:285
 PReaction.cc:286
 PReaction.cc:287
 PReaction.cc:288
 PReaction.cc:289
 PReaction.cc:290
 PReaction.cc:291
 PReaction.cc:292
 PReaction.cc:293
 PReaction.cc:294
 PReaction.cc:295
 PReaction.cc:296
 PReaction.cc:297
 PReaction.cc:298
 PReaction.cc:299
 PReaction.cc:300
 PReaction.cc:301
 PReaction.cc:302
 PReaction.cc:303
 PReaction.cc:304
 PReaction.cc:305
 PReaction.cc:306
 PReaction.cc:307
 PReaction.cc:308
 PReaction.cc:309
 PReaction.cc:310
 PReaction.cc:311
 PReaction.cc:312
 PReaction.cc:313
 PReaction.cc:314
 PReaction.cc:315
 PReaction.cc:316
 PReaction.cc:317
 PReaction.cc:318
 PReaction.cc:319
 PReaction.cc:320
 PReaction.cc:321
 PReaction.cc:322
 PReaction.cc:323
 PReaction.cc:324
 PReaction.cc:325
 PReaction.cc:326
 PReaction.cc:327
 PReaction.cc:328
 PReaction.cc:329
 PReaction.cc:330
 PReaction.cc:331
 PReaction.cc:332
 PReaction.cc:333
 PReaction.cc:334
 PReaction.cc:335
 PReaction.cc:336
 PReaction.cc:337
 PReaction.cc:338
 PReaction.cc:339
 PReaction.cc:340
 PReaction.cc:341
 PReaction.cc:342
 PReaction.cc:343
 PReaction.cc:344
 PReaction.cc:345
 PReaction.cc:346
 PReaction.cc:347
 PReaction.cc:348
 PReaction.cc:349
 PReaction.cc:350
 PReaction.cc:351
 PReaction.cc:352
 PReaction.cc:353
 PReaction.cc:354
 PReaction.cc:355
 PReaction.cc:356
 PReaction.cc:357
 PReaction.cc:358
 PReaction.cc:359
 PReaction.cc:360
 PReaction.cc:361
 PReaction.cc:362
 PReaction.cc:363
 PReaction.cc:364
 PReaction.cc:365
 PReaction.cc:366
 PReaction.cc:367
 PReaction.cc:368
 PReaction.cc:369
 PReaction.cc:370
 PReaction.cc:371
 PReaction.cc:372
 PReaction.cc:373
 PReaction.cc:374
 PReaction.cc:375
 PReaction.cc:376
 PReaction.cc:377
 PReaction.cc:378
 PReaction.cc:379
 PReaction.cc:380
 PReaction.cc:381
 PReaction.cc:382
 PReaction.cc:383
 PReaction.cc:384
 PReaction.cc:385
 PReaction.cc:386
 PReaction.cc:387
 PReaction.cc:388
 PReaction.cc:389
 PReaction.cc:390
 PReaction.cc:391
 PReaction.cc:392
 PReaction.cc:393
 PReaction.cc:394
 PReaction.cc:395
 PReaction.cc:396
 PReaction.cc:397
 PReaction.cc:398
 PReaction.cc:399
 PReaction.cc:400
 PReaction.cc:401
 PReaction.cc:402
 PReaction.cc:403
 PReaction.cc:404
 PReaction.cc:405
 PReaction.cc:406
 PReaction.cc:407
 PReaction.cc:408
 PReaction.cc:409
 PReaction.cc:410
 PReaction.cc:411
 PReaction.cc:412
 PReaction.cc:413
 PReaction.cc:414
 PReaction.cc:415
 PReaction.cc:416
 PReaction.cc:417
 PReaction.cc:418
 PReaction.cc:419
 PReaction.cc:420
 PReaction.cc:421
 PReaction.cc:422
 PReaction.cc:423
 PReaction.cc:424
 PReaction.cc:425
 PReaction.cc:426
 PReaction.cc:427
 PReaction.cc:428
 PReaction.cc:429
 PReaction.cc:430
 PReaction.cc:431
 PReaction.cc:432
 PReaction.cc:433
 PReaction.cc:434
 PReaction.cc:435
 PReaction.cc:436
 PReaction.cc:437
 PReaction.cc:438
 PReaction.cc:439
 PReaction.cc:440
 PReaction.cc:441
 PReaction.cc:442
 PReaction.cc:443
 PReaction.cc:444
 PReaction.cc:445
 PReaction.cc:446
 PReaction.cc:447
 PReaction.cc:448
 PReaction.cc:449
 PReaction.cc:450
 PReaction.cc:451
 PReaction.cc:452
 PReaction.cc:453
 PReaction.cc:454
 PReaction.cc:455
 PReaction.cc:456
 PReaction.cc:457
 PReaction.cc:458
 PReaction.cc:459
 PReaction.cc:460
 PReaction.cc:461
 PReaction.cc:462
 PReaction.cc:463
 PReaction.cc:464
 PReaction.cc:465
 PReaction.cc:466
 PReaction.cc:467
 PReaction.cc:468
 PReaction.cc:469
 PReaction.cc:470
 PReaction.cc:471
 PReaction.cc:472
 PReaction.cc:473
 PReaction.cc:474
 PReaction.cc:475
 PReaction.cc:476
 PReaction.cc:477
 PReaction.cc:478
 PReaction.cc:479
 PReaction.cc:480
 PReaction.cc:481
 PReaction.cc:482
 PReaction.cc:483
 PReaction.cc:484
 PReaction.cc:485
 PReaction.cc:486
 PReaction.cc:487
 PReaction.cc:488
 PReaction.cc:489
 PReaction.cc:490
 PReaction.cc:491
 PReaction.cc:492
 PReaction.cc:493
 PReaction.cc:494
 PReaction.cc:495
 PReaction.cc:496
 PReaction.cc:497
 PReaction.cc:498
 PReaction.cc:499
 PReaction.cc:500
 PReaction.cc:501
 PReaction.cc:502
 PReaction.cc:503
 PReaction.cc:504
 PReaction.cc:505
 PReaction.cc:506
 PReaction.cc:507
 PReaction.cc:508
 PReaction.cc:509
 PReaction.cc:510
 PReaction.cc:511
 PReaction.cc:512
 PReaction.cc:513
 PReaction.cc:514
 PReaction.cc:515
 PReaction.cc:516
 PReaction.cc:517
 PReaction.cc:518
 PReaction.cc:519
 PReaction.cc:520
 PReaction.cc:521
 PReaction.cc:522
 PReaction.cc:523
 PReaction.cc:524
 PReaction.cc:525
 PReaction.cc:526
 PReaction.cc:527
 PReaction.cc:528
 PReaction.cc:529
 PReaction.cc:530
 PReaction.cc:531
 PReaction.cc:532
 PReaction.cc:533
 PReaction.cc:534
 PReaction.cc:535
 PReaction.cc:536
 PReaction.cc:537
 PReaction.cc:538
 PReaction.cc:539
 PReaction.cc:540
 PReaction.cc:541
 PReaction.cc:542
 PReaction.cc:543
 PReaction.cc:544
 PReaction.cc:545
 PReaction.cc:546
 PReaction.cc:547
 PReaction.cc:548
 PReaction.cc:549
 PReaction.cc:550
 PReaction.cc:551
 PReaction.cc:552
 PReaction.cc:553
 PReaction.cc:554
 PReaction.cc:555
 PReaction.cc:556
 PReaction.cc:557
 PReaction.cc:558
 PReaction.cc:559
 PReaction.cc:560
 PReaction.cc:561
 PReaction.cc:562
 PReaction.cc:563
 PReaction.cc:564
 PReaction.cc:565
 PReaction.cc:566
 PReaction.cc:567
 PReaction.cc:568
 PReaction.cc:569
 PReaction.cc:570
 PReaction.cc:571
 PReaction.cc:572
 PReaction.cc:573
 PReaction.cc:574
 PReaction.cc:575
 PReaction.cc:576
 PReaction.cc:577
 PReaction.cc:578
 PReaction.cc:579
 PReaction.cc:580
 PReaction.cc:581
 PReaction.cc:582
 PReaction.cc:583
 PReaction.cc:584
 PReaction.cc:585
 PReaction.cc:586
 PReaction.cc:587
 PReaction.cc:588
 PReaction.cc:589
 PReaction.cc:590
 PReaction.cc:591
 PReaction.cc:592
 PReaction.cc:593
 PReaction.cc:594
 PReaction.cc:595
 PReaction.cc:596
 PReaction.cc:597
 PReaction.cc:598
 PReaction.cc:599
 PReaction.cc:600
 PReaction.cc:601
 PReaction.cc:602
 PReaction.cc:603
 PReaction.cc:604
 PReaction.cc:605
 PReaction.cc:606
 PReaction.cc:607
 PReaction.cc:608
 PReaction.cc:609
 PReaction.cc:610
 PReaction.cc:611
 PReaction.cc:612
 PReaction.cc:613
 PReaction.cc:614
 PReaction.cc:615
 PReaction.cc:616
 PReaction.cc:617
 PReaction.cc:618
 PReaction.cc:619
 PReaction.cc:620
 PReaction.cc:621
 PReaction.cc:622
 PReaction.cc:623
 PReaction.cc:624
 PReaction.cc:625
 PReaction.cc:626
 PReaction.cc:627
 PReaction.cc:628
 PReaction.cc:629
 PReaction.cc:630
 PReaction.cc:631
 PReaction.cc:632
 PReaction.cc:633
 PReaction.cc:634
 PReaction.cc:635
 PReaction.cc:636
 PReaction.cc:637
 PReaction.cc:638
 PReaction.cc:639
 PReaction.cc:640
 PReaction.cc:641
 PReaction.cc:642
 PReaction.cc:643
 PReaction.cc:644
 PReaction.cc:645
 PReaction.cc:646
 PReaction.cc:647
 PReaction.cc:648
 PReaction.cc:649
 PReaction.cc:650
 PReaction.cc:651
 PReaction.cc:652
 PReaction.cc:653
 PReaction.cc:654
 PReaction.cc:655
 PReaction.cc:656
 PReaction.cc:657
 PReaction.cc:658
 PReaction.cc:659
 PReaction.cc:660
 PReaction.cc:661
 PReaction.cc:662
 PReaction.cc:663
 PReaction.cc:664
 PReaction.cc:665
 PReaction.cc:666
 PReaction.cc:667
 PReaction.cc:668
 PReaction.cc:669
 PReaction.cc:670
 PReaction.cc:671
 PReaction.cc:672
 PReaction.cc:673
 PReaction.cc:674
 PReaction.cc:675
 PReaction.cc:676
 PReaction.cc:677
 PReaction.cc:678
 PReaction.cc:679
 PReaction.cc:680
 PReaction.cc:681
 PReaction.cc:682
 PReaction.cc:683
 PReaction.cc:684
 PReaction.cc:685
 PReaction.cc:686
 PReaction.cc:687
 PReaction.cc:688
 PReaction.cc:689
 PReaction.cc:690
 PReaction.cc:691
 PReaction.cc:692
 PReaction.cc:693
 PReaction.cc:694
 PReaction.cc:695
 PReaction.cc:696
 PReaction.cc:697
 PReaction.cc:698
 PReaction.cc:699
 PReaction.cc:700
 PReaction.cc:701
 PReaction.cc:702
 PReaction.cc:703
 PReaction.cc:704
 PReaction.cc:705
 PReaction.cc:706
 PReaction.cc:707
 PReaction.cc:708
 PReaction.cc:709
 PReaction.cc:710
 PReaction.cc:711
 PReaction.cc:712
 PReaction.cc:713
 PReaction.cc:714
 PReaction.cc:715
 PReaction.cc:716
 PReaction.cc:717
 PReaction.cc:718
 PReaction.cc:719
 PReaction.cc:720
 PReaction.cc:721
 PReaction.cc:722
 PReaction.cc:723
 PReaction.cc:724
 PReaction.cc:725
 PReaction.cc:726
 PReaction.cc:727
 PReaction.cc:728
 PReaction.cc:729
 PReaction.cc:730
 PReaction.cc:731
 PReaction.cc:732
 PReaction.cc:733
 PReaction.cc:734
 PReaction.cc:735
 PReaction.cc:736
 PReaction.cc:737
 PReaction.cc:738
 PReaction.cc:739
 PReaction.cc:740
 PReaction.cc:741
 PReaction.cc:742
 PReaction.cc:743
 PReaction.cc:744
 PReaction.cc:745
 PReaction.cc:746
 PReaction.cc:747
 PReaction.cc:748
 PReaction.cc:749
 PReaction.cc:750
 PReaction.cc:751
 PReaction.cc:752
 PReaction.cc:753
 PReaction.cc:754
 PReaction.cc:755
 PReaction.cc:756
 PReaction.cc:757
 PReaction.cc:758
 PReaction.cc:759
 PReaction.cc:760
 PReaction.cc:761
 PReaction.cc:762
 PReaction.cc:763
 PReaction.cc:764
 PReaction.cc:765
 PReaction.cc:766
 PReaction.cc:767
 PReaction.cc:768
 PReaction.cc:769
 PReaction.cc:770
 PReaction.cc:771
 PReaction.cc:772
 PReaction.cc:773
 PReaction.cc:774
 PReaction.cc:775
 PReaction.cc:776
 PReaction.cc:777
 PReaction.cc:778
 PReaction.cc:779
 PReaction.cc:780
 PReaction.cc:781
 PReaction.cc:782
 PReaction.cc:783
 PReaction.cc:784
 PReaction.cc:785
 PReaction.cc:786
 PReaction.cc:787
 PReaction.cc:788
 PReaction.cc:789
 PReaction.cc:790
 PReaction.cc:791
 PReaction.cc:792
 PReaction.cc:793
 PReaction.cc:794
 PReaction.cc:795
 PReaction.cc:796
 PReaction.cc:797
 PReaction.cc:798
 PReaction.cc:799
 PReaction.cc:800
 PReaction.cc:801
 PReaction.cc:802
 PReaction.cc:803
 PReaction.cc:804
 PReaction.cc:805
 PReaction.cc:806
 PReaction.cc:807
 PReaction.cc:808
 PReaction.cc:809
 PReaction.cc:810
 PReaction.cc:811
 PReaction.cc:812
 PReaction.cc:813
 PReaction.cc:814
 PReaction.cc:815
 PReaction.cc:816
 PReaction.cc:817
 PReaction.cc:818
 PReaction.cc:819
 PReaction.cc:820
 PReaction.cc:821
 PReaction.cc:822
 PReaction.cc:823
 PReaction.cc:824
 PReaction.cc:825
 PReaction.cc:826
 PReaction.cc:827
 PReaction.cc:828
 PReaction.cc:829
 PReaction.cc:830
 PReaction.cc:831
 PReaction.cc:832
 PReaction.cc:833
 PReaction.cc:834
 PReaction.cc:835
 PReaction.cc:836
 PReaction.cc:837
 PReaction.cc:838
 PReaction.cc:839
 PReaction.cc:840
 PReaction.cc:841
 PReaction.cc:842
 PReaction.cc:843
 PReaction.cc:844
 PReaction.cc:845
 PReaction.cc:846
 PReaction.cc:847
 PReaction.cc:848
 PReaction.cc:849
 PReaction.cc:850
 PReaction.cc:851
 PReaction.cc:852
 PReaction.cc:853
 PReaction.cc:854
 PReaction.cc:855
 PReaction.cc:856
 PReaction.cc:857
 PReaction.cc:858
 PReaction.cc:859
 PReaction.cc:860
 PReaction.cc:861
 PReaction.cc:862
 PReaction.cc:863
 PReaction.cc:864
 PReaction.cc:865
 PReaction.cc:866
 PReaction.cc:867
 PReaction.cc:868
 PReaction.cc:869
 PReaction.cc:870
 PReaction.cc:871
 PReaction.cc:872
 PReaction.cc:873
 PReaction.cc:874
 PReaction.cc:875
 PReaction.cc:876
 PReaction.cc:877
 PReaction.cc:878
 PReaction.cc:879
 PReaction.cc:880
 PReaction.cc:881
 PReaction.cc:882
 PReaction.cc:883
 PReaction.cc:884
 PReaction.cc:885
 PReaction.cc:886
 PReaction.cc:887
 PReaction.cc:888
 PReaction.cc:889
 PReaction.cc:890
 PReaction.cc:891
 PReaction.cc:892
 PReaction.cc:893
 PReaction.cc:894
 PReaction.cc:895
 PReaction.cc:896
 PReaction.cc:897
 PReaction.cc:898
 PReaction.cc:899
 PReaction.cc:900
 PReaction.cc:901
 PReaction.cc:902
 PReaction.cc:903
 PReaction.cc:904
 PReaction.cc:905
 PReaction.cc:906
 PReaction.cc:907
 PReaction.cc:908
 PReaction.cc:909
 PReaction.cc:910
 PReaction.cc:911
 PReaction.cc:912
 PReaction.cc:913
 PReaction.cc:914
 PReaction.cc:915
 PReaction.cc:916
 PReaction.cc:917
 PReaction.cc:918
 PReaction.cc:919
 PReaction.cc:920
 PReaction.cc:921
 PReaction.cc:922
 PReaction.cc:923
 PReaction.cc:924
 PReaction.cc:925
 PReaction.cc:926
 PReaction.cc:927
 PReaction.cc:928
 PReaction.cc:929
 PReaction.cc:930
 PReaction.cc:931
 PReaction.cc:932
 PReaction.cc:933
 PReaction.cc:934
 PReaction.cc:935
 PReaction.cc:936
 PReaction.cc:937
 PReaction.cc:938
 PReaction.cc:939
 PReaction.cc:940
 PReaction.cc:941
 PReaction.cc:942
 PReaction.cc:943
 PReaction.cc:944
 PReaction.cc:945
 PReaction.cc:946
 PReaction.cc:947
 PReaction.cc:948
 PReaction.cc:949
 PReaction.cc:950
 PReaction.cc:951
 PReaction.cc:952
 PReaction.cc:953
 PReaction.cc:954
 PReaction.cc:955
 PReaction.cc:956
 PReaction.cc:957
 PReaction.cc:958
 PReaction.cc:959
 PReaction.cc:960
 PReaction.cc:961
 PReaction.cc:962
 PReaction.cc:963
 PReaction.cc:964
 PReaction.cc:965
 PReaction.cc:966
 PReaction.cc:967
 PReaction.cc:968
 PReaction.cc:969
 PReaction.cc:970
 PReaction.cc:971
 PReaction.cc:972
 PReaction.cc:973
 PReaction.cc:974
 PReaction.cc:975
 PReaction.cc:976
 PReaction.cc:977
 PReaction.cc:978
 PReaction.cc:979
 PReaction.cc:980
 PReaction.cc:981
 PReaction.cc:982
 PReaction.cc:983
 PReaction.cc:984
 PReaction.cc:985
 PReaction.cc:986
 PReaction.cc:987
 PReaction.cc:988
 PReaction.cc:989
 PReaction.cc:990
 PReaction.cc:991
 PReaction.cc:992
 PReaction.cc:993
 PReaction.cc:994
 PReaction.cc:995
 PReaction.cc:996
 PReaction.cc:997
 PReaction.cc:998
 PReaction.cc:999
 PReaction.cc:1000
 PReaction.cc:1001
 PReaction.cc:1002
 PReaction.cc:1003
 PReaction.cc:1004
 PReaction.cc:1005
 PReaction.cc:1006
 PReaction.cc:1007
 PReaction.cc:1008
 PReaction.cc:1009
 PReaction.cc:1010
 PReaction.cc:1011
 PReaction.cc:1012
 PReaction.cc:1013
 PReaction.cc:1014
 PReaction.cc:1015
 PReaction.cc:1016
 PReaction.cc:1017
 PReaction.cc:1018
 PReaction.cc:1019
 PReaction.cc:1020
 PReaction.cc:1021
 PReaction.cc:1022
 PReaction.cc:1023
 PReaction.cc:1024
 PReaction.cc:1025
 PReaction.cc:1026
 PReaction.cc:1027
 PReaction.cc:1028
 PReaction.cc:1029
 PReaction.cc:1030
 PReaction.cc:1031
 PReaction.cc:1032
 PReaction.cc:1033
 PReaction.cc:1034
 PReaction.cc:1035
 PReaction.cc:1036
 PReaction.cc:1037
 PReaction.cc:1038
 PReaction.cc:1039
 PReaction.cc:1040
 PReaction.cc:1041
 PReaction.cc:1042
 PReaction.cc:1043
 PReaction.cc:1044
 PReaction.cc:1045
 PReaction.cc:1046
 PReaction.cc:1047
 PReaction.cc:1048
 PReaction.cc:1049
 PReaction.cc:1050
 PReaction.cc:1051
 PReaction.cc:1052
 PReaction.cc:1053
 PReaction.cc:1054
 PReaction.cc:1055
 PReaction.cc:1056
 PReaction.cc:1057
 PReaction.cc:1058
 PReaction.cc:1059
 PReaction.cc:1060
 PReaction.cc:1061
 PReaction.cc:1062
 PReaction.cc:1063
 PReaction.cc:1064
 PReaction.cc:1065
 PReaction.cc:1066
 PReaction.cc:1067
 PReaction.cc:1068
 PReaction.cc:1069
 PReaction.cc:1070
 PReaction.cc:1071
 PReaction.cc:1072
 PReaction.cc:1073
 PReaction.cc:1074
 PReaction.cc:1075
 PReaction.cc:1076
 PReaction.cc:1077
 PReaction.cc:1078
 PReaction.cc:1079
 PReaction.cc:1080
 PReaction.cc:1081
 PReaction.cc:1082
 PReaction.cc:1083
 PReaction.cc:1084
 PReaction.cc:1085
 PReaction.cc:1086
 PReaction.cc:1087
 PReaction.cc:1088
 PReaction.cc:1089
 PReaction.cc:1090
 PReaction.cc:1091
 PReaction.cc:1092
 PReaction.cc:1093
 PReaction.cc:1094
 PReaction.cc:1095
 PReaction.cc:1096
 PReaction.cc:1097
 PReaction.cc:1098
 PReaction.cc:1099
 PReaction.cc:1100
 PReaction.cc:1101
 PReaction.cc:1102
 PReaction.cc:1103
 PReaction.cc:1104
 PReaction.cc:1105
 PReaction.cc:1106
 PReaction.cc:1107
 PReaction.cc:1108
 PReaction.cc:1109
 PReaction.cc:1110
 PReaction.cc:1111
 PReaction.cc:1112
 PReaction.cc:1113
 PReaction.cc:1114
 PReaction.cc:1115
 PReaction.cc:1116
 PReaction.cc:1117
 PReaction.cc:1118
 PReaction.cc:1119
 PReaction.cc:1120
 PReaction.cc:1121
 PReaction.cc:1122
 PReaction.cc:1123
 PReaction.cc:1124
 PReaction.cc:1125
 PReaction.cc:1126
 PReaction.cc:1127
 PReaction.cc:1128
 PReaction.cc:1129
 PReaction.cc:1130
 PReaction.cc:1131
 PReaction.cc:1132
 PReaction.cc:1133
 PReaction.cc:1134
 PReaction.cc:1135
 PReaction.cc:1136
 PReaction.cc:1137
 PReaction.cc:1138
 PReaction.cc:1139
 PReaction.cc:1140
 PReaction.cc:1141
 PReaction.cc:1142
 PReaction.cc:1143
 PReaction.cc:1144
 PReaction.cc:1145
 PReaction.cc:1146
 PReaction.cc:1147
 PReaction.cc:1148
 PReaction.cc:1149
 PReaction.cc:1150
 PReaction.cc:1151
 PReaction.cc:1152
 PReaction.cc:1153
 PReaction.cc:1154
 PReaction.cc:1155
 PReaction.cc:1156
 PReaction.cc:1157
 PReaction.cc:1158
 PReaction.cc:1159
 PReaction.cc:1160
 PReaction.cc:1161
 PReaction.cc:1162
 PReaction.cc:1163
 PReaction.cc:1164
 PReaction.cc:1165
 PReaction.cc:1166
 PReaction.cc:1167
 PReaction.cc:1168
 PReaction.cc:1169
 PReaction.cc:1170
 PReaction.cc:1171
 PReaction.cc:1172
 PReaction.cc:1173
 PReaction.cc:1174
 PReaction.cc:1175
 PReaction.cc:1176
 PReaction.cc:1177
 PReaction.cc:1178
 PReaction.cc:1179
 PReaction.cc:1180
 PReaction.cc:1181
 PReaction.cc:1182
 PReaction.cc:1183
 PReaction.cc:1184
 PReaction.cc:1185
 PReaction.cc:1186
 PReaction.cc:1187
 PReaction.cc:1188
 PReaction.cc:1189
 PReaction.cc:1190
 PReaction.cc:1191
 PReaction.cc:1192
 PReaction.cc:1193
 PReaction.cc:1194
 PReaction.cc:1195
 PReaction.cc:1196
 PReaction.cc:1197
 PReaction.cc:1198
 PReaction.cc:1199
 PReaction.cc:1200
 PReaction.cc:1201
 PReaction.cc:1202
 PReaction.cc:1203
 PReaction.cc:1204
 PReaction.cc:1205
 PReaction.cc:1206
 PReaction.cc:1207
 PReaction.cc:1208
 PReaction.cc:1209
 PReaction.cc:1210
 PReaction.cc:1211
 PReaction.cc:1212
 PReaction.cc:1213
 PReaction.cc:1214
 PReaction.cc:1215
 PReaction.cc:1216
 PReaction.cc:1217
 PReaction.cc:1218
 PReaction.cc:1219
 PReaction.cc:1220
 PReaction.cc:1221
 PReaction.cc:1222
 PReaction.cc:1223
 PReaction.cc:1224
 PReaction.cc:1225
 PReaction.cc:1226
 PReaction.cc:1227
 PReaction.cc:1228
 PReaction.cc:1229
 PReaction.cc:1230
 PReaction.cc:1231
 PReaction.cc:1232
 PReaction.cc:1233
 PReaction.cc:1234
 PReaction.cc:1235
 PReaction.cc:1236
 PReaction.cc:1237
 PReaction.cc:1238
 PReaction.cc:1239
 PReaction.cc:1240
 PReaction.cc:1241
 PReaction.cc:1242
 PReaction.cc:1243
 PReaction.cc:1244
 PReaction.cc:1245
 PReaction.cc:1246
 PReaction.cc:1247
 PReaction.cc:1248
 PReaction.cc:1249
 PReaction.cc:1250
 PReaction.cc:1251
 PReaction.cc:1252
 PReaction.cc:1253
 PReaction.cc:1254
 PReaction.cc:1255
 PReaction.cc:1256
 PReaction.cc:1257
 PReaction.cc:1258
 PReaction.cc:1259
 PReaction.cc:1260
 PReaction.cc:1261
 PReaction.cc:1262
 PReaction.cc:1263
 PReaction.cc:1264
 PReaction.cc:1265
 PReaction.cc:1266
 PReaction.cc:1267
 PReaction.cc:1268
 PReaction.cc:1269
 PReaction.cc:1270
 PReaction.cc:1271
 PReaction.cc:1272
 PReaction.cc:1273
 PReaction.cc:1274
 PReaction.cc:1275
 PReaction.cc:1276
 PReaction.cc:1277
 PReaction.cc:1278
 PReaction.cc:1279
 PReaction.cc:1280
 PReaction.cc:1281
 PReaction.cc:1282
 PReaction.cc:1283
 PReaction.cc:1284
 PReaction.cc:1285
 PReaction.cc:1286
 PReaction.cc:1287
 PReaction.cc:1288
 PReaction.cc:1289
 PReaction.cc:1290
 PReaction.cc:1291
 PReaction.cc:1292
 PReaction.cc:1293
 PReaction.cc:1294
 PReaction.cc:1295
 PReaction.cc:1296
 PReaction.cc:1297
 PReaction.cc:1298
 PReaction.cc:1299
 PReaction.cc:1300
 PReaction.cc:1301
 PReaction.cc:1302
 PReaction.cc:1303
 PReaction.cc:1304
 PReaction.cc:1305
 PReaction.cc:1306
 PReaction.cc:1307
 PReaction.cc:1308
 PReaction.cc:1309
 PReaction.cc:1310
 PReaction.cc:1311
 PReaction.cc:1312
 PReaction.cc:1313
 PReaction.cc:1314
 PReaction.cc:1315
 PReaction.cc:1316
 PReaction.cc:1317
 PReaction.cc:1318
 PReaction.cc:1319
 PReaction.cc:1320
 PReaction.cc:1321
 PReaction.cc:1322
 PReaction.cc:1323
 PReaction.cc:1324
 PReaction.cc:1325
 PReaction.cc:1326
 PReaction.cc:1327
 PReaction.cc:1328
 PReaction.cc:1329
 PReaction.cc:1330
 PReaction.cc:1331
 PReaction.cc:1332
 PReaction.cc:1333
 PReaction.cc:1334
 PReaction.cc:1335
 PReaction.cc:1336
 PReaction.cc:1337
 PReaction.cc:1338
 PReaction.cc:1339
 PReaction.cc:1340
 PReaction.cc:1341
 PReaction.cc:1342
 PReaction.cc:1343
 PReaction.cc:1344
 PReaction.cc:1345
 PReaction.cc:1346
 PReaction.cc:1347
 PReaction.cc:1348
 PReaction.cc:1349
 PReaction.cc:1350
 PReaction.cc:1351
 PReaction.cc:1352
 PReaction.cc:1353
 PReaction.cc:1354
 PReaction.cc:1355
 PReaction.cc:1356
 PReaction.cc:1357
 PReaction.cc:1358
 PReaction.cc:1359
 PReaction.cc:1360
 PReaction.cc:1361
 PReaction.cc:1362
 PReaction.cc:1363
 PReaction.cc:1364
 PReaction.cc:1365
 PReaction.cc:1366
 PReaction.cc:1367
 PReaction.cc:1368
 PReaction.cc:1369
 PReaction.cc:1370
 PReaction.cc:1371
 PReaction.cc:1372
 PReaction.cc:1373
 PReaction.cc:1374
 PReaction.cc:1375
 PReaction.cc:1376
 PReaction.cc:1377
 PReaction.cc:1378
 PReaction.cc:1379
 PReaction.cc:1380
 PReaction.cc:1381
 PReaction.cc:1382
 PReaction.cc:1383
 PReaction.cc:1384
 PReaction.cc:1385
 PReaction.cc:1386
 PReaction.cc:1387
 PReaction.cc:1388
 PReaction.cc:1389
 PReaction.cc:1390
 PReaction.cc:1391
 PReaction.cc:1392
 PReaction.cc:1393
 PReaction.cc:1394
 PReaction.cc:1395
 PReaction.cc:1396
 PReaction.cc:1397
 PReaction.cc:1398
 PReaction.cc:1399
 PReaction.cc:1400
 PReaction.cc:1401
 PReaction.cc:1402
 PReaction.cc:1403
 PReaction.cc:1404
 PReaction.cc:1405
 PReaction.cc:1406
 PReaction.cc:1407
 PReaction.cc:1408
 PReaction.cc:1409
 PReaction.cc:1410
 PReaction.cc:1411
 PReaction.cc:1412
 PReaction.cc:1413
 PReaction.cc:1414
 PReaction.cc:1415
 PReaction.cc:1416
 PReaction.cc:1417
 PReaction.cc:1418
 PReaction.cc:1419
 PReaction.cc:1420
 PReaction.cc:1421
 PReaction.cc:1422
 PReaction.cc:1423
 PReaction.cc:1424
 PReaction.cc:1425
 PReaction.cc:1426
 PReaction.cc:1427
 PReaction.cc:1428
 PReaction.cc:1429
 PReaction.cc:1430
 PReaction.cc:1431
 PReaction.cc:1432
 PReaction.cc:1433
 PReaction.cc:1434
 PReaction.cc:1435
 PReaction.cc:1436
 PReaction.cc:1437
 PReaction.cc:1438
 PReaction.cc:1439
 PReaction.cc:1440
 PReaction.cc:1441
 PReaction.cc:1442
 PReaction.cc:1443
 PReaction.cc:1444
 PReaction.cc:1445
 PReaction.cc:1446
 PReaction.cc:1447
 PReaction.cc:1448
 PReaction.cc:1449
 PReaction.cc:1450
 PReaction.cc:1451
 PReaction.cc:1452
 PReaction.cc:1453
 PReaction.cc:1454
 PReaction.cc:1455
 PReaction.cc:1456
 PReaction.cc:1457
 PReaction.cc:1458
 PReaction.cc:1459
 PReaction.cc:1460
 PReaction.cc:1461
 PReaction.cc:1462
 PReaction.cc:1463
 PReaction.cc:1464
 PReaction.cc:1465
 PReaction.cc:1466
 PReaction.cc:1467
 PReaction.cc:1468
 PReaction.cc:1469
 PReaction.cc:1470
 PReaction.cc:1471
 PReaction.cc:1472
 PReaction.cc:1473
 PReaction.cc:1474
 PReaction.cc:1475
 PReaction.cc:1476
 PReaction.cc:1477
 PReaction.cc:1478
 PReaction.cc:1479
 PReaction.cc:1480
 PReaction.cc:1481
 PReaction.cc:1482
 PReaction.cc:1483
 PReaction.cc:1484
 PReaction.cc:1485
 PReaction.cc:1486
 PReaction.cc:1487
 PReaction.cc:1488
 PReaction.cc:1489
 PReaction.cc:1490
 PReaction.cc:1491
 PReaction.cc:1492
 PReaction.cc:1493
 PReaction.cc:1494
 PReaction.cc:1495
 PReaction.cc:1496
 PReaction.cc:1497
 PReaction.cc:1498
 PReaction.cc:1499
 PReaction.cc:1500
 PReaction.cc:1501
 PReaction.cc:1502
 PReaction.cc:1503
 PReaction.cc:1504
 PReaction.cc:1505
 PReaction.cc:1506
 PReaction.cc:1507
 PReaction.cc:1508
 PReaction.cc:1509
 PReaction.cc:1510
 PReaction.cc:1511
 PReaction.cc:1512
 PReaction.cc:1513
 PReaction.cc:1514
 PReaction.cc:1515
 PReaction.cc:1516
 PReaction.cc:1517
 PReaction.cc:1518
 PReaction.cc:1519
 PReaction.cc:1520
 PReaction.cc:1521
 PReaction.cc:1522
 PReaction.cc:1523
 PReaction.cc:1524
 PReaction.cc:1525
 PReaction.cc:1526
 PReaction.cc:1527
 PReaction.cc:1528
 PReaction.cc:1529
 PReaction.cc:1530
 PReaction.cc:1531
 PReaction.cc:1532
 PReaction.cc:1533
 PReaction.cc:1534
 PReaction.cc:1535
 PReaction.cc:1536
 PReaction.cc:1537
 PReaction.cc:1538
 PReaction.cc:1539
 PReaction.cc:1540
 PReaction.cc:1541
 PReaction.cc:1542
 PReaction.cc:1543
 PReaction.cc:1544
 PReaction.cc:1545
 PReaction.cc:1546
 PReaction.cc:1547
 PReaction.cc:1548
 PReaction.cc:1549
 PReaction.cc:1550
 PReaction.cc:1551
 PReaction.cc:1552
 PReaction.cc:1553
 PReaction.cc:1554
 PReaction.cc:1555
 PReaction.cc:1556
 PReaction.cc:1557
 PReaction.cc:1558
 PReaction.cc:1559
 PReaction.cc:1560
 PReaction.cc:1561
 PReaction.cc:1562
 PReaction.cc:1563
 PReaction.cc:1564
 PReaction.cc:1565
 PReaction.cc:1566
 PReaction.cc:1567
 PReaction.cc:1568
 PReaction.cc:1569
 PReaction.cc:1570
 PReaction.cc:1571
 PReaction.cc:1572
 PReaction.cc:1573
 PReaction.cc:1574
 PReaction.cc:1575
 PReaction.cc:1576
 PReaction.cc:1577
 PReaction.cc:1578
 PReaction.cc:1579
 PReaction.cc:1580
 PReaction.cc:1581
 PReaction.cc:1582
 PReaction.cc:1583
 PReaction.cc:1584
 PReaction.cc:1585
 PReaction.cc:1586
 PReaction.cc:1587
 PReaction.cc:1588
 PReaction.cc:1589
 PReaction.cc:1590
 PReaction.cc:1591
 PReaction.cc:1592
 PReaction.cc:1593
 PReaction.cc:1594
 PReaction.cc:1595
 PReaction.cc:1596
 PReaction.cc:1597
 PReaction.cc:1598
 PReaction.cc:1599
 PReaction.cc:1600
 PReaction.cc:1601
 PReaction.cc:1602
 PReaction.cc:1603
 PReaction.cc:1604
 PReaction.cc:1605
 PReaction.cc:1606
 PReaction.cc:1607
 PReaction.cc:1608
 PReaction.cc:1609
 PReaction.cc:1610
 PReaction.cc:1611
 PReaction.cc:1612
 PReaction.cc:1613
 PReaction.cc:1614
 PReaction.cc:1615
 PReaction.cc:1616
 PReaction.cc:1617
 PReaction.cc:1618
 PReaction.cc:1619
 PReaction.cc:1620
 PReaction.cc:1621
 PReaction.cc:1622
 PReaction.cc:1623
 PReaction.cc:1624
 PReaction.cc:1625
 PReaction.cc:1626
 PReaction.cc:1627
 PReaction.cc:1628
 PReaction.cc:1629
 PReaction.cc:1630
 PReaction.cc:1631
 PReaction.cc:1632
 PReaction.cc:1633
 PReaction.cc:1634
 PReaction.cc:1635
 PReaction.cc:1636
 PReaction.cc:1637
 PReaction.cc:1638
 PReaction.cc:1639
 PReaction.cc:1640
 PReaction.cc:1641
 PReaction.cc:1642
 PReaction.cc:1643
 PReaction.cc:1644
 PReaction.cc:1645
 PReaction.cc:1646
 PReaction.cc:1647
 PReaction.cc:1648
 PReaction.cc:1649
 PReaction.cc:1650
 PReaction.cc:1651
 PReaction.cc:1652
 PReaction.cc:1653
 PReaction.cc:1654
 PReaction.cc:1655
 PReaction.cc:1656
 PReaction.cc:1657
 PReaction.cc:1658
 PReaction.cc:1659
 PReaction.cc:1660
 PReaction.cc:1661
 PReaction.cc:1662
 PReaction.cc:1663
 PReaction.cc:1664
 PReaction.cc:1665
 PReaction.cc:1666
 PReaction.cc:1667
 PReaction.cc:1668
 PReaction.cc:1669
 PReaction.cc:1670
 PReaction.cc:1671
 PReaction.cc:1672
 PReaction.cc:1673
 PReaction.cc:1674
 PReaction.cc:1675
 PReaction.cc:1676
 PReaction.cc:1677
 PReaction.cc:1678
 PReaction.cc:1679
 PReaction.cc:1680
 PReaction.cc:1681
 PReaction.cc:1682
 PReaction.cc:1683
 PReaction.cc:1684
 PReaction.cc:1685
 PReaction.cc:1686
 PReaction.cc:1687
 PReaction.cc:1688
 PReaction.cc:1689
 PReaction.cc:1690
 PReaction.cc:1691
 PReaction.cc:1692
 PReaction.cc:1693
 PReaction.cc:1694
 PReaction.cc:1695
 PReaction.cc:1696
 PReaction.cc:1697
 PReaction.cc:1698
 PReaction.cc:1699
 PReaction.cc:1700
 PReaction.cc:1701
 PReaction.cc:1702
 PReaction.cc:1703
 PReaction.cc:1704
 PReaction.cc:1705
 PReaction.cc:1706
 PReaction.cc:1707
 PReaction.cc:1708
 PReaction.cc:1709
 PReaction.cc:1710
 PReaction.cc:1711
 PReaction.cc:1712
 PReaction.cc:1713
 PReaction.cc:1714
 PReaction.cc:1715
 PReaction.cc:1716
 PReaction.cc:1717
 PReaction.cc:1718
 PReaction.cc:1719
 PReaction.cc:1720
 PReaction.cc:1721
 PReaction.cc:1722
 PReaction.cc:1723
 PReaction.cc:1724
 PReaction.cc:1725
 PReaction.cc:1726
 PReaction.cc:1727
 PReaction.cc:1728
 PReaction.cc:1729
 PReaction.cc:1730
 PReaction.cc:1731
 PReaction.cc:1732
 PReaction.cc:1733
 PReaction.cc:1734
 PReaction.cc:1735
 PReaction.cc:1736
 PReaction.cc:1737
 PReaction.cc:1738
 PReaction.cc:1739
 PReaction.cc:1740
 PReaction.cc:1741
 PReaction.cc:1742
 PReaction.cc:1743
 PReaction.cc:1744
 PReaction.cc:1745
 PReaction.cc:1746
 PReaction.cc:1747
 PReaction.cc:1748
 PReaction.cc:1749
 PReaction.cc:1750
 PReaction.cc:1751
 PReaction.cc:1752
 PReaction.cc:1753
 PReaction.cc:1754
 PReaction.cc:1755
 PReaction.cc:1756
 PReaction.cc:1757
 PReaction.cc:1758
 PReaction.cc:1759
 PReaction.cc:1760
 PReaction.cc:1761
 PReaction.cc:1762
 PReaction.cc:1763
 PReaction.cc:1764
 PReaction.cc:1765
 PReaction.cc:1766
 PReaction.cc:1767
 PReaction.cc:1768
 PReaction.cc:1769
 PReaction.cc:1770
 PReaction.cc:1771
 PReaction.cc:1772
 PReaction.cc:1773
 PReaction.cc:1774
 PReaction.cc:1775
 PReaction.cc:1776
 PReaction.cc:1777
 PReaction.cc:1778
 PReaction.cc:1779
 PReaction.cc:1780
 PReaction.cc:1781
 PReaction.cc:1782
 PReaction.cc:1783
 PReaction.cc:1784
 PReaction.cc:1785
 PReaction.cc:1786
 PReaction.cc:1787
 PReaction.cc:1788
 PReaction.cc:1789
 PReaction.cc:1790
 PReaction.cc:1791
 PReaction.cc:1792
 PReaction.cc:1793
 PReaction.cc:1794
 PReaction.cc:1795
 PReaction.cc:1796
 PReaction.cc:1797
 PReaction.cc:1798
 PReaction.cc:1799
 PReaction.cc:1800
 PReaction.cc:1801
 PReaction.cc:1802
 PReaction.cc:1803
 PReaction.cc:1804
 PReaction.cc:1805
 PReaction.cc:1806
 PReaction.cc:1807
 PReaction.cc:1808
 PReaction.cc:1809
 PReaction.cc:1810
 PReaction.cc:1811
 PReaction.cc:1812
 PReaction.cc:1813
 PReaction.cc:1814
 PReaction.cc:1815
 PReaction.cc:1816
 PReaction.cc:1817
 PReaction.cc:1818
 PReaction.cc:1819
 PReaction.cc:1820
 PReaction.cc:1821
 PReaction.cc:1822
 PReaction.cc:1823
 PReaction.cc:1824
 PReaction.cc:1825
 PReaction.cc:1826
 PReaction.cc:1827
 PReaction.cc:1828
 PReaction.cc:1829
 PReaction.cc:1830
 PReaction.cc:1831
 PReaction.cc:1832
 PReaction.cc:1833
 PReaction.cc:1834
 PReaction.cc:1835
 PReaction.cc:1836
 PReaction.cc:1837
 PReaction.cc:1838
 PReaction.cc:1839
 PReaction.cc:1840
 PReaction.cc:1841
 PReaction.cc:1842
 PReaction.cc:1843
 PReaction.cc:1844
 PReaction.cc:1845
 PReaction.cc:1846
 PReaction.cc:1847
 PReaction.cc:1848
 PReaction.cc:1849
 PReaction.cc:1850
 PReaction.cc:1851
 PReaction.cc:1852
 PReaction.cc:1853
 PReaction.cc:1854
 PReaction.cc:1855
 PReaction.cc:1856
 PReaction.cc:1857
 PReaction.cc:1858
 PReaction.cc:1859
 PReaction.cc:1860
 PReaction.cc:1861
 PReaction.cc:1862
 PReaction.cc:1863
 PReaction.cc:1864
 PReaction.cc:1865
 PReaction.cc:1866
 PReaction.cc:1867
 PReaction.cc:1868
 PReaction.cc:1869
 PReaction.cc:1870
 PReaction.cc:1871
 PReaction.cc:1872
 PReaction.cc:1873
 PReaction.cc:1874
 PReaction.cc:1875
 PReaction.cc:1876
 PReaction.cc:1877
 PReaction.cc:1878
 PReaction.cc:1879
 PReaction.cc:1880
 PReaction.cc:1881
 PReaction.cc:1882
 PReaction.cc:1883
 PReaction.cc:1884
 PReaction.cc:1885
 PReaction.cc:1886
 PReaction.cc:1887
 PReaction.cc:1888
 PReaction.cc:1889
 PReaction.cc:1890
 PReaction.cc:1891
 PReaction.cc:1892
 PReaction.cc:1893
 PReaction.cc:1894
 PReaction.cc:1895
 PReaction.cc:1896
 PReaction.cc:1897
 PReaction.cc:1898
 PReaction.cc:1899
 PReaction.cc:1900
 PReaction.cc:1901
 PReaction.cc:1902
 PReaction.cc:1903
 PReaction.cc:1904
 PReaction.cc:1905
 PReaction.cc:1906
 PReaction.cc:1907
 PReaction.cc:1908
 PReaction.cc:1909
 PReaction.cc:1910
 PReaction.cc:1911
 PReaction.cc:1912
 PReaction.cc:1913
 PReaction.cc:1914
 PReaction.cc:1915
 PReaction.cc:1916
 PReaction.cc:1917
 PReaction.cc:1918
 PReaction.cc:1919
 PReaction.cc:1920
 PReaction.cc:1921
 PReaction.cc:1922
 PReaction.cc:1923
 PReaction.cc:1924
 PReaction.cc:1925
 PReaction.cc:1926
 PReaction.cc:1927
 PReaction.cc:1928
 PReaction.cc:1929
 PReaction.cc:1930
 PReaction.cc:1931
 PReaction.cc:1932
 PReaction.cc:1933
 PReaction.cc:1934
 PReaction.cc:1935
 PReaction.cc:1936
 PReaction.cc:1937
 PReaction.cc:1938
 PReaction.cc:1939
 PReaction.cc:1940
 PReaction.cc:1941
 PReaction.cc:1942
 PReaction.cc:1943
 PReaction.cc:1944
 PReaction.cc:1945
 PReaction.cc:1946
 PReaction.cc:1947
 PReaction.cc:1948
 PReaction.cc:1949
 PReaction.cc:1950
 PReaction.cc:1951
 PReaction.cc:1952
 PReaction.cc:1953
 PReaction.cc:1954
 PReaction.cc:1955
 PReaction.cc:1956
 PReaction.cc:1957
 PReaction.cc:1958
 PReaction.cc:1959
 PReaction.cc:1960
 PReaction.cc:1961
 PReaction.cc:1962
 PReaction.cc:1963
 PReaction.cc:1964
 PReaction.cc:1965
 PReaction.cc:1966
 PReaction.cc:1967
 PReaction.cc:1968
 PReaction.cc:1969
 PReaction.cc:1970
 PReaction.cc:1971
 PReaction.cc:1972
 PReaction.cc:1973
 PReaction.cc:1974
 PReaction.cc:1975
 PReaction.cc:1976
 PReaction.cc:1977
 PReaction.cc:1978
 PReaction.cc:1979
 PReaction.cc:1980
 PReaction.cc:1981
 PReaction.cc:1982
 PReaction.cc:1983
 PReaction.cc:1984
 PReaction.cc:1985
 PReaction.cc:1986
 PReaction.cc:1987
 PReaction.cc:1988
 PReaction.cc:1989
 PReaction.cc:1990
 PReaction.cc:1991
 PReaction.cc:1992
 PReaction.cc:1993
 PReaction.cc:1994
 PReaction.cc:1995
 PReaction.cc:1996
 PReaction.cc:1997
 PReaction.cc:1998
 PReaction.cc:1999
 PReaction.cc:2000
 PReaction.cc:2001
 PReaction.cc:2002
 PReaction.cc:2003
 PReaction.cc:2004
 PReaction.cc:2005