Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/utils/src/G4ReactionTableMessenger.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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  * G4ReactionTableMessenger.cc
 28  *
 29  *  Created on: Sep 14, 2015
 30  *      Author: mkaramit
 31  */
 32 
 33 #include <G4ReactionTableMessenger.hh>
 34 #include <G4DNAMolecularReactionTable.hh>
 35 #include <G4UIcmdWithAString.hh>
 36 #include <G4UIcmdWithADoubleAndUnit.hh>
 37 #include <G4UnitsTable.hh>
 38 #include <G4SystemOfUnits.hh>
 39 #include <G4UIcmdWithoutParameter.hh>
 40 #include <G4UIcmdWithABool.hh>
 41 
 42 //------------------------------------------------------------------------------
 43 
 44 G4ReactionTableMessenger::G4ReactionTableMessenger(G4DNAMolecularReactionTable* table)
 45   : 
 46    fpTable(table)
 47   , fpActivateReactionUI(new G4UIcmdWithoutParameter("/chem/reaction/UI", this))
 48 {
 49   fpNewDiffContReaction = new G4UIcmdWithAString("/chem/reaction/new", this);
 50   fpAddReaction = new G4UIcmdWithAString("/chem/reaction/add", this);
 51   fpPrintTable = new G4UIcmdWithoutParameter("/chem/reaction/print", this);
 52 }
 53 
 54 //------------------------------------------------------------------------------
 55 
 56 G4ReactionTableMessenger::~G4ReactionTableMessenger()
 57 {
 58   delete fpNewDiffContReaction;
 59   delete fpAddReaction;
 60   delete fpPrintTable;
 61 }
 62 
 63 //------------------------------------------------------------------------------
 64 void G4ReactionTableMessenger::SetNewValue(G4UIcommand* command,
 65                                            G4String newValue)
 66 {
 67   if(command == fpActivateReactionUI.get())
 68   {
 69     //assert(false);
 70       fpTable->Reset();//release reaction data
 71   }
 72 
 73   if(command == fpNewDiffContReaction)
 74   {
 75     std::istringstream iss(newValue);
 76 
 77     G4String species1;
 78     iss >> species1;
 79 
 80     G4String species2;
 81     iss >> species2;
 82 
 83     double reactionRate;
 84     iss >> reactionRate;
 85 
 86 //    G4String reactionRateUnit;
 87 //    iss >> reactionRateUnit;
 88 
 89     double dimensionedReactionRate = reactionRate * (1e-3 * m3 / (mole * s));
 90 //        G4UIcmdWithADoubleAndUnit::ConvertToDimensionedDouble((reactionRate
 91 //            + G4String(" ") + reactionRateUnit).c_str());
 92 
 93     auto reactionData =
 94         new G4DNAMolecularReactionData(dimensionedReactionRate,
 95                                        species1,
 96                                        species2);
 97 
 98 //    G4String productionRate;
 99 //    iss >> productionRate;
100 //
101 //    if(productionRate != "" && productionRate != "X")
102 //    {
103 //      double prodRateReal = G4UIcommand::ConvertToDouble(productionRate);
104 //
105 //      if(prodRateReal == 0 || isnan(prodRateReal))
106 //      {
107 //        G4Exception("G4ReactionTableMessenger",
108 //                    "WRONG_PRODUCTION_RATE",
109 //                    FatalException, "");
110 //      }
111 //
112 //      double dimensionedProductionRate = prodRateReal
113 //          * (1e-3 * m3 / (mole * s));
114 //      reactionData->SetProductionRate(dimensionedProductionRate);
115 //    }
116 
117     while(!iss.eof())
118     {
119       G4String product;
120       iss >> product;
121 
122       if(!product.empty())
123       {
124         reactionData->AddProduct(product);
125       }
126       else
127       {
128         break;
129       }
130     };
131 
132     fpTable->SetReaction(reactionData);
133   }
134 //  else if(command == fpNewPartDiffContReactionByRadius)
135 //  {
136 //    std::istringstream iss(newValue);
137 //
138 //    G4String species1;
139 //    iss >> species1;
140 //
141 //    G4String species2;
142 //    iss >> species2;
143 //
144 //    double reactionRate;
145 //    iss >> reactionRate;
146 //
147 ////    G4String reactionRateUnit;
148 ////    iss >> reactionRateUnit;
149 //
150 ////    G4String reactionRateUnit;
151 ////    iss >> reactionRateUnit;
152 //
153 //    double reactionRadius;
154 //    iss >> reactionRadius;
155 //
156 ////    G4String reactionRadiusUnit;
157 ////    iss >> reactionRadiusUnit;
158 //
159 //    double dimensionedReactionRate = reactionRate * (1e-3 * m3 / (mole * s));
160 //
161 ////    double dimensionedReactionRate =
162 ////        G4UIcmdWithADoubleAndUnit::ConvertToDimensionedDouble((reactionRate
163 ////            + " " + reactionRateUnit).c_str());
164 //
165 //    double dimensionedReactionRadius = reactionRadius * nm;
166 ////        G4UIcmdWithADoubleAndUnit::ConvertToDimensionedDouble((reactionRadius
167 ////            + " " + reactionRadiusUnit).c_str());
168 //
169 //    G4DNAMolecularReactionData* reactionData =
170 //        new G4DNAMolecularReactionData(dimensionedReactionRate,
171 //                                       species1,
172 //                                       species2);
173 //    reactionData->SetPartiallyDiffusionControlledReaction(dimensionedReactionRate,
174 //                                                          dimensionedReactionRadius);
175 //
176 //    while(iss.eof() == false)
177 //    {
178 //      G4String product;
179 //      iss >> product;
180 //
181 //      if(product != "")
182 //      {
183 //        reactionData->AddProduct(product);
184 //      }
185 //      else
186 //      {
187 //        break;
188 //      }
189 //    }
190 //
191 //    fpTable->SetReaction(reactionData);
192 //  }
193 //  else if(command == fpNewPartDiffContReactionByReactionRate)
194 //  {
195 //    std::istringstream iss(newValue);
196 //
197 //    G4String species1;
198 //    iss >> species1;
199 //
200 //    G4String species2;
201 //    iss >> species2;
202 //
203 //    double reactionRate;
204 //    iss >> reactionRate;
205 //
206 //    //    G4String reactionRateUnit;
207 //    //    iss >> reactionRateUnit;
208 //
209 //    //    G4String reactionRateUnit;
210 //    //    iss >> reactionRateUnit;
211 //
212 //    double activationRate;
213 //    iss >> activationRate;
214 //
215 //    //    G4String reactionRadiusUnit;
216 //    //    iss >> reactionRadiusUnit;
217 //
218 //    double dimensionedReactionRate = reactionRate * (1e-3 * m3 / (mole * s));
219 //
220 //    double dimensionedActivationRate = activationRate
221 //        * (1e-3 * m3 / (mole * s));
222 //
223 //    G4DNAMolecularReactionData* reactionData =
224 //        new G4DNAMolecularReactionData(dimensionedReactionRate,
225 //                                       species1,
226 //                                       species2);
227 //    reactionData->
228 //      SetPartiallyDiffusionControlledReactionByActivation(dimensionedReactionRate,
229 //                                                          dimensionedActivationRate);
230 //
231 //    while(iss.eof() == false)
232 //    {
233 //      G4String product;
234 //      iss >> product;
235 //
236 //      if(product != "")
237 //      {
238 //        reactionData->AddProduct(product);
239 //      }
240 //      else
241 //      {
242 //        break;
243 //      }
244 //    }
245 //
246 //    fpTable->SetReaction(reactionData);
247 //  }
248   else if(command == fpPrintTable)
249   {
250     fpTable->PrintTable();
251   }
252   else if(command == fpAddReaction)
253   {
254     std::istringstream iss(newValue);
255 
256     //--------------------------------------------------------------------------
257     // Reactants definition
258 
259     G4String species1;
260     iss >> species1;
261 
262     G4String marker;
263     iss >> marker; // peut etre +, ->, |
264 
265     G4String species2;
266 
267     if(marker == "+")
268     {
269         iss >> species2;
270         iss >> marker; // peut etre ->, |
271     }
272 
273     //--------------------------------------------------------------------------
274 
275     auto  reactionData =
276                 new G4DNAMolecularReactionData(0,
277                                                species1,
278                                                species2);
279     //fpTable->SetReaction(reactionData);
280 
281     //--------------------------------------------------------------------------
282     // Add products
283     if(marker == "->")
284     {
285       iss >> marker; // doit etre = species name
286 
287       while(marker!="|"
288           //&& marker!=""
289           && !iss.eof()
290           )
291       {
292         //G4cout << marker << G4endl;
293         if(marker == "+")
294         {
295           iss >> marker; // doit etre species name
296           continue;
297         }
298         if(marker != "H2O")
299         {
300           reactionData->AddProduct(marker);
301         }
302 
303         iss >> marker; // peut etre species name, +, |
304       };
305     }
306 
307 //    G4cout << "out of 1st loop" << G4endl;
308 
309     //--------------------------------------------------------------------------
310     // Add reaction rate method
311     G4String rateconst_method;
312     iss >> rateconst_method;
313     if(rateconst_method == "Fix")
314     {
315       iss >> marker; // must be |
316       double reactionRate;
317       iss >> reactionRate;
318 
319       double dimensionedReactionRate = reactionRate * (1e-3 * m3 / (mole * s));
320       reactionData->SetObservedReactionRateConstant(dimensionedReactionRate);
321       reactionData->ComputeEffectiveRadius();
322       G4String markerType;
323       iss >> markerType; // must be |
324       if(markerType == "|")
325       {
326         G4int reactionType;
327         iss >> reactionType;
328         if(reactionType == 1)
329         {
330           reactionData->SetReactionType(reactionType);
331         }
332       }
333 
334 
335 //      G4String productionRate;
336 //      iss >> productionRate;
337 //
338 //      if(productionRate != "" && productionRate != "X")
339 //      {
340 //        double prodRateReal = G4UIcommand::ConvertToDouble(productionRate);
341 //
342 //        if(prodRateReal == 0 || isnan(prodRateReal))
343 //        {
344 //          G4Exception("G4ReactionTableMessenger",
345 //                      "WRONG_PRODUCTION_RATE",
346 //                      FatalException,
347 //                      "");
348 //        }
349 //
350 //        double dimensionedProductionRate = prodRateReal
351 //            * (1e-3 * m3 / (mole * s));
352 //        reactionData->SetProductionRate(dimensionedProductionRate);
353 //      }
354     }
355     else if(rateconst_method == "Arr")
356     {
357       iss >> marker; // must be |
358       double A0  = 0;
359       double E_R = 0;
360 
361       iss >> A0;
362       iss >> E_R;
363       reactionData->SetArrehniusParameterization(A0, E_R);
364     }
365     else if(rateconst_method == "Pol")
366     {
367       iss >> marker; // must be |
368       std::vector<double> P = {0, 0, 0, 0, 0};
369 
370       size_t i = 0;
371       while(i < 4) // could be changed to 5 only if marker is used as delimiter
372       {
373         double tmp;
374         iss >> tmp;
375         P[i] = tmp;
376 //        G4cout << newValue << G4endl;
377 //        G4cout << tmp << G4endl;
378 //        G4cout << P[i] << G4endl;
379         ++i;
380       };
381       reactionData->SetPolynomialParameterization(P);
382     }
383     else if(rateconst_method == "Scale")
384     {
385       iss >> marker; // must be |
386       double temp_K;
387       iss >> temp_K;
388       double reactionRateCste;
389       iss >> reactionRateCste;
390       double dimensionedReactionRate = reactionRateCste * (1e-3 * m3 / (mole * s));
391       reactionData->SetObservedReactionRateConstant(dimensionedReactionRate);
392       reactionData->SetScaledParameterization(temp_K, dimensionedReactionRate);
393     }
394 
395 //    if(iss.eof() == false)
396 //    {
397 //      iss >> marker;
398 //
399 //      if(marker == "|")
400 //      {
401 //        G4String productionRate ;
402 //        iss >> productionRate;
403 //
404 ////        G4cout << productionRate << G4endl;
405 //
406 //        double dimProductionRate = G4UIcommand::ConvertToDouble(productionRate)* (1e-3 * m3 / (mole * s));
407 //
408 //        G4cout << " DIM PROD RATE = " << reactionData->GetReactant1()->GetName()
409 //             << " + " << reactionData->GetReactant2()->GetName() << " = " << dimProductionRate << G4endl;
410 //
411 //        reactionData->SetProductionRate(dimProductionRate);
412 //      }
413 //    }
414     fpTable->SetReaction(reactionData);
415 //    G4cout << "Reaction " << species1 << " + " << species2 << " added" << G4endl;
416   }
417 }
418