/////////////////////////////////////////////////////////////////////
//
// Production of a+b -> X (so only 1 daughter)
//
//                                  Author:  I. Froehlich
/////////////////////////////////////////////////////////////////////


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

#include "PFixedProduction.h"


PFixedProduction::PFixedProduction()  {
};

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

    if (is_channel < 0)
	Warning("PFixedProduction", "The model (%s) should be bound to CHANNELS only",de);
    
    //Get particles
    Int_t tid[11];
    tid[0] = 10; 
    makeStaticData()->GetDecayModeByKey(primary_key, tid); // retrieve current mode info

    //Parent ALWAYS important (also for the inherited classes)
    parent_id   = makeStaticData()->GetDecayParentByKey(primary_key);
    parent_mass = makeStaticData()->GetParticleMass(parent_id);

    if (tid[0] > 1) {
	Warning("PFixedProduction", "Only for 'decay's to 1 daughter");
    }

    dmass = makeStaticData()->GetParticleMass(tid[1]);
    d_id  = tid[1];

    parent   = NULL;
    daughter = NULL;

    version_flag |= VERSION_MASS_SAMPLING;  //Only one mass sampling in the PChannel
};

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

Bool_t PFixedProduction::Init(void) {
    //Init function called once for each PChannel
    
    parent = GetParticle("parent");
    if (!parent) {
	Warning("Init", "Parent not found");
	return kFALSE;
    }
 
    daughter=GetParticle(makeStaticData()->GetParticleName(d_id));
	if (!daughter) {
	  Warning("Init", "daughter not found");
	  return kFALSE;
	}
    return kTRUE;
}

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

Bool_t PFixedProduction::SampleMass(void) {
    //Mass-sampling wrapper
    //mass=parent mass
    
    //check if we are in the allowed mass region
    if ((parent->M() < PData::LMass(d_id)) ||
	(parent->M() > PData::UMass(d_id))) return kFALSE;

    daughter->SetM(parent->M());

    return kTRUE;
};

Bool_t PFixedProduction::SampleMass(Double_t *mass, Int_t *) {
    //Not much to do here...
    //mass=parent mass
    
    mass[0]=parent_mass;
    
    return kTRUE;
};

Bool_t PFixedProduction::SampleMomentum(void) {

    daughter->SetPxPyPzE(0, 0, 0, daughter->M());

    return kTRUE;
};

ClassImp(PFixedProduction)
 PFixedProduction.cc:1
 PFixedProduction.cc:2
 PFixedProduction.cc:3
 PFixedProduction.cc:4
 PFixedProduction.cc:5
 PFixedProduction.cc:6
 PFixedProduction.cc:7
 PFixedProduction.cc:8
 PFixedProduction.cc:9
 PFixedProduction.cc:10
 PFixedProduction.cc:11
 PFixedProduction.cc:12
 PFixedProduction.cc:13
 PFixedProduction.cc:14
 PFixedProduction.cc:15
 PFixedProduction.cc:16
 PFixedProduction.cc:17
 PFixedProduction.cc:18
 PFixedProduction.cc:19
 PFixedProduction.cc:20
 PFixedProduction.cc:21
 PFixedProduction.cc:22
 PFixedProduction.cc:23
 PFixedProduction.cc:24
 PFixedProduction.cc:25
 PFixedProduction.cc:26
 PFixedProduction.cc:27
 PFixedProduction.cc:28
 PFixedProduction.cc:29
 PFixedProduction.cc:30
 PFixedProduction.cc:31
 PFixedProduction.cc:32
 PFixedProduction.cc:33
 PFixedProduction.cc:34
 PFixedProduction.cc:35
 PFixedProduction.cc:36
 PFixedProduction.cc:37
 PFixedProduction.cc:38
 PFixedProduction.cc:39
 PFixedProduction.cc:40
 PFixedProduction.cc:41
 PFixedProduction.cc:42
 PFixedProduction.cc:43
 PFixedProduction.cc:44
 PFixedProduction.cc:45
 PFixedProduction.cc:46
 PFixedProduction.cc:47
 PFixedProduction.cc:48
 PFixedProduction.cc:49
 PFixedProduction.cc:50
 PFixedProduction.cc:51
 PFixedProduction.cc:52
 PFixedProduction.cc:53
 PFixedProduction.cc:54
 PFixedProduction.cc:55
 PFixedProduction.cc:56
 PFixedProduction.cc:57
 PFixedProduction.cc:58
 PFixedProduction.cc:59
 PFixedProduction.cc:60
 PFixedProduction.cc:61
 PFixedProduction.cc:62
 PFixedProduction.cc:63
 PFixedProduction.cc:64
 PFixedProduction.cc:65
 PFixedProduction.cc:66
 PFixedProduction.cc:67
 PFixedProduction.cc:68
 PFixedProduction.cc:69
 PFixedProduction.cc:70
 PFixedProduction.cc:71
 PFixedProduction.cc:72
 PFixedProduction.cc:73
 PFixedProduction.cc:74
 PFixedProduction.cc:75
 PFixedProduction.cc:76
 PFixedProduction.cc:77
 PFixedProduction.cc:78
 PFixedProduction.cc:79
 PFixedProduction.cc:80
 PFixedProduction.cc:81
 PFixedProduction.cc:82
 PFixedProduction.cc:83
 PFixedProduction.cc:84
 PFixedProduction.cc:85
 PFixedProduction.cc:86
 PFixedProduction.cc:87
 PFixedProduction.cc:88
 PFixedProduction.cc:89
 PFixedProduction.cc:90
 PFixedProduction.cc:91
 PFixedProduction.cc:92
 PFixedProduction.cc:93
 PFixedProduction.cc:94
 PFixedProduction.cc:95
 PFixedProduction.cc:96
 PFixedProduction.cc:97
 PFixedProduction.cc:98
 PFixedProduction.cc:99
 PFixedProduction.cc:100
 PFixedProduction.cc:101
 PFixedProduction.cc:102