Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

Using NetBeans IDE to Build Quick UI’s

Ray Hylock, GISo Tutorial – 3/8/2011

We will be building the following application using the NetBeans IDE. It’s a simple nucleotide search tool
where we have as input a sequence to search, a search sequence, the direction of the input sequence (5’
→ 3’ – Forward – or 3’ → 5’ – Reverse), the maximum percent mismatch, the minimum percent GC
content, and whether or not the search sequence indicates transitions. If transitions are allowed, then
the search sequence is case sensitive where a lower-case nucleotide indicates the possibility for a
transition (i.e., a = A or G, c = C or T, g = A or G, and t = C or T); otherwise case doesn’t matter. The input
file may or may not be in FASTA format. The output is the matching nucleotide sequence from the input
file with an offset to the start position in the input sequence, the percent mismatch, and the percent gc
content. We also add three parameter presets to the menu bar.
INSTALLATION STEPS
1. Downloading and installing the latest NetBeans IDE (using 6.9.1 in this demo)
a. Go to: http://netbeans.org/downloads/index.html
b. Select the version you want and save it somewhere
i. This file is an installer on windows so you just delete it after installation (not like
Eclipse)
ii. I typically just download ALL because I use the Java and C/C++ modules
c. Install the file when the download is complete
d. Run when installation is complete
e. At any point in time, if you wish to run the project, you must first execute Clean and
Build then Run
i. 6.8 and earlier execute Build with Run, but for some reason, 6.9.1 doesn’t

CREATING A DESKTOP PROJECT


1. File → New Project
2. In the categories section, select Java
3. In the projects section, select Java Desktop Application
4. Next → Next → Name the project (e.g., GisoDemo) → Finish
5. You should now have something that looks like the figure below
6. In package gisodemo, you have the following files
a. GisoDemoAboutBox: This is an about box tied to Help → About
b. GisoDemoApp: This is where the project is instantiated; do not modify unless you know
what you’re doing
c. GisoDemoView: This is the interface class which provides Source and Design view
i. Source: the underlying code for the GUI
ii. Design: the drag-and-drop view

BUILDING THE EXAMPLE INTERFACE


BUILDING THE INPUT
1. To being with our demo, we first want to make sure the palette is open
a. If you do not see the Palette window, then Window → Palette
2. Before we can continue on, we must first set some code generation variables.
a. Click in any part of the white space around the application
b. In the Form GisoDemoView – Properties panel (below the Palette in the screenshot
from part a – Windows → Properties),… (in the following order)
i. Uncheck Use Local Variable
ii. Set Variable Modifiers → Access = Private and
3. First, drag a Swing Panel object into the main panel (the central object) – place it in the upper
half of pane with full width

4. Next, in the Properties window, click on border and select Titled Border, change the Border
option to EtchedBorder, type “Input” into the Title field and change the color to black
5. Next, we will drag a Swing Label and Combo Box control into the Input pane
a. To change the variable name, right-click on the label and select Change variable name…
enter “direction” as the new name
6. To change the text for jLabel1, simply double-click it and type Species
7. To change the values in the combo box, click on it and in Properties select model Type in
“Forward” <enter> “Reverse

8. Next, we are going to add a series of Label and Spinner objects (Mismatch, GCMin)
a. To modify the Spinner elements, select Properties → model
i. We want to use the Model Type number for both of these
ii. Initial Value for Mismatch is 20, minimum is 0 and max is 100, step size 1
iii. Initial Value for GCMin is 70, minimum is 0 and max is 100, step size 1
b. Set the variable names to mismatch and gcminrespectively
9. We need to specify whether or not transitions are allowed (i.e., A ↔ G and C ↔ T)
a. Drag a Check Box control next to max and name it Transitions
b. Change the variable name to transitions
c. If it is checked then that means allowed else disallowed

10. We need to specify a search sequence via an input field


a. Add a Label called Search String and a Text Field with a variable name of search
b. Clear the default text by deleting everything in Properties → text
11. Next, we are going to add the controls to input a file from the File Choose (multi-step process)
a. Drag a Swing Button control to the pane and change its text value (in properties) to
Select File

