49 #define G4cout std::cout
50 #define G4cerr std::cerr
51 #define G4endl std::endl
52 #define G4String std::string // string included in PDBatom.hh
67 fNbNucleotidsPerStrand(0)
84 unsigned short int& isDNA,
85 unsigned short int verbose = 0)
89 infile.open(filename.c_str());
92 G4cout <<
"PDBlib::load >> file " << filename <<
" not found !!!!"
103 Atom * AtomicOld =
nullptr;
104 Atom * AtomicNext =
nullptr;
113 Residue * residueOld =
nullptr;
114 Residue * residueFirst =
nullptr;
115 Residue * residueNext =
nullptr;
124 double minGlobZ, maxGlobZ;
125 double minGlobX, maxGlobX;
126 double minGlobY, maxGlobY;
147 unsigned short int numModel = 0;
148 unsigned short int model = 0;
158 getline(infile, sLine);
159 std::size_t found = sLine.find(
"DNA");
160 if(found != G4String::npos)
167 found = sLine.find(
"HEADER");
168 if(found == G4String::npos)
171 infile.open(filename.c_str());
173 G4cout <<
"PDBlib::load >> No header found !!!!" <<
G4endl;
179 getline(infile, sLine);
181 if((sLine.substr(0, 6)).compare(
"NUMMDL") == 0)
183 istringstream((sLine.substr(10, 4))) >> numModel;
185 if((numModel > 0) && ((sLine.substr(0, 6)).compare(
"MODEL ") == 0))
187 istringstream((sLine.substr(10, 4))) >>
model;
193 if((sLine.substr(0, 6)).compare(
"SEQRES") == 0)
200 if((numModel > 0) && ((sLine.substr(0, 6)).compare(
"ENDMDL") == 0))
204 else if((sLine.substr(0, 6)).compare(
"TER ") == 0)
209 if(ter > terMax)
break;
222 if(moleculeOld == NULL)
225 moleculeOld =
new Molecule(nameMol, nbMolecule);
226 moleculeOld->
SetFirst(residueFirst);
228 moleculeFirst = moleculeOld;
232 moleculeNext =
new Molecule(nameMol, nbMolecule);
233 moleculeOld->
SetNext(moleculeNext);
234 moleculeNext->
SetFirst(residueFirst);
236 moleculeOld = moleculeNext;
241 moleculeOld->
fCenterX = (
int) ((minX + maxX) / 2.);
242 moleculeOld->
fCenterY = (
int) ((minY + maxY) / 2.);
243 moleculeOld->
fCenterZ = (
int) ((minZ + maxZ) / 2.);
275 else if((sLine.substr(0, 6)).compare(
"ATOM ") == 0)
280 istringstream((sLine.substr(6, 5))) >> serial;
284 atomName = sLine.substr(12, 4);
285 if(atomName.substr(0, 1).compare(
" ") == 0) element = sLine.substr(13,
287 else element = sLine.substr(12, 1);
290 double vdwRadius = -1.;
295 else if(element ==
"C")
299 else if(element ==
"N")
303 else if(element ==
"O")
307 else if(element ==
"P")
311 else if(element ==
"S")
318 G4cerr <<
"Element not recognized : " << element <<
G4endl;
323 errMsg <<
"Element not recognized : " << element <<
G4endl;
326 "ELEM_NOT_RECOGNIZED",
336 resName = sLine.substr(17, 3);
338 istringstream((sLine.substr(22, 4))) >> resSeq;
340 stringstream((sLine.substr(30, 8))) >>
x;
341 stringstream((sLine.substr(38, 8))) >>
y;
342 stringstream((sLine.substr(46, 8))) >>
z;
346 if(minGlobZ < z) minGlobZ =
z;
347 if(maxGlobZ > z) maxGlobZ =
z;
348 if(minGlobX < x) minGlobX =
x;
349 if(maxGlobX > x) maxGlobX =
x;
350 if(minGlobY < y) minGlobY =
y;
351 if(maxGlobY > y) maxGlobY =
y;
352 if(minX > x) minX =
x;
353 if(maxX < x) maxX =
x;
354 if(minY > y) minY =
y;
355 if(maxY < y) maxY =
y;
356 if(minZ > z) minZ =
z;
357 if(maxZ < z) maxZ =
z;
360 if(AtomicOld == NULL)
362 AtomicOld =
new Atom(serial,
378 AtomicNext =
new Atom(serial,
390 AtomicOld->
SetNext(AtomicNext);
391 AtomicOld = AtomicNext;
397 if(residueOld == NULL)
399 if(verbose > 2)
G4cout <<
"residueOld == NULL" <<
G4endl;
402 residueOld =
new Residue(resName, resSeq);
405 residueFirst = residueOld;
411 if(lastResSeq == resSeq)
421 residueNext =
new Residue(resName, resSeq);
423 residueOld->
SetNext(residueNext);
424 residueOld->
fNbAtom = nbAtom - 1;
427 residueOld = residueNext;
438 return moleculeFirst;
468 while(moleculeListTemp)
470 residueListTemp = moleculeListTemp->
GetFirst();
476 int correctNumerotationNumber = 0;
477 if(k == 2 && residueListTemp->
fResSeq > 1)
479 correctNumerotationNumber = residueListTemp->
fResSeq;
482 while(residueListTemp)
484 AtomTemp = residueListTemp->
GetFirst();
488 if(correctNumerotationNumber != 0)
491 - correctNumerotationNumber
496 double baryX = 0., baryY = 0., baryZ = 0.;
497 double baryBaseX = 0., baryBaseY = 0., baryBaseZ = 0.;
498 double barySugX = 0., barySugY = 0., barySugZ = 0.;
499 double baryPhosX = 0., baryPhosY = 0., baryPhosZ = 0.;
500 unsigned short int nbAtomInBase = 0;
502 for(
int i = 0; i < residueListTemp->
fNbAtom; i++)
505 baryX += AtomTemp->
fX;
506 baryY += AtomTemp->
fY;
507 baryZ += AtomTemp->
fZ;
509 if(residueListTemp->
fResSeq == 1)
513 baryPhosX += AtomTemp->
fX;
514 baryPhosY += AtomTemp->
fY;
515 baryPhosZ += AtomTemp->
fZ;
519 barySugX += AtomTemp->
fX;
520 barySugY += AtomTemp->
fY;
521 barySugZ += AtomTemp->
fZ;
529 baryBaseX += AtomTemp->
fX;
530 baryBaseY += AtomTemp->
fY;
531 baryBaseZ += AtomTemp->
fZ;
540 baryPhosX += AtomTemp->
fX;
541 baryPhosY += AtomTemp->
fY;
542 baryPhosZ += AtomTemp->
fZ;
546 barySugX += AtomTemp->
fX;
547 barySugY += AtomTemp->
fY;
548 barySugZ += AtomTemp->
fZ;
556 baryBaseX += AtomTemp->
fX;
557 baryBaseY += AtomTemp->
fY;
558 baryBaseZ += AtomTemp->
fZ;
563 AtomTemp = AtomTemp->
GetNext();
566 baryX = baryX / (double) residueListTemp->
fNbAtom;
567 baryY = baryY / (
double) residueListTemp->
fNbAtom;
568 baryZ = baryZ / (double) residueListTemp->
fNbAtom;
570 if(residueListTemp->
fResSeq != 1)
572 baryPhosX = baryPhosX / 4.;
573 baryPhosY = baryPhosY / 4.;
574 baryPhosZ = baryPhosZ / 4.;
576 barySugX = barySugX / 7.;
577 barySugY = barySugY / 7.;
578 barySugZ = barySugZ / 7.;
579 baryBaseX = baryBaseX / (double) nbAtomInBase;
580 baryBaseY = baryBaseY / (double) nbAtomInBase;
581 baryBaseZ = baryBaseZ / (double) nbAtomInBase;
584 if(BarycenterOld == NULL)
586 BarycenterOld =
new Barycenter(j + j_old, baryX, baryY, baryZ,
596 BarycenterFirst = BarycenterOld;
613 BarycenterOld->
SetNext(BarycenterNext);
614 BarycenterOld = BarycenterNext;
620 AtomTemp = residueListTemp->
GetFirst();
623 for(
int ii = 0; ii < residueListTemp->
fNbAtom; ii++)
632 if(dT3Dp > max) max = dT3Dp;
633 AtomTemp = AtomTemp->
GetNext();
637 residueListTemp = residueListTemp->
GetNext();
644 moleculeListTemp = moleculeListTemp->
GetNext();
647 if(BarycenterNext != NULL)
652 return BarycenterFirst;
670 double minminX, minminY, minminZ;
671 double maxmaxX, maxmaxY, maxmaxZ;
680 while(moleculeListTemp)
682 if(minminX > moleculeListTemp->
fMaxGlobX)
686 if(minminY > moleculeListTemp->
fMaxGlobY)
690 if(minminZ > moleculeListTemp->
fMaxGlobZ)
694 if(maxmaxX < moleculeListTemp->fMinGlobX)
698 if(maxmaxY < moleculeListTemp->fMinGlobY)
702 if(maxmaxZ < moleculeListTemp->fMinGlobZ)
707 moleculeListTemp = moleculeListTemp->
GetNext();
710 dX = (maxmaxX - minminX) / 2. + 1.8;
711 dY = (maxmaxY - minminY) / 2. + 1.8;
712 dZ = (maxmaxZ - minminZ) / 2. + 1.8;
714 tX = minminX + (maxmaxX - minminX) / 2.;
715 tY = minminY + (maxmaxY - minminY) / 2.;
716 tZ = minminZ + (maxmaxZ - minminZ) / 2.;
733 while(moleculeListTemp)
735 residueListTemp = moleculeListTemp->
GetFirst();
740 while(residueListTemp)
743 residueListTemp = residueListTemp->
GetNext();
747 moleculeListTemp = moleculeListTemp->
GetNext();
769 unsigned short int matchFound = 0;
771 Molecule *mLTsavedPointer = moleculeListTemp;
774 short int strandNum = 0;
777 unsigned short int BSP = 2;
789 moleculeListTemp = mLTsavedPointer;
790 BarycenterList = BLsavedPointer;
793 while(moleculeListTemp)
796 residueListTemp = moleculeListTemp->
GetFirst();
802 while(residueListTemp)
806 if(j - j_save > 2)
break;
814 if(distEdepDNA < BarycenterList->GetRadius())
819 AtomTemp = residueListTemp->
GetFirst();
820 for(
int iii = 0; iii < residueListTemp->
fNbAtom; iii++)
830 if((distEdepAtom < AtomTemp->GetVanDerWaalsRadius()) && (smallestDist
842 residueNum = residueListTemp->
fResSeq;
845 baseName = (residueListTemp->
fResName)[2];
846 if(residueListTemp->
fResSeq == 1)
848 if(iii == 0) BSP = 0;
849 else if(iii < 8) BSP = 1;
855 else if(iii < 11) BSP = 1;
859 smallestDist = distEdepAtom;
863 if(j_save == j_max_value) j_save = j;
866 AtomTemp = AtomTemp->
GetNext();
869 BarycenterList = BarycenterList->
GetNext();
870 residueListTemp = residueListTemp->
GetNext();
872 moleculeListTemp = moleculeListTemp->
GetNext();
875 numStrand = strandNum;
876 numNucleotid = residueNum;
891 return sqrt((xA - xB) * (xA - xB) + (yA - yB) * (yA - yB)
892 + (zA - zB) * (zA - zB));
int fNbAtom
Number of atoms into a residue (usage before vector)
T max(const T t1, const T t2)
brief Return the largest of the two arguments
void SetNext(Barycenter *)
Set the next Barycenter.
std::ostringstream G4ExceptionDescription
std::string fResName
Residue name.
Atom * GetNext()
Returns the next Atom.
void SetDistance(int i, double)
Set the distance between atom i and nucleotide barycenter.
Definition of the PDBlib class.
Molecule * Load(const std::string &filename, unsigned short int &isDNA, unsigned short int verbose)
Load PDB file into memory.
Barycenter * GetNext()
Get the next Barycenter.
int fCenterY
"Y center" of this Molecule (for rotation...)
int fResSeq
Residue sequence number.
std::string fElement
Element symbol extracted from 'atom name'.
double fCenterZ
"Z coordinate" of this nucelotide Barycenter
double DistanceTwo3Dpoints(double xA, double xB, double yA, double yB, double zA, double zB)
return distance between two 3D points
void ComputeNbNucleotidsPerStrand(Molecule *moleculeListTemp)
Compute number of nucleotide per strand.
typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData)
void ComputeBoundingVolumeParams(Molecule *moleculeListTemp, double &dX, double &dY, double &dZ, double &tX, double &tY, double &tZ)
Compute the corresponding bounding volume parameters.
double GetY()
Return the Y position for the Atom.
Molecule * GetNext()
information about molecule (not implemented)
int fCenterZ
"Z center" of this Molecule (for rotation...)
int fNbNucleotidsPerStrand
Number of nucleotid per strand.
void SetRadius(double)
Set the distance between the farther atom and nucleotide barycenter.
G4GLOB_DLL std::ostream G4cerr
void SetFirst(Atom *)
Set the first Atom of the residue.
double fY
Y orthogonal coordinates in Angstroms.
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
double fZ
Z orthogonal coordinates in Angstroms.
int fNbResidue
Number of residue inside the molecule.
int fCenterX
"X center" of this Molecule (for rotation...)
G4GLOB_DLL std::ostream G4cout
double fX
X orthogonal coordinates in Angstroms.
double GetZ()
Return the Z position for the Atom.
Residue * GetNext()
Get the next residue.
Atom * GetFirst()
Get the first atom.
PDBlib()
First constructor.
void SetNext(Residue *)
Set the next residue.
void SetNext(Atom *)
Set the next atom.
double fCenterY
"Y coordinate" of this nucelotide Barycenter
unsigned short int ComputeMatchEdepDNA(Barycenter *, Molecule *, double x, double y, double z, int &numStrand, int &numNucleotid, int &codeResidue)
Compute if energy is deposited in per atom.
void SetNext(Molecule *)
Set the next Molecule.
Barycenter * ComputeNucleotideBarycenters(Molecule *moleculeListTemp)
Compute nucleotide barycenter from memory.
const XML_Char XML_Content * model
Residue * GetFirst()
Get the first Residue.
double fCenterX
"X coordinate" of this nucelotide Barycenter
void SetFirst(Residue *)
Set the first Residue.
int fNumInRes
its number in residue sequence
double GetX()
Return the X position for the Atom.