Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4MoleculeCounter.cc
Go to the documentation of this file.
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 // $Id: G4MoleculeCounter.cc 65022 2012-11-12 16:43:12Z gcosmo $
27 //
28 #include "G4MoleculeCounter.hh"
29 #include "G4UIcommand.hh"
30 #include "G4UnitsTable.hh"
31 #include <iomanip>
32 
34 
36 {
37  fUse = FALSE;
38  fVerbose = 0 ;
39 }
40 
42 
44 {
45  if(!fpInstance)
47 
48  return fpInstance;
49 }
50 
52 {
53  if(fpInstance)
54  {
55  delete fpInstance;
56  fpInstance = 0;
57  }
58 }
59 
61 {
62  if(fVerbose > 1)
63  {
64  G4cout<<"G4MoleculeCounter::AddAMoleculeAtTime : "<< molecule.GetName()
65  << " at time : " << G4BestUnit(time, "Time") <<G4endl;
66  }
67 
68  if(fDontRegister[molecule.GetDefinition()]) return ;
69 
70  // G4double pstime = time/picosecond;
71  //
72  // G4double fractpart=-1, intpart=-1;
73  // fractpart = modf (pstime , &intpart);
74  //
75  // if(pstime<10.1)
76  // {
77  // fractpart *= 10 ;
78  // fractpart = floor(fractpart)/10;
79  // pstime = intpart+fractpart;
80  // }
81  //
82  // else
83  // {
84  // pstime = intpart;
85  // }
86  // time = pstime*picosecond ;
87 
88  if(fVerbose)
89  {
90  G4cout<<"-------------------------"<<G4endl ;
91  G4cout << "G4MoleculeCounter::AddAMoleculeAtTime " << G4endl;
92  G4cout<<"!! Molecule = " << molecule.GetName() << G4endl;
93  G4cout<<"!! At Time = "<< G4BestUnit(time, "Time") <<G4endl;
94  }
95 
96  CounterMapType::iterator counterMap_i = fCounterMap.find(molecule) ;
97 
98  if(counterMap_i == fCounterMap.end())
99  {
100  if(fVerbose) G4cout << " !! ***** Map is empty " << G4endl;
101  fCounterMap[molecule][time] = 1;
102  }
103  else if(counterMap_i->second.empty())
104  {
105  if(fVerbose) G4cout << " !! ***** Map is empty " << G4endl;
106  counterMap_i->second[time] = 1;
107  }
108  else
109  {
110  NbMoleculeAgainstTime::iterator end = counterMap_i->second.end();
111  end--;
112 
113  if(fVerbose)
114  G4cout<<"!! End Time = "<< G4BestUnit(end->first, "Time") <<G4endl;
115 
116  if(end->first <= time)
117  {
118  counterMap_i->second[time]=end->second + 1;
119  }
120  else
121  {
122  NbMoleculeAgainstTime::iterator it = counterMap_i->second.lower_bound(time);
123 
124  while(it->first > time && it!=counterMap_i->second.begin())
125  {
126  if(fVerbose)
127  G4cout<<"!! ********** Is going back!!!!"<<G4endl;
128  it--;
129  }
130 
131  if(it==counterMap_i->second.begin() && it->first > time)
132  {
133  if(fVerbose)
134  G4cout<<"!! ********** Illegal !!!!"<<G4endl;
135  return ;
136  }
137 
138  if(fVerbose)
139  {
140  G4cout<<"!! PREVIOUS NB = "<< it->second <<G4endl;
141  G4cout<<"!! PREVIOUS TIME = "<< G4BestUnit(it->first,"Time") <<G4endl;
142  }
143  counterMap_i->second[time]=it->second + 1;
144  }
145  }
146 
147  if(fVerbose)
148  G4cout<<"!! NB = "<< fCounterMap[molecule][time]<<G4endl;
149 }
150 
152 {
153  if(fVerbose > 1)
154  {
155  G4cout<<"-------------------------"<<G4endl ;
156  G4cout<<"G4MoleculeCounter::RemoveAMoleculeAtTime : "<< molecule.GetName()
157  << " at time : " << G4BestUnit(time,"Time") <<G4endl;
158  G4cout<<"-------------------------"<<G4endl ;
159  }
160 
161  if(fDontRegister[molecule.GetDefinition()]) return ;
162 
163  NbMoleculeAgainstTime& nbMolPerTime = fCounterMap[molecule];
164 
165  if(nbMolPerTime.empty())
166  {
167  molecule.PrintState();
168  G4String errMsg = "You are trying to remove molecule "
169  + molecule.GetName()
170  +" from the counter while this kind of molecules has not been registered yet";
171  G4Exception("G4MoleculeCounter::RemoveAMoleculeAtTime","",FatalErrorInArgument, errMsg);
172 
173  return;
174  }
175  else
176  {
177  NbMoleculeAgainstTime::iterator it ;
178 
179  if(nbMolPerTime.size() == 1)
180  {
181  it = nbMolPerTime.begin() ;
182  if(fVerbose)
183  G4cout << "!! fCounterMap[molecule].size() == 1" << G4endl;
184  }
185  else
186  {
187  it = nbMolPerTime.lower_bound(time);
188  }
189 
190  if(it==nbMolPerTime.end())
191  {
192  if(fVerbose)
193  G4cout << " ********** NO ITERATOR !!!!!!!!! " << G4endl;
194  it--;
195 
196  if(time<it->first)
197  {
198  G4String errMsg = "There was no "+ molecule.GetName()
199  + " record at the time or even before the time asked";
200  G4Exception("G4MoleculeCounter::RemoveAMoleculeAtTime","",FatalErrorInArgument, errMsg);
201  }
202  }
203 
204  if(fVerbose)
205  {
206 // G4cout << "G4MoleculeCounter::RemoveAMoleculeAtTime " << G4endl;
207  G4cout<<"!! Molecule = " << molecule.GetName() << G4endl;
208  G4cout<<"!! At Time = "<< G4BestUnit(time,"Time") <<G4endl;
209  G4cout<<"!! PREVIOUS TIME = "<< G4BestUnit(it->first,"Time")<<G4endl;
210  G4cout<<"!! PREVIOUS Nb = "<< it->second <<G4endl;
211  }
212 
213  // If valgrind problem on the line below, it means that the pointer "it"
214  // points nowhere
215  if(nbMolPerTime.value_comp()(*it, *nbMolPerTime.begin()))
216  {
217  if(fVerbose)
218  G4cout<<"!! ***** In value_comp ... " << G4endl;
219  it++;
220  if(time<it->first)
221  {
222  G4String errMsg = "There was no "+ molecule.GetName()
223  + " record at the time or even before the time asked";
224  G4Exception("G4MoleculeCounter::RemoveAMoleculeAtTime","",FatalErrorInArgument, errMsg);
225  }
226  }
227 
228  while(it->first - time > compDoubleWithPrecision::fPrecision && it!=nbMolPerTime.begin())
229  {
230  if(fVerbose)
231  {
232  G4cout<<"!! ***** Is going back!!!!"<<G4endl;
233  G4cout<<"!! PREVIOUS TIME = "<< G4BestUnit(it-> first,"Time") <<G4endl;
234  }
235  it--;
236  }
237 
238  if(it==nbMolPerTime.begin() && it->first > time)
239  {
240  if(fVerbose)
241  G4cout<<"!! ********** Illegal !!!!"<<G4endl;
242  return ;
243  }
244 
245  if(fVerbose)
246  {
247  G4cout<<"!! PREVIOUS NB = "<< (*it).second <<G4endl;
248  G4cout<<"!! PREVIOUS TIME = "<< G4BestUnit(it->first,"Time")<<G4endl;
249  }
250  nbMolPerTime[time]=it->second - 1;
251  }
252  if(fVerbose)
253  {
254  G4cout<<"!! NB = "<< nbMolPerTime[time]<<G4endl;
255  }
256 }
257 
258 std::auto_ptr<vector<G4Molecule> > G4MoleculeCounter::GetRecordedMolecules()
259 {
260  if(fVerbose > 1)
261  {
262  G4cout<<"Entering in G4MoleculeCounter::RecordMolecules"<<G4endl;
263  }
264 
265  CounterMapType::iterator it;
266  std::auto_ptr< vector<G4Molecule> > output (new vector<G4Molecule>) ;
267 
268  for(it = fCounterMap.begin() ; it != fCounterMap.end() ; it++)
269  {
270  output->push_back((*it).first);
271  }
272  return output;
273 }
274