b. Next, we will add a Label to the right of the select file where we will eventually display
the path to the selected file; set text to “empty”
i. To change the variable name to fileName

c. Instead of using the File Chooser palette option, we will create an action for the button
to call the File Chooser from
i. Select Source view

ii. Under the method showAboutBox(), add the following (you may have to add the
import to File)

private File inFile = null;

@Action
public void fileChooser(){
JFileChooser chooser = new JFileChooser("");
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int returnVal = chooser.showOpenDialog((java.awt.Component) null);
if (returnVal == JFileChooser.APPROVE_OPTION ){
inFile = chooser.getSelectedFile();
fileName.setText(inFile.getPath());
}
}
iii. Return to the Design menu
iv. Double-click the Select File button → Action = fileChooser
1. This assigns the method fileChooser to the button when it is pressed
12. We will round out the input part with a submission button
a. Add a Button names Execute

b. Add the following code below the fileChooser method


i. The method execute sets initializes the progress bar
ii. The class Task manages the progress bar and calls the runExecute method
iii. The runExecute method is where the computation is done (we will be adding to
this later)

@Action
public void execute(){
statusAnimationLabel.setIcon(busyIcons[0]);
busyIconIndex = 0;
busyIconTimer.start();
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
jButton1.setEnabled(false);
task = new Task();
task.addPropertyChangeListener(propertyChangeListener);
task.execute(); // just like run, different from this execute
}

private void runExecute() throws IOException{


String dir = this.direction.getSelectedItem().toString();
int mm = Integer.parseInt(this.mismatch.getValue().toString());
int gcm = Integer.parseInt(this.gcmin.getValue().toString());
boolean trans = this.transitions.isSelected();
String srch = this.search.getText();
}

private Task task;


class Task extends SwingWorker<Void, Void> {
/*
* Main task. Executed in background thread.
*/
@Override
public Void doInBackground() throws IOException {
runExecute();
return null;
}

/*
* Executed in event dispatch thread
*/
public void done() {
// Beep
Toolkit.getDefaultToolkit().beep();

// reset the status bar


busyIconTimer.stop();
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
progressBar.setValue(0);

// enable the execute button


jButton1.setEnabled(true);
}
}

/**
* Invoked when task's progress property changes.
*/
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
progressBar.setIndeterminate(false);
progressBar.setVisible(false);
progressBar.setValue(progress);
}
}
PropertyChangeListener propertyChangeListener = new
PropertyChangeListener() {

public void propertyChange(PropertyChangeEvent propertyChangeEvent) {


String property = propertyChangeEvent.getPropertyName();
}
};
c. Double-click on the button and set the action to “execute”

BUILDING THE OUTPUT


1. Add another Panel below the input and name it Output
2. Drag a Table Control object into that new Output Pane
a. Change the variable name to results
3. Go to the source view and add the following line before the execute method (required import of
DefaultTableModel)
a. The table model controls the jTable content

private DefaultTableModel model = new DefaultTableModel();

4. Let’s add a label for the total number in the result set
a. Drag a Label between the top of the Table and the Panel
b. Set the text to “---“
c. Change the variable name to resultsize
5. Now we need to write the methods to process the input
a. Create a new package called “compute” with a new method named “Compute”
b. Replace this class with the code provided at the end of this tutorial
c. Go back to GisoDemo and enter the source view
i. Add the following code the end of the runExecute method

results.setAutoCreateRowSorter(true);
model = new DefaultTableModel();
Compute c = new Compute(inFile, dir, trans, mm, gcm, srch, model);
results.setModel(model);
this.resultsize.setText(model.getRowCount() + " Results");

6. We need to assign the new DefaultTableModel to the jTable


a. In design view, select the jTable: Properties → model → Set jTable’s model property
using = Custom code, jTable1.setModel = model

7. The last thing we’ll cover is the creation of menu items with preset values
a. In design view, go to the Inspector window (lower-left) and right-click on menuBar →
Add menu
b. Change the variable name to presetMenu and set the text to Presets
c. Drag it to the second position

