/////////////////////////////////////////////////////////////////////
//
// Quasi-free scattering and construction of virtual quasi-beam-particle
//
//                                  Author: R. Holzmann
//                                  Reimplemented I. Froehlich
// Ref 1: Benz et al. NP B65 (1973) 158
//        (p + d Fermi kinematics, implemented by R. Holzmann)
//
/////////////////////////////////////////////////////////////////////


using namespace std;
#include <sstream>
#include <iostream>
#include <iomanip>

#include "PFermiMomentum.h"
#include "PDynamicData.h"

ClassImp(PFermiMomentum)
    PFermiMomentum::PFermiMomentum() {
};

PFermiMomentum::PFermiMomentum(const Char_t *id, const Char_t *de, Int_t key) :
    PChannelModel(id, de, key) {

    beam = NULL;
    target = NULL;
    spectator = NULL;
    parent = NULL;
    p1 = NULL;
    p2 = NULL;
    composite = NULL;
    SetNpx(500);
    fXmin = 0.;
    fXmax = 1.;
    mesh = NULL;

    spline = kFALSE;
    g_spline = NULL;
    mom = NULL;

    didx_composite = -1;
    composite_model = NULL;
    tcross_key = makeStaticData()->MakeDirectoryEntry("modeldef", NMODEL_NAME, LMODEL_NAME, "tcross");
    relative_warning = 0;
};

PDistribution *PFermiMomentum::Clone(const char *) const {
    return new PFermiMomentum((const PFermiMomentum &)* this);
};

PFermiMomentum::~PFermiMomentum() {
    if (mesh) delete mesh;
};

double PFermiMomentum::SampleFermi(double &px, double &py, double &pz) {
    // sample Deuteron Fermi momentum in GeV/c
  
    double p = this->GetRandom();
    while (p>0.3)
	p = this->GetRandom();

    double theta = acos(1.-2.*PUtils::sampleFlat());
    double phi = 2.*TMath::Pi()*PUtils::sampleFlat();
    double sth = sin(theta);
    px = p*cos(phi)*sth;
    py = p*sin(phi)*sth;
    pz = p*cos(theta);

    return p;
};

Double_t PFermiMomentum::GetWeight(Double_t *mass, Int_t *) {
    //Use GetWeight for multi-dimensional sampling
    //mass[0]: Momentum of nucleon
    //mass[0]: cos Theta (polar angle)

    double p = mass[0];
    double theta = acos(mass[1]);
    double phi = 2.*TMath::Pi()*PUtils::sampleFlat();
    double sth = sin(theta);
    px = p*cos(phi)*sth;
    py = p*sin(phi)*sth;
    pz = p*cos(theta);

    Double_t massS, eS, eP, ptot, t=-1., mdeut;

    ptot = sqrt(px*px+py*py+pz*pz);

    massS = spectator->M();                        // mass of spectator nucleon
    eS = sqrt(ptot*ptot + massS*massS);            // spectator total energy in deuteron c.m.
    mdeut = makeStaticData()->GetParticleMass("d");
    t = pow(mdeut-massS,2) - 2.*mdeut*(eS-massS);  // off-shell mass**2 of participant
    eP = sqrt(ptot*ptot + t);         // participant total energy	
    TLorentzVector my_part(px,py,pz,eP);

    TLorentzVector my_q = my_part + my_beam;
    Double_t my_sqrt = my_q.M();
    Double_t w = Eval(p);
    if (composite_model && (!(composite_model->GetVersionFlag()) & VERSION_WEIGHTING)) {
	w *= composite_model->GetWeight(&my_sqrt);
    }

    return w;    
};

double PFermiMomentum::EvalPar(const double *x, const double *) {
    return Eval(x[0]);
};

