/////////////////////////////////////////////////////////////////////
//
//
//
//                                  Author:  I. Froehlich
/////////////////////////////////////////////////////////////////////


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

#include "PFixedDecay.h"

PFixedDecay::PFixedDecay()  {
};

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

    if (is_channel<0)
	Warning("PFixedDecay", "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);

    n_daughters = tid[0];
    if (n_daughters > MAX_FIXED_NUM) {
	Warning("PFixedDecay", "n_daughters>MAX_FIXED_NUM");
    }

    parent = NULL;
    for (int i=0; i<n_daughters; i++) {
	dmass[i]    = makeStaticData()->GetParticleMass(tid[i+1]);
	d_id[i]     = tid[i+1];
	daughter[i] = NULL;
    }

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

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

Bool_t PFixedDecay::Init(void) {
    //Init function called once for each PChannel
    
    parent = GetParticle("parent");
    if (!parent) {
	Warning("Init", "Parent not found");
	return kFALSE;
    }
 
    for (int i=0; i<n_daughters; i++) {
	daughter[i]=GetParticle(makeStaticData()->GetParticleName(d_id[i]));
	if (!daughter[i]) {
	    Warning("Init", "daughters not found");
	    return kFALSE;
	}
    }
    
    return kTRUE;
}

int PFixedDecay::GetDepth(int) {
    
    double mymin = 0.;
    for (int i=1; i<=n_daughters; i++) {
	mymin+=dmass[i-1];
    }

    makeStaticData()->SetDecayEmin(is_channel, mymin);
    return 0; //stable products -> depth is 0
}

Bool_t PFixedDecay::SampleMass(void) {
    //Mass-sampling wrapper

    for (int i=0; i<n_daughters; i++) {
	daughter[i]->SetM(dmass[i]);
    }

    return kTRUE;
};

Bool_t PFixedDecay::SampleMass(Double_t *mass, Int_t *) {
    //Not much to do here...
    //Since we have 2 stable products, for completeness
    //we reset the masses to the nominal value

    for (int i=1; i<=n_daughters; i++) {
	mass[i] = dmass[i-1];
    }
    return kTRUE;
};


Bool_t PFixedDecay::GetWidth(Double_t mass, Double_t *width, Int_t) {
    //Returns the fixed width for stable parents
    //and the p.s. for the decay unstable -> stable stable
    //decays > 2 body are not supported yet

    if ((n_daughters>2) || (makeStaticData()->GetParticleTotalWidth(parent_id) <  
			    (*unstable_width )) ) {
	*width = makeStaticData()->GetDecayPartialWidth(is_channel);
	return kTRUE;
    } 

    double pCms      = PKinematics::pcms(mass, dmass[0], dmass[1]);
    double pole_pCms = PKinematics::pcms(parent_mass, dmass[0], dmass[1]);

    *width = (pCms/pole_pCms) * makeStaticData()->GetDecayPartialWidth(is_channel);
    return kTRUE;
};

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