d. Right-click on presetMenu in the Inspector and add three menu items (Add From Palette
→ Menu Item)
i. Change the variable name to noTrans and set the text to No Trans
ii. Change the variable name to trans and set the text to Trans
iii. Change the variable name to reverse and set the text to Reverse

e. We need to add the actions to the source (we still have to add the file from the GUI)

@Action
public void noTrans(){
this.direction.setSelectedIndex(0);
this.mismatch.setValue(25);
this.gcmin.setValue(25);
this.transitions.setSelected(false);
this.search.setText("ATGAAG");
}

@Action
public void trans(){
this.direction.setSelectedIndex(0);
this.mismatch.setValue(25);
this.gcmin.setValue(25);
this.transitions.setSelected(true);
this.search.setText("ATGAaG");
}

@Action
public void reverse(){
this.direction.setSelectedIndex(1);
this.mismatch.setValue(25);
this.gcmin.setValue(25);
this.transitions.setSelected(true);
this.search.setText("ATgAAG");
}

f. Back in the Design view, click on Presets in the menu bar and add the appropriate action
to each of the menu items

8. That’s it! Clean and Build then Run (a sequence file is also provided in this document)
9. Additionally, to change the application title and About box, go to gisodemo.resources and edit
GisoDemoAboutBox.properties and GisoDemoApp.properties
COMPUTE.java
package compute;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.table.DefaultTableModel;

