//____________________________________________________________________
//
// HEP particle used in Monte Carlo simulations
// 

//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: HepMCParticle.cxx,v 1.10 2010/08/02 09:17:20 herrberg Exp $
// Copyright: 2008 (C) Oliver Maria Kind
//
#ifndef HEP_HepMCParticle
#include <HepMCParticle.h>
#endif
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(HepMCParticle);
#endif

//____________________________________________________________________

HepMCParticle::HepMCParticle() {
    //
    // Default constructor
    //
    fMothers     = new TRefArray;
    fDaughters   = new TRefArray;
    fStartVertex = new TRef;
    fDecayVertex = new TRef;
}

//____________________________________________________________________

HepMCParticle::HepMCParticle(Int_t Id, Int_t PdgCode,
			     Float_t Px, Float_t Py,Float_t Pz,
			     Float_t E, Int_t MCStatus,
			     Bool_t IsGenerator,
			     Bool_t IsGenNonInteracting,
			     Bool_t IsGenStable,
			     Bool_t IsGenSimulStable,
			     Bool_t IsGenInteracting,
			     Bool_t IsConversion,
			     Bool_t IsBremsstrahlung ) :
    HepParticle(Id, Px, Py, Pz, E, PdgCode),
    fMCStatus(MCStatus),
    fIsGenerator(IsGenerator),
    fIsGenNonInteracting(IsGenNonInteracting),
    fIsGenStable(IsGenStable),
    fIsGenSimulStable(IsGenSimulStable),
    fIsGenInteracting(IsGenInteracting),
    fIsConversion(IsConversion),
    fIsBremsstrahlung(IsBremsstrahlung) {
    //
    // Normal constructor
    //
    fDaughters   = new TRefArray;
    fMothers     = new TRefArray;
    fStartVertex = new TRef;
    fDecayVertex = new TRef;
}

//____________________________________________________________________

HepMCParticle::~HepMCParticle() {
    //
    // Default destructor
    //
    delete fDaughters;   fDaughters = 0;
    delete fMothers;     fMothers = 0;
    delete fStartVertex; fStartVertex = 0;
    delete fDecayVertex; fDecayVertex = 0;
}

//____________________________________________________________________

void HepMCParticle::Clear(Option_t *option) {
    //
    // Clear object
    //
    HepParticle::Clear(option);
    delete fMothers;  fMothers = 0;
    delete fDaughters; fDaughters = 0;
    delete fStartVertex; fStartVertex = 0;
    delete fDecayVertex; fDecayVertex = 0;
    fIsGenerator = 0;
    fIsGenNonInteracting = 0;
    fIsGenStable = 0;
    fIsGenSimulStable = 0;
    fIsGenInteracting = 0;
    fIsConversion = 0;
    fIsBremsstrahlung = 0;
}

//____________________________________________________________________

void HepMCParticle::Print(Option_t *option) {
    //
    // Print object information
    //
    // Options available:
    //   "nohead" - No header containing the variable names is
    //              displayed. Useful when printing a whole table
    //              for a list of particles
    //
    TString opt = option;
    opt.ToLower();

    // Header
    if ( !opt.Contains("nohead") ) PrintHeader();

    // Main
    cout.setf(ios::showpoint | ios::fixed, ios::floatfield);
    cout.width(4); cout << fId;
    cout.width(12);  cout << GetPdgName();
    cout.precision(3);
    cout.width(12); cout << fP.E();
    cout.width(12); cout << fP.P();
    cout.width(12); cout << fP.Pt();
    cout.width(12); cout << fP.Theta()*180/TMath::Pi();
    cout.width(12); cout << fP.Phi()*180/TMath::Pi();
    if ( fP.Pt() != 0. ) {
	cout.width(12); cout << fP.Eta();
    } else {
	if ( fP.Pz() > 0. ) {
	    cout << "    infinity";
	} else {
	    cout << "   -infinity";
	}
    }
    cout.width(10); cout << fIsGenerator;
    cout.width(1); cout << fIsGenInteracting;
    cout.width(1); cout << fIsGenNonInteracting;
    cout.width(1); cout << fIsGenSimulStable;
    cout.width(1); cout << fIsGenStable;
    cout << endl;
    
    // Footer
    if ( !opt.Contains("nohead") ) PrintFooter();
}

//____________________________________________________________________

void HepMCParticle::PrintHeader() {
    //
    // Print information header
    //
    //
    // GINUS denotes (in this order):
    //
    // IsGenerator()
    // IsGenInteracting()
    // IsGenNonInteracting()
    // IsGenSimulStable()
    // IsGenStable()
    //
    cout << "---------------------------------------------------------------------------------------------------------" << endl
         << " Id     Type            E           P           Pt         Theta       Phi          Eta          GINUS   " << endl
         << "---------------------------------------------------------------------------------------------------------" << endl; 
}

//____________________________________________________________________

void HepMCParticle::PrintFooter() {
    //
    // Print footer
    //
    cout << "---------------------------------------------------------------------------------------------------------" << endl;
}

