ROOT logo
#include "hparticlegeantdecay.h"


#include <vector>
#include <iostream>
#include <iomanip>
#include <algorithm>

using namespace std;

ClassImp(HParticleGeantDecay)

//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////////
//
//
// HParticleGeantDecay
//
// Simulation object keeping HGeant pointers mother and pointers to daughters and
// mother decays. For documentation of use case see the documentation of
// HParticleGeantEvent.
////////////////////////////////////////////////////////////////////////////////

HParticleGeantDecay::HParticleGeantDecay()
{
    clear();
}

HParticleGeantDecay::~HParticleGeantDecay()
{
    ;
}

Bool_t HParticleGeantDecay::isDaughterPID(Int_t pid)
{
    // return kTRUE if a daughters with the given id
    // is among the list of daughters.

    for(UInt_t i = 0; i < fdaughters.size(); i ++ ){
      if(fdaughters[i]->getID() == pid) return kTRUE;
    }
    return kFALSE;
}

Bool_t HParticleGeantDecay::isDaughterPID(vector<Int_t>& pids)
{
    // checks if all pids in vector
    // are contained in daughters. This function
    // can be used to make sure that a decay has all
    // all needed daughters in the list.
    // example : lambda -> p + piminus
    //           if both daughters should be in acceptance found
    //           one can ask with ids 14+9
    // example 2 :   pi0 -> e+ + e- + gamma
    //               2+3 will make sure both leptons are found

    if(fdaughters.size()==0 ) return kFALSE;
    vector<Int_t> ind;
    ind.assign(pids.size(),-1);

    for(UInt_t i  = 0; i < fdaughters.size(); i ++ ){
	for(UInt_t j  = 0; j < pids.size(); j ++ ){
	    if(fdaughters[i]->getID() == pids[j] && ind[j] < 0) {
		ind[j] = i;
                break;
	    }
	}
    }

    for(UInt_t j  = 0; j < ind.size(); j ++ ){
       if (ind[j] < 0 ) return kFALSE;
    }
    return kTRUE;
}

void HParticleGeantDecay::addDaughter(HGeantKine* d)
{
    // adds a daughter to the list of daughters
    // if the daughters is not already in the list
    if(!isDaughter(d)) fdaughters.push_back(d);
}

void  HParticleGeantDecay::sortDaughters()
{
    // sorts the daughters ascending by track number
    sort(fdaughters.begin(),fdaughters.end(),compareTrackNr);
}
Float_t  HParticleGeantDecay::getDistFromVertex(HGeomVector* primVer)
{
    // returns the distance of the decay from primary vertex (if provided)
    // otherwise the distance from 0,0,0 in mm

    if(!primVer){
	return fdecayVertex.length();
    } else {
	HGeomVector diff = *primVer - fdecayVertex;
        return diff.length();
    }
}

void HParticleGeantDecay::clear()
{
    // clears all internal variables
    fmother     = 0 ;
    fdaughters.clear();
    fgeneration = 0;
    fmotherDecay= 0;
    fdecayVertex.setXYZ(-1000,-1000,-1000);
}

Bool_t HParticleGeantDecay::isDaughter(HGeantKine* d)
{
    // return kTRUE if the particle is inside the list of
    // daughters of the decay
    if( find(fdaughters.begin(),fdaughters.end(),d) == fdaughters.end()) return kFALSE;
    else                                                                 return kTRUE;

}

Bool_t HParticleGeantDecay::isDaughter(vector<HGeantKine*> daughters)
{
    // returns kTRUE if all particles are found
    // in the list of daughters

    if(fdaughters.size()==0 ) return kFALSE;
    if(daughters.size() ==0 ) return kFALSE;

    for(UInt_t i  = 0; i < daughters.size(); i ++ ){
      if(!isDaughter(daughters[i])) return kFALSE;
    }
    return kTRUE;
}

