Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4ITModelProcessor.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: G4ITModelProcessor.cc 64057 2012-10-30 15:04:49Z gcosmo $
27 //
28 // Author: Mathieu Karamitros (kara (AT) cenbg . in2p3 . fr)
29 //
30 // History:
31 // -----------
32 // 10 Oct 2011 M.Karamitros created
33 //
34 // -------------------------------------------------------------------
35 
36 #include "G4ITModelProcessor.hh"
37 #include "G4VITTimeStepper.hh"
38 #include "G4VITReactionProcess.hh"
39 
40 std::map<const G4Track*, G4bool> G4ITModelProcessor::fHasReacted ;
41 
43 {
44  //ctor
45  fpTrack = 0;
46  fpModelHandler = 0;
47  fpModel = 0;
48  fInitialized = false;
49  fpModelManager = 0;
50  fCurrentModel.assign(G4ITType::size(), std::vector<G4VITModel*>());
51 
52  for(int i = 0 ; i < (int) G4ITType::size() ; i++)
53  {
54  fCurrentModel[i].assign(G4ITType::size(),0);
55  }
56  fUserMinTimeStep = -1.;
57 }
58 
60 {
61  //dtor
62 // if(fpModelHandler) delete fpModelHandler; deleted by G4ITStepManager
63  fCurrentModel.clear();
64  fReactionInfo.clear();
65 }
66 
67 // Should not be used
69 {
70  //copy ctorr
71  fpTrack = 0;
72  fpModelHandler = 0;
73  fpModel = 0;
74  fInitialized = false;
75  fpModelManager = 0;
76  fUserMinTimeStep = -1.;
77 }
78 
79 // Should not be used
81 {
82  if (this == &rhs) return *this; // handle self assignment
83  //assignment operator
84  return *this;
85 }
86 //______________________________________________________________________________
88 {
90  fInitialized = true;
91 }
92 
93 //______________________________________________________________________________
94 void G4ITModelProcessor::InitializeStepper(const G4double& currentGlobalTime,
95  const G4double& userMinTime)
96 {
97  // G4cout << "G4ITModelProcessor::InitializeStepper" << G4endl;
98  if(fpModelHandler==0)
99  {
100  G4ExceptionDescription exceptionDescription ;
101  exceptionDescription << "No G4ITModelHandler was passed to the modelProcessor.";
102  G4Exception("G4ITModelProcessor::InitializeStepper","ITModelProcessor002",
103  FatalErrorInArgument,exceptionDescription);
104  }
105  const std::vector<std::vector<G4ITModelManager*> >* modelManager = fpModelHandler
106  ->GetAllModelManager();
107 
108  if(modelManager==0)
109  {
110  G4ExceptionDescription exceptionDescription ;
111  exceptionDescription << "No G4ITModelManager was register to G4ITModelHandler.";
112  G4Exception("G4ITModelProcessor::InitializeStepper","ITModelProcessor003",
113  FatalErrorInArgument,exceptionDescription);
114  }
115 
116  int nbModels1 = modelManager->size() ;
117 
118  G4VITTimeStepper::SetTimes(currentGlobalTime, userMinTime) ;
119 
120  // TODO !!!
121  // if( nbModels1 != 1 || (nbModels1 == 1 && !fpModelManager) )
122  {
123  int nbModels2 = -1;
124  G4VITModel* model = 0;
125  G4ITModelManager* modman = 0;
126 
127  for(int i = 0 ; i < nbModels1 ; i++)
128  {
129  nbModels2 = (*modelManager)[i].size();
130 
131  for(int j = 0 ; j <= i ; j++)
132  {
133  modman = (*modelManager)[i][j];
134 
135  if(modman == 0) continue ;
136 
137  model = modman -> GetModel(currentGlobalTime);
138  G4VITTimeStepper* stepper = model->GetTimeStepper() ;
139 
140 // stepper -> PrepareForAllProcessors() ;
141  stepper -> Prepare() ;
142  fCurrentModel[i][j] = model;
143  }
144  }
145 
146  if(nbModels1 == 1 && nbModels2 ==1)
147  {
148  fpModelManager = modman;
149  fpModel = model;
150  }
151  else fpModel = 0;
152  }
153 }
154 
155 //______________________________________________________________________________
156 void G4ITModelProcessor::CalculateTimeStep(const G4Track* track, const G4double userMinTimeStep)
157 {
158  // G4cout << "G4ITModelProcessor::CalculateStep" << G4endl;
159  CleanProcessor();
160  if(track == 0)
161  {
162  G4ExceptionDescription exceptionDescription ;
163  exceptionDescription << "No track was passed to the method (track == 0).";
164  G4Exception("G4ITModelProcessor::CalculateStep","ITModelProcessor004",
165  FatalErrorInArgument,exceptionDescription);
166  }
167  SetTrack(track);
168  fUserMinTimeStep = userMinTimeStep ;
169 
170  DoCalculateStep();
171 }
172 
173 //______________________________________________________________________________
175 {
176  if(fpModel) // ie only one model has been declared and will be used
177  {
178  fpModel -> GetTimeStepper()->CalculateStep(*fpTrack, fUserMinTimeStep);
179  }
180  else // ie many models have been declared and will be used
181  {
182  std::vector<G4VITModel*>& model = fCurrentModel[GetIT(fpTrack)->GetITType()];
183 
184  for(int i =0 ; i < (int) model.size() ; i++)
185  {
186  if(model[i] == 0) continue;
187  model[i]->GetTimeStepper()->CalculateStep(*fpTrack, fUserMinTimeStep);
188  }
189  }
190 }
191 
192 //______________________________________________________________________________
193 void G4ITModelProcessor::FindReaction(std::map<G4Track*, G4TrackVectorHandle>* tracks,
194  const double currentStepTime,
195  const double previousStepTime,
196  const bool reachedUserStepTimeLimit)
197 {
198  // DEBUG
199  // G4cout << "G4ITReactionManager::FindReaction" << G4endl;
200  if(tracks == 0) return ;
201 
202  if(fpModelHandler->GetAllModelManager()->empty()) return ;
203 
204  std::map<G4Track*, G4TrackVectorHandle>::iterator tracks_i = tracks->begin();;
205 
206  for(tracks_i = tracks->begin() ; tracks_i != tracks-> end() ; tracks_i ++)
207  {
209  G4Track* trackA = tracks_i->first;
210 
211  if(trackA == 0) continue;
212 
213  std::map<const G4Track*, G4bool>::iterator it_hasReacted = fHasReacted.find(trackA);
214  if(it_hasReacted != fHasReacted.end()) continue;
215  if(trackA->GetTrackStatus() == fStopAndKill) continue;
216 
217  G4IT* ITA = GetIT(trackA);
218  G4ITType ITypeA = ITA -> GetITType();
219 
220  const std::vector<G4VITModel*> model = fCurrentModel[ITypeA];
221 
222  G4TrackVectorHandle& trackB_vector = tracks_i->second ;
223  std::vector<G4Track*>::iterator trackB_i = trackB_vector->begin();
224 
225  G4Track* trackB = 0 ;
226  G4ITType ITypeB(-1);
227  G4VITReactionProcess* process = 0;
228  G4ITReactionChange* changes = 0;
229 
230  for(; trackB_i != trackB_vector->end() ; trackB_i++)
231  {
232  trackB = *trackB_i;
233 
234  if(trackB == 0) continue;
235  it_hasReacted = fHasReacted.find(trackB);
236  if(it_hasReacted != fHasReacted.end()) continue;
237  if(trackB->GetTrackStatus() == fStopAndKill) continue;
238 
239  // DEBUG
240  // G4cout << "Couple : " << trackA->GetParticleDefinition->GetParticleName() << " ("
241  // << trackA->GetTrackID() << ") "
242  // << trackB->GetParticleDefinition->GetParticleName() << " ("
243  // << trackB->GetTrackID() << ")"
244  // << G4endl;
245 
246  if(trackB == trackA)
247  {
248  G4ExceptionDescription exceptionDescription ;
249  exceptionDescription << "The IT reaction process sent back a reaction between trackA and trackB. ";
250  exceptionDescription << "The problem is trackA == trackB";
251  G4Exception("G4ITModelProcessor::FindReaction","ITModelProcessor005",
252  FatalErrorInArgument,exceptionDescription);
253  }
254 
255  G4IT* ITB = GetIT(trackB);
256  G4ITType ITypeBtmp = ITB -> GetITType();
257 
258  if(ITypeB != ITypeBtmp)
259  {
260  ITypeB = ITypeBtmp ;
261 
262  if(model[ITypeB])
263  process = model[ITypeB]->GetReactionProcess();
264  }
265 
266  if(process && process -> TestReactibility(*trackA, *trackB,
267  currentStepTime, previousStepTime,
268  reachedUserStepTimeLimit))
269  {
270  changes = process->MakeReaction(*trackA, *trackB);
271  }
272 
273  if(changes)
274  {
275  fHasReacted[trackA] = true;
276  fHasReacted[trackB] = true;
277  changes -> GetTrackA();
278  changes -> GetTrackB();
279 
280  fReactionInfo.push_back(changes);
281 
282  process->ResetChanges();
283  changes = 0;
284 
285  break;
286  }
287  }
288  }
289 
290  fHasReacted.clear();
291 }