[traitement de nombres] Comment pourrais je faire ça sous Linux ?

Comment pourrais je faire ça sous Linux ? [traitement de nombres] - Divers - Programmation

Marsh Posté le 03-02-2004 à 19:27:48    

Bonsoir,
 
voilà le pb :
j'ai plusieurs fichiers texte (codage ASCII) contenant 2 colonnes de nombres. Ce sont des fichiers décrivant des courbes de diffraction X.
Ma première colonne contient des angles en degrées.
Je cherche à appliquer cette formule sur ces angles (ça me permettra de comparer des diagrammes fait dans différents appareils) :

angle_final (en degré) = arcsin{(lambda'/lambda)*sin(angle_initial)}


 
j'ai commencé par faire ça avec un tableur mais je suis vite limité (entre 3500 et 6000 valeurs à chaque fois, ça devient vite lourd).
Je cherches donc un moyen d'automatiser ces opérations avec un script/programme.
 
L'ennui c'est que je ne sais pas quoi utiliser :( ; j'ai quelques notions de BASH (je suis sous linux) et j'avais pensé à awk, mais celui ci ne semble pas faire les arcsin.
 
je m'en remets donc à vous pour me donner des pistes ou des noms de softs ou bien des liens. Enfin bref tout ce qui pourrait m'aider. :)
 
Merci d'avance.


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 03-02-2004 à 19:27:48   

Reply

Marsh Posté le 03-02-2004 à 19:37:15    

bon je dirais pour des calculs mathematique le Fortran est ce qu'il y a de mieux, mais bon pas top , avec du Perl tu devrais t'en sortir :jap:


---------------
IVG en france
Reply

Marsh Posté le 03-02-2004 à 19:39:13    

et c'est pas trop compliqué à apprendre le perl ? tu aurais des bons liens ?
 
HS : au fait, tu t'en es sortie avec ton DHCP ?


Message édité par Mjules le 03-02-2004 à 19:41:26

---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 03-02-2004 à 19:45:43    

Mjules a écrit :

et c'est pas trop compliqué à apprendre le perl ? tu aurais des bons liens ?
 
HS : au fait, tu t'en es sortie avec ton DHCP ?


 
Pour Perl : http://forum.hardware.fr/forum2.ph [...] 097&cat=10
 
compliqué... la syntaxe est un peu special mais c'est pas trop compliqué, maintenant la plupart de langages te permette de faire ce que tu veux, je prends Perl parce que je le connais un peu  [:spamafote]  
 
HS: :jap: pas encore verifier vu que j'ai pas la machine sous la main, mais je teste et je réup le sujet


---------------
IVG en france
Reply

Marsh Posté le 03-02-2004 à 20:53:35    

Salut, je comprends pas trop :)
Tu as des fichiers texte contenant 2 colonnes de nombres, la première colonne réprésente des angles en dégré, et la deuxième, on s'en fiche ?
 
C'est "angle_initial" que l'on doit remplacer dans ta formule ?  
 
@+

Reply

Marsh Posté le 03-02-2004 à 21:31:46    

Bon, je viens de me mettre au python y'a 10 minutes [:ddr555]
 
Pour un fichier essai.tmp de cette forme :


1.2 5.8
3.9 2.8
1.2 5.1


 
Et un script python qui ressemble à çà (indulgence demandé)

Code :
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import math
  4. # angle_final (en degré) = arcsin{(lambda'/lambda)*sin(angle_initial)}
  5. fichier = open('essai.tmp','r')
  6. a = 1.9
  7. b = 2.47
  8. # on lit tout le fichier qu'on place dans lignes, ligne par ligne
  9. lignes = fichier.readlines()
  10. # on lit ligne par ligne
  11. for ligne in lignes :
  12. # split sépare les élements de la ligne (par défaut, l'espace est l'élément séparateur
  13.   donnees = ligne.split()
  14.   if len(donnees) == 2 :
  15.           s = "Angle initial:" + donnees[0] + " "
  16.           p = "Angle final:%f" % math.asin((a/b)*math.sin(float(donnees[0])))
  17.           print s+p
  18. fichier.close()


 
J'obtiens la sortie suivante :


$ ./files.py  
Angle initial:1.2 Angle final:0.799422
Angle initial:3.9 Angle final:-0.557482
Angle initial:1.2 Angle final:0.799422
$


 
Ca à l'air pas trop mal, à moins que je réponde à coté de la plaque :D
 
Enfin tout ca pour te dire que ca semble pas extremement complexe, d'autant plus que la doc python est super bien faite !
 
@++

Reply

Marsh Posté le 03-02-2004 à 21:33:34    

c'est vrai que Python est peut être plus lisible et facile d'acces maintenant que tu en parles :D


---------------
IVG en france
Reply

Marsh Posté le 03-02-2004 à 21:36:55    

Evadream -jbd- a écrit :

Salut, je comprends pas trop :)
Tu as des fichiers texte contenant 2 colonnes de nombres, la première colonne réprésente des angles en dégré, et la deuxième, on s'en fiche ?
 
