10 #include "CLHEP/Units/PhysicalConstants.h" 
   11 #include "CLHEP/Units/SystemOfUnits.h" 
   42   G4String pType=
"custom";
 
   53       std::string::size_type beg_idx,end_idx;
 
   58       beg_idx = 
line.find_first_not_of(
"\t #");
 
   59       if(beg_idx > 0 && 
line[beg_idx-1] == 
'#') 
continue;
 
   60       end_idx = 
line.find_first_of( 
"\t ", beg_idx);
 
   61       if (end_idx == std::string::npos) 
continue;
 
   63       pdgCode  = strtol(
line.substr( beg_idx, end_idx - beg_idx ).c_str(), &endptr, 0);
 
   64       if (endptr[0] != 
'\0') {
 
   65         throw std::invalid_argument(
"CustomMonopoleFactory::loadCustomMonopoles: Could not convert string to int: " + 
line.substr( beg_idx, end_idx - beg_idx ));
 
   68       G4cout << 
"CustomMonopoleFactory: pdgCode = " << pdgCode << G4endl;
 
   70       beg_idx = 
line.find_first_not_of(
"\t ",end_idx);
 
   71       end_idx = 
line.find_first_of( 
"\t #", beg_idx);
 
   72       if (end_idx == std::string::npos) 
continue;
 
   74       mass  = 
atof(
line.substr( beg_idx, end_idx - beg_idx ).c_str());
 
   76       beg_idx = 
line.find_first_not_of(
"\t ",end_idx);
 
   77       end_idx = 
line.find_first_of( 
"\t #", beg_idx);
 
   78       if (end_idx == std::string::npos) 
continue;
 
   80       elCharge  = 
atof(
line.substr( beg_idx, end_idx - beg_idx ).c_str());
 
   82       beg_idx = 
line.find_first_not_of(
"\t ",end_idx);
 
   83       end_idx = 
line.find_first_of( 
"\t #", beg_idx);
 
   85       if (end_idx == std::string::npos) 
continue;
 
   86       magCharge  = 
atof(
line.substr( beg_idx, end_idx - beg_idx ).c_str());
 
   88       beg_idx = 
line.find_first_not_of(
"\t# ",end_idx);
 
   89       end_idx = 
line.length();
 
   90       name = 
line.substr( beg_idx, end_idx - beg_idx );
 
   91       while(
name.c_str()[0] == 
' ') 
name.erase(0,1);
 
   93       std::string lowerCaseName(
name);
 
   94       for(
unsigned int il=0; 
il < lowerCaseName.length(); ++
il) lowerCaseName[
il] = 
std::tolower(lowerCaseName[
il]);
 
   95       isQball = (lowerCaseName.find(
"qball") != std::string::npos) ? 
true : 
false;
 
   97       isFCP = (lowerCaseName.find(
"fcp") != std::string::npos) ? 
true : 
false;
 
   99       isDyon = (lowerCaseName.find(
"dyonss") != std::string::npos || lowerCaseName.find(
"dyonos") != std::string::npos) ? 
true : 
false; 
 
  100       G4cout << 
"CustomMonopoleFactory: name = " << 
name << G4endl;
 
  102       if(abs(pdgCode) / 1000000 == 0)
 
  104           G4cout << 
"CustomMonopoleFactory: pdgCode too low: " << pdgCode << 
" " << abs(pdgCode) / 1000000  << G4endl;
 
  110           double elChargeFromPDGcode = (isQball) ? (pdgCode/10)%10000/10. : (pdgCode/10)%1000/1. ;
 
  116           XX = (abs(pdgCode)/1000)%100;
 
  117           YY = (abs(pdgCode)/10)%100;
 
  118           G4cout << 
"CustomMonopoleFactory: XX = " << XX << 
", YY = " << YY << G4endl;
 
  120           elChargeFromPDGcode = (pdgCode>0) ? 
round(100.*XX/YY)/100. : -
round(100.*XX/YY)/100.;
 
  121           G4cout << 
"CustomMonopoleFactory: elChargeFromPDGcode = " << elChargeFromPDGcode << G4endl;
 
  126             elChargeFromPDGcode =  (abs((
int)(pdgCode/10000)) == 412) ? -pdgCode%4120000/10 : pdgCode%4110000/10; 
 
  127         magCharge = (pdgCode>0) ? 1 : -1; 
 
  128         G4cout << 
"Loading Dyons: " << magCharge << G4endl;
 
  131           if (!isQball && !isFCP && !isDyon && abs((
int)(pdgCode/10000)) == 412) elChargeFromPDGcode = -elChargeFromPDGcode;
 
  133           if (elChargeFromPDGcode != elCharge) {
 
  134             G4cout << 
"CustomMonopoleFactory: El. charges for "<< 
name <<
" from PDGcode and 3d col. of particles.txt file do not agree: " <<  elChargeFromPDGcode << 
" / " << elCharge << G4endl;
 
  135             G4Exception(
"CustomMonopoleFactory::loadCustomMonopoles",
"WrongElCharges",FatalException,
"El charge from PDGcode and 3d col. of particles.txt file do not agree");
 
  137           if (elCharge == 0.0 && magCharge == 0.0) {
 
  138             G4cout << 
"CustomMonopoleFactory: Both electric and magnetic charges are ZEROs. Skip the particle. " << G4endl;
 
  144       G4cout << 
"CustomMonopoleFactory: pType is " << pType << G4endl;
 
  145       G4cout << 
"CustomMonopoleFactory: PDGcode of "  << 
name << 
" is " << pdgCode << G4endl;
 
  146       G4cout << 
"CustomMonopoleFactory: Mass of "     << 
name << 
" is " << 
mass   << G4endl;
 
  147       G4cout << 
"CustomMonopoleFactory: Electrical Charge of " << 
name << 
" is "<< elCharge << G4endl;
 
  148       G4cout << 
"CustomMonopoleFactory: Magnetic Charge of " << 
name << 
" is "<< magCharge << G4endl;
 
  155                                                      pType,           0,       +1,      pdgCode,
 
  159       particle->SetMagneticCharge(magCharge);
 
  167     G4cout << 
"CustomMonopoleFactory:  No particles have been loaded." << G4endl;
 
  168     G4Exception(
"CustomMonopoleFactory::loadCustomMonopoles",
"NoParticlesLoaded",FatalException,
"No particles have been loaded");