Double_t PFermiMomentum::Eval(Double_t x, Double_t, Double_t, Double_t) const {
    // Deuteron wave function in p-space (Ref 6)

    double p = x;
    double r = p/0.197;

    if (mom) {
	Double_t x = mom->Eval(r, g_spline, "");
	if (x > 0) return r*r*x;
	return 0;
    }

    const double sqrtpi2 = 0.79788456;
    const double alpha = 0.23162461;

    double m[13], m2[13];
    for(int i=0; i<13; i++) {
	m[i]  = alpha + i;
	m2[i] = m[i]*m[i];
    }
  
    double c[13] = {0.88688076e0, -0.34717093e0, -0.30502380e1, 0.56207766e2,
		    -0.74957334e3,  0.53365279e4, -0.22706863e5, 0.60434469e5,
		    -0.10292058e6,  0.11223357e6, -0.75925226e5, 0.29059715e5,
		    0.};
  
    double d[13] = {0.23135193e-1, -0.85604572e0, 0.56068193e1, -0.69462922e2,
		    0.41631118e3,  -0.12546621e4, 0.12387830e4,  0.33739172e4,
		    -0.13041151e5,   0.19512524e5, 0., 0., 0.}; 
  
    c[12] = 0.;
    for(int i=0; i<12; i++) c[12] -= c[i];   // normalize c[] properly
  
    int n = 12, n1 = 11, n2 = 10;
  
    double sum1 = 0.;
    double sum2 = 0.;
    double sum3 = 0.;
    double rtemp;
    for(int i=0; i<5; i++) {
	rtemp = d[i*2]/m2[i*2] + d[i*2+1]/m2[i*2+1];
	sum1  = sum1 + rtemp;
	rtemp = d[i*2] + d[i*2+1];
	sum2  = sum2 + rtemp;
	rtemp = d[i*2]*m2[i*2] + d[i*2+1]*m2[i*2+1];
	sum3  = sum3 + rtemp;
    }
  
    for(int i=0; i<3; i++) {                 // normalize d[] properly
	d[n2] = -m2[n1]*m2[n]*sum1 + (m2[n1]+m2[n])*sum2 - sum3;
	d[n2] = d[n2] * m2[n2]/(m2[n]-m2[n2])/(m2[n1]-m2[n2]);
	int cycle = n2;
	n2 = n1;
	n1 = n;
	n  = cycle;
    }
  
    double U = 0.;
    double W = 0.;
    for(int i=0; i<13; i++) {
	U += c[i]/(r*r + m2[i]);
	W += d[i]/(r*r + m2[i]);
    }
    U = sqrtpi2 * U;    // s wave
    W = sqrtpi2 * W;    // d wave
  
    return draw_scaling*r*r*(U*U + W*W);  // total probability to have momentum p
};

Bool_t PFermiMomentum::IsNotRejected(void) {
    return kTRUE;
};

Bool_t PFermiMomentum::Init(void) {

    num_of_sampledevents = num_of_realevents = 0; //BUGBUG: Can cause trouble in BulkDecay

    beam   = GetParticle("beam");
    target = GetParticle("target");
    parent = GetParticle("parent");

    if (!beam || !target) {
	Warning("Init", "<%s> beam or target not found",GetIdentifier());
	return kFALSE;
    }

    spectator = GetParticle("spectator");
    p1 = GetParticle("p1");
    p2 = GetParticle("p2");
    //BUGBUG: Check presence
    composite = GetParticle("composite");
    if (!composite) {
	Warning("Init", "<%s> composite not found", GetIdentifier());
	return kFALSE;
    }

    return kTRUE;
}

int PFermiMomentum::GetDepth(int) {
    return 0;
}

void PFermiMomentum::SubPrint(Int_t) const {
    //Print sub-models    
    if (composite_model) {cout << " {";cout << composite_model->GetIdentifier()<<"}";}
}


Bool_t PFermiMomentum::Prepare(void) {

    if (composite) {
	didx_composite = composite->GetDecayModeIndex(1);
	if (didx_composite > 0) {
	    composite_model =
		makeDynamicData()->GetDecayModelByKey(
		    makeStaticData()->GetDecayKey(didx_composite), tcross_key);
	}
    } 

    return kTRUE;
}

