Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4AdjointPhysicsList.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 //
28 //
29 // $Id$
30 //
32 // Class Name: G4AdjointPhysicsList
33 // Author: L. Desorgher
34 // Organisation: SpaceIT GmbH
35 // Contract: ESA contract 21435/08/NL/AT
36 // Customer: ESA/ESTEC
38 
39 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
40 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
41 
42 #include "G4AdjointPhysicsList.hh"
43 #include "G4ProcessManager.hh"
44 #include "G4ParticleTypes.hh"
46 #include "G4SystemOfUnits.hh"
47 
48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
49 
52  fEminusIonisation(0),fPIonisation(0),
53  fUse_eionisation(true),fUse_pionisation(true),
54  fUse_brem(true),fUse_compton(true),fUse_ms(true),
55  fUse_egain_fluctuation(true),fUse_peeffect(true),
56  fEmin_adj_models(1.*keV), fEmax_adj_models(1.*MeV),
57  fCS_biasing_factor_compton(1.),fCS_biasing_factor_brem(1.),
58  fCS_biasing_factor_ionisation(1.),fCS_biasing_factor_PEeffect(1.)
59 {
60  defaultCutValue = 1.0*mm;
61  SetVerboseLevel(1);
62  fPhysicsMessenger = new G4AdjointPhysicsMessenger(this);
63 }
64 
65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
66 
68 {
69 }
71 {
72  // In this method, static member functions should be called
73  // for all particles which you want to use.
74  // This ensures that objects of these particle types will be
75  // created in the program.
81 }
82 
83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
84 
86 {
88 }
89 
90 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
91 
93 {
94  // pseudo-particles
97 
98  // gamma
100 
101  // optical photon
103 }
104 
105 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
106 
108 {
109  // leptons
114 
119 }
120 
121 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
122 
124 {
125 // mesons
137 }
138 
139 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
140 
142 {
143 // barions
148 }
149 
150 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
151 
152 #include"G4AdjointGamma.hh"
153 #include"G4AdjointElectron.hh"
154 #include"G4AdjointProton.hh"
156 {
157 // adjoint_gammma
159 
160 // adjoint_electron
162 
163 // adjoint_proton
165 }
166 
167 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
168 
170 {
172  ConstructEM();
174 }
175 
176 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
177 
178 #include "G4PEEffectModel.hh"
179 #include "G4ComptonScattering.hh"
180 #include "G4GammaConversion.hh"
181 #include "G4PhotoElectricEffect.hh"
182 #include "G4eMultipleScattering.hh"
183 #include "G4hMultipleScattering.hh"
184 #include "G4eIonisation.hh"
185 #include "G4eBremsstrahlung.hh"
186 #include "G4eplusAnnihilation.hh"
187 #include "G4hIonisation.hh"
188 #include "G4ionIonisation.hh"
190 
192 #include "G4eInverseIonisation.hh"
194 #include "G4AdjointCSManager.hh"
197 #include "G4AdjointComptonModel.hh"
198 #include "G4eInverseCompton.hh"
199 #include "G4InversePEEffect.hh"
202 #include "G4hInverseIonisation.hh"
205 #include "G4IonInverseIonisation.hh"
207 
208 #include "G4AdjointSimManager.hh"
210 
213 
214  G4AdjointSimManager* theAdjointSimManager = G4AdjointSimManager::GetInstance();
215 
217 
218  if (fUse_brem || fUse_peeffect ||fUse_compton)
220 
221  if (fUse_eionisation) {
223  fEminusIonisation->SetLossFluctuations(fUse_egain_fluctuation);
224  }
225 
226  if (fUse_pionisation) {
228  fPIonisation->SetLossFluctuations(fUse_egain_fluctuation);
230  }
231 
232  G4eBremsstrahlung* theeminusBremsstrahlung = 0;
233  if (fUse_brem && fUse_eionisation)
234  theeminusBremsstrahlung = new G4eBremsstrahlung();
235 
236  G4ComptonScattering* theComptonScattering =0;
237  if (fUse_compton) theComptonScattering = new G4ComptonScattering();
238 
239  G4PhotoElectricEffect* thePEEffect =0;
240  if (fUse_peeffect) thePEEffect = new G4PhotoElectricEffect();
241 
242  G4eMultipleScattering* theeminusMS = 0;
243  G4hMultipleScattering* thepMS= 0;
244  if (fUse_ms) {
245  theeminusMS = new G4eMultipleScattering();
246  thepMS = new G4hMultipleScattering();
247  }
248 
249  G4VProcess* theGammaConversion =0;
250  if (fUse_gamma_conversion) theGammaConversion = new G4GammaConversion();
251 
252  //Define adjoint e- ionisation
253  //-------------------
254  G4AdjointeIonisationModel* theeInverseIonisationModel = 0;
255  G4eInverseIonisation* theeInverseIonisationProjToProjCase = 0 ;
256  G4eInverseIonisation* theeInverseIonisationProdToProjCase = 0;
257  if (fUse_eionisation) {
258  theeInverseIonisationModel = new G4AdjointeIonisationModel();
259  theeInverseIonisationModel->SetHighEnergyLimit(fEmax_adj_models);
260  theeInverseIonisationModel->SetLowEnergyLimit(fEmin_adj_models);
261  theeInverseIonisationModel->SetCSBiasingFactor(fCS_biasing_factor_ionisation);
262  theeInverseIonisationProjToProjCase =
263  new G4eInverseIonisation(true,"Inv_eIon",theeInverseIonisationModel);
264  theeInverseIonisationProdToProjCase =
265  new G4eInverseIonisation(false,"Inv_eIon1",theeInverseIonisationModel);
266  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("e-"));
267  }
268 
269  //Define adjoint Bremsstrahlung
270  //-------------------------------
271  G4AdjointBremsstrahlungModel* theeInverseBremsstrahlungModel = 0;
272  G4eInverseBremsstrahlung* theeInverseBremsstrahlungProjToProjCase = 0;
273  G4eInverseBremsstrahlung* theeInverseBremsstrahlungProdToProjCase = 0;
274 
275  if (fUse_brem && fUse_eionisation) {
276  theeInverseBremsstrahlungModel = new G4AdjointBremsstrahlungModel();
277  theeInverseBremsstrahlungModel->SetHighEnergyLimit(fEmax_adj_models);
278  theeInverseBremsstrahlungModel->SetLowEnergyLimit(fEmin_adj_models);
279  theeInverseBremsstrahlungModel->SetCSBiasingFactor( fCS_biasing_factor_brem);
280  theeInverseBremsstrahlungProjToProjCase = new G4eInverseBremsstrahlung(
281  true,"Inv_eBrem",theeInverseBremsstrahlungModel);
282  theeInverseBremsstrahlungProdToProjCase = new G4eInverseBremsstrahlung(false,
283  "Inv_eBrem1",theeInverseBremsstrahlungModel);
284  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("e-"));
285  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("gamma"));
286  }
287 
288 
289  //Define adjoint Compton
290  //---------------------
291 
292  G4AdjointComptonModel* theeInverseComptonModel = 0;
293  G4eInverseCompton* theeInverseComptonProjToProjCase = 0;
294  G4eInverseCompton* theeInverseComptonProdToProjCase = 0;
295 
296  if (fUse_compton) {
297  theeInverseComptonModel = new G4AdjointComptonModel();
298  theeInverseComptonModel->SetHighEnergyLimit(fEmax_adj_models);
299  theeInverseComptonModel->SetLowEnergyLimit(fEmin_adj_models);
300  theeInverseComptonModel->SetDirectProcess(theComptonScattering);
301  theeInverseComptonModel->SetUseMatrix(false);
302  theeInverseComptonModel->SetCSBiasingFactor( fCS_biasing_factor_compton);
303  theeInverseComptonProjToProjCase = new G4eInverseCompton(true,"Inv_Compt",
304  theeInverseComptonModel);
305  theeInverseComptonProdToProjCase = new G4eInverseCompton(false,"Inv_Compt1",
306  theeInverseComptonModel);
307  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("e-"));
308  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("gamma"));
309 
310  }
311 
312  //Define adjoint PEEffect
313  //---------------------
314  G4AdjointPhotoElectricModel* theInversePhotoElectricModel = 0;
315  G4InversePEEffect* theInversePhotoElectricProcess = 0;
316 
317  if (fUse_peeffect) {
318  theInversePhotoElectricModel = new G4AdjointPhotoElectricModel();
319  theInversePhotoElectricModel->SetHighEnergyLimit(fEmax_adj_models);
320  theInversePhotoElectricModel->SetLowEnergyLimit(fEmin_adj_models);
321  theInversePhotoElectricModel->SetCSBiasingFactor(fCS_biasing_factor_PEeffect);
322  theInversePhotoElectricProcess = new G4InversePEEffect("Inv_PEEffect",
323  theInversePhotoElectricModel);
324  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("e-"));
325  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("gamma"));
326 
327  }
328 
329 
330  //Define adjoint ionisation for protons
331  //---------------------
332  G4AdjointhIonisationModel* thepInverseIonisationModel = 0;
333  G4hInverseIonisation* thepInverseIonisationProjToProjCase = 0 ;
334  G4hInverseIonisation* thepInverseIonisationProdToProjCase = 0;
335  if (fUse_pionisation) {
336  thepInverseIonisationModel = new G4AdjointhIonisationModel(G4Proton::Proton());
337  thepInverseIonisationModel->SetHighEnergyLimit(fEmax_adj_models);
338  thepInverseIonisationModel->SetLowEnergyLimit(fEmin_adj_models);
339  thepInverseIonisationModel->SetUseMatrix(false);
340  thepInverseIonisationProjToProjCase = new G4hInverseIonisation(true,
341  "Inv_pIon",thepInverseIonisationModel);
342  thepInverseIonisationProdToProjCase = new G4hInverseIonisation(false,
343  "Inv_pIon1",thepInverseIonisationModel);
344  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("e-"));
345  theAdjointSimManager->ConsiderParticleAsPrimary(G4String("proton"));
346  }
347  ;
348 
349 
350  //Declare the processes active for the different particles
351  //--------------------------------------------------------
353  while( (*theParticleIterator)() ){
355  G4ProcessManager* pmanager = particle->GetProcessManager();
356  if (!pmanager) {
357  pmanager = new G4ProcessManager(particle);
358  particle->SetProcessManager(pmanager);
359  }
360 
361  G4String particleName = particle->GetParticleName();
362  if (particleName == "e-") {
363  if (fUse_ms && fUse_eionisation) pmanager->AddProcess(theeminusMS);
364 
365  if (fUse_eionisation){
366  pmanager->AddProcess(fEminusIonisation);
368  RegisterEnergyLossProcess(fEminusIonisation,particle);
369  }
370  if (fUse_brem && fUse_eionisation) {
371  pmanager->AddProcess(theeminusBremsstrahlung);
373  RegisterEnergyLossProcess(theeminusBremsstrahlung,particle);
374  }
375 
376  G4int n_order=0;
377  if (fUse_ms && fUse_eionisation) {
378  n_order++;
379  pmanager->SetProcessOrdering(theeminusMS, idxAlongStep,n_order);
380  }
381  if (fUse_eionisation) {
382  n_order++;
384  }
385  if (fUse_brem && fUse_eionisation) {
386  n_order++;
387  pmanager->SetProcessOrdering(theeminusBremsstrahlung,idxAlongStep,
388  n_order);
389  }
390 
391  n_order=0;
392  if (fUse_ms && fUse_eionisation) {
393  n_order++;
394  pmanager->SetProcessOrdering(theeminusMS,idxPostStep,n_order);
395  }
396  if (fUse_eionisation) {
397  n_order++;
399  }
400  if (fUse_brem && fUse_eionisation) {
401  n_order++;
402  pmanager->SetProcessOrdering(theeminusBremsstrahlung,idxPostStep,
403  n_order);
404  }
405  }
406 
407  if (particleName == "adj_e-") {
408  G4ContinuousGainOfEnergy* theContinuousGainOfEnergy =0;
409  if (fUse_eionisation ) {
410  theContinuousGainOfEnergy= new G4ContinuousGainOfEnergy();
411  theContinuousGainOfEnergy->SetLossFluctuations(fUse_egain_fluctuation);
412  theContinuousGainOfEnergy->SetDirectEnergyLossProcess(fEminusIonisation);
413  theContinuousGainOfEnergy->SetDirectParticle(G4Electron::Electron());
414  pmanager->AddProcess(theContinuousGainOfEnergy);
415  }
416  G4int n_order=0;
417 
418  if (fUse_ms) {
419  n_order++;
420  pmanager->AddProcess(theeminusMS);
421  pmanager->SetProcessOrdering(theeminusMS, idxAlongStep,n_order);
422  }
423 
424  n_order++;
425  pmanager->SetProcessOrdering(theContinuousGainOfEnergy,idxAlongStep,
426  n_order);
427 
428  n_order++;
429  G4AdjointAlongStepWeightCorrection* theAlongStepWeightCorrection =
431  pmanager->AddProcess(theAlongStepWeightCorrection);
432  pmanager->SetProcessOrdering(theAlongStepWeightCorrection,idxAlongStep,
433  n_order);
434 
435  n_order=0;
436  if (fUse_eionisation) {
437  pmanager->AddProcess(theeInverseIonisationProjToProjCase);
438  pmanager->AddProcess(theeInverseIonisationProdToProjCase);
439  n_order++;
440  pmanager->SetProcessOrdering(theeInverseIonisationProjToProjCase,
441  idxPostStep,n_order);
442  n_order++;
443  pmanager->SetProcessOrdering(theeInverseIonisationProdToProjCase,
444  idxPostStep,n_order);
445  }
446 
447  if (fUse_brem && fUse_eionisation) {
448  pmanager->AddProcess(theeInverseBremsstrahlungProjToProjCase);
449  n_order++;
450  pmanager->SetProcessOrdering(theeInverseBremsstrahlungProjToProjCase,
451  idxPostStep,n_order);
452  }
453 
454  if (fUse_compton) {
455  pmanager->AddProcess(theeInverseComptonProdToProjCase);
456  n_order++;
457  pmanager->SetProcessOrdering(theeInverseComptonProdToProjCase,
458  idxPostStep,n_order);
459  }
460  if (fUse_peeffect) {
461  pmanager->AddDiscreteProcess(theInversePhotoElectricProcess);
462  n_order++;
463  pmanager->SetProcessOrdering(theInversePhotoElectricProcess,
464  idxPostStep,n_order);
465  }
466  if (fUse_pionisation) {
467  pmanager->AddProcess(thepInverseIonisationProdToProjCase);
468  n_order++;
469  pmanager->SetProcessOrdering(thepInverseIonisationProdToProjCase,
470  idxPostStep,n_order);
471  }
472  if (fUse_ms && fUse_eionisation) {
473  n_order++;
474  pmanager->SetProcessOrdering(theeminusMS,idxPostStep,n_order);
475  }
476  }
477 
478 
479  if(particleName == "adj_gamma") {
480  G4int n_order=0;
481  G4AdjointAlongStepWeightCorrection* theAlongStepWeightCorrection =
483  pmanager->AddProcess(theAlongStepWeightCorrection);
484  pmanager->SetProcessOrdering(theAlongStepWeightCorrection,idxAlongStep,1);
485 
486  if (fUse_brem && fUse_eionisation) {
487  pmanager->AddProcess(theeInverseBremsstrahlungProdToProjCase);
488  n_order++;
489  pmanager->SetProcessOrdering(theeInverseBremsstrahlungProdToProjCase,
490  idxPostStep,n_order);
491  }
492  if (fUse_compton) {
493  pmanager->AddDiscreteProcess(theeInverseComptonProjToProjCase);
494  n_order++;
495  pmanager->SetProcessOrdering(theeInverseComptonProjToProjCase,
496  idxPostStep,n_order);
497  }
498  }
499 
500  if (particleName == "gamma") {
501  if (fUse_compton) {
502  pmanager->AddDiscreteProcess(theComptonScattering);
504  RegisterEmProcess(theComptonScattering,particle);
505  }
506  if (fUse_peeffect) {
507  pmanager->AddDiscreteProcess(thePEEffect);
509  RegisterEmProcess(thePEEffect,particle);
510  }
511  if (fUse_gamma_conversion) {
512  pmanager->AddDiscreteProcess(theGammaConversion);
513  }
514  }
515 
516  if (particleName == "e+" && fUse_gamma_conversion) {//positron
517  G4VProcess* theeplusMultipleScattering = new G4eMultipleScattering();
518  G4VProcess* theeplusIonisation = new G4eIonisation();
519  G4VProcess* theeplusBremsstrahlung = new G4eBremsstrahlung();
520  G4VProcess* theeplusAnnihilation = new G4eplusAnnihilation();
521 
522  // add processes
523  pmanager->AddProcess(theeplusMultipleScattering);
524  pmanager->AddProcess(theeplusIonisation);
525  pmanager->AddProcess(theeplusBremsstrahlung);
526  pmanager->AddProcess(theeplusAnnihilation);
527 
528  // set ordering for AtRestDoIt
529  pmanager->SetProcessOrderingToFirst(theeplusAnnihilation, idxAtRest);
530 
531  // set ordering for AlongStepDoIt
532  pmanager->SetProcessOrdering(theeplusMultipleScattering,
533  idxAlongStep,1);
534  pmanager->SetProcessOrdering(theeplusIonisation, idxAlongStep,2);
535  pmanager->SetProcessOrdering(theeplusBremsstrahlung,idxAlongStep,3);
536 
537  // set ordering for PostStepDoIt
538  pmanager->SetProcessOrdering(theeplusMultipleScattering,
539  idxPostStep,1);
540  pmanager->SetProcessOrdering(theeplusIonisation,idxPostStep,2);
541  pmanager->SetProcessOrdering(theeplusBremsstrahlung,idxPostStep,3);
542  pmanager->SetProcessOrdering(theeplusAnnihilation,idxPostStep,4);
543  }
544  if (particleName == "proton" && fUse_pionisation) {
545  if (fUse_ms && fUse_pionisation) pmanager->AddProcess(thepMS);
546 
547  if (fUse_pionisation){
548  pmanager->AddProcess(fPIonisation);
550  RegisterEnergyLossProcess(fPIonisation,particle);
551  }
552 
553  G4int n_order=0;
554  if (fUse_ms && fUse_pionisation) {
555  n_order++;
556  pmanager->SetProcessOrdering(thepMS, idxAlongStep,n_order);
557  }
558 
559  if (fUse_pionisation) {
560  n_order++;
561  pmanager->SetProcessOrdering(fPIonisation,idxAlongStep,n_order);
562  }
563 
564  n_order=0;
565  if (fUse_ms && fUse_pionisation) {
566  n_order++;
567  pmanager->SetProcessOrdering(thepMS, idxPostStep,n_order);
568  }
569 
570  if (fUse_pionisation) {
571  n_order++;
572  pmanager->SetProcessOrdering(fPIonisation,idxPostStep,n_order);
573  }
574 
575  }
576 
577  if (particleName == "adj_proton" && fUse_pionisation) {
578  G4ContinuousGainOfEnergy* theContinuousGainOfEnergy =0;
579  if (fUse_pionisation ) {
580  theContinuousGainOfEnergy= new G4ContinuousGainOfEnergy();
581  theContinuousGainOfEnergy->SetLossFluctuations(fUse_egain_fluctuation);
582  theContinuousGainOfEnergy->SetDirectEnergyLossProcess(fPIonisation);
583  theContinuousGainOfEnergy->SetDirectParticle(G4Proton::Proton());
584  pmanager->AddProcess(theContinuousGainOfEnergy);
585  }
586 
587  G4int n_order=0;
588  if (fUse_ms) {
589  n_order++;
590  pmanager->AddProcess(thepMS);
591  pmanager->SetProcessOrdering(thepMS, idxAlongStep,n_order);
592  }
593 
594  n_order++;
595  pmanager->SetProcessOrdering(theContinuousGainOfEnergy,idxAlongStep,
596  n_order);
597 
598  n_order++;
599  G4AdjointAlongStepWeightCorrection* theAlongStepWeightCorrection =
601  pmanager->AddProcess(theAlongStepWeightCorrection);
602  pmanager->SetProcessOrdering(theAlongStepWeightCorrection,idxAlongStep,
603  n_order);
604  n_order=0;
605  if (fUse_pionisation) {
606  pmanager->AddProcess(thepInverseIonisationProjToProjCase);
607  n_order++;
608  pmanager->SetProcessOrdering(thepInverseIonisationProjToProjCase,
609  idxPostStep,n_order);
610  }
611 
612  if (fUse_ms && fUse_pionisation) {
613  n_order++;
614  pmanager->SetProcessOrdering(thepMS,idxPostStep,n_order);
615  }
616  }
617  }
618 }
619 
620 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
621 
622 #include "G4Decay.hh"
624 {
625  // Add Decay Process
626  G4Decay* theDecayProcess = new G4Decay();
628  while( (*theParticleIterator)() ){
630  G4ProcessManager* pmanager = particle->GetProcessManager();
631  if (theDecayProcess->IsApplicable(*particle)) {
632  pmanager ->AddProcess(theDecayProcess);
633  // set ordering for PostStepDoIt and AtRestDoIt
634  pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep);
635  pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest);
636  }
637  }
638 }
639 
640 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
641 
643 {
644  if (verboseLevel >0){
645  G4cout << "G4AdjointPhysicsList::SetCuts:";
646  G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl;
647  }
648 
649  // set cut values for gamma at first and for e- second and next for e+,
650  // because some processes for e+/e- need cut values for gamma
651  //
652  SetCutValue(defaultCutValue, "gamma");
655 
657 }
658 
659 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......