source: trunk/source/event/src/G4GeneralParticleSource.cc @ 1202

Last change on this file since 1202 was 816, checked in by garnier, 16 years ago

import all except CVS

File size: 6.8 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26///////////////////////////////////////////////////////////////////////////////
27//
28// MODULE:       G4GeneralParticleSource.cc
29//
30// Version:      2.0
31// Date:         5/02/04
32// Author:       Fan Lei
33// Organisation: QinetiQ ltd.
34// Customer:     ESA/ESTEC
35//
36// Documentation avaialable at http://reat.space.qinetiq.com/gps
37//   These include:
38//       User Requirement Document (URD)
39//       Software Specification Documents (SSD)
40//       Software User Manual (SUM): on-line version available
41//       Technical Note (TN) on the physics and algorithms
42//
43///////////////////////////////////////////////////////////////////////////////
44//
45// CHANGE HISTORY
46// --------------
47//
48// Version 2.0, 05/02/2004, Fan Lei, Created.
49//    After changes to version 1.1 as in Geant4 v6.0
50//     - Mutilple particle source definition
51//     - Re-structured commands
52//     - Split the task into smaller classes
53//
54//     - old commonds have been retained for backward compatibility, will be
55//       removed in the future.
56//
57//
58///////////////////////////////////////////////////////////////////////////////
59//
60#include "G4Event.hh"
61#include "Randomize.hh"
62#include "G4GeneralParticleSource.hh"
63
64G4GeneralParticleSource::G4GeneralParticleSource()
65  : multiple_vertex(false), flat_sampling(false), weight_change(1.)
66{
67  sourceVector.clear();
68  sourceIntensity.clear();
69  sourceProbability.clear();
70  currentSource = new G4SingleParticleSource();
71  sourceVector.push_back(currentSource);
72  sourceIntensity.push_back(1.);
73  currentSourceIdx = G4int(sourceVector.size() - 1);
74  theMessenger = new G4GeneralParticleSourceMessenger(this);
75  theMessenger->SetParticleGun(currentSource);
76  IntensityNormalization();
77}
78 
79G4GeneralParticleSource::~G4GeneralParticleSource()
80{
81  delete theMessenger;
82}
83
84void G4GeneralParticleSource::AddaSource(G4double aV)
85{
86  currentSource = new G4SingleParticleSource();
87  theMessenger->SetParticleGun(currentSource);
88  sourceVector.push_back(currentSource);
89  sourceIntensity.push_back(aV);
90  currentSourceIdx = G4int(sourceVector.size() - 1);
91  IntensityNormalization();
92}
93
94void G4GeneralParticleSource::IntensityNormalization()
95{
96  G4double total  = 0.;
97  size_t i = 0 ;
98  for (i = 0; i < sourceIntensity.size(); i++) 
99    total += sourceIntensity[i] ;
100  //
101  sourceProbability.clear();
102  std::vector <G4double> sourceNormalizedIntensity;
103  sourceNormalizedIntensity.clear();
104
105  sourceNormalizedIntensity.push_back(sourceIntensity[0]/total);
106  sourceProbability.push_back(sourceNormalizedIntensity[0]);
107
108  for ( i = 1 ;  i < sourceIntensity.size(); i++) {
109    sourceNormalizedIntensity.push_back(sourceIntensity[i]/total);
110    sourceProbability.push_back(sourceNormalizedIntensity[i] + sourceProbability[i-1]);
111  }
112
113  // set source weights here based on sampling scheme (analog/flat) and intensities
114  for ( i = 0 ;  i < sourceIntensity.size(); i++) {
115    if (!flat_sampling) {
116      sourceVector[i]->GetBiasRndm()->SetIntensityWeight(1.);
117    } else {
118      sourceVector[i]->GetBiasRndm()->SetIntensityWeight(sourceNormalizedIntensity[i]*sourceIntensity.size());
119    }
120  }
121
122  normalised = true;
123} 
124
125void G4GeneralParticleSource::ListSource()
126{
127  G4cout << " The number of particle sources is " << sourceIntensity.size() << G4endl;
128  for (size_t i = 0 ; i < sourceIntensity.size(); i++)
129    G4cout << "   source " << i << " intensity is " << sourceIntensity[i] << G4endl;
130}
131
132void G4GeneralParticleSource::SetCurrentSourceto(G4int aV)
133{
134  size_t id = size_t (aV) ;
135  if ( id <= sourceIntensity.size() ) {
136    currentSourceIdx = aV;
137    currentSource = sourceVector[id];
138    theMessenger->SetParticleGun(currentSource);
139    //
140  } else {
141    G4cout << " source index is invalid " << G4endl;
142    G4cout << "    it shall be <= " << sourceIntensity.size() << G4endl;
143  }
144}
145
146void G4GeneralParticleSource::SetCurrentSourceIntensity(G4double aV)
147{
148  sourceIntensity[currentSourceIdx] = aV;
149  normalised = false;
150}
151
152void G4GeneralParticleSource::ClearAll()
153{
154  currentSourceIdx = -1;
155  currentSource = 0;
156  sourceVector.clear();
157  sourceIntensity.clear();
158  sourceProbability.clear();
159}
160
161void G4GeneralParticleSource::DeleteaSource(G4int aV)
162{
163  size_t id = size_t (aV) ;
164  if ( id <= sourceIntensity.size() ) {
165    sourceVector.erase(sourceVector.begin()+aV);
166    sourceIntensity.erase(sourceIntensity.begin()+aV);
167    normalised = false ;
168    if (currentSourceIdx == aV ) { 
169        if ( sourceIntensity.size() > 0 ) { 
170          currentSource = sourceVector[0];
171          currentSourceIdx = 1;
172        } else {
173          currentSource = 0;
174          currentSourceIdx = -1;
175        }
176    }                   
177  } else {
178    G4cout << " source index is invalid " << G4endl;
179    G4cout << "    it shall be <= " << sourceIntensity.size() << G4endl;
180  }
181} 
182
183void G4GeneralParticleSource::GeneratePrimaryVertex(G4Event* evt)
184{
185  if (!multiple_vertex){
186    if (sourceIntensity.size() > 1) {
187      if (!normalised) IntensityNormalization();
188      G4double rndm = G4UniformRand();
189      size_t i = 0 ;
190      if (!flat_sampling) {
191        while ( rndm > sourceProbability[i] ) i++;
192        (currentSource = sourceVector[i]);
193      } else {
194        i = size_t (sourceIntensity.size()*rndm);
195        currentSource = sourceVector[i];
196      }
197    }
198    currentSource-> GeneratePrimaryVertex(evt);
199  } 
200  else {
201    for (size_t i = 0; i <  sourceIntensity.size(); i++) {
202      sourceVector[i]->GeneratePrimaryVertex(evt); 
203    }
204  }
205}
Note: See TracBrowser for help on using the repository browser.