Bool_t PFermiMomentum::SampleMass(void) {
    
    Int_t beam_breakup = 0;

    //This is the d+N reaction:
    if ((beam->ID() == makeStaticData()->GetParticleID("d")) && (
	    target->ID() != makeStaticData()->GetParticleID("d"))) {
	beam_breakup = 1;
    } 
    else if ((beam->ID() == makeStaticData()->GetParticleID("d")) && (
	    target->ID() == makeStaticData()->GetParticleID("d"))) { 
	//d+d_coherent reaction
	Double_t is_breakup = 0;
	if (beam->GetValue(IS_BREAKUP, &is_breakup)) //value used
	    beam_breakup = 1;
	else if (!target->GetValue(IS_BREAKUP, &is_breakup)) {
	    //randomize if value not used
	    beam_breakup=(PUtils::sampleFlat() < 0.5 ? 0 : 1);
	}
    }

    PParticle participant;
    if (spectator->ID() == 14) {
	participant.SetID(13);
	participant_mass = makeStaticData()->GetParticleMass("n");
    } else {
	participant.SetID(14);
	participant_mass = makeStaticData()->GetParticleMass("p");
    }

    Int_t makeloop = kTRUE;
    num_of_realevents++;

    while (makeloop) {
	num_of_sampledevents++;
	exp_w_mean = (Double_t)num_of_realevents/(Double_t)num_of_sampledevents;
	makeloop = kFALSE;
	if (!composite_model || ((composite_model->GetVersionFlag()) & VERSION_WEIGHTING)) {
	    //no consecutive decay model or 
	    //Taken into account in next step
	    Double_t massS, eS, eP, ptot, px, py, pz, t=-1., mdeut;
	    while (t < 0.) {
		ptot  = SampleFermi(px,py,pz);                 // Fermi momentum
		massS = spectator->M();                        // mass of spectator nucleon
		eS = sqrt(ptot*ptot + massS*massS);            // spectator total energy in deuteron c.m.
		mdeut = makeStaticData()->GetParticleMass("d");
		t = pow(mdeut-massS,2) - 2.*mdeut*(eS-massS);  // off-shell mass**2 of participant
	    }
	    
	    eP = sqrt(ptot*ptot + t);         // participant total energy
	    
	    participant.SetPxPyPzE(-px, -py, -pz, eP);  // initialize participant nucleon	    
	    spectator->SetPxPyPzE(px, py, pz, eS);      // initialize spectator nucleon
	} else {
	    //here we have to fold in consecutive decay model
	    if (beam_breakup) {
		//beam is (breakup-)deuteron
		my_beam = *target;
		my_beam.Boost(-beam->BoostVector());
	    } else {
		my_beam = *beam;
		my_beam.Boost(-target->BoostVector());
	    }
	    if (!mesh) {
		debug_print = 0;
		mesh = new PAdaptiveMeshN(0x3, 2, this, 1.);
		mesh->SetRange(0, 0., 0.300); //max fermi momentum
		mesh->SetRange(1, -1., +1.);  //range for cos theta
		mesh->ReCalcYMax();
		mesh->SetThreshold(1.5, 0.01);
		mesh->SetMCPoints(1000);
		mesh->Divide(5, 2);		
	    }
	    debug_print = 1;
	    mesh->GetRandom();
	    
//	double p = mesh->GetArrayValue(0);
// 	double theta = acos(mesh->GetArrayValue(1));
	    
// 	cout << mesh->GetArrayValue(0) << ":" << mesh->GetArrayValue(1) << endl;
	    
// 	double phi = 2.*TMath::Pi()*PUtils::sampleFlat();
// 	double sth=sin(theta);
// 	px = p*cos(phi)*sth;
// 	py = p*sin(phi)*sth;
// 	pz = p*cos(theta);
//	cout << px << ":" << py << ":" <<pz << endl;
	    
	    Double_t massS, eS, eP, ptot, t=-1., mdeut;
	    
	    ptot = sqrt(px*px+py*py+pz*pz);
	    
	    massS = spectator->M();                        // mass of spectator nucleon

	    eS = sqrt(ptot*ptot + massS*massS);            // spectator total energy in deuteron c.m.
	    mdeut = makeStaticData()->GetParticleMass("d");
	    t = pow(mdeut-massS,2) - 2.*mdeut*(eS-massS);  // off-shell mass**2 of participant
	    eP = sqrt(ptot*ptot + t);         // participant total energy	
	    participant.SetPxPyPzE(px, py, pz, eP);  // initialize participant nucleon
	    spectator->SetPxPyPzE(-px, -py, -pz, eS);      // initialize spectator nucleon
	}
		
	//Up to now we are in the (breakup-)deuteron frame.
	//Let us go into the lab frame first
	if (beam_breakup) {
	    //beam is (breakup-)deuteron
	    participant.Boost(beam->BoostVector()); //go to Lab frame
	    spectator->Boost(beam->BoostVector());  //go to Lab frame
	    if (target->ID() == p1->ID()) { //Identify the scattered nucleon
		*p1 = *target;
		*p2 = participant;
	    } else  { //Identify the scattered nucleon
		*p2 = *target;
		*p1 = participant;
	    }
	    
	} else {
	    //target is (breakup-)deuteron
	    //for consistency (target might move) we boost also here
	    participant.Boost(target->BoostVector()); //go to Lab frame
	    spectator->Boost(target->BoostVector());  //go to Lab frame
	    if (beam->ID() == p1->ID()) { //Identify the scattered nucleon
		*p1 = *beam;
		*p2 = participant;
	    } else  { //Identify the scattered nucleon
		*p2 = *beam;
		*p1 = participant;
	    }
	} 
	//go into parent frame
	p1->Boost(-parent->BoostVector());
	p2->Boost(-parent->BoostVector());
	spectator->Boost(-parent->BoostVector());
	composite->Reconstruct(); //reset mass after p1 and p2 have been setted

	//now check if we fall into the kinematic limits
	if (composite_model && ((composite_model->GetVersionFlag()) & VERSION_WEIGHTING)) {

	    if (composite_model->GetWeight(composite->M()) <= 0.) {		
		makeloop = kTRUE;
	    }
	}
    }

    //boost scatter back to lab
    p1->Boost(parent->BoostVector());
    p2->Boost(parent->BoostVector());

    spectator->SetW(parent->W());                  // copy parent weight to spectator

    return kTRUE;
}


Bool_t PFermiMomentum:: SampleMomentum(void) {
    return kTRUE;
}


void PFermiMomentum::Print(const Option_t *) const {
    PDistribution::Print();
}


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