/////////////////////////////////////////////////////////////////////
//
// Quasi-free scattering in the d+d scattering
//
//                                  Author: I. Froehlich
//
/////////////////////////////////////////////////////////////////////

#include "PFermiMomentumDD.h"

PFermiMomentumDD::PFermiMomentumDD(const Char_t *id, const Char_t *de, Int_t key) : 
    PFermiMomentum(id, de, key) {
};

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

Bool_t PFermiMomentumDD::Init(void) {

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

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

    spectator1 = GetParticle("spectator");
    spectator2 = GetParticle("spectator");
    p1 = GetParticle("p1");
    p2 = GetParticle("p2");

    composite = GetParticle("composite");
    if (!composite) {
	Warning("Init", "<%s> composite not found", GetIdentifier());
	return kFALSE;
    }

    return kTRUE;
}


Bool_t PFermiMomentumDD::SampleMass(void) {
   
    PParticle participant1, participant2;
    Int_t pair1_is_beam = 0;

    //First we have to find out which kind of reaction we have
    //for pp and nn we have no ambiguity
    if ((spectator1->ID() == 14) && (spectator2->ID() == 14)) {
	participant1.SetID(13);
	participant2.SetID(13);
	pair1_is_beam = 1; //dont care
    } else if ((spectator1->ID() == 13) && (spectator2->ID() == 13)) {
	participant1.SetID(14);
	participant2.SetID(14);
	pair1_is_beam = 1; //dont care
    } else if ((spectator1->ID() == 14) && (spectator2->ID() == 13)) {
	//spectator1 is proton.
	//We have to check if "beam" contains the scattered proton:
	Double_t dummy = 0;
	if (beam->GetValue(P_SCATTER, &dummy)) //value used
	    pair1_is_beam = 1; //p from beam
	else if (!target->GetValue(P_SCATTER, &dummy)) {
	    //randomize if value not used
	    pair1_is_beam = (PUtils::sampleFlat() < 0.5 ? 0 : 1);
	}	
	participant1.SetID(13);
	participant2.SetID(14);
    } else if ((spectator1->ID() == 13) && (spectator2->ID() == 14)){
	//spectator2 is proton.
	//We have to check if "target" contains the scattered proton:
	Double_t dummy = 0;
	pair1_is_beam = 1; 
	if (target->GetValue(P_SCATTER, &dummy)) //value used
	    pair1_is_beam = 0; //p from target
	else if (!beam->GetValue(P_SCATTER, &dummy)) {
	    //randomize if value not used
	    pair1_is_beam = (PUtils::sampleFlat() < 0.5 ? 0 : 1);
	}

	participant1.SetID(14);
	participant2.SetID(13);
    } else {
	Warning("SampleMass", "Unknown reaction");
    }
    
    Double_t massS, eS, eP, ptot, px, py, pz, t=-1., mdeut;

    //sample participant1
    while (t < 0.) {
	ptot  = SampleFermi(px,py,pz);                 // Fermi momentum
	massS = spectator1->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
    }

    if (t < 0.) {
	Warning("SampleMass", "Insufficient energy");
	return kTRUE;
    }
    eP = sqrt(ptot*ptot + t);         // participant total energy

    participant1.SetPxPyPzE(-px, -py, -pz, eP);  // initialize participant nucleon
    spectator1->SetPxPyPzE(px, py, pz, eS);      // initialize spectator nucleon

     //sample participant2
    while (t < 0.) {
	ptot  = SampleFermi(px,py,pz);                 // Fermi momentum
	massS = spectator2->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
    }

    if (t < 0.) {
	Warning("SampleMass", "Insufficient energy");
	return kTRUE;
    }
    eP = sqrt(ptot*ptot + t);         // participant total energy

    participant2.SetPxPyPzE(-px,-py,-pz,eP);  // initialize participant nucleon
    spectator2->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 (pair1_is_beam) {
	//pair 1 is beam
	participant1.Boost(beam->BoostVector()); //go from Lab to D frame
	spectator1->Boost(beam->BoostVector());  //go from Lab to D frame
	participant2.Boost(target->BoostVector()); //go from Lab to D frame
	spectator2->Boost(target->BoostVector());  //go from Lab to D frame
	if (participant2.ID() == p1->ID()) { //Identify the scattered nucleon
	    *p1 = participant2;
	    *p2 = participant1;
	} else { //Identify the scattered nucleon
	    *p2 = participant1;
	    *p1 = participant2;
	}
    } else {
	//pair 2 is beam
	participant2.Boost(beam->BoostVector()); //go from Lab to D frame
	spectator2->Boost(beam->BoostVector());  //go from Lab to D frame
	participant1.Boost(target->BoostVector()); //go from Lab to D frame
	spectator1->Boost(target->BoostVector());  //go from Lab to D frame
	if (participant2.ID() == p1->ID()) { //Identify the scattered nucleon
	    *p1 = participant2;
	    *p2 = participant1;
	} else  { //Identify the scattered nucleon
	    *p2 = participant1;
	    *p1 = participant2;
	}
    }

    //go into parent frame
    p1->Boost(-parent->BoostVector());
    p2->Boost(-parent->BoostVector());
    spectator1->Boost(-parent->BoostVector());
    spectator2->Boost(-parent->BoostVector());

    composite->Reconstruct(); //reset mass after p1 and p2 have been setted

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

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

    return kTRUE;
}


