// Author: M.A. Kagarlis
// Written: 03.02.99
// Revised: 21.04.05  R.H.
// PReaction Class Header

#ifndef _PREACTION_H_
#define _PREACTION_H_

#include "TClonesArray.h"
#include "TTree.h"
#include "TFile.h"
#include "TMethodCall.h"
#include "PChannel.h"
// #include "G__ci.h"

#include "PDistributionManager.h"
#include "PStdData.h"
#include "PFileOutput.h"
#include "PBulkInterface.h"
#include "PProjector.h"
#include "PPlutoBulkDecay.h"

#define MAX_FILEOUTPUT 5


#define MIN_PARTICLE_STACKSIZE 500
#define INC_PARTICLE_STACKSIZE 100
#define MAX_PARTICLE_STACKSIZE 10000
#define MAX_REACTION_FILTERS   100


class TPythia6;
class PFilter;

Int_t select(PParticle*);

class PReaction : public TObject  {

    friend class PDecayManager;
 public:

    PReaction();

    PReaction(const char *filename);

    PReaction(PChannel **, const char *, int n=2, int f0=1, int f1=0, int f2=0, int f3=0, TTree *ttree=NULL);

    PReaction(PChannel **, int n=2, unsigned int ff=0, TTree *ttree=NULL, const char *filename=NULL);

    PReaction(Double_t momentum, const char *beam, const char *target, const char *reaction, const char *file_name=NULL,
	      Int_t f0=1, Int_t f1=0, Int_t f2=0, Int_t f3=0, TTree *ttree=NULL); 
    // build reaction from a descriptor string
    PReaction(const char *command,  const char *beam, const char *target, 
	      const char *reaction, const char *file_name=NULL,
	      Int_t f0=1, Int_t f1=0, Int_t f2=0, Int_t f3=0, TTree *ttree=NULL); 
    // build reaction from a descriptor string but uses energy parser
    PReaction(PParticle *, const char *reaction, const char *file_name=NULL,
	      Int_t f0=1, Int_t f1=0, Int_t f2=0, Int_t f3=0, TTree *ttree=NULL); 
    // build reaction from a descriptor string but uses a seed particle

    void AddReaction(const char *reaction);
    //add a reaction to the list

    ~PReaction();
    // Reaction destructor

    void InitChannels();

    int loop(int i=-1, int wf=0, int verbose=1) {
	//kept for backward compatibility
	return Loop(i, wf, verbose);
    };

    int Loop(int i=-1, int wf=0, int verbose=1);
    // number of events to simulate

    int GetNumAll() { return ndpar; }
    // returns number of all the particles in the reaction

    int *GetCIndex() { 
	return cindex.GetArray(); }
    // returns product channel index

    void VertexYes() {
	// turn on vertex calculation after initialization
	if (IsExtTree()) return;
	getVERTEX = 1;
	ropt = ropt | ff2;
    }

    void VertexNo()  {
	// turn off vertex calculation after initialization
	if (IsExtTree()) return;
	getVERTEX = 0;
	ropt=~((~ropt)|ff2);
    }


    void allParticles() {
	// put all particles on root file after initialization
	if (IsExtTree()) return;
	allPARTICLES = 1;
	ropt = ropt | ff0;
    }

    void trackedParticles() {
	// put tracked particles on root file file after initialization
	if (IsExtTree()) return;
	allPARTICLES = 0;
	ropt=~((~ropt)|ff0);
    }

    void asciiYes() {
	// enable ascii output for GEANT after initialization
	if (IsExtTree()) return;
	asciiOUTPUT = 1;
	ropt = ropt | ff3;
	SetName(filename);
    }

    void asciiNo() {
	// disable ascii output for GEANT after initialization
	if (IsExtTree()) return;
	asciiOUTPUT = 0;
	ropt=~((~ropt)|ff3);
	SetName(filename);
    }

    void SetName(const char *);
    // sets up output file names

    PParticle **GetProducts() { return particle_stack; }
    // returns product pointer

    void SetFilter(int ch_id, PFilter *filter);
    // This function is invoked by the Filter class. It directs loop to
    // impose a filter at address (*filter) following the decay represented
    // by the reaction Channel number ch_id. See also PFilter.

    PFilter **GetFilter() { return NULL; }
    // returns pointer to array of existing filters

