CGI/Perl Guide | Learning Center | Forums | Advertise | Login
Site Search: in

  Main Index MAIN
INDEX
Search Posts SEARCH
POSTS
Who's Online WHO'S
ONLINE
Log in LOG
IN

Home: Perl Programming Help: Intermediate:
DNA Sequence Count Perl Program HELP!

 

First page Previous page 1 2 Next page Last page  View All


Kevone07
Novice

Oct 20, 2012, 1:14 PM

Post #1 of 34 (7141 views)
DNA Sequence Count Perl Program HELP! Can't Post

HI,
I been trying to make this program work for a good week and I have been with perl for longer than 6 weeks just having a hard time creating certain programs. This program I have make it able to read a file that has about 5,230,000 DNA sequences which I am suppose to find the count of G and C then use a equation to calculate the GC-skew. The equation is (G-C)/(G+C) x W (window)/C (length). The window is suppose to be 2000 bp and character length suppose to contain 5,230,000 bp. Its mainly meant for the program to determine the terminus sequences for a specific species. Is there anyone that has some idea to how to start this because I been spending too much time on it and freaking out. I would really appreciate it and, if you need me to explain it clear, Ill do my best. Please help & thanks in advance.


Laurent_R
Enthusiast / Moderator

Oct 20, 2012, 1:34 PM

Post #2 of 34 (7138 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

I would love to help you, but I haven't understood what you want to do.

May be the fact that I am a relatively good IT specialist, but I know nothing (or extremly little) about biology.


Kevone07
Novice

Oct 20, 2012, 4:22 PM

Post #3 of 34 (7133 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

I need help getting a count of finding the amount of "G" and "C" in a whole sequence of about 5,230,000 bp which I can go through this step by step but there are checkpoints in reading the sequence of a window of 2,000 bp. So first, I need to get a perl program to read the 2,000 bp of 5,230,000 bp finding how many "G" & "C" show up in that length (2,000 bp) which it will record and start again where it left of at the first checkpoint (2,000 bp to 4,000 bp). Again the same letters are counted and recorded. This keeps on going till the program reaches the end of the loop which is 5,230,000 bp character length . Once the results are figured out of the amount of "G" and "C" in the DNA sequence (research data saved in a file) for each 2,000 bp window. After completed the results, these numbers have to go in a GC-skew which will be calculated in a formula (G-C)/(G+C) x (W/C) for each 2,000 bp window (W) of 5,230,000 bp character length (C). These calculations only calculate for each 2,000 bp which will determine the terminus sequences for the specie genetic code I'm helping someone with there research. If you still don't understand, Ill explain it little by little bit. I tried to write it but I just get too mind boggled and get no where. I would appreciate your help and would save me a lot of time for other classes. I spent days trying to figure this out without any errors which was very impossible for me. Please respond back asap and thanks in advance! Much appreciate it!


Kevone07
Novice

Oct 20, 2012, 7:19 PM

Post #4 of 34 (7127 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

The DNA Sequence is located on a stored file so I would start off with:

open <INFILE> ".txt"
while (<INFILE>)....

Im confused on where to state the variables and how to state them to go with what I'm trying to do. Do I use an @arr in a %hash or...


wickedxter
User

Oct 20, 2012, 8:09 PM

Post #5 of 34 (7124 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post


Code
 
open my $fh ,'>','/dir/to/file.txt';

while (my $line = <$fh>){
#this reads the file one line(row) at a time starting at the top of the file and its assigned to $line

}
close $fh;



Laurent_R
Enthusiast / Moderator

Oct 21, 2012, 2:59 AM

Post #6 of 34 (7119 views)
Re: [wickedxter] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

OK, Kevone, now I start to understand better. Can you provide a short sample of your DNA file, so that we understand better how to look for the relevant nucleobases in your data.


In Reply To

Code
open my $fh ,'>','/dir/to/file.txt'; 
# ...



It should ideally be:


