Geant4 Cross Reference |
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