/**
*
* @author Ray
*/
public class Compute {
StringBuilder sequence = null;
boolean transitions = false;
int mismatch = 0;
int gcmin = 0;
String search = null;
String direction = null;
DefaultTableModel model = null;

public Compute(File f, String direction, boolean transitions, int mismatch,


int gcmin, String search, DefaultTableModel model) throws IOException{
this.direction = direction;
this.transitions = transitions;
this.mismatch = mismatch;
this.gcmin = gcmin;
this.search = search;
this.model = model;
this.sequence = new StringBuilder();
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
String s;
String seqHeader = "", accession = "";
while((s = br.readLine()) != null) {
if(s.charAt(0) == '>'){
seqHeader = s;
// 0=gi, 1=gi-number, 2=from datasource, 3=accession, 4=locus
String[] t = s.split("|");
accession = t[3];
} else {
sequence.append(s.toUpperCase());
}
}
fr.close();
if(direction.equalsIgnoreCase("REVERSE")){
StringBuilder t = new StringBuilder();
for(int i=this.sequence.length()-1; i>=0; i--){
t.append(this.sequence.charAt(i));
}
this.sequence.delete(0, this.sequence.length());
this.sequence = t;
}
model.addColumn("Match");
model.addColumn("Offset");
model.addColumn("Mismatch%");
model.addColumn("GC%");
this.compute(false);
}

private void compute(boolean sortKey) {


// iterate over the sequence
boolean loop = true;
int pos = 0;
while (loop) {
boolean match = false;
String v = sequence.substring(pos, pos + search.length());
if(transitions){
this.trans(v, search, pos);
} else {
this.exact(v, search.toUpperCase(), pos);
}
if (sequence.length() - search.length() == pos) {
loop = false;
}
pos++;
}
}

private void exact(String v, String seq, int offset) {


double mis = 0.0d;
double gc = 0.0d;
boolean match = false;
StringBuilder s = new StringBuilder();
// compare each nucleotide
for (int i = 0; i < v.length(); i++) {
char n = seq.charAt(i); // the search sequence
char t = v.charAt(i);
s.append(t);
if(t == 'C' || t == 'G'){
gc += 100/v.length();
}
if(n != t){
mis += 100/v.length();
}
if (i + 1 == v.length()) {
if(mis <= this.mismatch && gc >= this.gcmin){
match = true;
}
}
}
if(match){
Object[] newRow = {s.toString(), offset, mis, gc};
model.addRow(newRow);
}
}

private void trans(String v, String seq, int offset) {


double mis = 0.0d;
double gc = 0.0d;
int length = v.length();
boolean match = false;
StringBuilder s = new StringBuilder();
// compare each nucleotide
for (int i = 0; i < length; i++) {
char n = seq.charAt(i); // the search sequence
char t = v.charAt(i);
s.append(t);
if(t == 'C' || t == 'G'){
gc += 100/length;
}
if(n == 'A' || n == 'C' || n == 'G' || n == 'T'){
if(n != t){
mis += 100/length;
}
} else if(n == 'a' || n == 'g'){
if(t == 'C' || t == 'T'){
mis += 100/length;
}
} else if(n == 'c' || n == 't'){
if(t == 'A' || t == 'G'){
mis += 100/length;
}
}

if (i + 1 == v.length()) {
if(mis <= this.mismatch && gc >= this.gcmin){
match = true;
}
}
}
if(match){
Object[] newRow = {s.toString(), offset, mis, gc};
model.addRow(newRow);
}
}
}
SAMPLE SEQUENCE
>gi|gi-number|from|accession|locus
ATGACCGACCTCTTGAGAAGTGTTGTCACCGTAATTGATGTTTTCTACAA
ATACACCAAGCAAGATGGGGAGTGTGGCACACTGAGCAAGGGTGAACTAA
AGGAACTTCTGGAGAAAGAGCTTCATCCAGTTCTGAAGAACCCAGATGAT
CCAGACACAGTGGATGTCATCATGCATATGCTGGATCGAGATCATGACAG
AAGATTGGACTTTACTGAGTTTCTTTTGATGATATTCAAGCTGACTATGG
CCTGCAACAAGGTCCTCAGCAAAGAATACTGCAAAGCTTCAGGGTCAAAG
AAGCATAGGCGTGGTCACCGACACCAAGAAGAAGAAAGTGAAACAGAAGA
GGATGAAGAGGATACACCAGGACATAAATCAGGTTACAGACATTCAAGTT
GGAGTGAGGGAGAGGAGCATGGATATAGTTCTGGGCACTCAAGGGGAACT
GTGAAATGTAGACATGGGTCCAACTCCAGGAGGCTAGGAAGACAAGGTAA
TTTATCCAGCTCTGGGAACCAAGAGGGATCTCAGAAAAGATACCACAGGT
CCAGCTGTGGTCATTCATGGAGTGGTGGCAAAGACAGACATGGTTCCAGC
TCTGTAGAACTGAGAGAAAGAATAAACAAGTCACACATTAGCCCTTCTAG
GGAATCTGGGGAGGAGTATGAATCTGGATCTGGATCAAACAGTTGGGAAA
GGAAAGGTCATGGTGGTCTGTCATGTGGATTGGAGACTAGTGGGCATGAA
TCAAACTCTACTCAGTCAAGAATTAGAGAACAAAAGCTTGGGTCTAGCTG
TTCAGGTTCAGGAGACAGTGGGAGGCGAAGTCATGCATGTGGTTATAGCA
ATTCAAGTGGGTGTGGAAGGCCACAAAATGCTTCAAGTTCTTGTCAGTCA
CATAGATTTGGAGGGCAAGGAAATCAATTTAGCTATATTCAGTCAGGCTG
TCAGTCAGGAATTAAGGGAGGACAAGGCCATGGCTGTGTCTCAGGAGGTC
AGCCCTCTGGATGTGGTCAACCTGAGTCTAACCCCTGTAGTCAGTCCTAT
AGTCAGAGAGGATATGGAGCTAGAGAAAATGGTCAACCACAGAACTGTGG
AGGACAATGGAGAACAGGCTCAAGTCAGTCCTCTTGCTGTGGACAATATG
GGTCTGGAGGTAGCCAGTCTTGTAGTAATGGTCAACATGAATATGGTTCC
TGTGGCCGCTTTTCAAACTCTTCTAGTTCAAATGAATTTTCCAAATGTGA
TCAATATGGGTCTGGTTCAAGTCAGTCTACTAGCTTTGAACAACATGGAA
CAGGCTTGAGTCAGTCCTCTGGGTTCGAACAACATGTATGTGGCTCAGGT
CAAACTTGTGGCCAGCATGAGTCTACATCAAGTCAATCCTTGGGCTATGA
CCAGCATGGGTCTAGCTCAGGTAAGACATCTGGCTTTGGACAACATGGGT
CTGGCTCAGGTCAGTCCTCTGGCTTTGGACAATGTGGGTCAGGCTCAGGT
CAGTCCTCTGGCTTTGGACAGCATGGGTCTGTCTCAGGACAATCCTCTGG
TTTTGGACAGCATGGGTCTGTCTCAGGACAATCCTCTGGTTTTGGACAAC
ATGAGTCTAGATCACGTCAGTCTAGCTATGGCCAACATGGTTCTGGCTCA
AGTCAATCATCTGGCTATGGCCAATATGGGTCTAGAGAGACATCTGGCTT
TGGACAACATGGGTTGGGCTCAGGTCAATCCACTGGCTTTGGCCAATATG
GATCGGGCTCAGGTCAGTCCTCTGGCTTTGGACAACATGGGTCTGGCTCA
GGACAATCCTCTGGCTTTGGACAACATGAGTCTAGATCAGGTCAGTCTAG
TTATGGCCAACACAGTTCTGGCTCAAGTCAGTCATCTGGCTATGGCCAAC
ATGGGTCTAGACAGACATCTGGCTTTGGACAACATGGGTCAGGCTCAAGT
CAATCCACTGGCTTTGGCCAATATGGATCAGGCTCAGGTCAGTCCTCTGG
CTTTGGACAACATGTTTCTGGCTCAGGACAATCCTCTGGTTTTGGACAAC
ATGAGTCTAGATCAGGTCATTCTAGCTATGGCCAACATGGTTTTGGCTCA
AGTCAATCATCTGGCTATGGTCAACATGGGTCAAGTTCAGGACAGACATC
TGGATTTGGACAACACGAGTTAAGCTCAGGTCAGTCTTCCAGCTTTGGCC
AACATGGATCAGGCTCAGGTCAGTCCTCTGGCTTTGGACAACATGGGTCT
GGCTCAGGACAATCCTCTGGCTTTGGACAACATGAGTCTAGATCAGGTCA
GTCTAGCTATGGCCAACACAGTTCTGGCTCAAGTCAGTCATCTGGCTATG
GCCAACATGGGTCTAGACAGACATCTGGCTTTGGACAACATGGGTCAGGC
TCAAGTCAATCCACTGGCTTTGGCCAATATGGATCAGGCTCAGGTCAGTC
CGCTGGCTTTGGACAACATGGGTCTGGCTCAGGACAATCCTCTGGCTTTG
GACAGCATGAGTCTAGATCACATCAGTCCAGCTATGGCCAACATGGTTCT
GGCTCAAGTCAATCATCTGGCTATGGTCAACATGGGTCAAGTTCGGGACA
GACATCTGGCTTTGGACAACACAGGTCAAGCTCAGGTCAATACTCTGGCT
TTGGACAACATGGATCAGGCTCAGGTCAGTCCAGTGGCTTTGGACAACAT
GGGACTGGCTCAGGACAATACTCTGGTTTTGGACAACATGAGTCTAGATC
ACATCAGTCTAGCTATGGCCAACATGGTTCTGGCTCAAGTCAGTCATCTG
GCTATGGTCAACATGGGTCAAGTTCAGGACAGACTTTTGGATTTGGACAA
CACAGGTCAGGCTCAGGTCAATCCTCTGGCTTTGGCCAACATGGATCAGG
CTCAGGTCAGTCCTCTGGCTTTGGACAACATGAGTCAGGCTCAGGAAAAT
CCTCTGGCTTTGGACAGCATGAGTCTAGATCAAGTCAGTCTAATTATGGC
CAACATGGTTCTGGCTCAAGTCAGTCATCTGGCTATGGTCAACATGGGTC
TAGTTCAGGACAGACAACTGGCTTTGGACAACACAGGTCAAGCTCAGGCC
AATACTCAGGCTTTGGACAACATGGATCAGGCTCAGATCAGTCCTCTGGC
TTTGGACAACATGGGACTGGTTCAGGACAATCCTCTGGTTTTGGACAATA
TGAGTCTAGATCACGTCAGTCTAGCTATGGCCAACATGGTTCTGGCTCAA
GTCAATCATCTGGCTATGGTCAACATGGGTCAAATTCAGGACAGACATCT
GGATTTGGACAACACAGGCCAGGCTCAGGTCAGTCCTCTGGCTTTGGCCA
ATATGGATCGGGCTCAGGTCAGTCTTCTGGCTTTGGACAACATGGGTCAG
GCACAGGTAAATCCTCTGGCTTTGCACAGCATGAGTACAGATCAGGTCAG
TCTAGCTATGGCCAACATGGTACTGGCTCCAGTCAATCATCTGGCTGTGG
CCAACATGAGTCTGGCTCAGGTCCAACCACAAGTTTTGGACAGCATGTGT
CTGGCTCAGACAATTTCTCTAGTTCTGGACAACATATATCTGACTCAGGT
CAGTCCACTGGATTTGGCCAATATGGTTCAGGCTCAGGTCAATCAACTGG
CTTGGGCCAGGGTGAATCTCAACAAGTAGAGTCAGGATCCACAGTTCATG
GGAGACAGGAAACTACTCATGGTCAGACAATAAATACCACTAGACATAGC
CAGTCTGGTCAAGGACAATCCACACAGACAGGGTCCAGGGTAACTAGAAG
ACGAAGATCTAGCCAAAGTGAGAACAGTGACAGTGAAGTGCACTCAAAGG
TCTCACACAGACATTCAGAACACATTCACACACAAGCTGGATCTCACTAC
CCAAAGTCAGGATCCACAGTTCGCAGAAGACAAGGAACTACTCATGGACA
GAGAGGAGATACCACTAGACATGGCCATTCTGGTCATGGACAGTCTACAC
AGACAGGTTCCAGAACATCTGGAAGACAGAGATTTAGCCACAGTGATGCC
ACTGACAGTGAAGTGCACTCAGGGGTCTCACATAGACCACACTCACAAGA
ACAAACTCACAGCCAAGCTGGATCTCAACATGGAGAGTCAGAATCCACAG
TTCATGAGAGACATGAAACTACTTATGGACAGACAGGAGAGGCCACTGGA
CATGGCCACTCTGGTCATGGACAGTCCACACAGAGAGGGTCCAGGACAAC
TGGAAGAAGGGGATCTGGCCATAGTGAGTCCAGTGACAGTGAAGTGCACT
CAGGGGGCTCACACAGACCACAATCACAAGAACAAACTCATGGCCAAGCC
GGATCTCAACATGGAGAGTCAGGATCCACAGTTCATGGGAGACACGGAAC
TACTCATGGACAGACAGGAGATACCACTAGACATGCCCACTATCATCATG
GAAAATCCACACAGAGAGGGTCCAGTACAACTGGAAGAAGGGGATCTGGC
CACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGGCTCGCACACACA
TTCAGGACACACTCACGGCCAAAGTGGATCTCAACATGGAGAGTCAGAAT
CCATAATTCATGACAGACACAGAATTACTCATGGACAGACAGGAGATACC
ACTAGACATTCCTACTCTGGTCATGAACAAACCACACAGACAGGGTCCAG
GACAACTGGAAGACAGAGAACTAGCCACAGTGAGTCCACTGACAGTGAAG
TGCACTCAGGGGGCTCACACAGACCACACTCACGAGAACACACTTACGGC
CAAGCCGGATCTCAACATGAAGAGCCAGAATTCACAGTTCATGAGAGACA
CGGAACTACTCATGGACAGATAGGAGATACCACTGGACATTCCCACTCTG
GTCATGGACAGTCCACACAGAGAGGGTCCAGGACAACTGGAAGACAGAGA
TCTAGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGTCTCACA
CACACATACAGGACACACTCATGGTCAAGCTGGATCTCAACATGGACAGT
CAGAATCCATAGTTCCTGAGAGACATGGAACTACTCATGGACAGACAGGA
GATACCACTAGACATGCCCACTATCATCATGGATTAACCACACAGACAGG
GTCCAGGACTACTGGAAGAAGGGGATCTGGCCACAGTGAGTACAGTGACA
GTGAAGGGTACTCAGGAGTCTCACATACACATTCAGGACACACTCATGGC
CAAGCCAGATCTCAACATGGAGAGTCAGAATCCATAGTTCATGAGAGACA
TGGAACTATACATGGACAGACAGGCGATACCACCAGACATGCCCACTCTG
GTCATGGACAGTCCACACAGACAGGGTCCAGGACCACTGGAAGAAGGTCA
TCTGGCCACAGTGAGTACAGTGACAGTGAAGGGCACTCAGGGTTCTCACA
AAGACCACACTCACGAGGACACACTCACGGCCAGGCTGGATCTCAACATG
GAGAGTCAGAATCCATAGTTGACGAGAGACATGGAACTACTCATGGACAG
ACAGGAGATACCAGTGGACATTCTCAATCTGGTCATGGACAGTCCACACA
GTCAGGATCCAGTACAACTGGAAGAAGGAGATCTGGCCACAGTGAGTCCA
GTGACAGTGAAGTGCACTCAGGGGGCTCACATACACATTCAGGACACACA
CACAGCCAAGCCAGGTCTCAACATGGAGAGTCAGAATCCACAGTTCACAA
GAGACACCAAACTACTCATGGACAGACAGGAGATACCACTGAACATGGCC
ACCCTAGTCATGGACAAACCATACAGACAGGGTCCAGGACAACTGGAAGA
AGGGGATCTGGCCACAGTGAGTACAGTGACAGTGAAGGGCCCTCAGGGGT
CTCACACACACATTCAGGACACACTCACGGTCAAGCTGGATCTCACTATC
CAGAGTCAGGATCCTCAGTTCATGAGAGACACGGAACTACTCATGGACAA
ACAGCAGATACCACTAGACATGGCCACTCTGGTCATGGACAGTCCACACA
GAGAGGGTCCAGGACAACTGGAAGAAGGGCATCTGGCCACAGTGAGTACA
GTGACAGTGAAGGGCACTCAGGGGTCTCACACACACATTCAGGACACGCT
CATGGCCAAGCCGGATCTCAACATGGAGAGTCAGGATCCTCAGTTCATGA
GAGACACGGAACTACTCATGGACAGACAGGAGATACCACTAGACATGCTC
ACTCTGGTCATGGACAGTCCACACAGAGAGGGTCAAGGACAGCTGGAAGA
AGGGGATCTGGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGT
CTCACACACACATTCAGGACACACTTATGGCCAAGCCAGATCTCAACATG
GAGAGTCAGGATCTGCCATTCACGGGAGACAGGGAACTATACATGGACAG
ACAGGAGATACCACTAGACATGGCCAGTCTGGTCATGGACAGTCCACACA
GACAGGTTCCAGGACAACTGGAAGACAAAGATCTAGTCACAGTGAGTCCA
GTGATAGTGAAGTGCACTCAGAGGCCTCACCCACACATTCAGGACACACT
CACAGCCAAGCCGGATCTCGACATGGACAGTCAGGATCCTCAGGTCATGG
GAGACAGGGAACTACTCATGGACAGACAGGAGATACCACTAGACATGCCC
ACTATGGTTATGGACAATCCACACAGAGAGGGTCCAGGACAACTGGAAGA
AGGGGATCTGGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCATGGGG
CTCACACACACATTCAGGACACATTCAGGGCCAAGCTGGATCTCAACAAA
GACAGCCAGGATCCACAGTTCATGGGAGACTGGAAACTACTCATGGACAG
ACAGGAGATACCACTAGACATGGCCATTCTGGTTATGGACAATCCACACA
GACAGGTTCCAGATCTAGTAGAGCAAGTCATTTTCAGTCACATAGTAGTG
AAAGGCAAAGGCATGGATCAAGTCAGGTTTGGAAACATGGCAGCTATGGA
CCTGCAGAATATGACTATGGGCACACTGGGTATGGGCCTTCTGGTGGCAG
CAGAAAAAGCATCAGTAATTCTCACCTTTCATGGTCAACAGACAGCACTG
CAAACAAGCAACTGTCTAGACATTGA

You might also like