Code
open my $fh ,'>','/dir/to/file.txt' or die "could not open file.txt $! \n"; 
# ...



Kevone07
Novice

Oct 21, 2012, 10:33 AM

Post #7 of 34 (7028 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

An example of this file would contain, AGTCATTCAAGACAGGTAA... I need the program to read every 2,000 of these leters counting the "G" and "C" then putting it in the equation for calculation that I provided. This is how it would look like if I put the details with what you provided: $fh ,'>','/home/share/bmeg/bacillus_spp/QMB1551_chromosome.seq' or die "could not open file.txt $! \n";


Laurent_R
Enthusiast / Moderator

Oct 21, 2012, 10:57 AM

Post #8 of 34 (7026 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Is your file organized in lines (separated by new line or cariage return characters) or is it just consisting of a stream of only the letters corresponding to the four nucleobases?

This has some importance on the way to best read the file.


Kevone07
Novice

Oct 21, 2012, 11:04 AM

Post #9 of 34 (7023 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

I posted a picture of somewhat is contained in the file.


(This post was edited by Kevone07 on Oct 21, 2012, 11:45 AM)
Attachments: Untitled.png (159 KB)


Laurent_R
Enthusiast / Moderator

Oct 21, 2012, 2:15 PM

Post #10 of 34 (7012 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Allright, your file is just a pure sequence of the letters corresponding to the four nucleobases, I understand.

This requires probably a specific approach. Probably a binary slurp of a 2,000 characters and analysis of the number of the C or G components, something not really looking as what Perl is usually very good at (processing successive test lines). But I am pretty sure that what you need can be done efficiently (within a few seconds).

Having said that, I need a bit of thinking to try to figure out the best way to do what you need, but I am pretty sure it can be done efficiently.


Kevone07
Novice

Oct 21, 2012, 8:05 PM

Post #11 of 34 (7003 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Sounds like i have a lot more to learn and Thank you for putting in the time to help me, really do appreciate! I have to get something in to show it to the person I'm helping by Tuesday. I'll try to help too as much as possible. Also, any other questions you need I'll answer ASAP.


Laurent_R
Enthusiast / Moderator

Oct 22, 2012, 1:58 AM

Post #12 of 34 (6988 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Hi Kevone,

here is a starting point. What my program below does is to read a file by windows of 2000 bytes, count the number of C and G in each window and print the information:


Code
#!/usr/bin/perl 

use strict;
use warnings;

my $window_size = 2000;

my $file = "test.txt";
my $window_nr = 0;

open (my $fh, "<", $file) or die "cannot open $file $! \n";
while (my $size_read = read $fh, my $window, $window_size) {
$window_nr++;
my $nr_G = () = $window =~ /g/gi;
my $nr_C = () = $window =~ /c/gi;
print "Window Number $window_nr : there are $nr_G guanine and $nr_C cytosine in this window\n";
}


This is the output:

Code
perl test_read.pl 
Window Number 1 : there are 14 guanine and 50 cytosine in this window
Window Number 2 : there are 23 guanine and 40 cytosine in this window
Window Number 3 : there are 18 guanine and 57 cytosine in this window
Window Number 4 : there are 11 guanine and 47 cytosine in this window
Window Number 5 : there are 12 guanine and 70 cytosine in this window
Window Number 6 : there are 9 guanine and 50 cytosine in this window
Window Number 7 : there are 10 guanine and 56 cytosine in this window
Window Number 8 : there are 12 guanine and 50 cytosine in this window
Window Number 9 : there are 11 guanine and 53 cytosine in this window
Window Number 10 : there are 4 guanine and 47 cytosine in this window