    void Print(const Option_t *delme=NULL) const;
    void PrintReport() const; //Print a final report after sampling

    void Close();
    // close root output file

    void SetHGeant(int flag) {HGeant = (flag!=0);}  // set to 1, if PLUTO is run
    // from the HGeant prompt 
    void setHGeant(int flag) {SetHGeant(flag);}; //backward comp.

    void SetUserSelection(Int_t (*f)(PParticle*)) { // compiled user selection
	SetUserSelection((void*)f);
    }
    void SetUserSelection(void *f);                 // interpreted user selection

    void SetUserAnalysis(Int_t (*f)(PParticle**,Int_t)) { // compiled analysis
	SetUserAnalysis((void*)f);
    }
    void SetUserAnalysis(void *f);                  // interpreted user analysis

    void SetTrigCond(Int_t n) {nTrigCond = n;}      // set trigger level

    void setDecayAll(Float_t tau=1.) { 
	Warning ("setDecayAll", "This method is depreciated: use SetDecayAll()");
	SetDecayAll(tau);
    }

    void SetDecayAll(Float_t tau=1.) {              
	// decay all particles with
	// lifetime < tau (in ns)
	// choose either Pluto or Pythia, depending on availability

	//if (allPARTICLES && (asciiOUTPUT||HGeant) ) {
	//    Warning ("setDecayAll",
	//	     "\nOptions decayALL & allPARTICLES & (asciiOUTPUT||HGeant) incompatible!\n\n");
	//    return;
	//}

	//Wrapper to the new scheme
	tauMax = tau;   // go to sec
    

#ifdef USE_PYTHIA6
    
	PPythiaBulkDecay *pl = new PPythiaBulkDecay();
	pl->SetPythia(fPythia);
	pl->SetTauMax(tauMax);
	AddBulk(pl);

#else

	PPlutoBulkDecay *pl = new PPlutoBulkDecay();
	pl->SetRecursiveMode(1);
	pl->SetTauMax(tauMax);
	AddBulk(pl);

#endif
    
    }


    void SetPythia(TPythia6 *p) {fPythia=p;}        // set pointer to Pythia

    void SetMaxFileSize(Int_t bytes) {nMaxBytes = bytes;}  // set max file size

#if 0
    Int_t testPointer(void *p2f) {   // determine type of pointer-to-function
	// (see CINT reference manual for details) 
	if (p2f == NULL) return -1;
	Int_t ret = G__isinterpretedp2f(p2f);
	char *fname;
	fname = G__p2f2funcname(p2f);
	printf("Pointer to function %s is of type %d\n",fname,ret);
	return ret;
    }
#endif

    void SetWriteIndex(Bool_t flag) {
	if (flag == kTRUE) writeINDEX = 1;
	else writeINDEX = 0;
    }

    void DisableWeightReset() {weight_reset=0;};

    Int_t GetReactionId() { return reactionId; }

    PDistributionManager *GetDistributionManager(void){
	return makeDistributionManager();
    }

    Bool_t AddFileOutput(PFileOutput *file) {
	if (fileoutput_pos == MAX_FILEOUTPUT ) {
	    Warning("AddFileOutput", "MAX_FILEOUTPUT reached");
	    return kFALSE;
	}
	files[fileoutput_pos++] = file;
	return kTRUE;
    }

    Bool_t AddBulk(PBulkInterface *mybulk);
    Bool_t AddPrologueBulk(PBulkInterface *mybulk); //Bulk IO before any decay

    Bool_t Do(const char *command) {
	return GetCurrentProjector()->AddCommand(command);
    }
    Bool_t Do(TH1 *f, const char *command, Int_t flag=1) {
	return GetCurrentProjector()->AddHistogram(f,command,flag);
    }
    Bool_t Do(TH2 *f, const char *command, Int_t flag=1) {
	return GetCurrentProjector()->AddHistogram(f,command,flag);
    }
    Bool_t Do(TH3 *f, const char *command, Int_t flag=1) {
	return GetCurrentProjector()->AddHistogram(f,command,flag);
    }
    Bool_t Output(TNtuple *f, const char *command = (char *)"") {
	return GetCurrentProjector()->AddOutputTNtuple(f,command);
    }
    Bool_t Input(TNtuple *f) {
	return GetCurrentProjector()->AddInputTNtuple(f);
    }
    Bool_t Output(const char *f, const char *command="") {
	return GetCurrentProjector()->AddOutputASCII(f,command);
    }
    Bool_t Input(const char *f, const char *command="") {
	return GetCurrentProjector()->AddInputASCII(f, command);
    }
    Bool_t CloseFile(void) {
	return GetCurrentProjector()->CloseFile();
    }