ClassImp(PFermiMomentumDD)
 PFermiMomentumDD.cc:1
 PFermiMomentumDD.cc:2
 PFermiMomentumDD.cc:3
 PFermiMomentumDD.cc:4
 PFermiMomentumDD.cc:5
 PFermiMomentumDD.cc:6
 PFermiMomentumDD.cc:7
 PFermiMomentumDD.cc:8
 PFermiMomentumDD.cc:9
 PFermiMomentumDD.cc:10
 PFermiMomentumDD.cc:11
 PFermiMomentumDD.cc:12
 PFermiMomentumDD.cc:13
 PFermiMomentumDD.cc:14
 PFermiMomentumDD.cc:15
 PFermiMomentumDD.cc:16
 PFermiMomentumDD.cc:17
 PFermiMomentumDD.cc:18
 PFermiMomentumDD.cc:19
 PFermiMomentumDD.cc:20
 PFermiMomentumDD.cc:21
 PFermiMomentumDD.cc:22
 PFermiMomentumDD.cc:23
 PFermiMomentumDD.cc:24
 PFermiMomentumDD.cc:25
 PFermiMomentumDD.cc:26
 PFermiMomentumDD.cc:27
 PFermiMomentumDD.cc:28
 PFermiMomentumDD.cc:29
 PFermiMomentumDD.cc:30
 PFermiMomentumDD.cc:31
 PFermiMomentumDD.cc:32
 PFermiMomentumDD.cc:33
 PFermiMomentumDD.cc:34
 PFermiMomentumDD.cc:35
 PFermiMomentumDD.cc:36
 PFermiMomentumDD.cc:37
 PFermiMomentumDD.cc:38
 PFermiMomentumDD.cc:39
 PFermiMomentumDD.cc:40
 PFermiMomentumDD.cc:41
 PFermiMomentumDD.cc:42
 PFermiMomentumDD.cc:43
 PFermiMomentumDD.cc:44
 PFermiMomentumDD.cc:45
 PFermiMomentumDD.cc:46
 PFermiMomentumDD.cc:47
 PFermiMomentumDD.cc:48
 PFermiMomentumDD.cc:49
 PFermiMomentumDD.cc:50
 PFermiMomentumDD.cc:51
 PFermiMomentumDD.cc:52
 PFermiMomentumDD.cc:53
 PFermiMomentumDD.cc:54
 PFermiMomentumDD.cc:55
 PFermiMomentumDD.cc:56
 PFermiMomentumDD.cc:57
 PFermiMomentumDD.cc:58
 PFermiMomentumDD.cc:59
 PFermiMomentumDD.cc:60
 PFermiMomentumDD.cc:61
 PFermiMomentumDD.cc:62
 PFermiMomentumDD.cc:63
 PFermiMomentumDD.cc:64
 PFermiMomentumDD.cc:65
 PFermiMomentumDD.cc:66
 PFermiMomentumDD.cc:67
 PFermiMomentumDD.cc:68
 PFermiMomentumDD.cc:69
 PFermiMomentumDD.cc:70
 PFermiMomentumDD.cc:71
 PFermiMomentumDD.cc:72
 PFermiMomentumDD.cc:73
 PFermiMomentumDD.cc:74
 PFermiMomentumDD.cc:75
 PFermiMomentumDD.cc:76
 PFermiMomentumDD.cc:77
 PFermiMomentumDD.cc:78
 PFermiMomentumDD.cc:79
 PFermiMomentumDD.cc:80
 PFermiMomentumDD.cc:81
 PFermiMomentumDD.cc:82
 PFermiMomentumDD.cc:83
 PFermiMomentumDD.cc:84
 PFermiMomentumDD.cc:85
 PFermiMomentumDD.cc:86
 PFermiMomentumDD.cc:87
 PFermiMomentumDD.cc:88
 PFermiMomentumDD.cc:89
 PFermiMomentumDD.cc:90
 PFermiMomentumDD.cc:91
 PFermiMomentumDD.cc:92
 PFermiMomentumDD.cc:93
 PFermiMomentumDD.cc:94
 PFermiMomentumDD.cc:95
 PFermiMomentumDD.cc:96
 PFermiMomentumDD.cc:97
 PFermiMomentumDD.cc:98
 PFermiMomentumDD.cc:99
 PFermiMomentumDD.cc:100
 PFermiMomentumDD.cc:101
 PFermiMomentumDD.cc:102
 PFermiMomentumDD.cc:103
 PFermiMomentumDD.cc:104
 PFermiMomentumDD.cc:105
 PFermiMomentumDD.cc:106
 PFermiMomentumDD.cc:107
 PFermiMomentumDD.cc:108
 PFermiMomentumDD.cc:109
 PFermiMomentumDD.cc:110
 PFermiMomentumDD.cc:111
 PFermiMomentumDD.cc:112
 PFermiMomentumDD.cc:113
 PFermiMomentumDD.cc:114
 PFermiMomentumDD.cc:115
 PFermiMomentumDD.cc:116
 PFermiMomentumDD.cc:117
 PFermiMomentumDD.cc:118
 PFermiMomentumDD.cc:119
 PFermiMomentumDD.cc:120
 PFermiMomentumDD.cc:121
 PFermiMomentumDD.cc:122
 PFermiMomentumDD.cc:123
 PFermiMomentumDD.cc:124
 PFermiMomentumDD.cc:125
 PFermiMomentumDD.cc:126
 PFermiMomentumDD.cc:127
 PFermiMomentumDD.cc:128
 PFermiMomentumDD.cc:129
 PFermiMomentumDD.cc:130
 PFermiMomentumDD.cc:131
 PFermiMomentumDD.cc:132
 PFermiMomentumDD.cc:133
 PFermiMomentumDD.cc:134
 PFermiMomentumDD.cc:135
 PFermiMomentumDD.cc:136
 PFermiMomentumDD.cc:137
 PFermiMomentumDD.cc:138
 PFermiMomentumDD.cc:139
 PFermiMomentumDD.cc:140
 PFermiMomentumDD.cc:141
 PFermiMomentumDD.cc:142
 PFermiMomentumDD.cc:143
 PFermiMomentumDD.cc:144
 PFermiMomentumDD.cc:145
 PFermiMomentumDD.cc:146
 PFermiMomentumDD.cc:147
 PFermiMomentumDD.cc:148
 PFermiMomentumDD.cc:149
 PFermiMomentumDD.cc:150
 PFermiMomentumDD.cc:151
 PFermiMomentumDD.cc:152
 PFermiMomentumDD.cc:153
 PFermiMomentumDD.cc:154
 PFermiMomentumDD.cc:155
 PFermiMomentumDD.cc:156
 PFermiMomentumDD.cc:157
 PFermiMomentumDD.cc:158
 PFermiMomentumDD.cc:159
 PFermiMomentumDD.cc:160
 PFermiMomentumDD.cc:161
 PFermiMomentumDD.cc:162
 PFermiMomentumDD.cc:163
 PFermiMomentumDD.cc:164
 PFermiMomentumDD.cc:165
 PFermiMomentumDD.cc:166
 PFermiMomentumDD.cc:167
 PFermiMomentumDD.cc:168
 PFermiMomentumDD.cc:169
 PFermiMomentumDD.cc:170
 PFermiMomentumDD.cc:171
 PFermiMomentumDD.cc:172
 PFermiMomentumDD.cc:173
 PFermiMomentumDD.cc:174
 PFermiMomentumDD.cc:175
 PFermiMomentumDD.cc:176
 PFermiMomentumDD.cc:177
 PFermiMomentumDD.cc:178