Note: the number of guanine and cytosine nucleobases is low because I ran the test not on a DNA sequence file (I don't have any), but on a plain HTML file that happened to be in my test directory.

What still needs to be done is the computing of the ratio and storing the individual results in an array, or something like that.

Please try it and let me know if this fits parts of your needs. Also let me know if you need explanations on the above.


Laurent_R
Enthusiast / Moderator

Oct 22, 2012, 7:24 AM

Post #13 of 34 (6978 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Hi,

looking at your requirement, it seems that the only missing part in my earlier post was the calculation of skew. So, here is the complete script:


Code
#!/usr/bin/perl 

use strict;
use warnings;

my $window_size = 2000;

my $file = "test.txt";
my $window_nr = 0;

open (my $fh, "<", $file) or die "cannot open $file $! \n";
while (my $size_read = read $fh, my $window, $window_size) {
$window_nr++;
my $nr_G = () = $window =~ /g/gi;
my $nr_C = () = $window =~ /c/gi;
my $skew_value = ($window_size / $nr_C)*($nr_G - $nr_C)/($nr_G + $nr_C);
print "Window Number $window_nr : there are $nr_G guanine and $nr_C cytosine in this window. Skew value is: $skew_value\n";
}
close $fh;


This gives the following output:


Code
Window Number 1 : there are 14 guanine and 50 cytosine in this window. Skew value is: -22.5 
Window Number 2 : there are 23 guanine and 40 cytosine in this window. Skew value is: -13.4920634920635
Window Number 3 : there are 18 guanine and 57 cytosine in this window. Skew value is: -18.2456140350877
Window Number 4 : there are 11 guanine and 47 cytosine in this window. Skew value is: -26.4123257520176
Window Number 5 : there are 12 guanine and 70 cytosine in this window. Skew value is: -20.2090592334495
Window Number 6 : there are 9 guanine and 50 cytosine in this window. Skew value is: -27.7966101694915
Window Number 7 : there are 10 guanine and 56 cytosine in this window. Skew value is: -24.8917748917749
Window Number 8 : there are 12 guanine and 50 cytosine in this window. Skew value is: -24.5161290322581
Window Number 9 : there are 11 guanine and 53 cytosine in this window. Skew value is: -24.7641509433962
Window Number 10 : there are 4 guanine and 47 cytosine in this window. Skew value is: -35.8781810596579


Of course, you may want to produce a different output (in particular, you may want to round off the skew), but you did not provide enough information for that.

Note that the results show heavily skewed data, but remember I ran it on a HTML text file, not on a DNA sequence. Since English has many more "C" than "G", the calculated skew is meaningless.


Kevone07
Novice

Oct 22, 2012, 4:18 PM

Post #14 of 34 (6961 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Seriously, I don't know how to thank you! I know I'm going to need future help so would it be poss. helping me when needed and I'll donate some money or something in return??

Also, I just want to make sure. Would the output file go something like this?

Code
 #!/usr/bin/perl  

use strict;
use warnings;

my $window_size = 2000;

my $file = "test.txt";
my $window_nr = 0;
my $outfile = "results.txt"

open (my $fh, "<", $file) or die "cannot open $file $! \n";
while (my $size_read = read $fh, my $window, $window_size) {
$window_nr++;
my $nr_G = () = $window =~ /g/gi;
my $nr_C = () = $window =~ /c/gi;
my $skew_value = ($window_size / $nr_C)*($nr_G - $nr_C)/($nr_G + $nr_C);
print "Window Number $window_nr : there are $nr_G guanine and $nr_C cytosine in this window. Skew value is: $skew_value\n";
}
close $fh;
open (OUTFILE, ">> $outfile") or die "ERROR: opening $outfile\n";

would I make a foreach under this or just place the while under here?


Kevone07
Novice

Oct 22, 2012, 5:24 PM

Post #15 of 34 (6958 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Forget about that question but is this way familiar. I found it in google.

You can forward the output into an outfile using the > on the command line:
project1.pl > project1_output.txt I tried using that as the command in Linux but I guess its meant for perl. I'm not sure, would you know?


Laurent_R
Enthusiast / Moderator

Oct 23, 2012, 12:15 AM

Post #16 of 34 (6950 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

I am not sure I understand your questions.

The easiest way to capture the output is to redirect it to a file using the '>' operator under Linux or Unix (I haven,'t tried, but I think this would work even under Dos).

Otherwise, you could just open an output file and write to this file, I can give you the syntax, but will do that later (it is not very practical for me right now, as I am in public transportation for the moment).


Laurent_R
Enthusiast / Moderator

Oct 23, 2012, 1:26 AM

Post #17 of 34 (6947 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

The same program with the opening of an output file:


Code
#!/usr/bin/perl 

use strict;
use warnings;

my $window_size = 2000;

my $in_file = "test.txt";
my $out_file = "test_results.txt";

my $window_nr = 0;

open (my $in_fh, "<", $in_file) or die "cannot open $in_file $! \n";
open (my $out_fh, ">", $out_file) or die "cannot open $out_file $! \n";

while (my $size_read = read $in_fh, my $window, $window_size) {
$window_nr++;
my $nr_G = () = $window =~ /g/gi;
my $nr_C = () = $window =~ /c/gi;
my $skew_value = ($window_size / $nr_C)*($nr_G - $nr_C)/($nr_G + $nr_C);
print $out_fh "Window Number $window_nr : there are $nr_G guanine and $nr_C cytosine in this window. Skew value is: $skew_value\n";
}
close $in_fh;
close $out_fh


And the content of the output file:


Code
cat test_results.txt 
Window Number 1 : there are 14 guanine and 50 cytosine in this window. Skew value is: -22.5
Window Number 2 : there are 23 guanine and 40 cytosine in this window. Skew value is: -13.4920634920635
Window Number 3 : there are 18 guanine and 57 cytosine in this window. Skew value is: -18.2456140350877
Window Number 4 : there are 11 guanine and 47 cytosine in this window. Skew value is: -26.4123257520176
Window Number 5 : there are 12 guanine and 70 cytosine in this window. Skew value is: -20.2090592334495
Window Number 6 : there are 9 guanine and 50 cytosine in this window. Skew value is: -27.7966101694915
Window Number 7 : there are 10 guanine and 56 cytosine in this window. Skew value is: -24.8917748917749
Window Number 8 : there are 12 guanine and 50 cytosine in this window. Skew value is: -24.5161290322581
Window Number 9 : there are 11 guanine and 53 cytosine in this window. Skew value is: -24.7641509433962
Window Number 10 : there are 4 guanine and 47 cytosine in this window. Skew value is: -35.8781810596579



Kevone07
Novice

Oct 23, 2012, 8:47 AM

Post #18 of 34 (6937 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

That's a good way of putting it. I figured out what I was trying to do which was execute a command in linux to give me the output results in a txt file of the perl program I was running which meant I had to use " perl project1.pl > project1_output_results.txt " in the linux server. Thanks for the help, seriously! I may have more questions, I'll see how things go on this project.


Kevone07
Novice

Oct 25, 2012, 6:11 PM

Post #19 of 34 (6870 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Question: How would I make the initial bp count restart, after reaching the first 2000bp, to 100 bp for the second window initial count ranging still in 2000bp ( 100bp + 2000bp = 2100bp). I was thinking of just adding " + 100 " to the window size but it will count all the "G" and "C" from 0 to 100 and so.. instead of just counting 100bp to 2100bp than going to 200 to 2200bp and being consistent till reaching the total bp of 5097129. I know I aint making much sense but maybe you will understand. If not, just let me know and Ill try to explain it better. Thanks in advance!


Kevone07
Novice

Oct 25, 2012, 6:13 PM

Post #20 of 34 (6869 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Writing in perl gets me really confused and lose my train of thought. Sorry about anything that doesnt make sense


Laurent_R
Enthusiast / Moderator

Oct 25, 2012, 11:27 PM

Post #21 of 34 (6851 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Do you want the count window to go like this:

- 1 - 2000
- 2001- 2100
- 2101- 4100
- 4101 - 4201?

Or something else?


Chris Charley
User

Oct 26, 2012, 8:17 AM

Post #22 of 34 (6843 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Maybe the attached files will give you an idea. t33.pl is the program file, fasta_dat.txt is the data file and junk.txt is the output from the program.

I used a smaller window size because my sample fasta file sequences weren't as long as the ones you have and the skip is smaller too. You would just need to make those adjustments for your program.

Look it over and ask any questions.

Hope this helps.

Update: Made a change to t33.pl

if ($begin_pos + $window_size > $length)

to

if ($begin_pos + $window_size >= $length)

Update2: Just to show a possible output ordered by skew, (uses SQLite database, pretty simple). File is bio_stat_db.pl.


Update3: Made adjustments to t33.pl and bio_stat_db.pl. Changed from $window_size to $size_read for skew calculations. Laurent caught this error (later in this thread). Output is now at the end of the 2 program files (after the __END__ token).


(This post was edited by Chris Charley on Oct 29, 2012, 8:20 AM)
Attachments: fasta_dat.txt (19.4 KB)
  bio_stat_db.pl (4.90 KB)
  t33.pl (9.98 KB)


Kevone07
Novice

Oct 26, 2012, 1:57 PM

Post #23 of 34 (6813 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

The initial count range of 'G' & 'C' go up +100 everytime after the first initial count at 1. So it would look something like this:

-1 - 2000

-100 - 2100

-200 - 2200

-300 - 2300 etc.. till hits the total bp of about 5,000,000

I figured I didn't explain it well enough but I think you have a clear idea of it now. I wish I was better at writting in perl, too difficult from where I started at..


Laurent_R
Enthusiast / Moderator

Oct 26, 2012, 2:28 PM

Post #24 of 34 (6810 views)
Re: [Kevone07] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

Allright, you want a kind of sliding windows. I think I understood what you want.

But it is very late for me now, I hope I'll be able to give you an answer tomorrow.

I should add that Chris Charley gave a track which might be much better: using existing modules that appear to do exactly the type of calculations you need. I must say that I asked myself the question before posting previous posts: "but, isn't there already a module to do just that?" Personally, I have never used Perl for biology, so I have no idea about the possibilities offered by such modules. But since this is your field, I would suggest that you investigate thoroughly before reinventing the wheel.


Laurent_R
Enthusiast / Moderator

Oct 27, 2012, 8:57 AM

Post #25 of 34 (6755 views)
Re: [Laurent_R] DNA Sequence Count Perl Program HELP! [In reply to] Can't Post

As I said previously, using existing biology modules is probably better if they give you what you want.

Having said that, this is what I can come up without using such modules:


Code
#!/usr/bin/perl  

use strict;
use warnings;

my $window_size = 2000;

my $in_file = "test.txt";
my $out_file = "test_results.txt";

my $pass = 1;
open (my $out_fh, ">", $out_file) or die "cannot open $out_file $! \n";

my $offset = 0;
while ($offset < 2000) {
open (my $in_fh, "<", $in_file) or die "cannot open $in_file $! \n";
my $discarded_data = read $in_fh, (my $unused_line), $offset;
my $window_nr = 0;
while (my $size_read = read $in_fh, my $window, $window_size) {
$window_nr++;
my $nr_G = () = $window =~ /g/gi;
my $nr_C = () = $window =~ /c/gi;
print $out_fh "skew undetermined for pass $pass and Window $window_nr\n" and next unless $nr_C; #avoid division by 0 error if $nr_C == 0
my $skew_value = ($window_size / $nr_C)*($nr_G - $nr_C)/($nr_G + $nr_C);
print $out_fh "Pass $pass Window Number $window_nr : there are $nr_G guanine and $nr_C cytosine in this window. Skew value is: $skew_value\n";
}
close $in_fh;
$offset += 200;
$pass ++;
}
close $out_fh;


This gives me the following output:


Code
Pass 1 Window Number 1 : there are 28 guanine and 73 cytosine in this window. Skew value is: -12.206700122067 
Pass 1 Window Number 2 : there are 20 guanine and 81 cytosine in this window. Skew value is: -14.9126023713482
Pass 1 Window Number 3 : there are 15 guanine and 24 cytosine in this window. Skew value is: -19.2307692307692
Pass 2 Window Number 1 : there are 29 guanine and 75 cytosine in this window. Skew value is: -11.7948717948718
Pass 2 Window Number 2 : there are 19 guanine and 80 cytosine in this window. Skew value is: -15.4040404040404
Pass 2 Window Number 3 : there are 13 guanine and 20 cytosine in this window. Skew value is: -21.2121212121212
Pass 3 Window Number 1 : there are 29 guanine and 86 cytosine in this window. Skew value is: -11.5267947421638
Pass 3 Window Number 2 : there are 19 guanine and 71 cytosine in this window. Skew value is: -16.2754303599374
Pass 3 Window Number 3 : there are 12 guanine and 16 cytosine in this window. Skew value is: -17.8571428571429
Pass 4 Window Number 1 : there are 26 guanine and 86 cytosine in this window. Skew value is: -12.4584717607973
Pass 4 Window Number 2 : there are 17 guanine and 68 cytosine in this window. Skew value is: -17.6470588235294
Pass 4 Window Number 3 : there are 11 guanine and 13 cytosine in this window. Skew value is: -12.8205128205128
Pass 5 Window Number 1 : there are 25 guanine and 91 cytosine in this window. Skew value is: -12.5047366426677
Pass 5 Window Number 2 : there are 16 guanine and 61 cytosine in this window. Skew value is: -19.1611667021503
Pass 5 Window Number 3 : there are 9 guanine and 12 cytosine in this window. Skew value is: -23.8095238095238
Pass 6 Window Number 1 : there are 16 guanine and 96 cytosine in this window. Skew value is: -14.8809523809524
...


(Again, the program was run on a test file that is not a DNA sequence, so the values obtained are completely unsignificant.)

Asides from the changes due to your sliding window requirement, I made an additional change, because I had a hidden bug. This change is the addition of the following line:


Code
print $out_fh "skew undetermined for pass $pass and Window $window_nr\n" and next unless $nr_C; #avoid division by 0 error if $nr_C == 0


There was the possibility of having a division by 0 error if the sequence did not contain any C. This was relatively unlikely in the original version, but it becomes more likely with the sliding window rule, as the last chunk read in the file might have only 2 or 3 nucleobases and no C (because of the sliding window rule, it becomes more likely that there be one pass where the last chunk has very few nucleobases).

This leads me to another possible problem that I did not see before and discovered because of the sliding window implementation: when the last segment of data read during one pass has much less than 2000 nucleobases (say 1 to 10), its skew is possibly completely unsignificant. For example, in my above example, during pass 6, the last chunk of data gives me the following result:


Code
Pass 6 Window Number 3 : there are 7 guanine and 7 cytosine in this window. Skew value is: 0


Another (opposite) example is in the last chunk of data read in my last pass:


Code
Pass 9 Window Number 3 : there are 1 guanine and 3 cytosine in this window. Skew value is: -333.333333333333


In both cases, the calculation of the skew is correct for the data being read, but, because we are reading the last chunk of data for a given pass, we are most probably reading too little of the data for the calculated skew to be significant. So, maybe, the last chunk of data of a given pass should be discarded from the skew calculation when the number of nucleobases in the chunk is less that a given value.

Again, I have extremely little knowledge in genetics, the algorithms using these skew values may take this issue into consideration, I just want to inform you that there may be something wrong here.


(This post was edited by Laurent_R on Oct 27, 2012, 11:54 AM)

First page Previous page 1 2 Next page Last page  View All
 
 


Search for (options) Powered by Gossamer Forum v.1.2.0

Web Applications & Managed Hosting Powered by Gossamer Threads
Visit our Mailing List Archives