    PProjector *GetCurrentProjector(void) {
	if (!bulkdecay_pos) {
	    current_projector = new PProjector();
	    AddBulk(current_projector);
	} else {
	    if ((strcmp("PProjector", bulk[bulkdecay_pos-1]->GetName()) == 0)) {
		if ((bulk[bulkdecay_pos-1]->GetPriority() > FILTER_PRIORITY) ||
		    ((PProjector *)bulk[bulkdecay_pos-1])->IsFileOpen()) {
		    current_projector = (PProjector *)bulk[bulkdecay_pos-1];
		} else {
		    current_projector = new PProjector();
		    AddBulk(current_projector);
		}
	    } else {		
		current_projector = new PProjector();
		AddBulk(current_projector);
	    }
/* 	    if ((strcmp("PProjector",bulk[bulkdecay_pos-1] -> GetName())==0)  */
/* 		&& (bulk[bulkdecay_pos-1] -> GetPriority() > FILTER_PRIORITY)) { */
/* 		current_projector = (PProjector *)bulk[bulkdecay_pos-1]; */
/* 	    } else { */
		
/* 		current_projector = new PProjector(); */
/* 		AddBulk(current_projector); */
/* 	    } */
	}
	return current_projector;
    }

    void Preheating(Int_t num) {pre_heating=num;}; //Perform num dummy decays

    void IsInline(void) {
	//pure inline PReaction, e.g. FAIRROOT
	is_inline = 1;
    }

 private:

    Int_t reactionId;                          //  reaction identifier
    Int_t (*userSelection)(PParticle*);        //! pointer to selection function 
    Int_t (*userAnalysis)(PParticle**,Int_t);  //! pointer to analysis function 

    Int_t num_filters;           //! Filters from PBatch commands
    Int_t filter_keys[MAX_REACTION_FILTERS], filter_counter[MAX_REACTION_FILTERS]; 
    Double_t *filter_values[MAX_REACTION_FILTERS]; 

    int nchan, ntpar, ndpar, nclones, loop_count, reset_count, status;
    // number of reaction channels (channels),
    // number of non-decayed (tracked) particles,
    // number of decay products,
    // number of filters
    // number of times loop function invoked
    // number of reset calls
    // error status
    static int activeCnt;  // number of clones for root branches,

    TArrayI cindex, dindex, ftrack;
    // channel index of the decay products,
    // indices of parents to channels after the 1st
    // flag indicating whether particle is tracked (1) or not (0)

    unsigned int ropt, allPARTICLES, asciiOUTPUT, writeINDEX,
	resetCHANNELS, getVERTEX, extTREE, HGeant, decayALL, inactivate_decayed_particles;
    static const unsigned int ff0, ff1, ff2, ff3, ff4;
    // option flags (see constructor)

    Float_t tauMax;   // max lifetime for decay (see decayALL option) 

    PChannel **channel;
    // address of array of pointers to reaction channels

    TString filename, file1, file2, original_filename,reaction_string;
    // output file name, filename.evt for (GEANT), filename.root (ROOT)
    void ConvertFilename(void);
    
    TTree *tree;
    // address of the event tree

    PParticle **particle_stack;
    // Particle stack for the event loop
    int decay_done[MAX_PARTICLE_STACKSIZE];
    int stacksize;

    PParticle **particle;
    //particles from the PChannel list

    static TClonesArray *evt[MAX_NUM_BRANCHES+1];
    // particle clone

    TFile *rootfile;
    // the root output file

    int size_branches;
    int key_branches[MAX_NUM_BRANCHES];
    int doonce;

    int fileoutput_pos;
    PFileOutput *files[MAX_FILEOUTPUT];
    int bulkdecay_pos, pro_bulkdecay_pos;
    
    PBulkInterface *bulk[MAX_BULKDECAY];
    PBulkInterface *pro_bulk[MAX_BULKDECAY];
    PProjector *current_projector;

  
    Int_t nTrigCond;

    TPythia6 *fPythia;                   //! pointer to Pythia object

    void SetReactionId(void);
    // calculate reaction id from list of products of 1st channel