void HParticleGeantDecay::print()
{
    // print some basic infos about the decay
    if(fmother) {
	cout<<"mother : generation "<<setw(3)<<fgeneration<< " ##################################"<<endl;
	cout<<"    mother     tr  "<<setw(5)<<fmother->getTrack()<<" parent tr "<<setw(5)<<fmother->getParentTrack()<<" id "<<setw(8)<<HPhysicsConstants::pid(fmother->getID())<<" vertex : "<<setw(10)<<fdecayVertex.X()<<" "<<setw(10)<<fdecayVertex.Y()<<" "<<setw(10)<<fdecayVertex.Z()<<endl;
	cout<<"               med "<<setw(4)<<getMedium()            <<" mechanism "<<setw(5)<<HPhysicsConstants::geantProcess(getMechanism())<<endl;
	cout<<"    generator info "<<setw(10)<<getGeneratorInfo()<<" info1 "<<setw(10)<<getGeneratorInfo1()<<" info2 "<<setw(10)<<getGeneratorInfo2()<<endl;
	for(UInt_t i=0;i<fdaughters.size(); i++){
	    HGeantKine* kine = fdaughters[i];
	    cout<<"    daughter "<<i<<" tr "<<setw(5)<<kine->getTrack()<<" parent tr "<<setw(5)<<kine->getParentTrack()<<" id "<<setw(8)<<HPhysicsConstants::pid(kine->getID())<<endl;
	}
    }
    if(fmotherDecay){
	cout<<"    parent Decay : generation "<<setw(3)<< fmotherDecay->getGeneration() <<" mother id "<<setw(8)<< (fmotherDecay->getMother() ? HPhysicsConstants::pid(fmotherDecay->getMotherID()): 0 )<<setw(5)<<" tr "<<(fmotherDecay->getMother() ? fmotherDecay->getMother()->getTrack(): 0 )<<endl;
    } else {
	cout<<"    parent Decay : none"<<endl;
    }
}
 hparticlegeantdecay.cc:1
 hparticlegeantdecay.cc:2
 hparticlegeantdecay.cc:3
 hparticlegeantdecay.cc:4
 hparticlegeantdecay.cc:5
 hparticlegeantdecay.cc:6
 hparticlegeantdecay.cc:7
 hparticlegeantdecay.cc:8
 hparticlegeantdecay.cc:9
 hparticlegeantdecay.cc:10
 hparticlegeantdecay.cc:11
 hparticlegeantdecay.cc:12
 hparticlegeantdecay.cc:13
 hparticlegeantdecay.cc:14
 hparticlegeantdecay.cc:15
 hparticlegeantdecay.cc:16
 hparticlegeantdecay.cc:17
 hparticlegeantdecay.cc:18
 hparticlegeantdecay.cc:19
 hparticlegeantdecay.cc:20
 hparticlegeantdecay.cc:21
 hparticlegeantdecay.cc:22
 hparticlegeantdecay.cc:23
 hparticlegeantdecay.cc:24
 hparticlegeantdecay.cc:25
 hparticlegeantdecay.cc:26
 hparticlegeantdecay.cc:27
 hparticlegeantdecay.cc:28
 hparticlegeantdecay.cc:29
 hparticlegeantdecay.cc:30
 hparticlegeantdecay.cc:31
 hparticlegeantdecay.cc:32
 hparticlegeantdecay.cc:33
 hparticlegeantdecay.cc:34
 hparticlegeantdecay.cc:35
 hparticlegeantdecay.cc:36
 hparticlegeantdecay.cc:37
 hparticlegeantdecay.cc:38
 hparticlegeantdecay.cc:39
 hparticlegeantdecay.cc:40
 hparticlegeantdecay.cc:41
 hparticlegeantdecay.cc:42
 hparticlegeantdecay.cc:43
 hparticlegeantdecay.cc:44
 hparticlegeantdecay.cc:45
 hparticlegeantdecay.cc:46
 hparticlegeantdecay.cc:47
 hparticlegeantdecay.cc:48
 hparticlegeantdecay.cc:49
 hparticlegeantdecay.cc:50
 hparticlegeantdecay.cc:51
 hparticlegeantdecay.cc:52
 hparticlegeantdecay.cc:53
 hparticlegeantdecay.cc:54
 hparticlegeantdecay.cc:55
 hparticlegeantdecay.cc:56
 hparticlegeantdecay.cc:57
 hparticlegeantdecay.cc:58
 hparticlegeantdecay.cc:59
 hparticlegeantdecay.cc:60
 hparticlegeantdecay.cc:61
 hparticlegeantdecay.cc:62
 hparticlegeantdecay.cc:63
 hparticlegeantdecay.cc:64
 hparticlegeantdecay.cc:65
 hparticlegeantdecay.cc:66
 hparticlegeantdecay.cc:67
 hparticlegeantdecay.cc:68
 hparticlegeantdecay.cc:69
 hparticlegeantdecay.cc:70
 hparticlegeantdecay.cc:71
 hparticlegeantdecay.cc:72
 hparticlegeantdecay.cc:73
 hparticlegeantdecay.cc:74
 hparticlegeantdecay.cc:75
 hparticlegeantdecay.cc:76
 hparticlegeantdecay.cc:77
 hparticlegeantdecay.cc:78
 hparticlegeantdecay.cc:79
 hparticlegeantdecay.cc:80
 hparticlegeantdecay.cc:81
 hparticlegeantdecay.cc:82
 hparticlegeantdecay.cc:83
 hparticlegeantdecay.cc:84
 hparticlegeantdecay.cc:85
 hparticlegeantdecay.cc:86
 hparticlegeantdecay.cc:87
 hparticlegeantdecay.cc:88
 hparticlegeantdecay.cc:89
 hparticlegeantdecay.cc:90
 hparticlegeantdecay.cc:91
 hparticlegeantdecay.cc:92
 hparticlegeantdecay.cc:93
 hparticlegeantdecay.cc:94
 hparticlegeantdecay.cc:95
 hparticlegeantdecay.cc:96
 hparticlegeantdecay.cc:97
 hparticlegeantdecay.cc:98
 hparticlegeantdecay.cc:99
 hparticlegeantdecay.cc:100
 hparticlegeantdecay.cc:101
 hparticlegeantdecay.cc:102
 hparticlegeantdecay.cc:103
 hparticlegeantdecay.cc:104
 hparticlegeantdecay.cc:105
 hparticlegeantdecay.cc:106
 hparticlegeantdecay.cc:107
 hparticlegeantdecay.cc:108
 hparticlegeantdecay.cc:109
 hparticlegeantdecay.cc:110
 hparticlegeantdecay.cc:111
 hparticlegeantdecay.cc:112
 hparticlegeantdecay.cc:113
 hparticlegeantdecay.cc:114
 hparticlegeantdecay.cc:115
 hparticlegeantdecay.cc:116
 hparticlegeantdecay.cc:117
 hparticlegeantdecay.cc:118
 hparticlegeantdecay.cc:119
 hparticlegeantdecay.cc:120
 hparticlegeantdecay.cc:121
 hparticlegeantdecay.cc:122
 hparticlegeantdecay.cc:123
 hparticlegeantdecay.cc:124
 hparticlegeantdecay.cc:125
 hparticlegeantdecay.cc:126
 hparticlegeantdecay.cc:127
 hparticlegeantdecay.cc:128
 hparticlegeantdecay.cc:129
 hparticlegeantdecay.cc:130
 hparticlegeantdecay.cc:131
 hparticlegeantdecay.cc:132
 hparticlegeantdecay.cc:133
 hparticlegeantdecay.cc:134
 hparticlegeantdecay.cc:135
 hparticlegeantdecay.cc:136
 hparticlegeantdecay.cc:137
 hparticlegeantdecay.cc:138
 hparticlegeantdecay.cc:139
 hparticlegeantdecay.cc:140
 hparticlegeantdecay.cc:141
 hparticlegeantdecay.cc:142
 hparticlegeantdecay.cc:143
 hparticlegeantdecay.cc:144
 hparticlegeantdecay.cc:145
 hparticlegeantdecay.cc:146
 hparticlegeantdecay.cc:147
 hparticlegeantdecay.cc:148
 hparticlegeantdecay.cc:149
 hparticlegeantdecay.cc:150
 hparticlegeantdecay.cc:151
 hparticlegeantdecay.cc:152