C'est "angle_initial" que l'on doit remplacer dans ta formule ?  
 
@+


oui exactement  :jap:


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 03-02-2004 à 21:40:03    

Evadream -jbd- a écrit :

Bon, je viens de me mettre au python y'a 10 minutes [:ddr555]
 
Pour un fichier essai.tmp de cette forme :


1.2 5.8
3.9 2.8
1.2 5.1


 
Et un script python qui ressemble à çà (indulgence demandé)

Code :
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import math
  4. # angle_final (en degré) = arcsin{(lambda'/lambda)*sin(angle_initial)}
  5. fichier = open('essai.tmp','r')
  6. a = 1.9
  7. b = 2.47
  8. # on lit tout le fichier qu'on place dans lignes, ligne par ligne
  9. lignes = fichier.readlines()
  10. # on lit ligne par ligne
  11. for ligne in lignes :
  12. # split sépare les élements de la ligne (par défaut, l'espace est l'élément séparateur
  13.   donnees = ligne.split()
  14.   if len(donnees) == 2 :
  15.           s = "Angle initial:" + donnees[0] + " "
  16.           p = "Angle final:%f" % math.asin((a/b)*math.sin(float(donnees[0])))
  17.           print s+p
  18. fichier.close()


 
J'obtiens la sortie suivante :


$ ./files.py  
Angle initial:1.2 Angle final:0.799422
Angle initial:3.9 Angle final:-0.557482
Angle initial:1.2 Angle final:0.799422
$


 
Ca à l'air pas trop mal, à moins que je réponde à coté de la plaque :D
 
Enfin tout ca pour te dire que ca semble pas extremement complexe, d'autant plus que la doc python est super bien faite !
 
@++


ouaouh !  
c'est ça qu'il me faut  :love:  sauf que moi je veux avoir en sortie un fichier avec colonne1 modifié et colonne2 intact.
 
bon je vais regarder python :)
Merci


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 03-02-2004 à 21:41:45    

Be gorgeous, use python.

Reply

Marsh Posté le 03-02-2004 à 21:41:45   

Reply

Marsh Posté le 03-02-2004 à 21:46:37    

Mjules a écrit :


ouaouh !  
c'est ça qu'il me faut  :love:  sauf que moi je veux avoir en sortie un fichier avec colonne1 modifié et colonne2 intact.
 
bon je vais regarder python :)
Merci


 
C'est cool :)
Si tu veux pas te prendre la tete, tu remplaces :
 


  if len(donnees) == 2 :
         s = "Angle initial:" + donnees[0] + " "
         p = "Angle final:%f" % math.asin((a/b)*math.sin(float(donnees[0])))
         print s+p  


 
Par  
 


  if len(donnees) == 2 :
        s = "%f  " % math.asin((a/b)*math.sin(float(donnees[0]))) + donnees[1]
        print s


 
Et tu fais :
 


./nomduscript > nouveaufichier  


 
et hop :D


Message édité par Evadream -jbd- le 03-02-2004 à 21:49:42
Reply

Marsh Posté le 03-02-2004 à 21:56:43    