    void SetUp(PChannel **);
    // get the channels and particles, identify the physics, set up the defaults.

    Bool_t parse_script(const char *e, const char *beam, const char *target, const char *reaction, const char *file_name=NULL,
			Int_t f0=1, Int_t f1=0, Int_t f2=0, Int_t f3=0, TTree *ttree=NULL); 

    void InitLoop();
    // resets the dynamical objects of the reaction and opens files

    Int_t IsExtTree() { return extTREE; }
    // check whether tree is external

    Int_t ParseChannel(PParticle *parent, const char *channel,
		       TList &plutoList, Int_t &numChannels);
    // parse string describing reaction
    PParticle *MakeParticle(char * name);

    Int_t nMaxBytes;

    static FILE *asciif;
    static Int_t globalEventCounter;

    Int_t weight_reset;
    Int_t is_inline;

    // beam axis skewing and smearing
    /* Double_t thetaBeam, phiBeam, sigmaBeam; */
    /* Double_t beam_energy,beam_momentum; //for consecutive reactions */
    const char *r_beam, *r_target;

    //From batch system
    Double_t *vertex_x, *vertex_y, *vertex_z;
    Double_t *event_impact_param , *event_plane;
    Double_t *weight_version;

    // ascii file

    static void passEvent(float,  float,  float,  int, int*, int*, int*, int*,
			  float*, float*, float*, float*,
			  float*, float*, float*, float*) {;}
    // dummy HGeant interface.  Comment to make HGeant routine visible!


    Int_t pre_heating;
    PReaction *sub_reaction;

    ClassDef(PReaction, 0) //Pluto Reaction Class

};

