Quanto è utile/interessante questa discussione:
Autore |
Discussione |
|
Selenocisteina
Nuovo Arrivato
64 Messaggi |
Inserito il - 09 luglio 2012 : 18:16:26
|
Ciao a tutti, devo scrivere un programma che faccia una simulazione del movimento (urti compresi, anche se semplificati) di una serie (con numero variabile) di ioni chiusi in una scatola 2d, evolvendo il sistema a tempi discreti e osservando il movimento delle particelle. Il problema è che non so come visualizzare poi graficamente i dati che ottengo.
Ho abbastanza esperienza nell'uso di R, ma mi sembra che lì si possano fare solo una serie di grafici statici, perciò poi mi dovrei mettere ad affiancarli tutti. Inoltre, ho anche un paio di altri problemi, come il fatto che dovrei fare la massa dei "pallini" proporzionata a quella delle particelle, e con R non so come si faccia.
Tralasciando l'ipotesi di farlo a mano a ogni step di tempo con Excel :D, esiste qualche tool rapido - preferibilmente online - per visualizzare questo genere di cose? Mi servirebbe qualcosa dove posso uploadare rapidamente i dati relativi alla posizione delle particelle, alla loro carica (con un codice colore magari) e alla loro massa, e poi vedere l'evoluzione del sistema tipo "filmato".
Grazie :)
|
|
|
kORdA
Utente Attivo
Prov.: Milano
Città: Monza
1303 Messaggi |
Inserito il - 09 luglio 2012 : 18:37:56
|
Caspita, chi è quel pazzoide che ti ha dato una commissione del genere? E soprattutto a che scopo?
Comunque, io userei un altro genere di approccio. Per ogni timeframe, mi costruirei un file in formato pdb in cui trascriverei le coordinate atomiche degli ioni al tempo X. Quindi metterei tutti questi snapshot in un unico multi-pdb e lo farei girare con un viewer tipo VMD o PyMol (che ci pensano già di conto loro a sistemare le dimensioni dei diversi tipi atomici).
Detta cosi sembra semplice, quanta dimestichezza hai a scrivere codice? |
http://www.linkedin.com/in/dariocorrada |
|
|
Selenocisteina
Nuovo Arrivato
64 Messaggi |
Inserito il - 09 luglio 2012 : 19:11:05
|
Grazie mille della risposta kORda! Nessun pazzoide, è un lavoro meramente didattico (sto studiando un linguaggio di programmazione), la simulazione non ha pretesa né assolutamente possibilità di essere realistica. Semplicemente, è un programma che genera una serie di "ioni" (particelle circolari in 2d con carica elettrica, raggio, massa note) e fa aggiornamenti a tempi discreti della loro posizione, velocità e accelerazione (calcolando solo la forza elettrica generata dalle cariche) e considerando (in maniera approssimativa) alcuni degli urti che si possono avere (per esempio, particelle di segno diverso si fondono, le altre rimbalzano etc). Non c'è niente di dettagliato sulla struttura chimica delle particelle (altrimenti mi starei già sparando). Mi servirebbe un tool al quale posso dare appunto le coordinate che il programma ha generato per ogni particella nei diversi step temporali, e che mi metta insieme tutte queste coordinate facendo vedere un "video" del movimento delle particelle-"ioni". Una cosa molto semplice, ma appunto perché inutile non penso esista niente di prefatto. |
|
|
chick80
Moderatore
Città: Edinburgh
11491 Messaggi |
Inserito il - 09 luglio 2012 : 19:52:29
|
Per creare dei video in R puoi (non le sole opzioni):
1) usare il pacchetto animation che ti permette di esportare GIF animate, video swf e video avi, mp4 etc (per questi ultimi è richiesta l'installazione di FFmpeg)
2) usare imageMagik per concatenare delle JPEG (assumo l'uso di Linux, ma puoi ovviamente adattare per Windows):
for (i in 1:10)
{
jpeg("/tmp/immagine%02d.jpg") # Nota che R è intelligente e ti codifica il nome da solo ;)
# plot del frame i
}
dev.off()
system("convert -delay 0.5 immagine*.jpg output.mpg")
Esempi pratici qui: http://ryouready.wordpress.com/2010/11/21/animate-gif-images-in-r-imagemagick/
Citazione: Dovrei fare la massa dei "pallini" proporzionata a quella delle particelle
Qualcosa così ti piace?
npoints <- 100
posx = sample(seq(0, 1, 0.01), npoints, replace=T)
posy = sample(seq(0, 1, 0.01), npoints, replace=T)
pointSize = sample(seq(0, 5, 0.1), npoints, replace=T)
plot(posx, posy, pch=20, cex=pointSize, xlim=c(0,1), ylim=c(0,1))
|
Sei un nuovo arrivato? Leggi il regolamento del forum e presentati qui
My photo portfolio (now on G+!) |
|
|
kORdA
Utente Attivo
Prov.: Milano
Città: Monza
1303 Messaggi |
Inserito il - 10 luglio 2012 : 09:18:46
|
ugh, anche con tutte le semplificazioni del caso mi sembra un task abbastanza tosto per imparare a usare un linguaggio di programmazione. Per semplificarti notevolmente la vita io ti consiglierei di scrivere in output un file multi-pdb, qui trovi tutte le specifiche del caso http://www.wwpdb.org/docs.html anche se di tutto questo credo che per te sia sufficiente produrre un pdb del tipo
TITLE THIS IS A SIMULATION BOX
MODEL 0
HETATM 9029 PB PB L 218 28.553 -6.926 67.292 1.00 0.00 PB
HETATM 9030 CL CL M 218 30.938 53.215 67.292 1.00 0.00 CL
TER
ENDMDL
TITLE THIS IS A SIMULATION BOX
MODEL 1
HETATM 9029 PB PB L 218 29.553 -5.926 67.292 1.00 0.00 PB
HETATM 9030 CL CL M 218 29.938 52.215 67.292 1.00 0.00 CL
TER
ENDMDL
[...]
Visto che vuoi fare la simulazione in 2D terrai le coordinate atomiche Z uguali per tutte le particelle. Prodotto questo file lo puoi successivamente caricare su VMD http://www.ks.uiuc.edu/Research/vmd/ e farti un filmato con la rappresentazione che più ti aggrada |
http://www.linkedin.com/in/dariocorrada |
|
|
Selenocisteina
Nuovo Arrivato
64 Messaggi |
Inserito il - 10 luglio 2012 : 19:07:15
|
Grazie mille a entrambi! Mi sa che per curiosità proverò entrambe le soluzioni :) chick80, non pensavo fosse così semplice con R, e dire che avevo anche cercato, ma non riuscivo a pensare alle keyword giuste e non trovavo un bel niente! kORdA, in realtà davvero si tratta di una simulazione molto semplice che segue un paio di leggi di meccanica classica molto molto basilari (per dire, negli urti non si calcola nemmeno che le particelle potrebbero sfregare l'una sull'altra prima di "rimbalzare", ma si semplifica semplicemente con urto perfettamente elastico in 2d). La difficoltà è solo nel capire la fisica, anche se basilare, mentre, una volta capite le leggi, per l'implementazione ci vuole massimo un paio di giorni. L'unico problema è che il linguaggio è il C, perciò a volte bisogna fare dei gran giri per cose che in altri linguaggi sarebbero un po' più immediate! |
|
|
chick80
Moderatore
Città: Edinburgh
11491 Messaggi |
Inserito il - 10 luglio 2012 : 19:42:43
|
In C puoi sempre usare delle API di fisica già pronte, come Box2D o Chipmunk.
Nota che Box2D è rilasciato sotto licenza zlib, mentre Chipmunk esiste in versione "base" sotto licenza MIT o in versione Pro/Enterprise, con condizioni varie d'uso (ma sempre sotto licenza MIT). Ovviamente a te basta la versione base. |
Sei un nuovo arrivato? Leggi il regolamento del forum e presentati qui
My photo portfolio (now on G+!) |
|
|
Selenocisteina
Nuovo Arrivato
64 Messaggi |
Inserito il - 10 luglio 2012 : 19:48:09
|
Grazie :). Le conoscevo già, ma il succo del lavoro che sto facendo è implementare la cosa da zero (anzi, sto usando solo le librerie proprio basilari, molte funzioni le sto re-implementando), perché appunto il lavoro non ha pretese di utilità ma solo di apprendimento delle basi, e quindi non credo sarebbero accettate "scorciatoie". |
|
|
chick80
Moderatore
Città: Edinburgh
11491 Messaggi |
Inserito il - 10 luglio 2012 : 20:21:46
|
Chiaro, comunque la cosa interessante è che sono librerie opensource e quindi puoi sempre sbirciare cosa succede "dietro le quinte" in caso fossi bloccata. Va bene reinventare la ruota... ma fino ad un certo punto! |
Sei un nuovo arrivato? Leggi il regolamento del forum e presentati qui
My photo portfolio (now on G+!) |
|
|
kORdA
Utente Attivo
Prov.: Milano
Città: Monza
1303 Messaggi |
Inserito il - 11 luglio 2012 : 08:54:43
|
ah, io mi tiro fuori allora. Il linguaggio C per me è ancora alieno, io avrei pensato di fare un agevole perlettone |
http://www.linkedin.com/in/dariocorrada |
|
|
Selenocisteina
Nuovo Arrivato
64 Messaggi |
Inserito il - 24 luglio 2012 : 14:53:19
|
chick80 ho una domanda per te: ho fatto come dicevi con R, ma non mi funziona perché mi continua a fare overwrite dello stesso file jpg.
Il codice che ho usato è:
j = 1; k = j + 49; for(n in 1:(nrow(prove_c)/50)){ jpeg(file="frame%02d.jpg"); plot(prove_c[j:k,1], prove_c[j:k,2], pch=20, cex=prove_c[j:k,7], xlim=c(0,200), ylim=c(0,200), col=prove_col[j:k]); dev.off(); j = k + 1; k = j + 49; }
Il sistema è composto da 50 particelle, e per comodità ho messo il nuovo stato del sistema di seguito a quello precedente (perciò la riga 51esima del dataframe è la 1a particella nel suo nuovo stato). La posizione x è la prima colonna del dataframe, la y la seconda e le dimensioni sono nella settima.
Il problema è che se metto dev.off() fuori dal ciclo for mi dice "Warning: too many open devices", mentre se lo metto dentro mi riscrive tutti i frame sullo stesso file. Se uso un'altra funzione che non sia plot non mi prende tutti i parametri (tipo col), ma inoltre non capisco perché così non gli vada bene. :(
[EDIT] Ho risolto, sostituendo nella funzione per creare il file immagine: png(paste(n, "png", sep="."), width=400, height=400); |
|
|
kORdA
Utente Attivo
Prov.: Milano
Città: Monza
1303 Messaggi |
Inserito il - 24 luglio 2012 : 15:27:23
|
Due suggerimenti veloci veloci, poi magari chick80 approfondirà...
Citazione: Il problema è che se metto dev.off() fuori dal ciclo for mi dice "Warning: too many open devices", mentre se lo metto dentro mi riscrive tutti i frame sullo stesso file.
è corretto che stia dentro il ciclo, ogni volta che fai dev.off() finalizzi l'immagine plottata. Se fosse fuori avresti un mucchio di immagini illeggibili, perchè ancora aperte.
Prob, c'è qualche problema nel rinominare i nuovi file (ie lo %02d di jpeg(file="frame%02d.jpg"); a quale variabile incrementale si riferisce?) |
http://www.linkedin.com/in/dariocorrada |
|
|
Selenocisteina
Nuovo Arrivato
64 Messaggi |
Inserito il - 24 luglio 2012 : 15:46:02
|
Grazie dei commenti. :)
Sì, anche secondo me il dev.off() deve stare all'interno del ciclo per le ragioni che mi dici, anche perché notavo che negli esempi postati da chick80 usa la funzione "new.plot", che suppongo rigeneri il grafico ogni volta (risolvendo il problema dei grafici singoli che si vanno a sovrapporre).
Anche io non capisco molto bene a che variabile incrementale si riferisca quel parametro, e non riesco a farlo funzionare, mentre assegnando come nome file una stringa che contiene la mia variabile n mi genera i file corretti.
|
|
|
chick80
Moderatore
Città: Edinburgh
11491 Messaggi |
Inserito il - 24 luglio 2012 : 16:31:51
|
Citazione: lo %02d di jpeg(file="frame%02d.jpg"); a quale variabile incrementale si riferisce?
A nessuna, in teoria è la stessa funzione jpeg che dovrebbe farlo... magari è dipendente dall'OS. Ad ogni modo la tua soluzione è perfetta :) |
Sei un nuovo arrivato? Leggi il regolamento del forum e presentati qui
My photo portfolio (now on G+!) |
|
|
Selenocisteina
Nuovo Arrivato
64 Messaggi |
Inserito il - 25 luglio 2012 : 17:58:52
|
Grazie dell'aiuto! Per il dubbio che è rimasto, io ho provato con Ubuntu, quasi quasi farò una prova con Windows e vedrò se aggiorna il nome file da solo :) |
|
|
|
Discussione |
|
|
|
Quanto è utile/interessante questa discussione:
MolecularLab.it |
© 2003-18 MolecularLab.it |
|
|
|