Evadream -jbd- a écrit :


 
C'est cool :)
Si tu veux pas te prendre la tete, tu remplaces :
 


  if len(donnees) == 2 :
         s = "Angle initial:" + donnees[0] + " "
         p = "Angle final:%f" % math.asin((a/b)*math.sin(float(donnees[0])))
         print s+p  


 
Par  
 


  if len(donnees) == 2 :
        s = "%f  " % math.asin((a/b)*math.sin(float(donnees[0]))) + donnees[1]
        print s


 
Et tu fais :
 


./nomduscript > nouveaufichier  


 
et hop :D


La grande classe  :wahoo:  
 
Merci 1000 fois  :jap:


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 03-02-2004 à 22:46:32    

fichier = open('essai.tmp','r')
   
  a = 1.9
  b = 2.47
   
  # on lit tout le fichier qu'on place dans lignes, ligne par ligne
  lignes = fichier.readlines()
   
  # on lit ligne par ligne  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
t'emmerdes pas
 
 
for ligne in open('fichier'):
    # ...

Reply

Marsh Posté le 03-02-2004 à 22:47:59    

Ah ok ! Très bien ! Merci !

Reply

Marsh Posté le 03-02-2004 à 22:48:48    

Mjules a écrit :


La grande classe  :wahoo:  
Merci 1000 fois  :jap:  


 
Pas de soucis, bon courage !
 
@+

Reply

Marsh Posté le 03-02-2004 à 22:52:38    

juste une réflexion
 
le % prends en argument droit un tuple. python fait automatiquement de packing, unpacking
comme dans
 
f, = sequence
ou
pair = first, second
 
donc "..." % arg fonctionne
seulement, je pense que ce n'est pas une bonne habitude, et ça peut se révéler problématique si arg est lui même un tuple
 
donc je recommande d'écrire
 
"..." % (arg,)

Reply

Marsh Posté le 03-02-2004 à 22:55:00    

Je note ! Merci pour cette remarque :)


Message édité par Evadream -jbd- le 03-02-2004 à 22:55:13
Reply

Marsh Posté le 03-02-2004 à 22:56:59    

eih j'espère que t'as surtout compris que pas besoin de fermer explicitement les fichiers en python, ça se fait tout seul à la destruction (plus de références sur les descripteur de fichiers)

Reply

Marsh Posté le 03-02-2004 à 23:01:54    

Ta remarque s'applique même lorsque qu'on fait un fichier = open('monnom'), ou bien c'était pour appuyer ta remarque précédente où le open se faisait dans le for ?


Message édité par Evadream -jbd- le 03-02-2004 à 23:02:26
Reply

Marsh Posté le 03-02-2004 à 23:04:00    

oui. en règle générale, ne prends pas la peine de fermer un fichier. le seul cas ou tu le fermes explicitement, c'est quand tu veux faire une autre opération (réouverture dans un autre mode, suppression, déplacement, renommage, etc) afin d'assurer la cohérence

Reply

Marsh Posté le 03-02-2004 à 23:06:10    

Très bien, encore merci :)

Reply

Marsh Posté le 03-02-2004 à 23:19:36    

taz a écrit :

juste une réflexion
 
le % prends en argument droit un tuple. python fait automatiquement de packing, unpacking
comme dans
 
f, = sequence
ou
pair = first, second
 
donc "..." % arg fonctionne
seulement, je pense que ce n'est pas une bonne habitude, et ça peut se révéler problématique si arg est lui même un tuple
 
donc je recommande d'écrire
 
"..." % (arg,)


 
Rapidement :
 
http://www.python.org/doc/current/tut/node9.html
 
String and Unicode objects have one unique built-in operation: the % operator (modulo). This is also known as the string formatting or interpolation operator. Given format % values (where format is a string or Unicode object), % conversion specifications in format are replaced with zero or more elements of values. The effect is similar to the using sprintf() in the C language. If format is a Unicode object, or if any of the objects being converted using the %s conversion are Unicode objects, the result will also be a Unicode object.  
 
If format requires a single argument, values may be a single non-tuple object. 2.8 Otherwise, values must be a tuple with exactly the number of items specified by the format string, or a single mapping object (for example, a dictionary).
 
