datei einlesen und daten verarbeiten



  • hallo,
    hilfeeeee.......... mein programm gibt mir keine ergebnisse nur blödsinn
    sorry für die folgende lange erklärung aber irgendwie kopliziert die sache 😕
    ➡ ich lesen eine sehr langen datei ein die hauptsächlich aus spalten besteht
    ich fange bei ATOM an zu lesen (sind in dem fall 9187 atome) bis HETATM (da ist ein sprung drin den ich aber noch weggelassen hab??)
    ich brauche nur die 2te und die 3te spalten für später und dann die 7te, die 8te und die 9te, die mir die coordinaten x, y, z liefern die ich für eine rechnung brauche in der alle! abstände zwischen den Atomen (ATOM) berechnet werden mit der formel
    r=[wur](x1-x2)²+(y1-y2)²+(z1-z2)²
    dann wird die energie bereichnet mit der formel
    E(ij)= A/r²³ - B/r²²*³
    und anschliessend die total energie aller atome
    die tabelle sieht verkürzt so aus
    ➡
    MTRIX1 1 0.988260 0.144042 0.050931 -24.18795 1
    MTRIX2 1 -0.152186 0.898692 0.411330 -0.39040 1
    MTRIX3 1 0.013477 -0.414252 0.910062 1.53174 1
    ATOM 1 N GLN A 1 30.787 46.088 118.285 1.00 28.08 N
    ATOM 2 CA GLN A 1 32.175 45.617 118.561 1.00 23.62 C
    ATOM 3 C GLN A 1 32.741 46.312 119.795 1.00 20.98 C
    ATOM 4 O GLN A 1 32.499 47.502 119.997 1.00 18.84 O
    .
    .
    ATOM 9186 CB ALA D 181 62.861 122.590 87.971 1.00 51.67 C
    ATOM 9187 OXT ALA D 181 65.791 120.957 88.045 1.00 54.73 O
    TER 9188 ALA D 181
    HETATM 9189 O HOH 1 30.941 49.382 119.125 1.00 18.13 O
    HETATM 9190 O HOH 2 42.714 50.039 127.313 1.00 10.28 O
    .
    .
    HETATM 9935 O HOH 748 35.520 91.023 110.575 1.00 31.60 O
    HETATM 9936 O HOH 749 49.150 47.055 139.304 1.00 30.11 O
    CONECT 705 704 3186
    CONECT 848 846 3187

    mein bisheriges programm sieht so 😕 ➡ :

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math
    

    .h>

    typedef struct   coordinates
            {       char key[6];
                    char name[4];
                    double x; 
                    double y; 
                    double z;
            } coordinates;
    int catFcoordChar(char *fcoordinates)
    {       
    	/*int number;
            char alter[1];
            char residun[3];
            int residus;
            char code[1];
    	ouble faktor;
            double grad;*/
            int anzcoords=0;
            int ATOM_found=0;
            char buffer [80];
            FILE *inF=NULL;                                                                                                                            
            inF=fopen(fcoordinates, "r");
            coordinates *coordinateslist;
            coordinateslist = (coordinates *) calloc(1, sizeof(coordinates));
    
            if(!inF)
            {return -1;
            }
            while (NULL!=fgets(buffer,sizeof buffer,inF))
            {
                    if (!strncmp(buffer,"ATOM",6)|| !strncmp(buffer,"ATOM  ",6))
                    {
                    ATOM_found=1;
                    coordinateslist=(coordinates*) realloc(coordinateslist, (anzcoords + 1) *sizeof
    (coordinates));
    
                    sscanf(buffer,"%s",     coordinateslist[anzcoords].key);
    				sscanf(buffer+12,"%s",  coordinateslist[anzcoords].name);
                    sscanf(buffer+30,"%lf",&coordinateslist[anzcoords].x);
                    sscanf(buffer+38,"%lf",&coordinateslist[anzcoords].y);
                    sscanf(buffer+46,"%lf",&coordinateslist[anzcoords].z);
    
                    printf("%s %s %lf %lf %lf \n",
                            coordinateslist[anzcoords].key,
                            coordinateslist[anzcoords].name,
                            coordinateslist[anzcoords].x,
                            coordinateslist[anzcoords].y,
                            coordinateslist[anzcoords].z);        
                    anzcoords++;
                    }
                    else
                    {if (1==ATOM_found)
                            {
    /*****ENERGIE VAN DER VAALS*****/
    
    	double E, r, rco, A, B, r1, r2, EtotVDW, X, Y, Z;//xi, xj, yi, yj, zi, zj, 
    	short i, j, nb, a = 2, b = 6, c = 12;
    //	double tab [nb];
    
    	EtotVDW=0;
    	i=0;
    	j=0;
    	j=i++;
    
    	A = 3;
    	B = 7;
    	nb = 8;
    	//nb,koordinaten
    
    	printf("Give r-cutoff:\n");
    	scanf("%lg",&rco);
    
    	for(i=1;i<= nb-1;i++)
    	{
    		for(j;j<=nb;j++)
    		{
    
    X = pow(coordinateslist[anzcoords].x - coordinateslist[anzcoords].x++,a); 
    Y = pow(coordinateslist[anzcoords].y - coordinateslist[anzcoords].y++,a);
    Z = pow(coordinateslist[anzcoords].z - coordinateslist[anzcoords].z++,a);
    
    			printf("X:%lg\nY:%lg\nZ:%lg\n",X,Y,Z);
    			r = X+Y+Z; 
    			r = sqrt(r);
                                printf("r:%lg\n",r);
    
    			if(r<=rco /* && i NICHT! verbunden mit j*/)
    			{
    														/* E(ij)= A/r²*³ - B/r²*²*³
    															  => E(totVDW) */
    				r1 = pow(r,b);
    				r2 = pow(r,c);
    printf("r fuer A: %f,r fuer B: %f\n",r1,r2);
    
    				E = A/r1 - B/r2;
    				printf("EVDW:%lg\n",E);
    
    				EtotVDW = EtotVDW+E;  
    				printf ("EtotVDW:%lg\n",EtotVDW);
    
    			}
    		else 
    			printf("geht nicht\n");
      }
     }
    }
                            ATOM_found=0;
                           }
                    }
            printf("%d atomes lus !\n",anzcoords);
            return 0;        
    }
    int main (void)
    
    {        
            if(catFcoordChar("PDB.pdb"))
            {
                    fprintf(stderr,"coordinates.pdb gibts nicht\n\n");
            }
            return 0;
    }
    

    wenn man das laufen lässt ist irgendwo totaler mist drin es gibt mir für alle rechnungen die ergebnisse null
    klasse 😡
    ➡ ich glaub ich mach einen fehler mit den variablen aber keine ahnung 😕
    ein total verzweifelter chemiker bittet um hilfe 😕 😕



  • wie wäre es mit einem debug durchgang?

    überprüfe mal, ob solche bedingungen richtig sind:
    (!strncmp(buffer,"ATOM",6)|| !strncmp(buffer,"ATOM ",6))

    und was er schritt für schritt in der variable hält.

    zur falschen berechnung:
    prüfe beim debuggen, ob du die datentypen richtig gewählt hast. ein int an der falschen stelle kann dir intern die gesamten rechnungen verfälschen.

    so long



  • kann elise nur zustimmmen... um das problem mit der berechnung (was ja mehr oder weniger kein problem sein wird wenn das andere erst funktioniert) kannst du dich immer noch später kümmern...

    ich bin sogar sicher das dein fehler hier liegt

    if (!strncmp(buffer,"ATOM",6)|| !strncmp(buffer,"ATOM  ",6))
    

    !strncmp(buffer,"ATOM",6) ergibt glaub ich immer false wenn nicht zufällig genau in buffer "ATOM" drin steht... wenn da z.b. "ATOM " drin steht klappt das schon nicht mehr...

    wenn du nur checken willst ob irgendwo in der zeile ATOM drin steht nimm doch einfach strstr...



  • wenn ich das programm ohne die rechnung laufen lasse und mir einfach nur mit printf die spalten meiner datei ausgeben lasse die ich brauch habe ich keine probleme...
    also müsste folglich auch die zeile

    if (!strncmp(buffer,"ATOM",6)|| !strncmp(buffer,"ATOM  ",6))
    

    richtig sein oder?
    ich habe erst schwierigkeiten wenn ich die rechnung einfüge, keine fehlermeldung aber eben liest er die koordinaten (x,y,z) nicht ein
    ich glaube eher dass der fehler bei

    X = pow(coordinateslist[anzcoords].x - coordinateslist[anzcoords].x++,a); 
    Y = pow(coordinateslist[anzcoords].y - coordinateslist[anzcoords].y++,a); 
    Z = pow(coordinateslist[anzcoords].z - coordinateslist[anzcoords].z++,a); 
    
                printf("X:%lg\nY:%lg\nZ:%lg\n",X,Y,Z);
    

    liegt vorallem bei dem
    coordinateslist[anzcoords].x++,
    bin ich mir nicht sicher ob er dann wirklich alle! abstände berechtnet, weil ich nicht weiss ob er da mit der struktur auch wirklich ein "x" (also in der spalte runter) weiter geht oder irgenrwohin 😕



  • ok nehmen wir mal an das dein einlesen funktioniert...

    und nehmen wir mal an das du nur folgende 4 Atoma eingelesen hast

    ATOM 1 N GLN A 1 30.787 46.088 118.285 1.00 28.08 N
    ATOM 2 CA GLN A 1 32.175 45.617 118.561 1.00 23.62 C
    ATOM 3 C GLN A 1 32.741 46.312 119.795 1.00 20.98 C
    ATOM 4 O GLN A 1 32.499 47.502 119.997 1.00 18.84 O

    wie soll das was gerechnet werden...

    wenn ichs richtig verstanden habe ist bei ATOM 1 x=30.787 y=118.285 und z=118.285 ...
    analog für atom 2-4

    wie wird das ganze jetzt in die formel gepackt?
    berechne ich jetzt den abstand von atom1 zu atom2? und jage dann die Energieformel drüber?
    was ist dann mit dem abstand atom1 zu atom3 und atom1 zu atom4?....



  • schon richtig du hast mein problem erkannt
    nehmen wir an ich habe nur diese 4 atome dann versuche 😉 ich mittels meiner schleifen erst alle abstände (in dem fall 6) zu berechnen (mit der wurzelformel der koordinaten)
    und anschliessen versuch ich mit der schleife für alle gefundenen abstände die energien zu berechenen (also auch 6 energien)

    printf("EVDW:%lg\n",E);
    

    und abschliessend tu ich die gesammte energie berechnen (ein ergebniss)

    printf ("EtotVDW:%lg\n",EtotVDW);
    

    ➡ vielleicht habe ich auch richtig mist gebaut mit den schleifen und dadurch die rechnung ruiniert? hilfe

    for(i=1;i<= nb-1;i++) 
        { 
            for(j;j<=nb;j++) 
            {
    

    wobei ich das i als die in der zweiten spalte angegebene nummer nehme und das nb als die grösste mögliche nummer der spalte (wie auch immer die zu finden sei, soweit bin ich noch nicht vorgedrungen 😕 )



  • spontan würd ich sagen das deine schleifen dann so laufen müssen...

    int i,j;
    for(i=0;i<anzahl-1;++i){
      for(j=i+1;j<anzahl;++j){
    
        //hier dann die formeln reinballern...
      }
    }
    


  • sags ja nur ungerne aber das hilft gar nix
    im gegenteil da hab ich dann auch noch ausführprobleme des programms
    kann aber gerne nochmal den gesammtcode zur verfügung stellen obwohl er an oberster stelle schon steht



  • öhm was hilft den daran gar nicht

    int i,j,x_2,y_2,z_2,r_2;
    double total_energie=0;;
    for(i=0;i<anzahl-1;++i){
      for(j=i+1;j<anzahl;++j){
        x_2=pow(coordinateslist[i].x - coordinateslist[j].x,2); 
        y_2=pow(coordinateslist[i].y - coordinateslist[j].y,2); 
        z_2=pow(coordinateslist[i].z - coordinateslist[j].z,2); 
    
        r_2=x_2+y_2+z_2;
    
      total_energie+=3/pow(r_2,3) - 7/pow(r_2,6);
      }
    }
    

    oder was genau ist denn bei der rechnung nun dein problem?...



  • geht auch nicht
    mein problem:
    ausgeführt sieht das so aus:
    r fuer A: 0.000000,r fuer B: 0.000000
    EVDW:-1.#IND
    EtotVDW:-1.#IND
    X:0
    Y:0
    Z:0
    r:0
    r fuer A: 0.000000,r fuer B: 0.000000
    EVDW:-1.#IND
    EtotVDW:-1.#IND
    X:0
    Y:0
    Z:0
    r:0

    das gibt er mir für mein bsp mit 25 atomen 42mal
    wo ich aber bei 25 atomen 200 abstände bekommen müsste
    dann fragt er mich nach dem r-cutoff für das 2-te atom?

    nochmal
    das ziel ist es die x, y, z koordinaten in der gegebenen datei zu lesen
    und anschliessen mit ihnen die abstände (r) zu berechenen (bei 25 sind das 200)
    dann 200 mal die energie berechnen
    und schliesslich die gesamte energie
    vielleicht sind aber auch so viele denkfehler in dem programm das ich von vorne anfangen kann
    keine ahnung 😕 so ein mist



  • also bei mir geht das
    habs mal eben schnell umgeschrieben...
    da ich vermute das du c und nicht c++ nimmst hab ichs in c gelassen

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    typedef struct {char key[6];char name[4];double x;double y;double z;}coordinates; 
    
    int catFcoordChar(char *fcoordinates){
    
            int anzcoords=0; 
            int i,j;
    		double x_2,y_2,z_2,r_2,energie,total_energie=0;
    		char buffer [512]; 
            char dummy[512];
    		FILE *inF;                                                                                                                             
            coordinates *coordinateslist; 
    
    		coordinateslist=(coordinates*)malloc(sizeof(coordinates));
    		if(!(inF=fopen(fcoordinates, "r")))return -1; 
    
            while (fgets(buffer,sizeof(buffer),inF)){
    			if (strstr(buffer,"ATOM")){ 
    
    				coordinateslist=(coordinates*) realloc(coordinateslist,(anzcoords+1)*sizeof(coordinates)); 
    				sscanf(buffer,"%s%s%s%s%s%s%lf%lf%lf",coordinateslist[anzcoords].key,coordinateslist[anzcoords].name,dummy,dummy,dummy,dummy,&coordinateslist[anzcoords].x,&coordinateslist[anzcoords].y,&coordinateslist[anzcoords].z);
    
                    printf("%s %s %lf %lf %lf \n", 
                            coordinateslist[anzcoords].key, 
                            coordinateslist[anzcoords].name, 
                            coordinateslist[anzcoords].x, 
                            coordinateslist[anzcoords].y, 
                            coordinateslist[anzcoords].z);         
    			    ++anzcoords;
    			} 
    
    		}
    
    	if(anzcoords){
    		for(i=0;i<anzcoords-1;++i){ 
    			for(j=i+1;j<anzcoords;++j){ 
    				x_2=pow(coordinateslist[i].x - coordinateslist[j].x,2); 
    				y_2=pow(coordinateslist[i].y - coordinateslist[j].y,2); 
    				z_2=pow(coordinateslist[i].z - coordinateslist[j].z,2); 
    				r_2=x_2+y_2+z_2; 
    				energie= 3/pow(r_2,3) - 7/pow(r_2,6);       
    				total_energie+= energie;
    				printf("r_2: %f\tEnergie: %f\n",r_2,energie);
    			  } 
    		} 
    
    		printf("ATOME: %d\n",anzcoords);
    		printf("Gesamtenergie: %f\n",total_energie);
    	}
    
    	return 0;         
    } 
    
    int main(){
    if(catFcoordChar("test.txt")) 
      fprintf(stderr,"coordinates.pdb gibts nicht\n\n"); 
    return 0; 
    }
    


  • es läuft 🙂 (obwohl ich im übrigen tatsächlich einen c++ compiler verwende)
    vielen dank



  • obwohl ich das ergebniss
    Gesamtenergie: -1.#IND00
    doch ein bisschen seltsam finde und auch noch mit der anzahl der berechneten energien unstimmig bin (bei 25 atomen müssten es 200 einzelenergien sein und nicht 75)
    naja...



  • also mit den einzelenergien seh ich das so

    Atome Energien
    1 0
    2 1
    3 3
    4 6
    5 10
    6 15

    usw...

    also summe n-1 was ja bekannt n*(n-1)/2 ist...

    bei 25 atomen würde ich also mit 25*24/2=300 Energien rechnen oder wie soll das genau mit den energien laufen... Ich vermute mal ich hab da dann was anderes modelliert als du haben wolltest...



  • formel volkommen richtig
    ich habe aber 75 statt 300 energie werte, ein komisches ergebniss für die gesamt energie und du hast meine bedingung mit r-cutoff und meine start bedingung in der datei (bei ATOM) unterschlagen (vermute ich zumindest, da er mir bei 25 vorhandene atomen 34 findet, er rechnet alles vorher auch mit rein)?
    und hin&und wieder spinnt der compiler und stürzt ab (c++?) 😕



  • jaja die chemiker 😉
    ka was du da wieder genau fabrizierst...
    kannst mir deine uminöse textdatei ja mal mailen..., dann ja ich die mal bei mir durch mal gucken was der da rausbekommt...



  • eher ungünstig,da platzt das forum
    hat über 6000 seiten...



  • öhm ich sprach von mailen nicht posten... 😉



  • 😕



  • was soll mir dieser smilie jetzt sagen?



  • übersetzte:
    wie zur hölle verdammt maile ich hier in dem forum was


Anmelden zum Antworten