//____________________________________________________________________

Bool_t HepMCParticle::IsGoodMother(){
    //
    // True if particle does not give birth to a particle of the same kind
    // (and has a daughter)
    //
    
    if (!fDaughters->GetEntries()) {return kFALSE;}

    HepParticle *Daughter;
    Daughter=(HepParticle*)fDaughters->At(0);
    
    if ( this->GetPdgCode() == Daughter->GetPdgCode() ) {return kFALSE;}    
    return kTRUE;
}

//____________________________________________________________________


Double_t HepMCParticle::GetBremsLoss() {
    //
    // return the lost energy of the particle due to Bremsstrahlung.
    // that means: find all it's mothers of the same kind (e.g. electrons)
    // and find corresponding photons. sum the energy of these photons.
    //

    Double_t Bremsstrahlung=0;
    HepMCParticle *Mother;
    HepMCParticle *PhotonCandidate;

    if ( !fMothers->GetEntries() ) { return 0.;}
    
    Mother=(HepMCParticle*)fMothers->At(0);
    
    while ( Mother->GetPdgCode() == fPdgCode ){

	for ( Int_t i=1; i<Mother->GetN_Daughters() ; i++ ){
	    PhotonCandidate=(HepMCParticle*)Mother->GetDaughters()->At(i);
	    if ( PhotonCandidate->IsPhoton() ){ Bremsstrahlung+=PhotonCandidate->E(); }
	}

	if ( Mother->GetN_Mothers() ) { Mother=Mother->GetMother(); }
	else { return Bremsstrahlung; }
	
    }
    
    return Bremsstrahlung;

}
 HepMCParticle.cxx:1
 HepMCParticle.cxx:2
 HepMCParticle.cxx:3
 HepMCParticle.cxx:4
 HepMCParticle.cxx:5
 HepMCParticle.cxx:6
 HepMCParticle.cxx:7
 HepMCParticle.cxx:8
 HepMCParticle.cxx:9
 HepMCParticle.cxx:10
 HepMCParticle.cxx:11
 HepMCParticle.cxx:12
 HepMCParticle.cxx:13
 HepMCParticle.cxx:14
 HepMCParticle.cxx:15
 HepMCParticle.cxx:16
 HepMCParticle.cxx:17
 HepMCParticle.cxx:18
 HepMCParticle.cxx:19
 HepMCParticle.cxx:20
 HepMCParticle.cxx:21
 HepMCParticle.cxx:22
 HepMCParticle.cxx:23
 HepMCParticle.cxx:24
 HepMCParticle.cxx:25
 HepMCParticle.cxx:26
 HepMCParticle.cxx:27
 HepMCParticle.cxx:28
 HepMCParticle.cxx:29
 HepMCParticle.cxx:30
 HepMCParticle.cxx:31
 HepMCParticle.cxx:32
 HepMCParticle.cxx:33
 HepMCParticle.cxx:34
 HepMCParticle.cxx:35
 HepMCParticle.cxx:36
 HepMCParticle.cxx:37
 HepMCParticle.cxx:38
 HepMCParticle.cxx:39
 HepMCParticle.cxx:40
 HepMCParticle.cxx:41
 HepMCParticle.cxx:42
 HepMCParticle.cxx:43
 HepMCParticle.cxx:44
 HepMCParticle.cxx:45
 HepMCParticle.cxx:46
 HepMCParticle.cxx:47
 HepMCParticle.cxx:48
 HepMCParticle.cxx:49
 HepMCParticle.cxx:50
 HepMCParticle.cxx:51
 HepMCParticle.cxx:52
 HepMCParticle.cxx:53
 HepMCParticle.cxx:54
 HepMCParticle.cxx:55
 HepMCParticle.cxx:56
 HepMCParticle.cxx:57
 HepMCParticle.cxx:58
 HepMCParticle.cxx:59
 HepMCParticle.cxx:60
 HepMCParticle.cxx:61
 HepMCParticle.cxx:62
 HepMCParticle.cxx:63
 HepMCParticle.cxx:64
 HepMCParticle.cxx:65
 HepMCParticle.cxx:66
 HepMCParticle.cxx:67
 HepMCParticle.cxx:68
 HepMCParticle.cxx:69
 HepMCParticle.cxx:70
 HepMCParticle.cxx:71
 HepMCParticle.cxx:72
 HepMCParticle.cxx:73
 HepMCParticle.cxx:74
 HepMCParticle.cxx:75
 HepMCParticle.cxx:76
 HepMCParticle.cxx:77
 HepMCParticle.cxx:78
 HepMCParticle.cxx:79
 HepMCParticle.cxx:80
 HepMCParticle.cxx:81
 HepMCParticle.cxx:82
 HepMCParticle.cxx:83
 HepMCParticle.cxx:84
 HepMCParticle.cxx:85
 HepMCParticle.cxx:86
 HepMCParticle.cxx:87
 HepMCParticle.cxx:88
 HepMCParticle.cxx:89
 HepMCParticle.cxx:90
 HepMCParticle.cxx:91
 HepMCParticle.cxx:92
 HepMCParticle.cxx:93
 HepMCParticle.cxx:94
 HepMCParticle.cxx:95
 HepMCParticle.cxx:96
 HepMCParticle.cxx:97
 HepMCParticle.cxx:98
 HepMCParticle.cxx:99
 HepMCParticle.cxx:100
 HepMCParticle.cxx:101
 HepMCParticle.cxx:102
 HepMCParticle.cxx:103
 HepMCParticle.cxx:104
 HepMCParticle.cxx:105
 HepMCParticle.cxx:106
 HepMCParticle.cxx:107
 HepMCParticle.cxx:108
 HepMCParticle.cxx:109
 HepMCParticle.cxx:110
 HepMCParticle.cxx:111
 HepMCParticle.cxx:112
 HepMCParticle.cxx:113
 HepMCParticle.cxx:114
 HepMCParticle.cxx:115
 HepMCParticle.cxx:116
 HepMCParticle.cxx:117
 HepMCParticle.cxx:118
 HepMCParticle.cxx:119
 HepMCParticle.cxx:120
 HepMCParticle.cxx:121
 HepMCParticle.cxx:122
 HepMCParticle.cxx:123
 HepMCParticle.cxx:124
 HepMCParticle.cxx:125
 HepMCParticle.cxx:126
 HepMCParticle.cxx:127
 HepMCParticle.cxx:128
 HepMCParticle.cxx:129
 HepMCParticle.cxx:130
 HepMCParticle.cxx:131
 HepMCParticle.cxx:132
 HepMCParticle.cxx:133
 HepMCParticle.cxx:134
 HepMCParticle.cxx:135
 HepMCParticle.cxx:136
 HepMCParticle.cxx:137
 HepMCParticle.cxx:138
 HepMCParticle.cxx:139
 HepMCParticle.cxx:140
 HepMCParticle.cxx:141
 HepMCParticle.cxx:142
 HepMCParticle.cxx:143
 HepMCParticle.cxx:144
 HepMCParticle.cxx:145
 HepMCParticle.cxx:146
 HepMCParticle.cxx:147
 HepMCParticle.cxx:148
 HepMCParticle.cxx:149
 HepMCParticle.cxx:150
 HepMCParticle.cxx:151
 HepMCParticle.cxx:152
 HepMCParticle.cxx:153
 HepMCParticle.cxx:154
 HepMCParticle.cxx:155
 HepMCParticle.cxx:156
 HepMCParticle.cxx:157
 HepMCParticle.cxx:158
 HepMCParticle.cxx:159
 HepMCParticle.cxx:160
 HepMCParticle.cxx:161
 HepMCParticle.cxx:162
 HepMCParticle.cxx:163
 HepMCParticle.cxx:164
 HepMCParticle.cxx:165
 HepMCParticle.cxx:166
 HepMCParticle.cxx:167
 HepMCParticle.cxx:168
 HepMCParticle.cxx:169
 HepMCParticle.cxx:170
 HepMCParticle.cxx:171
 HepMCParticle.cxx:172
 HepMCParticle.cxx:173
 HepMCParticle.cxx:174
 HepMCParticle.cxx:175
 HepMCParticle.cxx:176
 HepMCParticle.cxx:177
 HepMCParticle.cxx:178
 HepMCParticle.cxx:179
 HepMCParticle.cxx:180
 HepMCParticle.cxx:181
 HepMCParticle.cxx:182
 HepMCParticle.cxx:183
 HepMCParticle.cxx:184
 HepMCParticle.cxx:185
 HepMCParticle.cxx:186
 HepMCParticle.cxx:187
 HepMCParticle.cxx:188
 HepMCParticle.cxx:189
 HepMCParticle.cxx:190
 HepMCParticle.cxx:191
 HepMCParticle.cxx:192
 HepMCParticle.cxx:193
 HepMCParticle.cxx:194
 HepMCParticle.cxx:195
 HepMCParticle.cxx:196
 HepMCParticle.cxx:197
 HepMCParticle.cxx:198
 HepMCParticle.cxx:199
 HepMCParticle.cxx:200
 HepMCParticle.cxx:201
 HepMCParticle.cxx:202
 HepMCParticle.cxx:203
 HepMCParticle.cxx:204
 HepMCParticle.cxx:205
 HepMCParticle.cxx:206
 HepMCParticle.cxx:207
 HepMCParticle.cxx:208
 HepMCParticle.cxx:209
 HepMCParticle.cxx:210
 HepMCParticle.cxx:211
 HepMCParticle.cxx:212
 HepMCParticle.cxx:213
 HepMCParticle.cxx:214
 HepMCParticle.cxx:215
 HepMCParticle.cxx:216
 HepMCParticle.cxx:217
 HepMCParticle.cxx:218
 HepMCParticle.cxx:219
 HepMCParticle.cxx:220
 HepMCParticle.cxx:221