Vraiment pour l'habitude alors :)


Message édité par chaica le 03-02-2004 à 23:21:22
Reply

Marsh Posté le 05-02-2004 à 15:25:12    

Bonjour,
 
alors voilà, après 2 jours d'apprentissage, j'ai finalement réussi à pondre ça :

Code :
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # Ce petit programme permet de convertir des angles obtenu par diffraction X avec une anticathode donnée
  4. # en les angles qu'on obtiendrais avec une autre anticathode
  5. # pour me contacter : mjules chez ifrance point com
  6. # v 0.1
  7. #
  8. #NOTE : le fichier d'entrée doit être composé de 2 colonnes angles et intensités, dans cet ordre et séparé par un ou plusieurs espaces
  9. import math
  10. # angle_final (en degr?) = arcsin{(lambda'/lambda)*sin(angle_initial)}
  11. fichier_anal = raw_input('Entrer le nom du fichier à analyser :')      # on entre le fichier à analyser
  12. try:                                                                                    # on vérifie que ce fichier existe
  13.         f = open(fichier_anal, 'r')
  14.         f.close()
  15. except:
  16.         print "le fichier", fichier_anal, "est introuvable"
  17. cath1 = raw_input('Entrer l\'élément utilisé pour l\'analyse (Co, Cr, Cu) : ')       # on entre le métal de l'anticathode d'analyse
  18. if cath1 == 'Co' :                                                                                   # on assigne la valeur de la raie à la variable utilisée dans l'équation
  19.         anticath_anal = 1.788
  20. elif cath1 == 'Cu' :
  21.         anticath_anal = 1.541
  22. elif cath1 == 'Cr' :
  23.         anticath_anal = 2.2798
  24. else :
  25.         print "Les autres éléments ne sont pas encore supporté, désolé"           # si l'élément est inconnu, on le dit
  26. cath2 = raw_input('Entrer l\'élément vers lequel les angles doivent être convertis (Co, Cr, Cu) : ')    #idem pour l'anticathode vers laquelle on converti
  27. if cath2 == 'Co' :
  28.         anticath_result = 1.788
  29. elif cath2 == 'Cu' :
  30.         anticath_result = 1.541
  31. elif cath2 == 'Cr' :
  32.         anticath_result = 2.2798
  33. else :
  34.         print "Les autres éléments ne sont pas encore supporté, désolé"
  35. # on lit tout le fichier qu'on place dans lignes, ligne par ligne
  36. fichier_result = fichier_anal + cath1 + "vers" + cath2                                              # on donne un nom au fichier de résultat
  37.                                                                                                                     # fichier original suivi des 2 métaux utilisés
  38. result = open(fichier_result, 'w')                                                                          # on crée le fichier de résultat
  39. # on lit ligne par ligne
  40. for ligne in open(fichier_anal, 'r') :
  41. # split s?pare les ?lements de la ligne (par d?faut, l'espace est l'?l?ment s?parateur
  42.         donnees = ligne.split()
  43.         if len(donnees) == 2 :
  44.                 pre_resultat = (anticath_result/anticath_anal)*math.sin(float(donnees[0])*(math.pi/360))   # si le résultat du sinus de l'angle multiplié par le rapport
  45.                 if (pre_resultat > 1) :                                                                                                # est supérieur à 1, l'arcsinus risque de faire la tête
  46.                                                                                                                                            # alors on met la valeur 0
  47.                   print "certains angles sont trop grands pour la conversion, ils seront remplacés par des 0"
  48.                   s = "0 " + donnees[1] + "\n"
  49.                 else :
  50.                   s = "%f " %((360/math.pi)*math.asin(float(pre_resultat)),) + donnees[1] + "\n"                # on écrit le résultat dans le fichier de sortie
  51.         result.write(str(s))


 
ça marche pas trop mal mais ya encore du boulot dessus à faire.
 
Merci beaucoup pour m'avoir donné les pistes et à bientôt sur la subcat python parce que je sens que je vais pas tarder à avoir besoin d'un peu d'aide ;)
 
A+


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed