40 std::ifstream configFile(
"particles.txt");
42 G4String pType=
"custom";
49 std::string name,line;
51 while(getline(configFile,line))
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 const std::string numberTxt = line.substr( beg_idx, end_idx - beg_idx );
64 pdgCode = strtol(numberTxt.c_str(), &endptr, 0);
65 if (endptr[0] !=
'\0') {
66 throw std::invalid_argument(
"CustomMonopoleFactory::loadCustomMonopoles: Could not convert string to int: " + numberTxt);
69 G4cout <<
"CustomMonopoleFactory: pdgCode = " << pdgCode << G4endl;
71 beg_idx = line.find_first_not_of(
"\t ",end_idx);
72 end_idx = line.find_first_of(
"\t #", beg_idx);
73 if (end_idx == std::string::npos)
continue;
75 mass = atof(line.substr( beg_idx, end_idx - beg_idx ).c_str());
77 beg_idx = line.find_first_not_of(
"\t ",end_idx);
78 end_idx = line.find_first_of(
"\t #", beg_idx);
79 if (end_idx == std::string::npos)
continue;
81 elCharge = atof(line.substr( beg_idx, end_idx - beg_idx ).c_str());
83 beg_idx = line.find_first_not_of(
"\t ",end_idx);
84 end_idx = line.find_first_of(
"\t #", beg_idx);
86 if (end_idx == std::string::npos)
continue;
87 magCharge = atof(line.substr( beg_idx, end_idx - beg_idx ).c_str());
89 beg_idx = line.find_first_not_of(
"\t# ",end_idx);
90 end_idx = line.length();
91 name = line.substr( beg_idx, end_idx - beg_idx );
92 while(name.c_str()[0] ==
' ') name.erase(0,1);
93 while(name[name.size()-1] ==
' ') name.erase(name.size()-1,1);
94 std::string lowerCaseName(name);
95 for(
unsigned int il=0; il < lowerCaseName.length(); ++il) lowerCaseName[il] = std::tolower(lowerCaseName[il]);
96 isQball = (lowerCaseName.find(
"qball") != std::string::npos) ? true :
false;
98 isFCP = (lowerCaseName.find(
"fcp") != std::string::npos) ? true :
false;
100 isDyon = (lowerCaseName.find(
"dyonss") != std::string::npos || lowerCaseName.find(
"dyonos") != std::string::npos) ? true :
false;
101 G4cout <<
"CustomMonopoleFactory: name = " << name << G4endl;
103 if(abs(pdgCode) / 1000000 == 0)
105 G4cout <<
"CustomMonopoleFactory: pdgCode too low: " << pdgCode <<
" " << abs(pdgCode) / 1000000 << G4endl;
111 double elChargeFromPDGcode = (isQball) ? (pdgCode/10)%10000/10. : (pdgCode/10)%1000/1. ;
117 XX = (abs(pdgCode)/1000)%100;
118 YY = (abs(pdgCode)/10)%100;
119 G4cout <<
"CustomMonopoleFactory: XX = " << XX <<
", YY = " << YY << G4endl;
121 elChargeFromPDGcode = (pdgCode>0) ? round(100.*XX/YY)/100. : -round(100.*XX/YY)/100.;
122 G4cout <<
"CustomMonopoleFactory: elChargeFromPDGcode = " << elChargeFromPDGcode << G4endl;
127 elChargeFromPDGcode = (abs((
int)(pdgCode/10000)) == 412) ? -pdgCode%4120000/10 : pdgCode%4110000/10;
128 magCharge = (pdgCode>0) ? 1 : -1;
129 G4cout <<
"Loading Dyons: " << magCharge << G4endl;
132 if (!isQball && !isFCP && !isDyon && abs((
int)(pdgCode/10000)) == 412) elChargeFromPDGcode = -elChargeFromPDGcode;
134 if (elChargeFromPDGcode != elCharge) {
135 G4cout <<
"CustomMonopoleFactory: El. charges for "<< name <<
" from PDGcode and 3d col. of particles.txt file do not agree: " << elChargeFromPDGcode <<
" / " << elCharge << G4endl;
136 G4Exception(
"CustomMonopoleFactory::loadCustomMonopoles",
"WrongElCharges",FatalException,
"El charge from PDGcode and 3d col. of particles.txt file do not agree");
138 if (elCharge == 0.0 && magCharge == 0.0) {
139 G4cout <<
"CustomMonopoleFactory: Both electric and magnetic charges are ZEROs. Skip the particle. " << G4endl;
145 G4cout <<
"CustomMonopoleFactory: pType is " << pType << G4endl;
146 G4cout <<
"CustomMonopoleFactory: PDGcode of " << name <<
" is " << pdgCode << G4endl;
147 G4cout <<
"CustomMonopoleFactory: Mass of " << name <<
" is " << mass << G4endl;
148 G4cout <<
"CustomMonopoleFactory: Electrical Charge of " << name <<
" is "<< elCharge << G4endl;
149 G4cout <<
"CustomMonopoleFactory: Magnetic Charge of " << name <<
" is "<< magCharge << G4endl;
153 name, mass * CLHEP::GeV , 0.0*CLHEP::MeV, CLHEP::eplus*elCharge,
156 pType, 0, +1, pdgCode,
160 particle->SetMagneticCharge(magCharge);
161 particle->PrintMonopoleInfo();
168 G4cout <<
"CustomMonopoleFactory: No particles have been loaded." << G4endl;
169 G4Exception(
"CustomMonopoleFactory::loadCustomMonopoles",
"NoParticlesLoaded",FatalException,
"No particles have been loaded");