#endif // _PREACTION_H_














	
 PReaction.h:1
 PReaction.h:2
 PReaction.h:3
 PReaction.h:4
 PReaction.h:5
 PReaction.h:6
 PReaction.h:7
 PReaction.h:8
 PReaction.h:9
 PReaction.h:10
 PReaction.h:11
 PReaction.h:12
 PReaction.h:13
 PReaction.h:14
 PReaction.h:15
 PReaction.h:16
 PReaction.h:17
 PReaction.h:18
 PReaction.h:19
 PReaction.h:20
 PReaction.h:21
 PReaction.h:22
 PReaction.h:23
 PReaction.h:24
 PReaction.h:25
 PReaction.h:26
 PReaction.h:27
 PReaction.h:28
 PReaction.h:29
 PReaction.h:30
 PReaction.h:31
 PReaction.h:32
 PReaction.h:33
 PReaction.h:34
 PReaction.h:35
 PReaction.h:36
 PReaction.h:37
 PReaction.h:38
 PReaction.h:39
 PReaction.h:40
 PReaction.h:41
 PReaction.h:42
 PReaction.h:43
 PReaction.h:44
 PReaction.h:45
 PReaction.h:46
 PReaction.h:47
 PReaction.h:48
 PReaction.h:49
 PReaction.h:50
 PReaction.h:51
 PReaction.h:52
 PReaction.h:53
 PReaction.h:54
 PReaction.h:55
 PReaction.h:56
 PReaction.h:57
 PReaction.h:58
 PReaction.h:59
 PReaction.h:60
 PReaction.h:61
 PReaction.h:62
 PReaction.h:63
 PReaction.h:64
 PReaction.h:65
 PReaction.h:66
 PReaction.h:67
 PReaction.h:68
 PReaction.h:69
 PReaction.h:70
 PReaction.h:71
 PReaction.h:72
 PReaction.h:73
 PReaction.h:74
 PReaction.h:75
 PReaction.h:76
 PReaction.h:77
 PReaction.h:78
 PReaction.h:79
 PReaction.h:80
 PReaction.h:81
 PReaction.h:82
 PReaction.h:83
 PReaction.h:84
 PReaction.h:85
 PReaction.h:86
 PReaction.h:87
 PReaction.h:88
 PReaction.h:89
 PReaction.h:90
 PReaction.h:91
 PReaction.h:92
 PReaction.h:93
 PReaction.h:94
 PReaction.h:95
 PReaction.h:96
 PReaction.h:97
 PReaction.h:98
 PReaction.h:99
 PReaction.h:100
 PReaction.h:101
 PReaction.h:102
 PReaction.h:103
 PReaction.h:104
 PReaction.h:105
 PReaction.h:106
 PReaction.h:107
 PReaction.h:108
 PReaction.h:109
 PReaction.h:110
 PReaction.h:111
 PReaction.h:112
 PReaction.h:113
 PReaction.h:114
 PReaction.h:115
 PReaction.h:116
 PReaction.h:117
 PReaction.h:118
 PReaction.h:119
 PReaction.h:120
 PReaction.h:121
 PReaction.h:122
 PReaction.h:123
 PReaction.h:124
 PReaction.h:125
 PReaction.h:126
 PReaction.h:127
 PReaction.h:128
 PReaction.h:129
 PReaction.h:130
 PReaction.h:131
 PReaction.h:132
 PReaction.h:133
 PReaction.h:134
 PReaction.h:135
 PReaction.h:136
 PReaction.h:137
 PReaction.h:138
 PReaction.h:139
 PReaction.h:140
 PReaction.h:141
 PReaction.h:142
 PReaction.h:143
 PReaction.h:144
 PReaction.h:145
 PReaction.h:146
 PReaction.h:147
 PReaction.h:148
 PReaction.h:149
 PReaction.h:150
 PReaction.h:151
 PReaction.h:152
 PReaction.h:153
 PReaction.h:154
 PReaction.h:155
 PReaction.h:156
 PReaction.h:157
 PReaction.h:158
 PReaction.h:159
 PReaction.h:160
 PReaction.h:161
 PReaction.h:162
 PReaction.h:163
 PReaction.h:164
 PReaction.h:165
 PReaction.h:166
 PReaction.h:167
 PReaction.h:168
 PReaction.h:169
 PReaction.h:170
 PReaction.h:171
 PReaction.h:172
 PReaction.h:173
 PReaction.h:174
 PReaction.h:175
 PReaction.h:176
 PReaction.h:177
 PReaction.h:178
 PReaction.h:179
 PReaction.h:180
 PReaction.h:181
 PReaction.h:182
 PReaction.h:183
 PReaction.h:184
 PReaction.h:185
 PReaction.h:186
 PReaction.h:187
 PReaction.h:188
 PReaction.h:189
 PReaction.h:190
 PReaction.h:191
 PReaction.h:192
 PReaction.h:193
 PReaction.h:194
 PReaction.h:195
 PReaction.h:196
 PReaction.h:197
 PReaction.h:198
 PReaction.h:199
 PReaction.h:200
 PReaction.h:201
 PReaction.h:202
 PReaction.h:203
 PReaction.h:204
 PReaction.h:205
 PReaction.h:206
 PReaction.h:207
 PReaction.h:208
 PReaction.h:209
 PReaction.h:210
 PReaction.h:211
 PReaction.h:212
 PReaction.h:213
 PReaction.h:214
 PReaction.h:215
 PReaction.h:216
 PReaction.h:217
 PReaction.h:218
 PReaction.h:219
 PReaction.h:220
 PReaction.h:221
 PReaction.h:222
 PReaction.h:223
 PReaction.h:224
 PReaction.h:225
 PReaction.h:226
 PReaction.h:227
 PReaction.h:228
 PReaction.h:229
 PReaction.h:230
 PReaction.h:231
 PReaction.h:232
 PReaction.h:233
 PReaction.h:234
 PReaction.h:235
 PReaction.h:236
 PReaction.h:237
 PReaction.h:238
 PReaction.h:239
 PReaction.h:240
 PReaction.h:241
 PReaction.h:242
 PReaction.h:243
 PReaction.h:244
 PReaction.h:245
 PReaction.h:246
 PReaction.h:247
 PReaction.h:248
 PReaction.h:249
 PReaction.h:250
 PReaction.h:251
 PReaction.h:252
 PReaction.h:253
 PReaction.h:254
 PReaction.h:255
 PReaction.h:256
 PReaction.h:257
 PReaction.h:258
 PReaction.h:259
 PReaction.h:260
 PReaction.h:261
 PReaction.h:262
 PReaction.h:263
 PReaction.h:264
 PReaction.h:265
 PReaction.h:266
 PReaction.h:267
 PReaction.h:268
 PReaction.h:269
 PReaction.h:270
 PReaction.h:271
 PReaction.h:272
 PReaction.h:273
 PReaction.h:274
 PReaction.h:275
 PReaction.h:276
 PReaction.h:277
 PReaction.h:278
 PReaction.h:279
 PReaction.h:280
 PReaction.h:281
 PReaction.h:282
 PReaction.h:283
 PReaction.h:284
 PReaction.h:285
 PReaction.h:286
 PReaction.h:287
 PReaction.h:288
 PReaction.h:289
 PReaction.h:290
 PReaction.h:291
 PReaction.h:292
 PReaction.h:293
 PReaction.h:294
 PReaction.h:295
 PReaction.h:296
 PReaction.h:297
 PReaction.h:298
 PReaction.h:299
 PReaction.h:300
 PReaction.h:301
 PReaction.h:302
 PReaction.h:303
 PReaction.h:304
 PReaction.h:305
 PReaction.h:306
 PReaction.h:307
 PReaction.h:308
 PReaction.h:309
 PReaction.h:310
 PReaction.h:311
 PReaction.h:312
 PReaction.h:313
 PReaction.h:314
 PReaction.h:315
 PReaction.h:316
 PReaction.h:317
 PReaction.h:318
 PReaction.h:319
 PReaction.h:320
 PReaction.h:321
 PReaction.h:322
 PReaction.h:323
 PReaction.h:324
 PReaction.h:325
 PReaction.h:326
 PReaction.h:327
 PReaction.h:328
 PReaction.h:329
 PReaction.h:330
 PReaction.h:331
 PReaction.h:332
 PReaction.h:333
 PReaction.h:334
 PReaction.h:335
 PReaction.h:336
 PReaction.h:337
 PReaction.h:338
 PReaction.h:339
 PReaction.h:340
 PReaction.h:341
 PReaction.h:342
 PReaction.h:343
 PReaction.h:344
 PReaction.h:345
 PReaction.h:346
 PReaction.h:347
 PReaction.h:348
 PReaction.h:349
 PReaction.h:350
 PReaction.h:351
 PReaction.h:352
 PReaction.h:353
 PReaction.h:354
 PReaction.h:355
 PReaction.h:356
 PReaction.h:357
 PReaction.h:358
 PReaction.h:359
 PReaction.h:360
 PReaction.h:361
 PReaction.h:362
 PReaction.h:363
 PReaction.h:364
 PReaction.h:365
 PReaction.h:366
 PReaction.h:367
 PReaction.h:368
 PReaction.h:369
 PReaction.h:370
 PReaction.h:371
 PReaction.h:372
 PReaction.h:373
 PReaction.h:374
 PReaction.h:375
 PReaction.h:376
 PReaction.h:377
 PReaction.h:378
 PReaction.h:379
 PReaction.h:380
 PReaction.h:381
 PReaction.h:382
 PReaction.h:383
 PReaction.h:384
 PReaction.h:385
 PReaction.h:386
 PReaction.h:387
 PReaction.h:388
 PReaction.h:389
 PReaction.h:390
 PReaction.h:391
 PReaction.h:392
 PReaction.h:393
 PReaction.h:394
 PReaction.h:395
 PReaction.h:396
 PReaction.h:397
 PReaction.h:398
 PReaction.h:399
 PReaction.h:400
 PReaction.h:401
 PReaction.h:402
 PReaction.h:403
 PReaction.h:404
 PReaction.h:405
 PReaction.h:406
 PReaction.h:407
 PReaction.h:408
 PReaction.h:409
 PReaction.h:410
 PReaction.h:411
 PReaction.h:412
 PReaction.h:413
 PReaction.h:414
 PReaction.h:415
 PReaction.h:416
 PReaction.h:417
 PReaction.h:418
 PReaction.h:419
 PReaction.h:420
 PReaction.h:421
 PReaction.h:422
 PReaction.h:423
 PReaction.h:424
 PReaction.h:425
 PReaction.h:426
 PReaction.h:427
 PReaction.h:428
 PReaction.h:429
 PReaction.h:430
 PReaction.h:431
 PReaction.h:432
 PReaction.h:433
 PReaction.h:434
 PReaction.h:435
 PReaction.h:436
 PReaction.h:437
 PReaction.h:438
 PReaction.h:439
 PReaction.h:440
 PReaction.h:441
 PReaction.h:442
 PReaction.h:443
 PReaction.h:444
 PReaction.h:445
 PReaction.h:446
 PReaction.h:447
 PReaction.h:448
 PReaction.h:449
 PReaction.h:450