APPARATUS AND METHOD FOR MULTIPLE SYNTHESIS OF ORGANIC COMPOUNDS ON POLYMER SUPPORT

Abstract: A solid phase synthesis system is provided by employing a fully automated robot (20) that operates with a novel timing protocol executed by a computer (25) for handling multiple synthetic tasks efficiently. The fully automated robot (20) moves along a track (35) and is equipped with a gripper arm (30) which can pick up, position, and operate syringes (40, 60) which can contain solid supports and amino acid reactants. The novel timing protocol is realized by performing steps in the synthesis cycles for different compounds, such as peptides, concurrently rather than on a sequential basis.

Description: APPARATUS AND METHOD FOR MULTIPLE SYNTHESIS OF ORGANIC COMPOUNDS ON POLYMER SUPPORT Technical Field This invention relates to an apparatus and method for the multiple synthesis of compounds consisting essentially of repeating structural units formed, for example, by repeated washing, deprotection, and coupling. More particularly, the invention is directed to a system for the multiple synthesis of organic compounds, such as peptides, which uses an automated robot for handling multiple synthetic tasks. Reference To Microfiche Appendix A microfiche appendix consisting of two (2) microfiches and of a hundred twenty (120) frames is included as a part of the specification. The microfiche appendix contains a program listing implementing the present invention. The program listing is subject to copyright protection. The copyright owner, however, has no objection to the facsimile reproduction by anyone of the program listing, as it appears in the Patent and Trademark Office file or records, but otherwise reserves all copyright rights whatsoever. Background of The Invention Systems for the synthesis of organic compounds, for example peptides, are highly desired for many applications. For example, the synthesis and collection of a large number of peptides would assist in the development of agents tha't could block, promote or otherwise affect cellular reactions that involve recognition and binding. These agents would be useful in the treatment or diagnosis of a number of diseases. SUBSTTTUTESHEET(RULE26) More particularly, synthetic peptides can be used as diagnostic and therapeutic agents. Understandably, peptide synthesis systems have been designed and constructed. Houghten. R.A. , Proc. Natl Acad. Sci. , 82: 5131-5135 (1985), employs a "tea bag" method using standard Boc amino acid resin in polypropylene mesh packets with standard washing, deprotection, neutralization, and coupling protocols of the original solid phase procedure of Merrifield, R.B., J. Amer. Chem Soc.. 85: 2149-2154 (1963). Although some peptide synthesis systems have been automated for the synthesis of multiple peptides, they generally exhibit poor "respite" time, unable to handle efficiently multiple synthetic tasks. For example, commercial peptide synthesis systems, such as those from Gilson, USA and Advanced Chem Tech, are capable of synthesizing multiple peptide sequences. However, these automated synthesis systems perform each step in the synthetic cycles for all peptides one by one or sequentially. The timing protocol, more specifically, involves washing all peptides one by one, deprotecting all peptides one by one and then coupling all peptides one by one. For example, coupling is initiated for a first peptide and then when those first initiation coupling steps are completed, coupling is initiated for a second peptide. Such a timing protocol results in an especially long delay or respite time between peptide synthesis steps. Washing all peptides one by one is time consuming. Moreover, during coupling, the system is idle while waiting for coupling to finish. 'With coupling taking up to 2 hours, the efficiency of prior art automated synthesis systems is severely limited. Furthermore, prior art automated peptide synthesis systems critically lack flexibility. Once the synthesis of a peptide set has started, any additional peptides, even those urgently required, cannot be started. Furthermore, prior art systems lack the flexibility so as to execute more than one type of coupling reaction, which is typically required for the synthesis of non-peptide compounds. Summary of The Invention A novel synthesis system overcoming the drawbacks of the prior art is realized by employing a fully automated robot that operates with a novel timing protocol for handling multiple synthetic tasks efficiently. The novel timing protocol is realized by performing different steps in the synthesis cycles for multiple organic compounds concurrently rather than on a sequential basis. Advantageously, this novel timing protocol provides the flexibility of readily adding desired compounds to the list of compounds to be synthesized, changing the order in which the compounds are synthesized, or deleting previously entered compounds. More importantly, such a timing approach or protocol decreases the "respite" time - new synthesis steps of the next compound synthesis being initiated prior to the completion of those in the previous synthesis. In an exemplary embodiment, the novel synthesis system includes an industrial robot system operating under computer control for effecting the synthesis steps within each cycle of the selected compounds, for example, peptides. Each synthetic cycle comprises five different steps: washing, adding deprotection reagents, deprotection, adding coupling reagents and coupling. Because deprotection and coupling do not involve any robot action they are passive synthetic steps, although chemically active; the other steps are active synthetic steps. Importantly, the novel timing protocol is realized by having the robot system, during the passive synthetic steps of a compound synthesis, perform active synthetic steps for the synthesis cycle of the synthesis of the next compound. In a preferred embodiment of the invention, a solid-phase peptide synthesis is used, with a first set of plastic syringes containing the resin used as the solid support and serving as the reaction vessel. Additionally, a second set of plastic syringes contains amino acids. The robot system equipped with a gripper arm positions any one of the plurality of syringes to selectively aspirate and dispense solvents and reagents from the desired syringe in accordance with the novel timing protocol for coupling predetermined amino acids to the solid support. Brief Description of The Drawings A more complete understanding of the invention may be obtained by reading the following description in conjunction with the appended drawing in which like elements are labeled similarly and in which: Fig. 1 is a block diagram of a synthesis system in accordance with the principles of the invention; Figs. 2A and 2B are illustrative flow charts representing the operation of the synthesis system of Fig. 1, and more particularly, the timing protocol; and Fig. 3 is a chart illustrative of the timing protocol for the synthesis system of Fig. 1. Detailed Description The invention relates to an apparatus for the multiple synthesis of compounds consisting essentially of repeating structural units, for example peptides, formed by repeated washing, deprotection, and coupling. The apparatus or synthesis system employs a fully automated robot system that operates with a novel timing protocol for handling multiple synthetic tasks efficiently. The novel timing protocol is realized by performing different steps in the different synthesis cycles of multiple organic compounds concurrently rather than on a sequential basis, as discussed in more detail below. Without any loss of generality or applicability for the principles of the present invention, the overall operation of the present invention is described using, as an example, Fmoc/tBu chemistry, applied to the Merrifield solid phase synthesis of peptides. It should, however, be understood that the present invention is equally applicable to any other chemistry for the solid phase synthesis of compounds that consist essentially of repeating structural units, such as polymers or organic compounds as described, for example, in Borchardt et al . , J. Am. Chem. Soc. 116: 373 (1994); Chen et al . , J. Am. Chem. Soc.. 116: 2661 (1994) ; Simon et al . , PNAS. 89: 9367 (1992) ; Nikolaiev et al. , Pept. Res.. 6: 161-70 (1993) ; and ebl et al. , Vol. 5: 541-548, Techniques In Protein Chemistry. Academic Press, San Diego (1994) , which are incorporated herein by reference. Before describing the present invention, however, it will be instructive to discuss briefly the basic principles of peptide synthesis. Peptide synthesis involves the coupling of amino acids and may be accomplished by techniques familiar to those skilled in the art. See, for example, Stewart and Young, Solid Phase Synthesis. Second Edition, Pierce Chemical Co., Rockford, IL (1984), which is incorporated herein by reference. The process of peptide synthesis on solid supports generally involves building a peptide from the carboxyl or C-terminal end in which the C-terminal amino acid with its protected α-amino group is attached to a solid phase polymer. The protecting group is then cleaved off, and the next amino acid, also protected, is coupled by a peptide bond to the α- amino group of the amino acid attached to the solid support. The cycle of deprotecting the prior amino acid and coupling the additional amino acid is repeated until the desired peptide is synthesized. Any reactive side chains of the amino acids are protected by chemical groups that can withstand the coupling and Nα-deprotection procedure. These side chain protecting groups, however, can be removed at the end of the synthesis. In order to couple an amino acid to the growing synthetic chain, the carboxyl group of the blocked amino acid must be activated. Many methods of activation may be used, including, for example, preformed symmetrical anhydrides (PSA) , preformed mixed anhydride (PMA) , acid chlorides, active esters, and in si tu activation of the carboxylic acid. The present synthesis system includes a fully automated robot system interfaced to a computer for effecting the synthesis cycle of each desired peptide to be synthesized. Referring to Fig. 1, there is illustrated a block diagram of a preferred embodiment of a system for the multiple synthesis of compounds, more particularly peptides, applying standard Fmoc/tBu chemistry in accordance with the principles of the invention. Synthesis system 10 comprises an industrial robot system 20, such as Model A251 from CRC Plus, Inc., Harrington, Canada, that is interfaced to a IBM personal computer 25. Computer 25 includes such hardware as a central processing unit, program and random access memories, timing and control circuitry, input and output interface devices, and other digital subsystems necessary to the operation of the central processing unit, all of which are well known and understood in the art. Accordingly, such computer hardware is not discussed herein for the sake of clarity. Robot system 20 is programmed to effect different mechanical manipulations through the use of pre¬ programmed steps typically provided for in software programs delivered with the robot system. Alternatively, such preprogrammed steps can be provided for in third party software programs, such as Total Control For Windows, Hudson Control Group Inc., Springfield, New Jersey. Those skilled in the art will readily note that other computer means, microcomputer control means or other automated control means, including other programming software, may be alternatively provided to effect mechanical manipulations. Automated robot system 20 equipped with a gripper arm 30 that is movable under program control along track 35 can pick up and position (X,Y,Z) any one of a plurality of syringes to any predetermined location. The gripper arm is used to selectively aspirate and dispense solvents and reagents from the desired syringe which serves as the reaction vessel for coupling predetermined amino acids to a solid support. More particularly, each syringe has a plunger that is movable by the gripper arm so as to aspirate or dispense reagents in a manner well known to those skilled in the art. See, for example, Krchnak, V., Vagner, J., "Color-Monitored Solid-Phase Multiple Peptide Synthesis Under Low-Pressure Continuous Flow Conditions," Peptide Res. 3, 182 (1990), which is incorporated herein by reference. Moreover, the gripper arm provides a means for shaking the contents of the syringes. Also, the content amount of reagents in each syringe can be readily determined by detecting the position of the plunger within the desired syringe. Also, to confirm that the syringe has been properly gripped and positioned, an optical sensor 36 detecting the motion of the syringes is preferably used to provide feedback to the synthesis system. A suitable solid support may be selected, such as a polystyrene or polyethylene glycol/polystyrene resin. The protected amino acids may be readily obtained from a number of places, such as Bachem (Torrance, California) , Advanced' ChemTech (Louisville, Kentucky) or Propeptide (Vert-le-Petit, France) . Importantly, computer 25 also controls when each step in the synthesis cycle is initiated so as to implement the novel timing protocol of the present invention wherein different steps in the synthesis cycles of multiple peptides are performed concurrently rather than on a sequential basis. More particularly, synthesis system 10 includes a first set of plastic syringes 40 for holding resin used as the solid support, herein referred to as "resin syringes." In the preferred embodiment, RAM- TentaGel (0.21 mmol/g) obtained from Rapp-Polymere, Tubingen, Germany, is used as the resin. First set of plastic resin syringes 40 is placed in incoming racks 50, each holding up to, for example, thirty 10 ml and thirty 2.5 ml syringes. Synthesis system 10 also includes a second set of plastic syringes 60 for holding amino acid solutions, herein referred to as "amino acid syringes." Similarly, second set of syringes 60 are placed in racks 70, each holding up to, for example, a hundred 10.0 ml and a hundred 2.5 ml syringes. Basket 65 holds the completed synthesized peptides . The number and size of the first and second sets of syringes will be dependent on the number of different peptides synthesized, the length of the peptides and the number of different amino acids required. Plastic syringes 40, 60 preferably are made of a material, such as polypropylene, that is sufficiently chemically inert to all solvents and reagents used in the solid-phase peptide synthesis, including trifluoroacetic acid. Alternative materials include Kevlar, Teflon or cast glass. Each plastic resin syringe 40, which serves as the reaction vessel, is equipped at the bottom with a frit (not shown) . It should be understood that various other vessels and means for retaining the solid phase and removing the excess reagents and solvents may be used. For example, columns or wells fitted with a frit or filter may be used as alternative reaction vessels that are compatible with the present synthesis system. In that alternative, the columns or wells are connected to a vacuum source in such a manner that they can be disconnected from the reaction vessel. Moreover, the frit or the means for retaining the solid phase does not have to be integral with the reaction vessel. Rather, it can be external or only present when necessary to retain the solid phase during the removal of solution therefrom. Appropriate solvents and reagents are introduced from solvent reservoirs to delivery cups 80 using four 10 ml piston pump systems 90, such as the Hamilton MicroLab 900, Reno Nevada. Commercial-grade solvents and reagents, such as dimethylformaminde (DMF) , piperidine/DMF, DIC/DMF, are used. Three of the piston pumps deliver solvents and reagents to delivery cups 80 whereas the fourth piston pump removes waste as well as wash solution from cups 80 where the amino acids and the coupling reagents are mixed. Delivery cups 80 comprise a first cup 100 that is used for all washing and for receiving the protected amino acids and coupling reagents, and a second cup 110 that is used for receiving deprotection reagents. Those skilled in the art will readily note that further independent manipulating stations may be used to manipulate the syringes, depending on the particular reaction desired therein, such as dispensing, aspirating, shaking, heating, cooling or even refluxing. In those instants, robot system 20 would only be required to position the appropriate syringes in the desired manipulating stations. This would decrease the required time to perform the active synthetic steps because the most time consuming tasks would be distributed among multiple and independent manipulating stations. Using the above synthesis system, multiple peptides are synthesized by manipulating the syringes so as to repeatably attach during a synthetic cycle a desired amino acid to the solid support. Those skilled in the art will note that there is neither a physical link, such as tubing and valves, between the reagent vessels and the reaction vessels nor between the mixing chambers and the reaction vessels. As such, different reagents and reaction conditions may be used within the same or different peptide synthesis. Each synthetic cycle consists of the following sequence of basic operations or steps: washing, adding deprotection reagents, deprotection, adding coupling reagents, and coupling. Judiciously combining synthetic cycles, each coupling a desired amino acid, creates a synthesis protocol for the synthesis of the desired peptide. Only three of the above synthetic steps, washing, adding deprotection reagents and adding coupling reagents, however, directly require the use of robot system 20. These steps are referred herein to as "active synthetic steps, " although chemically passive, and are discussed in more detail below. During washing, robot system 20 positions a selected resin syringe from rack 40, a tumbler 120 or holding position 125 and then dispenses any liquid therein into liquid waste 130. A preprogrammed amount of washing liquid is subsequently delivered to first cup 100 using piston pump system 90 and then aspirated together with a preprogrammed amount of air using the selected resin syringe. Robot system 20 finally then shakes the selected resin syringe for a preprogrammed time to ensure efficient mixing. Adding deprotection reagents similarly requires the use of robot system 20. Robot system 20 positions the desired resin syringe over liquid waste 130 and dispenses any liquid therein. A preprogrammed amount of deprotection mixture is subsequently delivered to second cup 110 and then aspirated together with a preprogrammed amount of air using the selected resin syringe . Lastly, adding coupling reagents also requires the use of robot system 20. Robot system 20 positions the selected resin syringe in holding position 125. Robot system 20 then selects and positions a selected amino acid syringe, dispensing a predetermined amount of desired amino acid into first cup 100. The selected amino acid syringe is repositioned in rack 40. A preprogrammed amount of activating agents is then delivered to first cup 100 and aspirated together with a preprogrammed amount of a r using the selected resin syringe located in holding position 125. That selected resin syringe is then positioned into tumbler 120. Next, robot system 20 dispenses a preprogrammed amount of washing solvent into first cup 100 which is then aspirated. Typically, the latter steps of tumbling and washing are repeated a number of times, preferably three times. During deprotection and coupling, the syringes are placed on 2.5 ml or 10.0 ml tumbling racks 120, each of which holds up to 18 syringes, to ensure an efficient mixing. In order to better understand the timing protocol that allows the handling of multiple synthetic tasks more efficiently, a discussion of the underlying basis for the timing protocol would be instructive, particularly with reference to the flow charts of Figs. 2A and 2B. To begin with, the user enters the sequence of compounds to be synthesized. And, if the necessary reagents are available, the system will start to initiate a desired synthesis - otherwise, the user is notified of the deficiencies. More particularly, for each desired synthesis, the system determines the particular synthetic steps, both active and passive, that are required to synthesize the sequence as well as determines when those synthetic steps are to be performed - that is, their timing or temporal relationship within the synthetic cycle. Those skilled in the art will readily note that these synthetic steps are sequence specific, that is they are specifically correlated' to the desired synthesis. Herein, these synthesis steps are referred to as a "sequence specific timing protocol." In considering to initiate a new synthesis, the "sequence specific timing protocol" of the new desired synthesis is compared to the sequence specific steps or timing protocol for those sequences already initiated. These latter sequence specific steps are referred to as a "cumulative remaining timing protocol" because they are a compilation of all the individual "sequence specific timing protocols" of currently initiated syntheses. More particularly, the above comparison requires the system to plot out when the active synthetic steps of the new desired synthesis occur with respect to the active synthetic steps of the sequences currently being synthesized. And, unless there is a timing conflict in performing the active synthetic steps of the new desired synthesis and those already initiated, the system begins to initiate the start of the new synthesis, if necessary reagents are available. It should be understood that the new sequence specific timing protocol of the desired new synthesis is added to the "cumulative remaining timing protocol." Should, however, a timing conflict exist, the system attempts to determine if the initiation of the new desired synthesis can be delayed or "time shifted", up and until the start of the next active synthetic step of any of the initiated syntheses, so as to eliminate the timing conflict. Unless the system is able to resolve the timing conflict, the system will not initiate the new desired synthesis, but will instead proceed to execute the next required active synthetic step of the syntheses currently in progress. Once the active synthetic step has been performed, the system updates the "cumulative remaining timing protocol" and then attempts again to resolve the timing conflict during the next passive synthetic step of any of the ongoing syntheses. This timing protocol is repeatably performed until all the desired syntheses have been initiated. Below is an illustrative description of the synthetic steps for the simultaneous synthesis of multiple peptides in accordance with the principles of the timing protocol discussed above. It should be recalled that each synthetic protocol in the multiple synthesis is a sequenced cycle order of pre-programmed steps or procedures. For this illustrative description, one synthetic cycle consists of the following synthetic steps: (i) washing the resin three times with dimethylformamide (DMF) for thirty (30) seconds each time; (ii) deprotecting the amino acid with fifty percent (50%) solution of piperidine/DMF for ten (10) minutes; (iii) washing the resin five (5) times with dimethylformamide (DMF) for thirty (30) seconds each time; and (iv) two (2) hour coupling using three (3) molar excess of DIC/HOBt activated Fmoc protected amino acids. After finishing the last synthetic cycle for each peptide, the synthesis is finished by washing, or by washing, deprotecting and washing, if that is applicable. Robot system 30 operating in accordance with the above illustrative synthetic cycle positions a first resin syringe (peptide synthesis no. 1) , manipulates the plunger to aspirate a wash solution of dimethylformamide (DMF) , and then shakes the resin syringe. This washes the resin with wash solution for „ W,O _ 9 _6,/,,2,2,15 --7 -j g PCT/US96/01168 thirty (30) seconds. Preferably, the washing is repeated three times. Subsequently, the first resin syringe is used to aspirate from the delivery cup the deprotection reagents that have been dispensed by the 5 piston pump. This latter step is the "adding deprotection reagents" step. This repeated washing and adding deprotection reagents takes about five (5) minutes. 0 During deprotection, which lasts about ten (10) minutes, the synthesis system can advantageously direct the robot system to initiate washing and adding deprotection reagents for a second resin syringe or the next peptide synthesis (peptide synthesis no. 2) . 5 Since that washing and adding deprotection reagents, however, only takes less than five minutes, there are at least five minutes still remaining before the deprotection is completed for the first resin syringe. To ensure that the respite time between steps is 0 minimized, the synthesis system further directs the robot system to initiate yet another washing and adding deprotection reagents for a third resin syringe (peptide synthesis no. 3) . 5 Determining whether to initiate another washing and adding deprotection reagents for a subsequent resin syringe (the next peptide synthesis) is controlled automatically under program control by comparing the sequence specific timing protocol with 0 the cumulative remaining timing protocol, as discussed above. In effect, washing and adding deprotection agents are initiated if the least remaining time for deprotection is sufficiently long to complete the task. 5 Once deprotection has been completed for the first resin syringe, the synthesis system directs the robot system to position the first resin syringe so as to wash the resin for thirty seconds with dimethylformamide (DMF) . This is repeated, preferably, five times, after which the resin syringe is positioned in a temporary holding location. The amino acid syringe containing the desired amino acid to be coupled is next positioned and a preprogrammed amount dispensed into the delivery cup which then receives a DIC solution. The first resin syringe is used to aspirate from the delivery cup the amino acid solution so as to couple that amino acid. This latter step is the "adding coupling reagents" step. Likewise, the time for washing and adding coupling reagents takes about five (5) minutes. During that coupling, the synthesis system advantageously directs the robot system to initiate coupling for the second resin syringe (peptide synthesis no. 2) , and then subsequently for the third resin syringe (peptide synthesis no. 3) . Similarly, determining whether to initiate another washing and add coupling reagents for a subsequent resin syringe or peptide synthesis is controlled automatically under program control by comparing the sequence specific timing protocol with the cumulative remaining timing protocol, as discussed above. In effect, washing and adding coupling reagents are initiated if the least remaining time for coupling is sufficiently long to complete the task. Once coupling has been initialized for all three resin syringes, that is the three peptide syntheses, the synthesis system takes a fourth resin syringe (peptide synthesis no. 4) and initiates washing and deprotection. The synthesis system initiates washing and deprotection for as many resin syringes (peptide syntheses) as possible before the least remaining coupling time expires. This procedure is repeated until the sequence of the shortest length peptide is assembled. If desired, an additional resin syringe can then be used to synthesize a new peptide sequence. The maximum amount of peptide synthesized is limited by the size of the syringe. For example, with 10 ml syringes containing about 500 mg of resin (0.5 mmol/g resin), it is anticipated that 0.25 mmol of peptide (ca 300 mg crude decapeptide) can be synthesized. Those skilled in the art will readily note in the above illustrative description that the coupling time for each peptide synthesis is the same - the earliest initiated coupling finishing prior to subsequently initiated couplings. In that situation, each new initiated synthetic cycle for a peptide synthesis follows the order in which the prior cycle was initiated. Of course, it should be understood that different coupling times, if that is desired, may be used. The principles of the timing protocol, however, do not change - the system, if time permits, initiates an active synthesis step of the next peptide synthesis during the passive steps of the prior peptide synthesis . A program listing implementing the principles of the invention, including the timing protocol, is contained in the microfiche appendix. Referring to Fig. 3, there is illustrated the timing protocol or timing relationship between washing, adding deprotection reagents, deprotection, adding coupling reagents and coupling for the multiple synthesis of twelve peptides using the above described solid phase peptide synthetic protocol. Those skilled in the art will readily note based on the discussion above that during passive synthetic steps (deprotection and coupling) , active synthetic steps in the synthetic cycles of the next peptide synthesis are concurrently initiated with the prior peptide synthesis. For example, referring to Fig. 3, during deprotection of the first peptide synthesis (peptide synthesis no. 1) , washing and adding deprotection reagents is initiated for the second and third peptide syntheses (peptide synthesis nos. 2 and 3) . It should be understood that prior to initiating the synthesis of each compound, various parameter variables must be specified, in the synthetic protocol of each desired peptide synthesis, including the kind and amount of solvent or reagents to be dispensed, and the length of time of the corresponding washing steps and/or reaction steps. Also, because aspiration is performed in adding deprotection reagents and adding coupling reagents, the volume of air necessary to enable the efficient mixing of the resin and solvent must be specified. In addition to the various parameter variables which must be specified or retrieved from existing stored synthetic protocols, the synthesis system must also be initialized with other information, including the assignment and identification of solvents and reagents contained in the peptide synthetic protocols,* the reagent and amino acid concentrations (mmol/ml) used to calculate the corresponding reagent and amino acid solution volumes, respectively; the size of the syringes; the amount of resin in the syringes; the substitution of resin in mmol/g; the positions and content of each amino acid syringe, preferably identified by a three to five letter code, including its concentration and available volume,* the peptide sequences desired to be synthesized using the identifying three to five letter codes; and for each peptide its identifying code, and sequence. Preferably, the system prompts the user for the information. Alternatively, however, this information may be entered prior to initiating the peptide syntheses or stored in a file or database. The order in which sequences to be synthesized are entered establishes their priority for synthesis, and establishes a synthesis queue. Advantageously, any compound can be entered with any priority. Also, additional sequences can be added to the synthesis queue together with the necessary synthetic protocol. Also, additional reagents may be added, if necessary. From the above information, the system calculates whether the amount of amino acid and reagents is sufficient to prepare all the peptides. Unless there is enough amino acid and reagents available for the synthesis, the synthesis system will not initiate that synthesis, indicating instead its status as "not ready." Significantly, the above timing protocol allows handling multiple synthetic tasks efficiently since active synthetic steps requiring the use of the robot system in the synthesis cycles of multiple peptides are performed concurrently with passive synthetic steps in different synthetic cycles. Moreover, because synthesis resources become immediately available with each completed synthesis, a new peptide synthesis can be initiated without waiting for the complete synthesis of the entire set of desired peptides. Preferably, the new peptide synthesis is taken from the top of a waiting list of peptides that has been prioritized according to need. Advantageously, that prioritized waiting list can be changed at any time, either by adding or deleting any peptide, to meet varying situations. Further, any peptide currently being synthesized can be halted without affecting the synthesis of the others. Advantageously, since there is neither a physical link between the reagent vessels and the reaction vessels nor between the mixing chambers and the reaction vessels, different reagents and reaction conditions may be used within the same or different peptide synthesis. Such flexibility, of course, allows for the synthesis of libraries requiring variable numbers of building block reagents. To test the reliability and throughput of the above novel peptide synthesis system, five different peptide amides (IKRKR, VRYGI, AAAGY, FPRGR, VYFAW) were synthesized using a RAM TentaGel resin in accordance with the principles of the invention. Also, a mixture K (82.5% trifluoroacetic acid, 5% p- cresol, 5% thioanisole, 2.5% ethanedithiol and 5% water) was used to deprotect side chains and to cleave 6/22157 2 2 the peptides from the resin. Results from that experimental practice indicate, a high degree of purity of the crude material based on analytical gradient HPLC traces and molecular peak analysis using mass spectroscopy. It is understood that various other modifications will also be readily apparent to those skilled in the art without departing from the scope and spirit of the invention. For example, the principles of the invention can be equally applied to any chemistry that involves repeated procedures, such as washing, deprotection and coupling - particularly, solid phase synthesis, including but not limited to the organic reactions described in Borchardt et al . , J. Am. Chem. Soc.. 116: 373 (1994); Chen et al. , J. Am. Chem. Soc. , 116: 2661 (1994); Simon et al. , PNAS. 89: 9367 (1992); Nikolaiev et al. , Pept . Res.. 6: 161-70 (1993) ; and Lebl et al., Vol. 5: 541-548, Techniques In Protein Chemistry, Academic Press, San Diego (1994) . Accordingly, it is not intended that the scope of the claims appended hereto be limited to the description set forth herein, but rather that the claims be construed as encompassing all the features of the patentable novelty that reside in the present invention, including all features that would be treated as equivalents thereof by those skilled in the art to which this invention pertains. FOCUS PAGE 24 Apparatus and Method for Multiple Synthesis of Organic Compounds on Polymer Support Viktor Krdmak et al. z^ Apparatus and Method for Multiple Synthesis of Organic Compounds on Polymer Support Viktor Krchnak et al. Page 1 £ 6. Procedure : AMINO Purpose : Print the current values of amino acid volumes Author : CES disablekeys filenew 2,"temp.prt" if (num_codes) filewriteline 2,"Required Amino Acid Amounts" filewriteline 2,"" filewriteline 2,"Code Req. Avail Code Req. Avail Code Req. Avail Code filewriteline 2 , n n a - 1 while (a <■- num_codes && a <= 50) a$ • » "" stringformat b$," 4.3s %5.11f %5.11f * « ,aalist_code$[a] ,aalist_req[a] ,aalist a$ « a$ + b$ ~~ if (a+50 <= num_codes) stringformat b$,"*4.3s %5.11f %5.11f ",aalist_code$[a+50] ,aalist_req[a+50 a$ « a$ + b$ endif if (a+100 <= num_codes) stringformat b$,"*4.3s *5.11f %5.11f ",aalist_code$[a+100],aalist_req[a+l a$ • = a$ + b$ endif if (a+150 <= num_codes) stringformat bS,"%4.3s *5.11f %5.11f",aalist_code$[a+150] ,aalist_req[a+150 a$ • = a$ + b$ ndif -ilewriteline 2,a$ a - a + l endwhile filewriteline 2,ascii$(12)+"Available Amino Acid Amounts" else filewriteline 2,"Available Amino Acid Amounts" endif filewriteline 2,"" filewriteline 2," 10 ml Syringe Rack 2.5 ml Syringe filewriteline 2,"" filewriteline 2,"Pos Code Cone Vol Pos Code Cone Vol Pos Code Cone Vol Po a - l while (a <= 50) a$ - "" stringformat b$,"%3.01f %4.3s - .llf *4.11f ",a,acid_code$[a] ,acid_conc[a],ac a$ - a$ + b$ stringformat b$,"*3.01f *4.3s *4.11f *4.11f '*,a+50,acid_cσde$(a+50],acid_con a$ » a$ + b$ stringformat b$,"*3.01f %4.3s *4.11f *4.11f ",a,acid_code$[a+100] ,acid_conc[a a$ - a$ + b$ stringformat b$,"*3.01f %4.3s %4.11f *4.11f",a+50,acid code$[a+150] ,acid_conc[ a$ - a$ + b$ ~ filewriteline 2,a$ a - a + 1 Copyrigh't, 1994, 1995 en —hile Page 2 fileclose « ■ fileprint "temp.prt" enablekeys Page 3 Procedure : AMINO Purpose : Allow operator to change amino acids Author : MJB,CES local a,b,a$,b$,lastcoderow,startindex,sel_row disablekeys ; Set the colors of the volumes — set the ones that have their required ; greater than their available to red. setnumarray code color[l] ,15,-1 a - l ~ while (a <= num codes) if (aalist_req[a] > aalist avail[a)) code color[a] - 4 * " endif ~ a y - a + l endvhile ; Start off by showing all codes a •• l while (a <= 100) code_index[a] «• a code_index( +100] = a a « • * a + ι endwhile code_row ■» o lastcoderow - o te row « o teι._col • « o num_ten •= loo two_row >•• o two_col ■» o num_two • = 100 ; Store temporary data so we can go back to it savevars 1,"tmpamino.dat" savevars 2,"t pcodes.dat" screenon "amino" enablekeys user_choice «- o while (user_choice !- -i) if (user_choice — l) call aminoprt.tcl user_choice ■ o elseif (user_choice — 2 ) ; Clear all amino acid values ask user_choice,"Are you sure you want to clear\nall amino data?" if (user ^ choice) s β tstrϊngarray acid_code$(l] ,"",200 setnumarray acid_conc(l],o,200 setnumarray acid_avail[1] ,0,200 Paqe 4 calc_needed • = l -Al . ?- . updatetable endif user_choice »* • 0 elseif (user_choice — 5) ask user_choice,"Cancel changes to amino rack?" if (user~choice) ; RetrTeve temporary data loadvars 1,"tmpamino.dat" loadvars 2 , " tmpcodes . dat" screenback stop endif user_choice « 0 elseif (code_row != lastcoderow) ; show a subset of the codes disablekeys screenhold if (code_row • »*•*- 0) ; show all codes a - 1 while (a <= 100) code_index[a] = a code~index(a+100] *= a a = a + 1 endwhile num_ten = 100 num_two = 100 else ; Only show the locations for the codes selected a$ " aalist_code$[code_row) ; Search through the 10 ml array and find ones that match num_ten = 0 startindex *• 0 sarrayfind startindex, acid_code$ [startindex+l] , a$ while (startindex ! = -1 && startindex <= 100) match endwhile endif lastcoderow — code_row updatetable screenupdate enablekeyε elseif (ten_row | | two_row) Page 5 ; Change amino acid disablekeys ; Figure out which amino acid rack if (ten_row) sel_row = code_index[ten_row] else sel_row = code_index[two_row + 100] + 100 endif show sel_row ten_row = o two~row = o if (fast_ ill) ; automatically set the syringe to the full amount if (acid_code$[sel_row] != "") acid_avail[sel_row] = 2.5 + 7.5*(sel_row<-100) endif else ; allow the user to set any of the values if (sel_row <= 100) b$ •= "\n(l0 ml rack, position " + numtostr$(sel_row) + ' ■ )" else b$ = "\n(2.5 ml rack, position " + numtostr$(sel_row-100) + ")" endif ; input the code: if changed, find the concentration from similar code a$ «- acid_code$[sel_row] inputstring a$,"Enter the code:"+b$ if (a$ != acid_code$[sel_row]) acid_code$(sel_row] = a$ sarrayfind startindex,acid_code$[l],a$ if (startindex =*» sel_row) sarray ind startindex,acid_code$[startindex+l] ,a$ endif if (startindex != -l) acid_conc(sel_row] = acid_conc(startindex] else acid_conc[sel_row] = .1 endif acid_avail[sel row] «* 0 endif a - acid_conc[sel_row] inputnum a,"Enter the concentration:"+b$ if (a ! • = acid_conc[sel_row]) startindex >*« 0 ~ sarrayfind startindex,acid_code$(startindex+1] ,a$ while (startindex != -l) acid_conc[startindex] •* a sarray ind startinde ,acid_code$(startindex+1] ,aS endwhile endif a - -l while (a < 0 |j a > (2.5 + 7.5*(sel_row<=100) ) ) a acid_avail[sel_row] inputnum a,"Enter the available volume:"+b$ if (a »= 0 && a <= (2.5 + 7.5*(sel_row<=*100))) if (a !«= acid_avail[sel_row]) Page 6 -3/- cid_avail[sel_row] •= a endif else tellalarm "The volume must be between 0 and " + untostr$(2.5 + 7.5*(s endif endwhile endif updatetable screenupdate enablekeys endif endwhile savevars 1, "amino.dat" savevars 2,"codes.dat" screenback Paqe 7 ~31 - Procedure: BREAKSEQ Pωpose : breaks sequence into individual codes Author : MJB Notes : Iiφut - bs_seq$ Output — couplings = # of couplings code$[couplings] = individual codes in sequence bs_error •= 1 if error, 0 if valid sequence local char$,seqlen,pos,a,b seqlen = strlen(bs_seq$) pos = 1 couplings — 0 bs_error = 0 setstringarray code$[l],"",-l // Break sequence string into peptide codes ===== while (pos<=seqlen) char$ = mid$(bs_seq$,pos,l) if Osallalnum(char$)) code$[couplings+l] = code$[couplings+l] + charS elseif(char$-="-") if(strien(code$[couplings+l])) couplings = couplings + 1 endif else bs_error= 1 stop endif pos = pos + 1 endwhile if(strien(codeS[couplings+l])) couplings - couplings + 1 endif // Flip sequence around : a « = l while (a<=couplings) flipcodeS[a] = code$[a] a « a + 1 endwhile b = couplings a=l while (a<=couplings) code$[a] = flipcodeSfb] a = a+l b = b-l endwhile Procedure : CAZ-C Purpose : Calculate required and available volumes Author : MJB,CES local syringe,curamino,curprocess,cursequenceS,curdodep$, ytime timer mytime disablekeys sysmsgS • *- "Waiting for robo ..." screenupdate stringrsquest "USING SYRINGES" sysmsgS • = "Calculating required volumes..." calc_needed ■= 0 screenupdate num_codes « 0 setstringarray aalist_code$[0],"",-1 setnumarray aalist_req[0],0,-1 setnumarray aalist_avail[0],0,-1 setnumarray aalist_coπc(0],0,-1 setnumarray sol_req[1] ,0,-1 syringe - l while (syringe <■ num_syringes) sysmsg$ = "Calculating volumes (syringe "+numtostr$(syringe)+") —" screenupdate "*nly process the syringe if it has been assigned a location or it , .ιas already been started if (syr_loc[syringe] | | syr_process(syringe] > 1) ; Set the process data to the syringe's current status or to the ; start if it hasn't begun if (syr_process[syringe] > 1) curprocess - syr_process[syringe] curamino •= syr_amino_step[syringe] else curprocess = 2 curamino » l endif cursequence$ - syr_sequence$[syringe] curdodepS «■ syr_dodeprot$[syringe] aa_short •* 0 buf_short *■ o ; Find the amino acid code bs_seq$ >- syr_sequence$[syringe] call breakseq.tcl ; Go through the protocol and figure out how much amino acid and ; reagent is required at each process step while ((prot_proc[curprocess] !=• step_finished) && (curprocess < num_procs) show "Step: " + prot_step$[prot_proc(curprocess]] Page 10 ; Fir--» amino volume xequired "βajarocess - curprocess aa_amino$ •= code?[curamino] aa_syringe = syringe call calcaa.tcl ; Find solution and buffer volume buf_process •= curprocess buf_syringe «= syringe call calcbuf.tcl ; Determine which step is next stringrequest "NEXT STEP" ns_process «= curprocess ns_amino = curamino ns_dodep$ = curdodepS call nextstep.tcl curprocess = ns_process curamino = ns_amino stringfree "NEXT STEP" endwhile ; Is there enough aa and buf for syringe to be processed? if (aa_short | | buf_short) calc_needed = l if (syr_process[syringe] = 1) syr_process(syringe] = 0 elseif (syr_process(syringe] > 1) tellalarm "Syringe #"+numtostr$(syringe)+" is in process\nbut will not h endif elseif (syr_process[syringe] = 0) syr_process[syringe] = l endif endif syringe = syringe + l endwhile sysmsgS • -- "•• updatetable screenupdate enablekeys show "calc took " + numtostrS(elapsed(mytime) ) stringfree "USING SYRINGES" Page 11 Procedure-: CALCAA Purpose : Calculate required amino acid or a step Author : MJB,CES Notes : Input: aa_process aa amino$ aa syringe aa~short — set if the avail is less than required local c_index,rt_index,tempamount if (prot_step$[prot_proc[aa_process] ] = "Add Coupl.") r iϊf , determine the volume required if (aalist_conc(c_index] ) tempamount = syr_resin(aa_syringe] * syr ^ subst [ aa_syringe ] * prot_vol [aa_pro tempamount = tempamount / aalist_conc[c_index] aalist_req[ c_index] = aalist_req(c_index] + tempamount else aalist_avail [ c_index] = -1 aalist_req [ c_index ] = 0 endif if (aalist_req[c_index] > aalist_avail[c_index) ) aa_short = l endif endif Page 12 than required local temp$ , sol_index temp$ = prot_step$ [prot_proc[buf jprocess] ] if ( empS 1 = "Add Coupl . " S.& temp$ ! = "Wash" 6& tempS ! = "Add Deprot . " ) stop endif sarrayfind sol_index,contents$[1],prot_buf$[buf_process] if (sol_index «= -l) sysmsgS = "Could not find buffer solution: "+prot_buf$[buf_process] delay 1000 stop endif if (temp$ • = "Wash") sol_req(sol_index] = sol_req[sol_index] + prot_vol(buf_process] sol_req[sol_index] = sol_req[sol_index] + cleaning_amount*3 elseif (temp$ • •*- "Add Coupl.") sol_req[sol_index] = sol_req[sol_index] + (syr_resin[buf_syringe]*syr_subst[bu elseif (tempS == "Add Deprot.") \_req[sol_index] = sol_req(sol_index] + prot_vol[buf_process] en>_ -t " if (sol_req[sol_index] > sol_avail[sol_index]) buf_short = l endif Page 13 3? - ~ Procedure: C EANCUP Purpose : clean coupling cup with solution Author : MJB local b ;find cleaning solution sarrayfind clean_buf l , prot_step$ [ 1 ] , "Wash" narrayfind clean_buf2 ,prot_proc[l] , clean_bufl sarrayfind clean_buf , contents^ [ 1 ] , prot_buf $ [ clean_buf 2 ] clean_cup_done •= 1 b - o while (b<3) ;dispense cleaning solution if (!Simulate_robot) SYRINGE.dispense clean buf,cleaning_amount endif delay 500 ;aspirate cleaning solution, fourth prob is vacuum probe if (!simulate_robot) SYRINGE.pipette 4, (cleaning amount + .5) endif delay 500 \- - b + 1 em -ile SYRINGE . pipette 4 , cleaning_amount clean_cup_done — 0 Page 14 Procedure: CLEARALL Purpose: Clear all syringes from the system A Iiuutthhnorr ? : f C*"EPSS local choice sysmsgS = "" screenupdate clear_all_syringes = 0 ask choice,"Are you sure you want to clear all syringes?" if (!choice) enablekeys stop jndif if (next_syringe > 1) ■ ■* >«* • ask choice,"Are you sure you want to clear all active syringes ? if (!choice) enablekeys stop else tell "Please remove ALL SYRINGES from the ROBOT SYSTEM now. endif sysmsg? = "Clearing all syringes" endif scr_--nupdate ; data for a sample setstringarray syr_pepcode$[1] ,"",-1 setstringarray syr_sequence$[1],"",-1 setnumarray syr_size[l] ,10,-1 setnumarray syr_rack[l] ,0,-l setnumarray syr_rackloc[1],0,-1 setnumarray syr_loc[1] ,0,-1 setnumarray syr_grip[l] ,0,-l setnumarr y syr_amount[1] ,0,-1 setnumarray syr process[1] ,0,-1 setnumarray syr amino step[l],0,-l ;holds current coupling solution setnumarray syr_amino_count[l] ,0,-1 ;holds current coupling solution setnumarray syr_resin[1] , .2,-l setnumarray syr_subs [1] , .45,-1 setstringarray syr_dodeprot$[1] ,"N",-1 setnumarray syr_processtime[1] ,0,-1 setstringarray syr_datetime$[1],"",-1 setnumarray syr_statcolor[1],0,-1 syr_pepcode$[1] = "Default" num_syringes » 0 next_syringe ■> l current_row ■*« l restart index -*- o Page 15 ; Set required amino to zero num_codes •» 0 setstringarray aalist_codeS[1],"",200 setnumarray aalist_req[1] ,0,200 setnumarray aalist_avail[l] ,0,200 setnumarray aalist~conc(1] ,0,200 screenupdate savevars 5, "syringes.dat" savevars 2, "codes.dat" sysmsgS = "" screenupdate enablekeys Page 16 Procedure: CLEARALL Purpose: Clear all syringes from the system Author: CES local choice sysmsg$ = "" screenupdate clear_all_syringes • = 0 ask choice,"Are you sure you want to clear all syringes?" if (ichoice) enanlekeys stop endif if (next_syringe > l) ask choice,"Are you sure you want to clear all active syringes?" if (!choice) enablekeys stop else tell "Please remove ALL SYRINGES from the ROBOT SYSTEM now." endif sysmsg$ • *- "clearing all syringes" endif sci .nupdate ; data for a sample setstringarray syr_pepcode$[1] ,"",-1 setstringarray syr_sequence$[1] ,"",-1 setnumarray syr_size[1] ,10,-1 setnumarray syr_rac [1] ,0,-1 setnumarray syr_rackloc[1J ,0,-1 setnumarray syr_loc[1] ,0,-1 setnumarray syr_grip[1] ,0,-1 setnumarray syr_amount[l] ,0,-1 setnumarray syr_process[l] ,0,-l setnumarray syr_amino_step[1] ,0,-1 ;holds current coupling solution setnumarray syr_amino_count[l],0,-1 ;holds current coupling solution setnumarray syr_resin[1] , .2,-1 setnumarray syr_subst[1 , .45,-1 setstringarray syr_dodeprot$[1],"N",-l setnumarray syr_processtime[1],0,-1 setstringarray syr_datetime$[1],"",-1 setnumarray syr_statcolor[1] ,0,-l syr_pepcode$[l] = "Default" num_syringes « o next_syringe ■ l current_row ~ l restart index -> 0 Page 17 ,^2 - ; Set requii . amino to zero num_codes - o setstringarray aalist_code$[l],"",200 setnumarray aalist_req[l] ,0,200 setnumarray aalist_avail[l],0,200 setnumarray aalist_conc[1] ,0,200 screenupdate savevars 5, "syringes.dat" savevars 2,"codes.dat" sysmsg$ = "" screenupdate enablekeys Page 18 - -J 3 - ^_ Procedure: CLRRACK Purpose : places a zero in rack position and current position in gripper Author : MJB ;clear input rack if (syr_loc[current_inde ]) syr_loc(current_index] = 0 endif ;set rack to gripper syr_rac [current_index] = 10 ;clear rack location syr_rackloc(current_index] = 0 ;save changed rack varibles savevars 5,"syringes.dat" Paαe 19 -4 — Procedure: COUPLNG Purpose : robot actions for coupling Author : MJB local b,buf_place,infoindex infoindex *-< l ;find buffer in reagent table sarrayfind buf_place,contents$[l] ,prot_buf$[syr_process[current_index] ] ;put RX syringe in holding rack if RX syringe in gripper i f (syr_rack[current_index]=-io) if (syr_size[current index]=-lθ) rack_type *= ι ~ else rack type •*- 2 endif nest •= 1 grip - syr_grip[current index] call puthold.tcl call stopchek.tcl endif *prot_vol[syr_pro endwhile ;gβt as many amino syringβs e se -yringe - 1 Paαe 20 endif nest «= 2 call puthold.tcl call stopchek.tcl grip - 2 nest = 2 call gethold.tcl call stopchek.tcl cup = 1 restart_info$[infoindex] = "Add Coup: Began Dispensing " + numtostr$(dsp_amou savevars 7,"restart.dat" infoindex = infoindex + 1 dsp_amount = acid_avail[amino_place] call syr_dsp.tcl call stopchek.tcl restart_info$[infoindex] = "Add Coup: Finished Dispensing " + numtostr$(dsp_a savevars 7,"restart.dat" infoindex = infoindex + 1 acid_needed = acid_needed - acid_avail[amino_place] acid_avail[amino_place] = 0 savevars l, "amino.dat" grip ■* 2 nest = 2 call puthold.tcl call stopchek.tcl grip = l nest = 2 call gethold.tcl call stopchek.tcl rack_location = amino_place if (amino_place>lOO) rack_location = rack_location - 100 rack_type = 4 else ~ " rack_type •= 3 endif call putrack.tcl call stopchek.tcl amino_found = 0 while (!amino_found) sarrayfind amino_place,acid_code$[ (amino_place+l) ] ,cp_amino$ if ( (acid_avail[amino_place]) | | (amino_place*—-1) ) amino_found = 1 endif endwhile endwhile rack_location >- amino_place ;do final RT syringe dispense if (amino_place>lθ0) rack_location ■*• rack_location - 100 rack_type = 4 else rack_type *-« 3 endif call getrack.tcl call stopchek.tcl Page 21 grip - l if (amino_place>100) syringe •« 2 els" £ inge •= l endif nest = 2 call puthold.tcl call stopchek.tcl grip «« 2 nest = 2 call gethold.tcl first_pulses = motor_jpulses call stopchek. tcl cup » 1 dsp_amount = acid_needed restart_in f o$ [ in f oindex 1 = " A dd Coup: Began Dispensing " + numtostrS (dsp_amount savevars 7 , " r es tart . dat " infoindex = infoindex + 1 call syr_dsp.tcl call stopchek. tcl acid_avail [amino_place] = acid_avail [ amino_place ] - acid_needed savevars 1 , " amino . dat " restart_info$ [ infoindex] = "Add Coup: Finished Dispensing " + numtostrS (dsp_amo savevars 7 , "restart . dat" infoindex = infoindex + 1 grip - 2 _econ _pu ses = motor_pu ses ; check that fluid was dispensed from syringe if ( ! simulate_robot) if ( ( (first_pulses- 5 ) <secon d _pulses) &£ (second_pulses< ( f irst_pulses+5) ) ) error_code *•*- 3 call error. tcl endif endif grip - 1 nest = 2 - • all gethold.tcl -all stopchek.tcl rack_location •= amino_place if (amino_place>100) rack_location = rack_location - 100 rack_type »• 4 else rack_type » 3 endif cal ' " putrack.tcl Page 22 -19 ~ call stopchcα .tcl getting_rt «■ 0 ;dispense buffer solution restart_infoS[infoindex] = "Add Coup: Began Dispensing Buffer" savevars 7,"restart.dat" infoindex = infoindex + l cup ■ l sarrayfind a,contents$[1] ,prot bu $[syr_process[current_ιnde ] ] disp_amount •= syr_resin(current_index]*syr_subst[current_ιndex]*prot_voi[syr_pro reagent_disp = disp_amount buf_number = a buf_amount = disp_amount run disp_buf.tcl sol_avail[a] «■ sol_avail[a] disp_amount savevars 4,"reagents.dat" if (log_robot) logrobot$ = "dispense : " + numtostrS(disp_amount) + nozzle: " + numtostrS(a call logrobot.tcl logrobot$ = "solution : " + prot_buf$[syr j process[current_index] ] call logrobot.tcl endif restart_info$[infoindex] = "Add Coup Finished Dispensing Buffer" savevars 7,"restart.dat" infoindex = infoindex + l ;get RX syringe from holding rack if (syr_size[current_index]«*-*«10) syringe = 1 ~ else syringe • = 2 endif grip - 2 nest *• l call gethold.tcl syr_grip[current_index] = 2 call stopchek.tcl ;squeeze out solution in syringe if ((syr_size(current_index]=10tssyr_amount[current_index]>drop_amountl) (syr_ call waste.tcl call stopchek.tcl endif restart_info$(infoindex] = "Add Coup: Emptied syringe" savevars 7,"restart.dat" infoindex - infoindex + 1 ; aspirate solution in cup restart_inf o$ [ infoindex ] « "Add Coup: Began Aspirating Solution" savevars 7 , " restart . dat " infoindex = infoindex + l asp_amount » disp_amount + amino_disp air_amount >**• prot_air[syr_process (current_index] ] call syr_asp. tcl call stopchek.tcl Page 23 restart_in o$ [ infoindex] - "Add Coup: Finished As -jrating Solution" savevars 7, "restart.dat" infoindex • = in oindex + l ;c n cup if ( !simulate_robot) run cleancup. tcl endif Page 24 Procedure: DATRACK Purpose : places a gripper value in rack position Author : MJB ;set syringe rack for current index syr_rack[current_index] = rack_type ;clear rack location syr_rackloc[current_index] = rack_location • save changed rack variables savevars 5,"syringes.dat" Paαe 25 ^57A ~ ; Procedure: DELETE ; Purpose: Delete a syringe from the system ; Author: CES local choice,temp,a$,size$ if (protjproc[syr_process(delete_row]] != step_finished && current_index »= dele tellalarm "You must wait until the syringe is in the tumbleri" stop endif if (syr_process(delete_row] > 1 && prot_proc[syr_process[delete_row]] != step_fi ask choice,"The peptide is in progress.\nAre you sure you want to delete pepti if (!choice) stop endif sysmsgS - "Waiting for robot..." screenupdate stringrequest "USING SYRINGES" syr_process[delete_row] = num_procs syr_processtime[delete_row] = time_now sysmsgS - "" screenupdate tell "The peptide has been marked as finished. \nThe robot will eventually take stringfree "USING SYRINGES" else if (user_choice — 3 ) _f (prot_proc[syr_process[ delete row] ] == step_f inished) tell "The robot will remove this syringe automatically. \nPlease allow ROBO stop else ask choice,"Are you sure you want to delete peptide, " + syr_pepcode$[dele endif if (!choice) stop else sizeS - "from " + numtostrS (syr_size[delete_row] ) + "ml INPUT RACK locatio tell "Please physically REMOVE this syringe\n" + sizeS + numtostrS (syr_loc endif endif ; Write the information to the complete.dat file if (prot_proc[syr_process[delete_row]] = • step_finished) stringrequest "SYRFILE" ileopen 6,"complete.dat" sf_row - delete_row call syrfile.tcl fileclose 6 stringfree "SYRFILE" en-lif Page=26 ~5Α sysmsgS ~ "Deleting from list..." temp ** delete_row while (temp <= num_syringes) syr_pepcodeS[temp] • = syr_pepcode$[temp+l] syr_size[temp] - syr_size[temp+l] syr_loc[temp] «• syr_Toc(temp+l] syr_sequence$[temp] = syr_sequence$[temp+l] syr_process[temp] = syr_process[temp+l] syr_amino_step[temp] - syr_amino_step[temp+l] syr_amino_count[temp) = syr_amino_count[temp+l] syr_resin[temp] = syr_resin[temp+l] syr_subst[temp] »■ syr_subst[temp+l] syr_dodeprot$[temp] = syr_dodeprotS[temp+l] syr_processtime[temp] = syr_processtime[temp+l] syr_datetime$[temp] «■ syr_datetime$[temp+l] syr_statcolor[temp] •* * • syr_statcolor[temp+l] syr_amount[temp] • = syr_amount[temp+l] syr_grip[temp] *-* syr_grip[temp+l] syr_rack[temp] = syr~rack[temp+l] syr_rackloc[temp] = syr_rackloc[temp+l] temp = temp + 1 endwhile num_syr inges = num_syr inges - 1 if ( next_syringe > delete row) next_syringe « next_syrιnge - 1 endif endif sysmsgS -= "Saving data to file..." screenupdate if (num_syringes «■ * — 0) ; Set required amino to zero num_codes = 0 setstringarray aalist_code$[1],"",200 setnumarray aalist_req[1] ,0,200 setnumarray aalist_avail[1],0,200 setnumarray aalist_conc[l] ,0,200 savevars 2,"codes.dat" endif savevars 5,"syringes.dat" sysmsgS = "" screenupdate Page 27 Procedure: DEPROTCT Purpose : robot actions for a deprotection Author : MJB local buf_place , infoindex infoindex •*- l ;find buffer in reagent table sarrayfind buf_place,contentsS[1] ,prot_bufS[syr_process[current_index]] |syr_rack[current_ e se ringe « 2 e. .if grip - 2 nest • * ■ l call gethold.tcl syr_grip[current_index] -- 2 call stopchek.tcl endif /squeeze out solution in syringe if ((syτ_size[current_index]«-10&&syr_amount[current_index]>drop_amountl) | | (sy call waste.tcl ~ call stopchek.tcl endif restart_in oS[infoindex] = "Add Deprot: Emptied syringe" savevars 7,"restart.da " infoindex » infoindex + l ;dispense buffer restart_infoS[infoindex] - "Add Deprot: Started dispensing buffer" savevars 7,"restart. a " infoindex « infoindex + l buf_number « buf_place u " amount • -- prot_vol[syr_process(current_index*]'] f " - j yrin e—2) Page 28 buf_amoun*e -= buf_amount/division_factor endif run disp_buf.tcl sol_avail[buf j place] = sol_avail[buf_place] - bul_amount savevars l,"amino.dat" if (log_robot) logrobotS = "dispense : " + numtostrS(buf_amount) + " nozzle: " + numtostrS(b * . call logrobot.tcl logrobotS = "solution : " + prot_buf$[syr_process[current_ιndex] ] call logrobot.tcl endif restart_info$[infoindex] = "Add Deprot: Finished dispensing buffer' savevars 7,"restart.dat" infoindex = infoindex + 1 ;aspirate buffer restart_info$[infoindex) = "Add Deprot: started aspirating buffer savevars 7,"restart.dat" infoindex = infoindex + 1 cup - 2 if (syr_size( current_index]==10) syringe ■» 1 else syringe • = 2 endif asp_amount = buf_amount air_amount = prot_air[syr_process [current_index] ] if (syringe«"2 ) air_amount = air amount/divisιon_factor endif call syr_asp. tcl call stopchek.tcl restart_info$ [ infoindex] - "Add Deprot: Finished aspirating buffer savevars 7 , " restart . dat " infoindex = infoindex + 1 ;rotate rot_time •= 60*prot_time(syr_process[current_index] ] call rotate.tcl call stopchek.tcl Page 29 Procedure: UOSTEP Purpose: Perform the next step for the syringe Author: CES Notes : current index is the syringe to work on local process process = prot_proc[syr_process[current_index] ] if (process =•» step ready) syr_rack[current_Tndex] = (2- (syr_size (current_index] -2 .5) /7 . 5) syr_rackloc[ current_index] = syr_loc[current_index] syr_loc [ current_index ] = 0 ~ syr_amino_step[current_index] = 1 ; This should always be true if we got here if (current_index -=■ next_syringe) next_syringe •» next_syrmge + 1 else tellalarm "Logic error ! next_syringe updated incorrectly" endif updatetable elseif (process =-« step_wash) call washing. tcl logrobotS - prot_stepS [process ] if (log_procedure) all logrobot. tcl e..-if if (dont_wait) time_nSw - time_now + prot_robottime(syr_process [current_index] ] else time_now = elapsed (0) endif elseif (process • = step_adddeprot) call deprotct. tcl " ~ logrobotS = prot_step$ [process] if ( log_procedur e ) call logrobot.tcl endif if (dont_wait) time_now • = time_now + prot_robottime [ syr_process [ current_index ] ] else time_now ■- elapsed (0) endif elseif (process = step_addcoupl) bs_seq$ • = syr_sequence$ [current_index] call breakseq. tcl cp_amino$ = code$ [syr_amino_step[current_index] ] call coupling. tcl — - 1-τrobotS = "Add Coupling: " + code$ [syr_aminό_step(current_index] ] Page 30 -S - if (log_ _ cedure) call ' logrobot.tcl endif if (dont_wait) time_now = time_now + prot_robottime(syr_process[current_index]] time_now « • elapsed(0) endif elseif (process — step_deprotection | | process = step_coupling) ]] time_now = elapsed(0) endif svr _P rocess t--me(current_index] = time now + 60*prot time[syr process[current current_index = o - ~ ~ else call get_tum.tcl logrobotS = "Get Tumbler, overtime — "+numtostr$(time now-syr_processtime[c if (log_procedure) ~ call logrobot.tcl endif if (dont_wait) time_now • = time_now + prot_robottime[syr_process[current_index]] time_now = elapsed(0) endif endif elseif (process =» step_finished) ;dump off syringe in waste basket logrobotS = prot_step$[process] if (log_procedure) call logrobot.tcl endif call finish.tcl ;delete syringe from list delete_row • = current_index stringfree "USING SYRINGES" call delete.tcl stringrequest "USING SYRINGES" current index = o endif Page 31 - (=>- Procedure: DUMP Purpose : drop finished syringe in basket Author : M B if (log_robot) logrobotS = "dump — " + numtostrS(current_index) call logrobot.tcl endif if (simulate_robot) stop endif request "ROBOT" ROBOT.speed sp_fast ROBOT.move "drop" ROBOT. speed sp_slow ROBOT . j og_s 0,0, -drop_ j og ROBOT. finish ROBOT. open delay 1000 Rθr " "" . j og_s o,o, drop_ j og ROBOT. speed sp_med free Paαe 32 Procedure: EQUPINIT Purpose: Starting procedure for robot and Hamilton Author: M B Notes: disablekeys initialization - 0 sysinit_message$ = "Please Wait..." robot_ready = 0 ; set a bit for each question syringe_ready «= 0 screenon "SYSINIT" if (!simulate_robot) call robhome.tcl else robot_ready «= l endif if (!robot_ready) tell "Initialization cancelled" free screenback stop endif ;/* Prepare Syringe Pump */ if (!simulate_robot) call syrinit.tcl elr t_ .inge_ready - l endif if (!syringe_ready) tell "Initialization cancelled" free screenback stop endif ;/* Homing Motor */ sysinit_message$ » "Homing Motor" -if ( ! simulate_robot ) call homemtr.tcl call safemtr.tcl endif sysinit_message$ = "" -screenupdate tell "Initialization complete" initialization •= l screenback Page 33 -.sy - Procedure: FINISH Purpose : dumps off finished syringe Author : MJB if (syr_rack[current_index] = 5 | | syr_rack[current_index] — 6) call get_tum.tcl endif ;if in gripper, check grip, change if necessary if (syr_rack[current_index]=l0) if (syr_grip[current_index]==2) nest = l grip • = 2 if (syr_size[current_index]*=10) syringe = l else syringe = 2 endif call puthold.tcl syr_rack(current_index] = 0 call stopchek.tcl nest = l grip = l if (syr_size[current_index]ra-10) syringe = l else syringe ■= 2 ndif -all gethold.tcl syr_grip(current_index] = 1 syr_rack(current_index] = 10 call stopchek.tcl endif ;if in holding rack, get with move grip elseif (syr_rack[current_index]=8| |syr_rack[current_index]= » 9) if (syr_sTze[current_index]'»-10) ~ syringe = l else syringe -■ 2 endif grip - 1 nest - 1 call gethold.tcl syr_grip(current_index] = l syr_rack[current_index] = 10 call stopchek.tcl ;if in other rack, get with move grip else if (syr_size[current_index)=»10) syringe ■ l — e ,- «e Paαe 34 syringe <-» 2 endif call getrack.tcl syr_grip(current_index] «- ι syr_rack(current_index] «- ιo call stopchek.tcl endif ;go to dump call dump. tcl Page 35 - de ¬ procedure: GETHOLD Purpose: Get a syringe from the holding nest Author: MJB Notes: set syringe • = 1 for 10ml , 2 for 2.5ml grip = l for move grip , 2 for stroke grip nest = l for nest 1, 2 for nest 2 if (syringe«***"l) rack_location * * 1 rack_type **» 8 else rack_location ■= 1 rack_type = 9 endif local get_repeat get_repeat = 0 if ((li<o-gg__rroobDoθtt)) log „r -ob -o -t -S - = "g -,e —t —h-old — syringe :" + numtostrS(syringe) + " grip " + numtos c caallll l looggrroobboott..ttccll endif if , _imulate_robot) if ( ! getting_rt) call clrrack. tcl endif stop endif request "ROBOT" syringe_present ■■ 1 while ( ( ! syringe_present) | | ( !get_repeat) ) if (get_repeat) call puthold.tcl endif ROBOT.open delay 500 ROBOT. speed sp_fast if (grip! »2 ) ROBOT. move "mixsafel" ' ^e Page 36 ROBOT.j- ve "mixsa£e2" run homemtr.tcl endif a$ - "tmp" + numtostrS(syringe) + "_" + numtostrS(grip) + "_" + numtostrS(η * . ROBOT.speed sp_med ROBOT.move a$ ROBOT.finish if ( (!syringe present)&&(get_repeat) ) error_COde = 1 /** CHANGE THIS CODE IF NECESSARY **/ call error.tcl endif ROBOT.speed sp_slow if (grip—2) while (!home_done) endwhile endif a$ = "tlw" + numtostrS(syringe) + "_" + numtostrS(grip) + "_" + numtostrS(nest if (grip—2) ROBOT.speed sp_mslow endif ROBOT.move_s a$ ROBOT,finish if (grip—2) /* Routine to find the top of the syringe* call findtop.tcl if (syringe—1) direction «=• 0 motor_steps = syrgl_back endif if (syringe—2) direction ■« 0 motor_steps •* syrg2 back endif call strkmtr.tcl endif delay 1000 ROBOT.close delay 500 if (grip— l) ROBOT. speed sp_slow Paαe 37 else ROBOT.speed sp_yslow endif i = «tmp" + numtostrS ( syringe) + "_" + numtostrS(grip) + "_" + numtostrS(nest RυBOT.move_s a$ OBOT.finish ; . a$ «■ "mixsafe" + numtostrS(grip) ROBOT.speed sp_med ; ROBOT.move a$ call syr_chk.tcl ;find syringe get_repeat = get_repeat + 1 endwhile if (!getting_rt) syr_grip[current_index] = grip call clrrack.tcl endif free Page 38 GETRACK pick up bottle from any rack and return to safe position • **** B ********* S ' ' USE OF PROCEDURE: before calling this procedure set the variable : rack_type = the type of rack 1 - 10ml RX 2 - 2.5ml RX 3 - 10ml RT 4 - 2.5ml RT 5 - 10ml TUM 6 - 2.5ml TUM 7 - probe rack_location •= the location in the rack it**********************************/ grip = 1 if (log_robot) logrobotS = "getrack — rack: " + numtostrS(rack_type) + " loc: " + numtostrS( call logrobot.tcl endif if (simulate_robot) if ' !getting_rt) -all clrrack.tcl endif stop endif request "ROBOT" TOBOT. speed sp_vfast if (rack_type— 5) tuml_continue=0 while ( ! tuml_latched ) endwhile -lseif (rack_type— 6) tum2_continue>_ 0 while ( i tum2_latched) endwhile endif ROBOT. open found - 0 robot_i •= 0 while ( ! found) if (rack_location <= robot_i * row_size[rack_type ] ) Page 39 if ((rack_type—3) | I (rack_type—4)) ROBOT.move "rack_ιm" " " endif rack_temp$ = rack_high$[rack_type] + numtostrS(robot_i ) ROBOT. ove rack_tempS ROBOT.finish found = 1 else robot_i = robot_i + 1 endif endwhile ROBOT.speed sp_fast jog_temp = ( track_jog[rack_type]* ( (row_size(rack_type]*robot_i) - rack_locatio ROBO .joint 6,-jog_temp ROBOT.finish ROBOT.speed sp_slow ROBOT.jog_s 0,0,-rack_jog[rack_type] ROBOT.finish delay 500 ROBOT.close delay 500 ROBOT. peed sp_slow ROBOT.jog s 0,0,rack_jog[rack_type] ROBOT.finish if (rack_type!=7) ROBOT.speed sp_fast call syr_chk.tcl ;find syringe while (!syringe_present) ROBOT.speed sp_med ROBOT.move "mixsafel" ROBOT.move rack tempS ROBOT.joint 6,-Jog_temp error_Cθde = 1 /** CHANGE THIS CODE IF NECESSARY **/ call error.tcl ROBOT.open delay 200 ROBOT.finish ROBOT. peed sp_slow ROBOT.jog s 0,0,-rack_jog(rack_type] ROBOT. inish ROBOT.close delay 200 ROBOT.jog_s 0,0,rack_jog(rack_type) call syr_chk.tcl endwhile endif ROBOT.speed sp_fast Page 40 - 6-T ~ — if J (lgettiιig_rt) syr_grip[current_index] •= 1 c«*ll clrrack.tcl em if (rack_type— 5 ) tuml_continue=l elseif ( rack_type— 6 ) tum2_continue=l endif free Page 41 G> <o Procedure: GET TUM Purpose: get syringe from tumbler Author: MJB rack_type = syr_rack[current_index] rack_location = syr_rackloc[current_index] call getrack.tcl syr_grip[current_index] = 1 call stopchek.tcl Page 42 Procedure HOMEMTR Purpose turn on motor until top sensor is triggered Author MJB home_done = 0 ;turn on motor for backward direction SHARK. ritebit 224,0 delay 500 SHARK.writebit 404,1 SHARK.readbit i_sense_home,a testerl = 0 timer homemtr_time while (!a) SHARK.readbit i_sense_home,a if (elapsed(homemtr_time) >30) ;stop motor from homing SHARK. ritebit 404,0 ;call error routine error_code = 4 call error.tcl stroke motor down direction = 1 motor_steps = 20 call strkmtr.tcl ;start motor to home again SHARK. ritebit 224,0 delay 500 SHARK. ritebit 404,1 timer homemtr_time endif endwhile home done = 1 Page 43 Procedure INIT Purpose initialize system variables Author MJB ; Variables to keep track of syringes in system num_syringes = 0 ; total number of syringes that have been input next_syringe = 1 ; next syringe that will be removed from the incoming rack getting_rt - 0 ;flag to tell an RT syringe is in system dont do next — 0 ; flag to tell max number of syringes in system Page 44 _ ?f - lear_all_syringes = 0 flag to tell robot procedure to clear all yringes etstringarray restart_info$[1] , "",-1 data for a sample etstringarray syr_pepcode$[1] , "",-1 etstringarray syr_sequence$[1] , "",-1 etnumarray syr_size[1] , 10,-1 etnumarray syr_rack[l], 0,-1 etnumarray syr_rackloc[l] ,0,-1 etnumarray syr_loc[l],0,-1 etnumarray syr_grip[l] ,0,-1 etnumarray syr_amount[1] , 0,-1 etnumarray syr_process[1] ,0,-1 etnumarray syr_amino_step[l] , 0,-1 ;holds current coupling olution etnumarray syr_amino_count[1] , 0,-1 /holds current coupling olution etnumarray syr_resin[l] , .2,-1 etnumarray syr_subst[1] , .45,-1 etstringarray syr_dodeprot$[1] , "N",-1 etnumarray syr_processtime[l] ,0,-1 etnumarray syr_statcolor[1] ,0,-1 etstringarray syr_datetime$[1] , "",-1 yr_pepcode$ [1] = "Default" // Record structure for amino acids, set once then retrieve from isk etstringarray acid_code$[1] , "",200 etnumarray acid_conc[l] , 0,200 etnumarray acid_avail[l] , 0,200 ast_fill = 0 Number of amino acids that appear in sequences um codes = 0 Number of steps in current protocol um_procs = 0 Robot Speed Variables p_vslow = 5 p_mslow = 20 p_slow = 30 _mod = 50 _med = 70 _fast = 90 _vf st = 100 Rack Variables ack5 full = 0 /set to keep track of whether or not tumblers are ull ack6_full = 0 t_get = 0 /set to RT rack location when RT in system ack_type = 1 / 1 = 10ml RX syringe Page 45 -« ; / Syringe Variables / syringe = 1 ; 1 is 10ml syringe, 2 is 2.5ml syringe temp_jog = 8 / / Cup Variables / cup = 1 ;1 for.RGPl, 2 for RGP2 cup_jog -= 4 ; / Waste Variables / Page 46 Ψ aste_jog = 3 / Finished Peptide Basket Variables / rop_jog = 8 / Check Syringe Presence Variables / yringe_sense_im$[1] = "IM_1" yringe_sense_im$[2] = "IM_2" yringe_sense_beginl$[l] = "CKB_11" yringe_sense_beginl$[2] = "CKB_12" yringe_sense_endl$[l] = "CKE_11" yringe_sense_endl$[2] = "CKE_12" yringe_sense_begin2$[l] = "CKB_21" yringe_sense_begin2$[2] = "CKB_22" yringe_sense_end2$[l] = "CKE_21" yringe_sense_end2$[2] = "CKE_22" yringe_sense_im$[3] = "IM_3" yringe_sense_beginl$[3] = "CKB 13" yringe_sense_endl$[3] = "CKE_13 ~ " yringe_sense_begin2$[3] = "CKB 23" yringe_sense_end2$[3] = "CKE_23 ~ " / Shark Inputs / = 24 = 0 while (s==24| I !a) erroroff table_position = 1 system_start = 0 sense_table = 1 sense_syringe = 2 sense_press = 3 sense_home - 4 sensor_latch = 551 motor_finish = 225 sense_tuml = 5 sense_tum2 = 6 SHARK.puttable able position,system_start,sense_table,sense syringe,sense__press,s nse_home,sensor_latch,motor_finish,sense_tumT,sense_tum2 i_system_start - 1 i_sense_table = 2 i_sense_syringe = 3 i_sense_press - 4 i_sense_home = 5 i_sensor latch = 6 i_motor_f " inish = 7 i_sense_tuml = 8 i_sense_tum2 = 9 SHARK.readbit i_system_start,a status s Page 47 /counter inputs pulses_counter = 2 putelapsed 10,pulses_counter i_motor_pulses = 10 / if (s==24| I !a) / tell "Turn the Selector Switch to ON\nand pull out the Emergency Stop button" endif /endwhile erroron / / Shark Outputs / o_tuml_start = 220 o_tum2_start = 221 o_tuml_clamp = 222 o_tuml_latch = 223 o_grip_dir = 224 o_grip_pulse = 225 o_buzzer = 226 o_syringe_locate = 227 o_tum2_clamp = 240 o_tum2_latch = 241 o_start_counter = 414 o_clear_counter = 415 o clear sensor = 550 / / Error Variables / error = 0 error_code = 0 err_syringe_sensor = 2 err_syringe_presence = 3 / / Error Messages / error_message$[0] = ' error_message$[100] error_message$[1] = "No Syringe Found" error_message$[2] = "Syringe Sensor Not Reset" error_message$[3] = "Syringe Did Not Dispense" error_ir.essage$[4] = "Motor Did Not Home" • error_message$[5] = "Top of Syringe Not Found" error message$[101] Page 48 - *- error_message$ [102] = error_message$ [103] = error_message$[104] = error_message$ [105] = ; / Error Solutions / error_solution$[0] = error_solution$[100] error_solution$ [1] *= "Place a Syringe in the Space" error_solution$ [101] = "Directly Below the Robot Gripper" error_solution$[2] = "Check to Ensure P C is on" error_solution$ [102] _ II II error_solution$ [3] = "Manually Add Solution" error_solution$[103] = "to RGP1" error_solution$[4] = "The Motor will Try to Home" error_solution$ [104] = "When Error is Cleared" error_solution$ [5] = "The Motor will Try to Find Syringe" error solution-? [105] = "Top When Error is Cleared" / / Alarm Variables / alarm_time = 1 initialization = 0 set to 1 when equipment initialized current_index = 0 simulate = 0 syrg_done = 0 running = 0 rinsing_cup = 0 /flag for washing cup in coupling cleaning_amount = 10 /amount of DMF to clean the cup with sysmsg$ = "" / / Data Input Variables / /Simulate Variables stop blinking = 0 simuTate_robot - 0 log_robot = 0 log_procedure = 0 dont_wait - 0 /Calibration data motor_safe_step = 70 syrgl_cal_asp = 14.5 syrg2_cal_asp = 40 syrgl_cal_dsp = 14.5 syrg2_cal_dsp = 40 syrgl_back = 6 syrg2_back = 5 drop_amountl = .5 drop_amount2 = .3 dsp_drop_amountl = .2 dsp_drop_amount2 = .1 Pgge 4§ ?« unstick_amountl = .5 unstick_amount2 = .1 /Create robot log file filecloseall filenew 1, "roblog.dat" filecloseall stringfree robot_running = 0 shake_running = 0 check_motor = 0 clean_cup_done = 0 / load the current variables call loadvars.tcl Paαe 50 -£T Procedure: INSERT Purpose : Insert syringes into the system Author: CES -—- ** -—-*ta—--α_--Mr-r-α-nι local choice,temp ; Determine the sequence(s) that will be inserted numseq = 0 if (user_choice *•**- 1) ; Ask the operator to input the Peptide's code and sequence numseq «*■ 1 tempcode$[1] *= "" tempseq$[l] = "" inputstring tempcode$[l] ,"Enter the Peptide C ode:" inputlongstring te»pseqS[l] ."Enter the sequence:" if (tempcode$[l] * -» "" || tempseqS[1] —» "") numseq - 0 endif elseif (user_choice —- 2) ; Get the sequence or group of sequences from a file call seqfile.tcl endif ; Check whether there is enough room for insertion if (numseq + num_syringes > 100 ) tellalarm "A maximum of " + numtostr$(100-num_syringes) + " syringes can be ad numseq = 0 end J " ; Tell operator if insert action is cancelled if (numseq « ■ -« 0) tell "No syringe will be inserted" stop endif ; Determine whether the Peptide codes and sequences are valid sysmsgS = "Checking for validity..." screenupdate -emp « 1 rfhile (temp <= numseq) if (strlen(tempcode$[temp]) > 8) sysmsgS -> "" screenupdate tellalarm "The code, \n" + tempcode$[temp] + ",\nis invalid." tell "No syringe will be inserted." stop endif bs_seq$ * « tempseq$[temp] caXl breakseq.tcl if (bs_error) sysmsgS _• "» screenupdate t ellalarm "The sequence,\n" + left$(temρseq$'[temp] ,200 ) + ",\nis invalid." Page 51 tell ' • . _ syringe will be inserted." stop endif if ((!strlen(tempcodeS[temp]) ) | | (•couplings) ) sysmsgS •= "" screenupdate tellalarm "Codes and sequences cannot be empty." tell "No syringe will be inserted." stop endif syr_amino_count[temp] = couplings tempcount[temp] «= couplings temp = temp + 1 endwhile ; Insert the sequences into the list of sequences sysmsgS = "Inserting into list..." screenupdate temp • = num_syringes+numseq+l while (temp>—current_row+numseq) syr_pepcode$[temp] = syr_pepcode$[temp-numseq] syr_size(temp] = syr_size[temp-numseq] syr_rack[temp] =■ syr_rack(temp-numseq] syr_loc(temp] = syr_loc(temp-numseq] syr_sequence$[temp] = syr_sequence$[temp-numseq] syr_process[temp] = syr_?rocess(temp-numseq] syr_amino_step[temp] = syr_amino_step[temp-numseq] syr_amino_count(temp] ■*» syr_am.Jio_count(temp-numseq] syr_resin[temp] •= syr_resin( " temp-numseq] syr_subst(temp] - syr_subst[temp-numseq] syr_dodeprotS[temp] *» syr_dodeprot$[temp-numseq] syr_processtime[temp] «* syr_processtime[temp-numseq] syr_datetime$[temp] = syr_datetime$(temp-numseq] syr_statcolor(temp] = syr_statcolor[temp-numseq] temp = temp - l endwhile temp = current_row while (temp <= ■ current_row+numseq-l) syr_pepcode$[temp] •- tt_mpcode$[temp-currβnt_row+l] syr_sequence$[temp] = tempseqS[temp-current_row+l] syr_amino_count[temp] = tempcount(temp-current_row+l] syr_size(temp] = syr_size(num_syringes+numseq+l] syr_rack(temp] «■ 0 syr_loc(temp] ■ 0 syr_process(temp] = 0 syr_amino_step[temp] - 1 syr_resin(temp] = syr_resin[num_syringes+numseq+l] syr_subst(temp] = syr_subst(num_syringes+numseq+l] syr_dodeprot-$[temp] «- syr_dodeprot$[num_syringes+numseq+1] syrjprocessti e(temp) « 0 syr_datetimeS[temp] - date$() + " " + time$() syr_statcolor[temp] = syr_statcolor(num_syringes+numseq+l] temp -» temp + l endwhile num_syringes »- num_syringes + numseq Page 52 to ile... " t" Page 53 - A/* — ^ Proceαure: LOADVARS P urpose : L oad system variables from disk and set other variables accordingly Author : KJB,CES local a ; Define Variable Groups for data storage ;amino acid rack clearvargroup 1 addvar l,fast_fill,l addvar l,acid_codeS[1] ,200 addvar 1, cid_conc(1] , 00 addvar 1,acid_avail[1],200 ; Amino acids that appear in sequences clearvargroup 2 addvar 2,num codes addvar 2,aalTst_code$[1] ,200 addvar 2,aalist_req[1] ,200 addvar 2,aalist_avail(1] ,200 addvar 2,aalist_conc(l] ,200 ; current synthetic protocol clearvargroup 3 addvar 3,num_procs adc? r 3,prot_proc(1],200 add .r 3,prot_buf$[1] ,200 addvar 3,prot_vol(l] ,200 addvar ,prot_air[1] ,200 addvar ,prot_time(1] ,200 addvar 3,prot_robottime(1] ,200 ; reagents and solutions clearvargroup 4 addvar 4,contentsS[1] ,10 addvar ,sol_conc[1] ,l0 addvar 4,sol_req[1] ,10 addvar 4,sol_avail[1] ,10 ;current syringe data clearvargroup 5 addvar 5,num_syringes addvar 5,syr_pepcode$[l],100 addvar S,syr_sequence$(l] ,100 addvar 5,syr_size(1],100 addvar 5,syr_rack(1] ,100 addvar 5,syr_rackloc[l],100 addvar S,syr_loc(l] ,100 addvar 5,syr_grip[1] ,100 addvar 5,syr_amount(l] ,100 add"-.r 5,syr_resin(1] ,100 Page 54 addvar 5,syr_subst[l],lo0 addvar 5,syr_dodeprot$[1] ,100 addvar 5,syr_process[l] ,100 addvar 5,syr_amino_step[1] ,100 addvar 5,syr_amino_count[1],100 addvar 5,syr_processtime[1] ,100 addvar 5,syr_datetime$[l],100 ; simulation flags clearvargroup 6 addvar 6,simulate_robot addvar 6,log_robot addvar 6,log_procedure addvar 6,dont_wait ; Current step state for restart purposes clearvargroup 7 addvar 7,restart_info$[1] ,20 clearvargroup 8 addvar 8,division_factor ; Load variables from disk erroroff a = o loadvars 1,"amino.dat" a " a + getstatus() loadvars 2,"codes.dat" a • = a + getstatus() loadvars 3,"lastprot.prt" a *= a + getstatus() loadvars 4,"reagents.dat" a - a + getstatus() loadvars 5 , " syringes . dat" a - a + getstatus ( ) loadvars 6,"simulate. at" a •- a + getstatus() loadvars 7 , " restart . dat " a - a + getstatus () loadvars 8,"division.dat" a *» a + getstatus() erroron if (a) ,„ ask a,"Some of the saved data did not load.\nDo you want to continue ? if (!a) terminate endif endif ; Figure out the value for next_syringe next_syringe ■> l — while (next_syringe <- num_syringes && syr__process[next_syringe] > 1) next_syringe • - next_syringe + 1 endwhile "* syr_pepcode$[num_syringes+l] = "Default" Page 55 ^ <A - syr_sequen-, ->[num_syringes+l] - "" βyr_loc[num_syringes+i] •» 0 syr_process(num_syringes+l] «■ 0 ; .' 1 in the descriptions for the protocol steps a •» o while (a <= num_procs) prot_desc$(a] = prot_step$[prot_proc(a] ] a = a + 1 endwhile Page 56 PCΪ7US96/01168 - / ~ Procedure: LOGROBOT Purpose saves robot action and data Author H B if (!dont_wait) time_now = elapsed(0) endif fileopen 5, "roblog.dat" stringformat logrobotS, "%s *03.0lf: 02.01 :%02.01f %-8s, %s",timeSO , (time_now-s fileappend 5,logrobotS fileclose 5 Page 57 Procedure : PROTCHNG Purpose : Allow operator to add, insert, or delete step Author : MJB , CES local temp if (user_choice —» 1) ; add a procedure num_procs = num_procs + 1 ; Set the selected row to be the added row prot_row = num procs ; Set the colu n selection so that the user will be asked ; to input the type of procedure to add prot o col = 2 prot j ?roc(prot_row] ■» ι prot_buf$(prot_row] ■« "" prot_voliprot_row] = 0 prot_air(prot_row] • >** o prot_time(prot_row] • = 0 prot~robottime(prot_row] • - • 0 elseif " (user_choice • —- 2) ; insert a procedure screenhold Page 58 _S - prot ^ robottime( emp]-••« prot robottime(temp+l , " ■' j-fi-ft "T « temp + ι "" endwhile else ; The selected row cannot be the deleted row prot_row = prot_row - l endif num_procs = num procs—l endif — Paαe 59 local a,a$,choice ; Allow the user to enter the data for a cell if (prot_col—2) ; change the procedure menuarray choice, rot_stepS[1],"Pick a procedure:" if (choice != prot_proc[prot_row] && choice>0) prot_proc(prot_row] = choice prot_buf$[prot_row] = "" prot_vol[prot_row] = 0 prot_air(prot_row] - 0 prot_time[prot_row] - o prot_robottime[prot_row] = 0 prot changed »*• l endif elseif (prot_col*—3) ; enter the buffer solution name if (prot_choice[prot_proc(prot_row] ] & param_buf) a$ ■ prot_buf$[prot_row] inputstring a$,"Input Buffer Name" if (a$ != prot_buf$[prot_row]) prot_bufS(prot_row] = a$ prot_changed • = l endif endif els—f (prot_col*—-4) ; enter the buffer volume i (prot_choice[prot_proc(prot_row]] & param_vol) a « ρrot_vol[prot_row] inputnum a,"Input Volume of Buffer or Excess" if (a !* prot_vol[prot_row]) prot_vol[prot_row] = a prot_changed — l endif endif endif elseif (prot_col—6) ; enter the time if (prot_choice(prot_proc(prot_row] ] & param_time) a - prot_time(prot_row) inputnum a,"Input Time (min) " if (a !■ prot_ ime(prot_row)) prot_time(prot_row] » a prot_changed - 1 endif Page 60 endif -S^ 'elseif (prot_col»— 7) ; enter the robot use time - if (prot_choice(prot_proc(prot_row] ] & param^robόttime) a - prot_robottime[prot_row] inputint a , "Input the 'robot in use' time (sec) : " if (a 1- prot_robottime[prot_row] ) prot_robottime[prot_row] - a prot_changed = 1 endif endif endif Page 61 Procedure : PROTLDSV Purpose : Load or save a protocol Author * : MJB,CES local choice,tempchanged ; Make sure there is a valid reagent specified for each step that needs one choice « l while (choice <= num_procs) if (prot_choice[prot__proc[choice] ] k para buf) if (rtrimS(ltrim$(prot_bufS(choice])) — "" "") tell "You must input a buffer type for each step that needs one." prot_row = choice user_choice « 0 stop endif endif choice *• choice + 1 endwhile ; Make sure that the protocol starts with Ready and ends with Finished if (prot_proc(l] != step_ready | | prot proc(num_procs] != step_finished) tellalarm "The protocol must begin with a 'Ready' step\nand end with a 'Finish user_choice - 0 stop endif ; i' ' ■ -he user is trying to quit or load, check if it needs saving if __er_choice »—■ 5 | | user_choice •*— 6) if (prot_changed) ask prot_changed,"Do you want to save your changes\nto a file?" endif endif if (prot_changed | | user_choice ■— 4) // Save Protocol to Disk inputstring prot_f ile$ , "Save Protocol As: \n(Do NOT add the Extension) " if (prot_file$ -*- "") user_choice - 0 stop endif prot_file$ = prot_file$ + ".prt" filetest choice,prot_file$ if (choice) ask choice,"That file exists.\nθverwrite?" if (!choice) user_choice - 0 stop" endif endif erroroff savevars 3,prot_file$ i-* (getstatus() ) Page 62 tellalarm "Error saving file, \n"+prot f ileS uusseerr_ cchhooiiccee 0 erroron stop endif erroron prot changed - 0 endif ~ if (user_choice •— 5) // Retrieve Protocol from Disk filetest choice,"*.prt" if (choice>0) filelist "*.prt",filesS[l] menuarray choice,filesS[1] ,"Pick a File to Load:" if (choice1-0) savevars 3,"lastprot.prt" erroroff loadvars 3,filesS[choice] status choice if (choice) loadvars 3,"lastprot.prt" tellalarm "That was an invalid protocol file.\nThe last protocol was re. prot_changed • » 1 else savevars 3,"lastprot.prt" prot_changed • » 0 endif erroron endif else prot_changed <■ l tell "No protocol files exist." endif endif if (user_choice --» 6) user_choice - -1 else user_choice - 0 endif Page 63 disablekeys ; initialize variables ; change this line to reflect the addresses of the inputs ; keep the first parameter at one SHARK.puttable 101,0,1,2,3,4,5,6 Page 64 βo_addrβss ( => j •_ 241 £"? _ βo~address[6] ■*** 240 so_address[7] >-> 227 so_address[8] » 226 so_addresβ ( 9 ] - -1 so~address(10] ■» -1 so_address [ 11 ] ■» -1 so_address [ 12 ] - -1 so_address ( 13 ] ■» -1 so_address [ 14 ] «■ -1 so_address [ 15 ] ■« -1 so_address ( 16 ] »» -1 so_address ( 17 ] ■■ -1 so_address [ 18 ] •= -1 so_address [ 19 ] = -1 so_address[20] -»- -1 a - 1 while (a <» numoutputs) readbit so address [a] , so_on[a] a - a + 1 ~ endwhile stopme - 0 screenison - 0 doterminal - 0 terminal_running - 0 choice - 0 while (!stopme) if (choice) writebit so_address(choice] , !so_on[choice] so_on[choice] *•■ !so_on(choice] choice « 0 endif a - 1 while (a <- numinputs-lθ) readbit a+100,si_on[a] ,si on(a+l] ,si_on(a+2] ,si_on[a+3] ,si_on[a+4],si_on(a+5 a - a + 10 ~ endwhile while (a <» numinputs-S) readbit a+100,si_on[a] ,si_on[a+l],si_on[a+2],si_on(a+3] ,si_on[a+4] a - a + 5 endwhile while (a <- numinputs) readbit a+100,si_on[a] a - a + l endwhile if (doterminal) if ( !terminal_running) run terminal. tcl endif doterminal - 0 Page 65 endif if (Iscreenison) creenon "testio" ' .nablekeys screenison - 1 endif endwhile request "robot" ROBOT.command "NOMANUAL" free screenback Page 66 -f/- Procedure : PROTOCOL Purpose : Allow operator to change protocol data Author : MJB, CES local choice, simulate_change, temp simulate_change = simulate_robot+ (dont_wait*2 ) + ( log_robot* ) + ( log_procedure*8 ) prot_col " 0 prot_row ■• 0 prot_changed « 0 prot_file$ = "" prot_proc(0] - 0 prot_proc(100] = 100 screenon "protocol" user_choice •« 0 while (user_choice !■■ -1) // Clicked on Synthetic Protocol Box if (prot_col) screenupdate if (next_syringe <*- 1) call protclik.tcl endif updatetable screenupdate prot_col «■ 0 e "1 * -.if _ (user ^ choice • —■ 7) Change division factor temp ■ * » division_factor inputnum temp,"Enter the new division factor:" if (temp > 0 && temp <- 99.99) division_factor *-* temp savevars-8,"division.dat" screenupdate endif user choice - 0 elseif~((user_choice && next_syringe <- 1) || user_choice —- 6) if (user_choice >«« 1 && user_choice <= 3) call protchng.tcl updatetable screenupdate user_choice - 0 elseif (user_choice >- 4 && user_choice <- 6) call protldsv.tcl updatetable screenupdate endif endif endwhile • Save, protocol to permanent file Page 67 savevars 3 , • • las pro . prt" user_choice - 0 if (simulate_changei-s * Lmulate_robot+ (dont_wait*2) + (log_robot*4 ) + (log_procedur savevars 6 , " s imulate . dat" initialization - 0 endif ; Fill in the descriptions for the protocol steps a - 0 while (a <= num procs) prot desc$[a] - prot_step$[prot__proc(a]] a - a + l endwhile screenback Page 68 -t3 ~ Procedure: POTHOLD Purpose: put a syringe in the holding rack Author: M B Notes: set syringe «-* l for 10ml , 2 for 2.5ml grip - l for move grip , 2 for stroke grip nest = l for nest 1, 2 for nest 2 local a if (syringe—1) rack_location - l rack_type - 8 else ~ rack_location - l rack_type = 9 endif if (log_robot) logrobotS - "puthold — syringe : " + numtostrS(syringe) + " grip : " + nu tos call logrobot.tcl endif if (simulate robot) i '!getting_rt) -all datrack.tcl endif stop andif request "ROBOT" ROBOT.speed sp_fast ;a$ = "mixsafe"+ numtostrS(grip) ; OBOT. ove a$ ROBOT. speed sp_mod a$ - "tmp" + numtostrS (syringe) + "_" + numtostrS (grip) + "_" + numtostrS (nest) ROBOT. ove a$ if (grip— l) ROBOT. speed sp_slow else ROBOT. speed sp vslow endif Page 69 aS - "tlw" + numtostrS (syringe) + "_". + numtostrS (g*--p) + "_" + numtostrS (nest) R OBOT. move 's a$ ROBOT. finish ROBOT.open if (grip—lϋ&syringe——2) delay 500 else delay 250 endif if (grip—1) ROBOT.speed sp_med else ROBOT.speed sp_slow endif if (grip—2) run homemtr.tcl endif ;check motor pulses if (grip—2&&check_motor) while (!home_done) endwhile call findtop.tcl run homemtr.tcl endif aS - "tmp" + numtostrS(syringe) + "_" + numtostrS(grip) + "_" + numtostrS(nes* l ROBOT. ove_s a$ ROBOT.finish if (syringe—2) SHARK.writebit o_syringe_locate,1 delay 1500 SHARK.writebit o_syringe_locate,0 endif — delay 500 if (grip—l«Ssyringe—»2) ROBOT.speed sp_mslow a$ - "tlw" + numtostrS(syringe) + "_" + numtostrS(grip) + "_" + numtostrS(nes ROBOT.move_s a$ ROBOT.finish ROBOT.jog s 0,0,.25 ROBOT.finish ROBOT.close Page 70 delay 250 ROBOT.open d»\ay 250 a β "tmp" + numtostrS(syringe) + "_" + numtostrS(grip) + "_" + numtostrS(nest ROBOT.move_s a$ ROBOT.finish endif a$ - "mixsafe" + numtostrS (grip) ; ROBOT. speed sp_fast ; ROBOT. move a$ if (grip— 2) while ( ! home_done ) endwhile run safemtr.tcl endif if ( ! getting_rt) call datrack.tcl endif free Page 71 PUTRACK put a bottle in a rack from the any safe position USE OF PROCEDURE: before calling this procedure set the variable: rack_type to reflect the type of bottle that is being picked up robot_Iocation - the location in the rack the following variables should be set in the gen_init.tcl procedure: row_βize[rack_type] - number of locations that are parallel to the track rack_jog(rack_type] - distance to jog down to get bottle track_jog[rack_type] - distance between the locations rack_safe$[rack_type] - safe position rack_im_lS[rack_type] - intermediate point ≠l rack_im_2S[rack type] rack_im 3$[rack~type] rack_high$(rack_type] = high point names for this rack (the procedure adds the location number to this name so that the robot moves to the first location in a row and moves the track to the appropriate final location. So rack_high$ should look like: "SAM_HI_") NOTES: If there are more racks than bottle types, you can have many of these ' >es of procedures for each type. For example, create a new procedure cxled getrackl.tcl and call each of the arrays by a different name. So rack_highS[rack_type] could be renamed rackl_high$[rack_type] , etc. A**********************************/ if (log robot) , , _ . logrobotS « "putrack — rack: " + numtostrS(rack_type) + " loc: + numtos call logrobot.tcl -?ndif if (simulate robot) if ( !gβttiήg_rt) call datrack. tcl endif stop endif request "ROBOT" ROBOT. speed sp_vfast if (rack_type— 5) tuml_continue-0 while ( ltuml_latched) »*--*dwhile — Page 72 elseif (ra___type—6) tum2 continue-0 while (!tum2_latched) endwhile endif found - 0 robot_i - 1 while (!found) if (rack_location <- robot_i * row_size[rack_type]) if ((rack_type—3) | j (rack_type—4)) ROBOT.move "rack_im" endif rack_tempS - rack_high$(rack_type] + numtostrS(robot_i) ROBOT. ove rack_temp$ ROBOT.finish found « l else robot_i - robot_i + 1 endif endwhile ROBOT.speed sp_fast jog_temp = track_jog[rack_type]*((row_size[rack_type]*robot_i) - rack_location) ROBOT.joint 6,-jog_temp ROBOT.finish if ((rack_type—5) | | (rack_type—6) | | (rack_type—3) ) ROBOT.speed sp_vslow else ~ ROBOT.speed sp_slow endif if (rack ^ type—7) ROBOT.5og_s 0,0, (-rack_jog[rack_type]+.5) else ROBOT.jog s 0,0,-rack jog[rack_type] endif ~ ~ ROBOT.finish ROBOT.open delay 500 ROBOT.speed sp_slow ROBOT.jog s 0,0,rack_jog[rack type] ROBOT.finish ROBOT.speed sp_fast if ( !getting_rt) call datrack.tcl endif if (rack_type— 5) tuml_cont inue- 1 Page 73 - t ~ elseif (ra-~ ^ _type— 6) tum2_continue-l endif fi Page 74 ~ ?7- Procedure: PUT_TUM Purpose: Put syringe in tumbler Author: MJB if (syr_rack[current_index] !=10) if (syr_size[current_index]-»10) syringe = l else syringe - 2 endif grip = 1 nest = l call gethold.tcl syr_rac [current_index] - 10 syr_rackloc(current_index] = 0 syr_grip(current index] = l endif ;change grip if needed if (syr_grip[current_index]—2) if (syr_size[current_index]=-- » 10) syringe = l else syringe • = 2 endif grip - 2 nest - l c "1 puthold.tcl c..1 stopchek.tcl grip = l nest — l call gethold.tcl call stopchek.tcl endif ;find next available tumbling rack space if (syr_size[current_index]-»10) rack cind - 5 else - rack_kind - 6 endif tum_current - 0 old~tum - l syr~rackloc[current_index] - 0 while (syr_rackloc(current_index)—0) no_index - o turn current - 0 while (!no_index) rayfind tum_current,syr_rackloc(tum_current+1] ,old_tum (tum_current!—l) Page 75 -fύό -- if tt-yr_ra<Λ( Λm_current]-- « rack_kind) no index -- 1 ~ endif elseif (tum_current—1) syr rackloc[current_index] - old_tum no_Tndex - 1 endif endwhile old_tum = old_tum + 1 endwhile if (syr_size[current_index)—10) syr_rack(current_index] « 5 else ~ syr_rack[current_index] - 6 endif ;place syringe in tumbling rack rack_type - syr_rack[current_index] rack_location = syr_rackloc[current_index] call putrack.tcl call stopchek.tcl Page 76 -10 / - Procedure: MONITOR Purpose: Hain procedure for data input Author: CES user_choice = 0 current_row = num_syringes+l last_row - current_row screenon "monitor" enablekeys running = l run robot.tcl run shake.tcl while (running) if (user_choice 1= 0) if (user_choice • *= l | | user_choice — 2) ; Insert syringe(s) if (num_syringes >*=» 100) tellaXarm "No more syringes may be added." else disablekeys screenhold call insert.tcl updatetable screenupdate enablekeys endif user_choice - 0 elseif (user_choice -=» 3) disablekeys delete_row = current_row call delete.tcl updatetable screenupdate enablekeys user_choice - 0 elseif (user choice — 4) stringrequest "CALCULATING" call calc.tcl stringfree "CALCULATING" user_choice = o elseif~(user_choice — 5) call reagents.tcl user_choice - o elseif " (user_choice — 6) call amino.tcl user_choice - 0 elseif (user_choice — 7) ; clear all syringes only works if 'initialization = 0 disablekeys call clearall.tcl enablekeys Page 77 - ' ό mm " user cnoice — 0 elβeir r (ui-.βr_choi.ce — 8) disablekeys call snapshot.tcl enablekeys user_choice - 0 elseif (user_choice •== 20) call equpinit.tcl screenupdate enablekeys user_choice - 0 elseif (user_choice == 21) ; change protocol call protocol.tcl user_choice - 0 elseif (user_c.noice — 22) call testio.tcl user_choice - 0 elseif (user_choice — -1) ; Verify termination of system ask user_choice,"Are you sure you want to terminate?\n" if (user_choice) call stopmtr.tcl terminate endif user_choice - 0 endif elseif (current_col | | current_row != last_row) if (current_row — last_row) if (current_row <= num_syrιnges+l && syr_process(current_row]<=l) disablekeys screenupdate screenhold call syrinfo.tcl updatetable screenupdate enablekeys endif else last_row — current row endif current_col - 0 endif endwhile screenon "logo" initialization - 0 Page 78 -/03- Procedure : NEXTSTEP Purpose : Figure out the next step for a svringe Author : M B,CES Notes Input — ns_process ns_amino ns_dodepS Output — ns_process ns_amino ' X £ * is . the end of an -mino acid, figure out what the next process ; should be if (prot_proc[ns_process] =- step nextamino) ns_amιno - ns_amino + l if (ns_amino <= couplings) ns_process — 2 else ns_process - ns_process + l endif ns_process = num procs endif - ; r ' Nerwise, just add one to the process number ns_process - ns process + 1 endif setstringarray restart info$ril ,"",-l savevars 7,"restart.dat" Page 79 Procedure : REAGENTS Purpose : Allow operator to change reagents Author : MJB local aS,a,change disablekeys ; Set the colors of the volumes — set the ones that have their required ; greater than their available to red. a - 1 while (a <= 4) if (sol_req[a] > sol_avail[a]) sol_color[a] = 4 else sol_color(a] - 15 endif a - a + 1 endwhile sol_col - 0 sol_row - 0 screenon "reagents" enablekeys user_choice = 0 while (user_choice i= -l) if (sol_row) if (sol_col—2) a$ - contentsS[sol_row] inputstring aS, "Input Probe Contents" if (a$ != contentsS[sol_row] && aS != "") contentsS[sol_row] - aS change - l endif ) change - l endif -.ndif Page 80 user_choice = o endif endif endif endwhile screenback Page 81 local choice request "ROBOT" sysinit_message$ = "" robot_ready - l screenupdate ; Arm Power tell "Make sure Robot Arm Power is on. " robot_ready = robot_ready | 2 ROBOT . cleararm screenupdate ; Home the robot ask choice, "Is the Robot homed?" if (choice) robot_ready = robot_ready | 4 screenupdate ask choice, "Is the Robot in a\nsafe position?" if (!choice) ROBOT.manualc sysinit_messageS = "Robot is in manual mode" * *reenupdate -all "The Robot is now in manual mode.\nϋse teach pendant to place it\nin ask choice, "Is the Robot in a safe position?\n(<No> cancels initializati if (!choice) robot_ready - 0 stop endif endif alse /* Ask if the robot is in its HOMEHERE position */ ask choice, "Is the Robot in its\nHOMEHERE position?" if (choice) ask choice, "Are you sure?" endif if (!choice) /* get the robot in its home bounds */ ROBOT.manual sysinit_message$ - "Robot is in manual mode" screenupdate tell "The robot is now in manual mode.\nUse the teach pendant to place\nit endif /* home robot */ choice - 0 ask choice, "Ready to home?" if (!choice) -obot_ready - 0 Page 82 stop --/.) -— endif ence in progress" " position? X n «No> will cancel initializa mιτ:ιaιιza end f ROBOT. open robot_ready = robot_ready | 8 /* ROBOT is at VERIFY Position */ p age 83 (d? Procedure: ROBOT Purpose: Control the robot movements Author: MJB,CES Notes: if (robot_running) stop endif local last_current,a robot_running = 1 system_paused = 0 error = 0 pause_system = 1 current_index = 0 timer start_time time_now = start_time while (running) if (initialization) stringrequest "USING SYRINGES" ; If no syringes are in the system, set the start time to zero if (num_syringes == 0) timer start_time time_now = start_time endif ; check if robot has been paused call stopchek.tcl ; check if all the syringes must be cleared if (clear_all_syringes) call clearall.tcl endif ;find next syringe that robot will work on: current_index call whattodo.tcl ; while the robot has a syringe, perform the next step for the syringe while (current_index > 0) syr_statcolor[current_index] = 1 last_current = current_index updatetable call dostep.tcl syr_statcolor[last_current] = 0 updatetable Paqe 84 i f ( cur ent_index ) stringrequest "NEXT STEP" ns_process = syr__process [current_index] ns_amino = syr_amino_step [current_index] ns_dodep$ = syr_dodeprot$ [current_index] ; Find the codes for the syringe bs_seq$ = syr_sequence$ [current_index] call breakseq. tcl call nextstep . tcl syr_process [current_index] = ns_ρrocess syr_amino_step [current_index] = ns amino stringfree "NEXT STEP" endif savevars 5, "syringes.dat" endwhile stringfree "USING SYRINGES" endif endwhile robot_running = 0 Paqe 85 PO7US96/01168 if (log_robot) logrobotS = "rotate — time: " call logrobot.tc l + numtostrS ■ 'rot_time) endif if (simulate_robot) stop endif local wait request "ROBOT" ROBOT ; speed sp_slow timer wait free Paαe 86 Procedure: SAFEKTR Purpose : move motor to a safe position Author : MJB direction - 1 mσtor_steps = motor_safe_step call strtan.tr. tcl Page 87 -AC2 - NAME: SHAKE PURPOSE: To Shake the appropriate tumblers AUTHOR: SBP if (shake_running) stop endif local a shake_running - l tuml_latched - 1 tum2_latched - 1 tuml_continue » 1 tum2_continue = 1 while ((!initialization) && (running)) endwhile while (running) if (!simulate_robot) if (tuml_latched && tumi_continue) ; Check if there is anything in the rack narrayfind a,syr_rac [1] ,5 if (a != -l) ; turn tumbler l on SHARK.writebit o_tuml clamp,1 delay 250 SHARK. ritebit o_tuml_latch,0 delay 500 ~" SHARK.writebit o_tuml_start,1 else ~ tuml_continue «= 0 endif tuml_latched - 0 endif if (tuml_continue — O S-. tuml_latched =- 0) ; turn~tumbler l off SHARK.writebit o_tuml_latch,0 delay 250 SHARK.writebit o_tuml_start,l SHARK.readbit i_sense tuml,a while (!a) SHARK.readbit i_sense_tuml,a endwhile SHARK. ritebit o tuml_start,0 delay 250 ~ SHARK.writebit o_tuml_latch,l delay 250 SHARK. ritebit o tuml clamp,0 Page 88 tuml_latched •= 1 endif if (tum2_latched && tum2_continue) ; Check if there is anything in the rack narrayfind a , syr_rack [ 1 ] , 6 if (a 1 = -l) ; turn tumbler 2 on SHARK. writebit o_tum2_clamp, l delay 250 SHAR .writebit o_tum2_latch,0 delay 500 "HARK.writebit o_tum2_start,1 else tum2_continue — 0 endif tum2_latched - 0 endif if (tum2_continue— 0 && tum2_latched — 0) ; turn tumbler 2 off SHARK. ritebit o_tum2_latch,0 delay 250 SHARK.writebit o_tum2_start,1 SHARK.readbit i_sense_tum2,a while (!a) SHARK.readbit i_sense_tum2,a endwhile SHARK.writebit o_tum2_start,0 delay 250 SHARK.writebit o_tum2_latch,1 delay 250 SHARK. ritebit o_tum2_clamp,0 tum2_latched = 1 endif endif endwhile shake_running - 0 Page 89 local fileS fileS •= "snapshot.dat" inputstring fileS,"Enter the file name:" if (fileS --• «") stop endif erroroff filenew 6,fileS if (getstatus() ) tellalarm "Invalid file name!" stop endif erroron sysmsgS «= "Waiting for robot " screenupdate stringrequest "SYRFILE" sysmsgS - "Writing to file..." screenupdate Sf -iW - 1 wh. J (sf_row <= num_syringes) call syrfile.tcl sf_row - sf_row + l endwhile fileclose 6 sysmsgS - "" screenupdate stringfree "SYRFILE" Paqe 90 Procedure: STARTUP v/r- Purpose : startup system Author : M B enablekeys call init.tcl if (next_syringe <= l) screenon "logo" else call restart.tcl run monitor.tcl endif Page 91 - / - *. - - Procedure: STOPCHEK Purpose: checks to see if pause system has been hit Author: MJB ; Free this string because it is ok to update the syringe list stringfree "USING SYRINGES" if (pause_system) if ( ! simulate_robot ) request "ROBOT" ROBOT . manualc free endif system_paused = 1 screenupdate while (pause_system) endwhile if ( ! simulate_robot) request "ROBOT" ROBOT. command "NOMANUAL" , free endif system_paused - 0 screenupdate endif ; request syringe list again stringrequest "USING SYRINGES" Page 92 - ( C9- - Procedure: SYR_ASP Purpose : move syringe to cup and aspirate solution Author : MJB set cup = 1 for RGP1, 2 for RGP2 syringe = 1 for 10ml , 2 for 2.5ml' asp_amount = amount of solution to aspirate air amount = amount of air to draw in if (log_robot) logrobotS = "syringe aspirate ~ cup: " + numtostrS(cup) + " syringe: " + num Λ call logrobot.tcl logrobotS = " — amount: " + numtostrS(asp_amount) + " air ami call logrobot.tcl endif if (simulate_robot) stop endif request "ROBOT" ROBOT.speed sp_f st ROBOT.move "mixsafe2" a$ " ixs" + numtostrS(cup) + numtostrS(syringe) ROBOT.move a$ ROBOT.speed sp_vslow while (!disp_done) endwhile ROBOT.jog_s 0,0,-4 ROBOT.finish delay 500 /* Program to pull up syringe for solution amount */ if (syringe—l) motor_steps = (asp_amount+air_amount)*syrgl_cal_asp syr_amount[current_index] •*» syr_amount(current_index] + asp_amount + aιr_amouι else — motor steps = (asp_amount+air_amount)*syrg2_cal_asp syr_amount(current_index) = syr_amount(current_index] + asp_amount + aιr_amouι endif if ((motor_steps-int(motor_steps) )>-.5) -*-*tor_steps •= int(motor_steps) + 1 Page 93 else . motor_steps - int(motor_steps) endif direction - 0 call strtantr. tcl /ROBOT.jog_s 0,0,4 ; OBOT.finish delay 500 savevars 5,"syringes. at" ROBOT.speed sp_mslow ROBOT.jog_s 0,0,4 ROBOT.finish ROBOT.speed sp_fast a$ - "mixs" + numtostrS(cup) + numtostrS(syringe) ROBOT.move aS ROBOT. move "mixsafe2" free Page 94 Procedure: SYR_DSP Purpose : move syringe to cup and dispense solution Author : MJB set cup *= 1 for RGP1, 2 for RGP2 dsp_amount = amount of solution to dispense if (log robot) logrobotS «= "syringe dispense ~ cup: " + numtostrS(cup) + " amount: + numto call logrobot.tcl endif if (Simulate_robot) stop endif request "ROBOT" ROBOT.speed sp_fast ROBOT.move "mixsafe2" ROBOT.speed sp_med aS * 'mixs" + numtostrS(cup) + numtostrS(syringe) ROBOT.move aS ROBOT. speed sp_vslow ROBOT. jog_s 0 , 0 , -3 .25 ROBOT. inish delay 500 /* Program to dispense from a syringe*/ if (syringe--'1) motor_steps — dsp_amount*syrgl_cal_dsp else motor_steps - dsp amount*syrg2_cal_dsp endif if ((motor_steps-int(motor_steps))> * * ■* .5) motor_steps — int(motor_steps) + l else motor_steps *-> int(motor steps) endif direction - 1 calJ strkmtr.tcl Page 95 ; /* Program to suck up drop from tip*/ if (syringe—i) else tθr -- StePS = ds P_ d∑ -op_amountl*syrgl_cal_dsp endif ° r ~ StePS = ds P_ dro P_a*nount2*syrg2_cal_dsp if ( ( motor_steps-int ( motor steps) ) >- .5 ) motor_steps = int (motor steps) + l else - r motor_steps = int (motor steps) endif - r ' direction *= o call strkmtr. tcl /* ROBOT.speed sp_mslow ROBOT.jog s 0,0,3.25 ROBOT.finish ROBOT.speed sp_med ROBOT.move "mixsafe2" free Riage 96 FOCUS PAGE WO 96/22157 \ , ητ. n~- PCT/US96/01168 Title: Apparatus and Method for Multiple Synthesis of Organic Compounds on Polymer Support Authors: Krchnak et al Attorney Docket No. : 7156-068 Procedure: SYRFILE Purpose: Write a syringe's data to a file Author: CES Notes: The file number will be 3 upon entry sf row will be the syringe to log local aS stringformat a$,"Pepcode: *-l5.15s Size: %s ml",syr_pepcodeS[sf_row] ,numtostrS(s fileappend 6,a$ aS = "Sequence: " + syr_sequence$[sf_row] fileapp&nά 6,a$ if (prot_proc[syr_process[sf_row]] != step_finished) stringformat a$,"Current Amino: %2.01f Resin: %4.11f Subst: %4.21f Fi fileappend 6,a$ if (syr loc[sf row]) string ormat~aS,"Status: %-13.13s Location: In Input Rack (Loc *.01f) ,pro elseif (syr rack[sf row] •— 5 | | syr_rack[sf_row] — 6) stringformat a$,"Status: *-13.13s",prot_step$[protjproc[syr_process(sf_row] else stringformat a$,"Status: %-i3.13s",prot_step$[prot_proc[syr_process[sf_row] endif fileappend 6,a$ a$ = "Start: " + syr_datetime$[sf_row] fileappend 6,a$ else stringformat a$,"Resin: %4.11f Subst: %4.21f Final Deprot: %s « ,syr_resιn *'λeappend 6,a$ - *= "Start: " + syr_datetime$[sf_row] + " Finished: " + dateSO + " " + tim fileappend 6,a$ endif fileappend 6,"" Page 97 Procedure : SYRINFO . Purpose: User wants to change syringe info Author : CES local a, a$ , choice, temp, oldchoice ; change the peptide code if (current_col -- l && current_row <= num_syringes ) a$ - syr_pepcode$ [current_row] inputstring a$, "Enter the peptide's code: " if (a$ *-*_ " ■■ | | strlen (a$) > 8) tellalar∑r "That code is invalid. " elseif (a$ ! •= syr_pepcode$(current_row] ) syr_pepcode$[current_row] = a$ savevars 5 , " syringes . dat " endif ; change the peptide sequence elseif (current_col —» 2 t& current_row <- num_syr inges) a$ - syr_sequence$ (current_row] ~ inputlongstring aS , "Enter the peptide's sequence: " bs_seq$ - a$ call breakseq. tcl if (bs_error | | ( ! couplings) ) tellalarm "That sequence is invalid. " elseif (a$ ! » syr_sequence$ [current_row] ) syr_amino_countfcurrent_row] - couplings syr~sequence$(current_row] - aS γrjprocess(current_ro " w] - o -alc_needed - 1 savevars 5,"syringes.dat" endif ; change the syringe size elseif (current_col -=- 4) menu choice,"Pick a size:","10 ml","2.5 ml" if (choice && syr_size[current_row] !» lθ-(7.5*(choice-l) ) ) syr_size(current_row] = lθ-(7.5*(choice-l) ) syr~loc[current_row] » o syr_rack(current_row] - 0 syr~rackloc(current_row] - 0 syr_process(current_row] •- o savevars 5, "syringes.dat" endif ; change the syringe location elseif (current_col — ■ 5 &- current_row <= num_syringes) choice - syr ϊoc(current_row] inputint choice,"Enter the location:" if (choice !- syr_loc(current_row]) if (choice) if (choice < 1 | | choice > 30) tellalarm "The location must be between *1 and 30" sysmsgS • *•* "" Page 98 screenupdate " ~ ^ stop endif sysmsgS m "Checking rack..." screenupdate temp " l while (temp <«• num syringes) if (syr_loc[tempi = choice && temp i= current_row && syr_sιze[temp] tellalarm "That location is already used!* sysmsgS = "" screenupdate stop endif temp = temp + l endwhile sysmsgS • *- • »» screenupdate endif if (syr_loc(current_row) • = 0 && choice > 0) calc_needed = 1 elseif (choice - * - 0) syr_process[current_row] - 0 endif syr_loc[current_row] = choice savevars 5, "syringes.dat" endif ; Change resin amount elseif (current_col — 6) a - syr_resin(current_row] inputnum a,"Enter the resin amount:" if (a !« syr_resin[current_row]) syr_resin[current_row] - a if (syr_process(current_row] > 0) syr_process(current_row] - 0 calc_needed - 1 endif savevars 5,"syringes.dat" endif ; Change substituion amount elseif (current_col - • - 7) a - syr_substTcurrent_row] inputnum a,"Enter the subst. amount:" if (a !- syr_subst(current_row]) syr_subst[current_row) - a if (syr_process[current_row] > 0) βyr_process(current_row] - 0 calc_needed - l endif savevars 5,"syringes.dat" endif ; Do final deprotection? elseif (current_col — 8) Page 99 -/z6~ i.t (syr_α,deprot$[c-urrent_row] — "Y") syr_dodeprot$[current_row] - "N" else ~ syr_dodeprot$[current row] = "Y" .if ir (syr_process(current_row) > 0) syr_process(current_row] - 0 calc_needed - 1 endif "" savevars 5,"syringes.dat" endif Page 100 local choice,temp syringe_ready = l screenupdate ; Check syringe pump power sysinit_message$ - "Checking Syringe Pump Power" screenupdate call syrpower.tcl if (!sp_power) syringe_ready - 0 erroron stop endif syringe_ready = syringe_ready | 2 ; Fill the reservior tell "Fill the Syringe Pump reservoir." syringe_ready = syringe_ready | 4 screenupdate ; Prime the syringes ask oice,"Do you want to prime the syringe pumps?" if , -noice) tell "Prime them now." tell "Turn the pumps off and then on." endif sysinit_message$ = "Checking Syringe Pump Power" screenupdate call syrpower.tcl if (!sp_power) syringe_ready - 0 erroron stop endif syriπge_ready - syringe_ready | 8 screenupdate ~ erroron Page 101 n* "" Procedure: WASHING Purpose : executes robot actions for a washing Author : MJB local a,buf_place,infoindex infoindex - l ;find buffer in reagent table sarrayfind buf_place,contentsSC1] ,prot_buf$[syr_process(current_index] ] !=10&&syr_rack(current rack_type - 2 endif rack_location - syr_rackloc[current_index] call getrack.tcl syr_grip[current_index] - l call stopchek.tcl endif ;switch grip on syringe i t_index]—1| | ((syr_rack(current_index)=8) | | (syr_rack[curr ent_index]«-lθ) syringe - 2 endif grip - l nest - l ;if syringe in restart dont pick up if (syr_rack[current_index]!-8&&syr_rack(current_index] !-9) call puthold.tcl call stopchek.tcl endif if (syr_size[current_index)—10) syringe - l else syringe - 2 endif grip - 2 nest = l call gethold.tcl s y r _*-fi'ip(current_index] = 2 call stopchek.tcl endif /squeeze out solution in syringe if ((syr_size(current_index]—10S-.syr_amount(cuιrrent_index]>drop_amountl) | | (s cr \ waste.tcl Page 102 (Z# - call stopcuek.tcl endif " restart_info$[infoindex] - "Wash: Emptied syringe" savevars 7,"restart.da " infoindex - infoindex + 1 /dispense buffer restart_info$(infoindex] - "Wash: Started dispensing buffer" savevars 7,"restart.dat" infoindex = infoindex + 1 buf_amount - prot_vol[syr_process[current_index] ] if (syringe—2) buf_amount = buf_amount/division_factor endif buf_number - buf _ lace run disp_buf . tcl sol_avail[buf_place] = sol_avail [buf_place ] - buf_amount savevars l , " amino . dat " if (log_robot) logrobotS - "dispense : " + numtostrS (buf_amount) + " nozzle : " + numtostrS (bu call logrobot. tcl logrobotS - "solution : " + prot_buf $ [ syr_process ( current_index ] ] call logrobot.tcl endif restart_info$(infoindex] = "Wash: Finished dispensing buffer" savevars 7,"restart.dat" infoindex ■= infoindex + 1 /aspirate buffer restart_info$[infoindex] = "Wash: Started aspirating buffer" savevars 7,"restart.dat" infoindex = infoindex + 1 cup - 1 if (syr_size(current_index]==10) syringe ■= 1 else syringe - 2 endif asp_amount • ** ■ buf_amount air_amount = prot_air[syr_process[current_index] ] if (syringe—2) air_amount - asp amount/division_factor endif call syr asp. tcl restart_Info$ [ infoindex) - "Wash: Finished aspirating buffer" savevars , "restart . dat" infoindex » in oindex + 1 call stopchek. tcl /rotate rot_time - 60 *pr ot_t ime [ syr_pr oces s ( curr ent_index ] ] call rotate. tcl call stopchek. tcl /squeeze out solution in syringe Page 103 call waste. _cl " ~τestart_infθ$ [ info index] = "Wash: Emptied syringe" savevars 7 , " restart . da " infoindex = infoindex + 1 ca , stopchek. tcl Page 104 A Procedure: WASHING Purpose : executes robot actions for a washing Author : M B local a , buf _place , infoindex infoindex = 1 /find buffer in reagent table sarrayfind buf_place,contentsS[1],prot_buf$[syr_process(current_index]] /if syringe just started, get from input rack if (syr_rack[current_index] !=8&&syr_rack[current_index] !=10&tsyr_rack[current_in if (syr_size(current_index]—10) rack_type «= l else rack type = 2 endif ~ rack_location *-- syr_rackloc(current_index] call getrack.tcl ~ syr_grip[current_index] = l call stopchek.tcl endif /switch grip on syringe if (syr_grip[current_index]==l| | ((syr_rack[current_index]=-8) | | (syr_rack[current if (syr_size[current_index]—10) yringe = l e_-.e syringe - 2 endif grip - l nest *-** l /if syringe in restart dont pick up if (syr_rack[current_index] !-8_&syr_rack[current_index] !=9) call puthold.tcl ~ call stopchek.tcl endif if (syr_size(current_index]—10) syringe - l else syringe = 2 endif grip - 2 nest - l call gethold.tcl syr_grip(current_indexJ = 2 calX stopchek.tcl endif /squeeze out solution in syringe if ((syr_size(current_indeκ]—i0&isyr_amount[current_index)>drop_amountl) | | (syr_ c~ Λ \ waste.tcl ~ Page 105 call stopchek.tcl endif-- - restart_info$[infoindex] = "Wash: Emptied syringe" savevars ,"restart.dat" infoindex - infoindex + l /dispense buffer restart_info$[infoindex] = "Wash: Started dispensing bu er" savevars 7,"restart.dat" infoindex = infoindex + buf_amount - prot_vol(syr_process[current_index] ] if (syringe—2) ~~ buf_amount - buf_amount/division_factor endif ~ " buf_number = buf_place run disp_buf.tcl sol_avail[buf_place] = sol_avail(buf_place] - buf_amount savevars 1,"amino.dat" if (log_robot) logrobotS - "dispense : " + numtostrS(buf_amount) + " nozzle: " + numtostrS(b call logrobot.tcl logrobotS - "solution : " + prot_buf$[syr_process(current_index] ] call logrobot.tcl endif restart_info$(infoindex) = "Wash: Finished dispensing buffer" savevars 7,"restart.dat" infoindex *-> infoindex + 1 /aspirate buffer restart_infoS(infoindex] = "Wash: Started aspirating buffer" savevars 7,"restart.dat" infoindex = infoindex + 1 cup - 1 if (syr_size[current_index]—10) syringe - l else syringe ■ 2 endif asp_amount »» buf_amount air_amount = prot_air[syr_process[current_index] ] if (syringe—2) air_amount - asp amount/division factor endif call syr asp.tcl reβtart_Tnfo$[infoindex] - "Wash: Finished aspirating buffer" savevars 7," estart.dat" infoindex ■ • infoindex + l call stopchek.tcl / rotate rot_t ime " 60 *prot time ( syr_process [ current_index ] ] call rotate. tcl ~ call stopchek.tcl /squeeze out solution in syringe Page 106 call waste. * l restart_inf o$ [ in oindex ] « "Wash: Emptied syringe" savevars 7 , " restart . dat " inf-* index = infoindex +* l ca. /stopchek. tcl Page 107 y . ?< - Procedure: WASTE Purpose : move to waste and dispense liquid Author : K B if ( log_robot) logrobotS = "waste : "+ numtostrS ( syr_amount [ current_index ] ) call logrobot. tcl endif if (simulate_robot) stop endif request "ROBOT" ROBOT. speed sp_med ROBOT . move "waste " ROBOT. speed sp_mslow ROBOT . j og s 0 , 0 , -waste_ j og ROBOT. finish /* Program to squeeze out liquid */ if (syringe— 1) motor_steps — (syr_amount(current_index]+l) *syrgl_cal_dsp elF n. -or_steps - (syr_amount[current_index] + .25) *syrg2_cal_dsp endif if ( (motor_steps-int (motor_steps) ) >-.5) motor_steps = int (motor_steps) + 1 else ~ motor_steps = int (motor steps) endif direction « l call strkmtr. tcl syr_amount(current_index] - 0 savevars 5 , " syringes . dat" /* */ /* Program to suck up drop */ if (syringe— 1) motor_steps *-> drop_amountl*syrgl_cal_asp syr_amount ( current_index ] - drop_amountl else motor_steps - drop_aunount2*syrg2_cal_asp syr_amount ( current index] - drop amount2 endif if ( (motor_steps-int (motor_steps) ) >- .5 ) motor_steps - int (motor_steps) + 1 else ~ m" or_steps = int (motor_εteps) Page 108 WOSXj/22157 PCI7US 6/01168 endif direction - 0 call strkmtr.tcl ROBOT. speed sp_mslow ROBOT . j og_s 0,0, waste_ j og free Page 109 Procedure: WHATTODO Purpose : finds current_index Author : PJF local i, j, k, temp, temp_time, temp_busy local new_busy, new_step, new_amino_count, new_amino_step local first_temp, bail_out, new_syr_start[100] , new_syr_end(100] / set the current time (leave it dummied if we are simulating times) if (!dont_wait) time_now - elapsed(0) endif current_index « 0 first_temp ■ 0 bail_out - 0 if (restart_index >- next_syringe) tell "Hake sure that the temporary nests are empty!" restart_index «■ 0 endif ; if there are no syringes in process, start the first one or bail out if (next_syringe <- l) if (prot_proc(syr_process[next_syringe] ] — step_ready ■*& next_syringe <- num_ current_index - next_syringe show "point 1" e * 'if endif / If one was interrupted, continue that syringe if (restart_index) current_index - restart_index show "point 2" restart_index - o stop endif / Search through the active syringes and find the one with the shortest wait first_temp - l i - 2 while (i < nβxt_syringe) if (syr_processtime( i ) < syr_processtime(first_temp] ) first_temp -» i endif i - i + l endwhile / Is the syringe with the shortest wait time ready to be processed? if (syr_processtime( first_temp] <» time_now) current_index - first temp stop — Page 110 endif num else / Simulate the next syringe current_index = first_temp show "point 3" time_now ••* syr_processtime(first_temp] stop endif endif / Figure out if we can start the next syringe in the input rack —————————————————————————— /first, set up a temp array of current tumble end-times i «• 1 while (i < next syringe) temp_processtιme[i] = syr_processtime[i] temp_amino_step[i] - syr_amino_step[i] temp step[i] - syr_process(i] i - I + 1 endwhile ; now set up arrays of 'robot busy' time slots using all active syringes / set the index of the START and END time arrays for robot busy periods temp_busy ■ 0 robot_busy_start[0] = time_now robot_busy_end[0] = time_now first_temp « l / while we haven't examined every active syringe's future, fill in the / busy time slots while (first_temp) temp_busy ■*■ temp_busy + l / Search through the active syringes and find the one with the shortest wait / that hasn't been processed to its finish step yet first_temp - 0 i - 1 while (i < next_syringe) if (prot proc[temp_step[i]] !» step_finished) if (!flrst_temp) first_temp - i elseif (temp_processtime(i] < temp_processtime[first_temp]) first_temp - i endif endif Page 111 ' / # i - i + 1 endwhile τ f we found a syringe that hasn't been processed to the end, process its sxt steps if (first_temp) / add up the adjacent robot move-times for that syringe temp = first_temp / the START of these robot moves robot_busy_start(temp_busy] = temp_processtime [temp] temp_step[ temp] = temp_step[temp] + 1 temp_time •« temp_processtime(temp] while ( ! (prot_choice[prot_proc[temp_step[temp] ] ] -. param_stop) ) / first, check if we are starting another amino if ( pro t_pr oc ( temp_s tep [ temp ] ] — step_nextamino ) if (temp_amino_step [temp] < syr_amino_count[temp] ) temp_amino_step[temp] - temp_amino_step[temp] + 1 temp_step[temp] - l else temp_step[teap] - temp step [temp] + 1 endif ~ elseif (prot_proc [temp_s tep [temp] ] — step_stopifnofinaldep) if (syr_dodeprot$ (temp) — "Y" ) temp_step[te_ιp) = temp_step(temp] + 1 else temp_step[temp] = num rocs endif else temp_step(temp] • = temp_step [ temp ] + 1 temp_time - temp time + prot robottime [temp step [ temp] ] endif ~ ~ ~ endwhile robot_busy_end[temp_busy] = temp_time /the END of thes robot moves / re-assign its NEXT scheduled tumble end-time if (prot_proc[temp_step[temp] ] ! = step finished) t β mp_processtime (temp] « temp time +~ (prot time[ temp step[temp] ] * 60) endif — ~ — endif endwhile slots needed by the next syringe in the input rack while (prot_proc[ new_s ep] ! - step_finished) n β w_busy • « new_busy + 1 / the START of these robot moves new_syr_start(nβw busy] - temp_time while (T(prot_choTce(prot_procTnew_step] ] s param_stop) ) 'first, check if we are starting another amino Page 112 if (pro-._proc[new_step) — -mstep-_nextamino) " if (new_amino_step < syr_amino_count[next_syringe)) new_amino_step — new_amino_step + 1 new_step «■ l else new_step - new_step + 1 endif elseif (prot_proc[new_step] — step_stopifnofinaldep) if (syr_dodeprot$[next_syringe] — "Y") new_step • = new_step + l else new_step - num_procs endif else new_step = new_step + l temp_time = temp_time + prot_robottime(new_step] endif endwhile / the END of these robot moves new_syr_end[new_busy] = temp_time ; re-assign its NEXT scheduled tumble end-time if (prot_proc(new_step] != step_finished) temp_time = temp_time + (prot_time(new_step] * 60) new_step = new step + l endif endwhile / Now compare the time line of the active syringes and the new syringe / and see if the new syringe fits i - 1 j - 0 if (new_syr_end[l] < robot busy start(l]) /the first block of moves is clear i - 2 while ( (i <= new_busy) && ( ! bail_out) 4& (j <= temp_busy) ) if ( (new_syr start [ i] >- robot busy end[j ] ) -.4 (new_syr end[i] <= robot busy i - i + l ~ ~ ~ ~ elseif ( (new_syr_start[i] >= robot_busy start[j ] ) && (new_syr_start(i] < rob bail out =~ " i ~ l - T elseif ( (new_syr_end( i] > robot_busy_start [ j ] ) &4 (new_syr_end(i] <= robot_b bail out *»~i k - J elseif ( (robot_busy_start[j] > • » new syr_start[i] ) && (rσbot_busy_start[j] < bail out - i - ~ k - 5 elseif ( (robot_busy end[j ] > new_syr_start[i] ) && (robot_busy_end( j ] <- n β w_ bail out - i ~ k - J else j - j + 1 endif Page 113 endwhile else bail_out •= 5 en -if /if 'next_syringe' not on hold, and there is one in the input rack, get it if (!bail_out) current_index = next_syringe show "point 4" else ; if don't want to wait and there is a syringe in process current_index « 0 if (dont_wait) time_now • = time_now + 60 endif endif Paαe 114 H I Procedure FINDTOP Purpose turn on motor until sensor is triggered Author MJB if (simulate_robot) stop endif ;load zero into pic counter register SHARK.writebit o_clear_counter, 1 delay 100 SHARK.writebit o clear counter, 0 set counter enable SHARK.writebit o start counter, 1 set direction to forward and turn on motor (motor will turn off automatically) SHARK.writebit 224,1 delay 500 SHARK.writebit 401,1 ;wait for syringe to be sensed SHARK.readbit i_sense_syringe,a timer findtop_time while (!a) SHARK,readbit i_sense_syringe,a if (elapsed(findtop_time) >13) ;stop motor SHARK.writebit 401,0 delay 500 ;home motor call home tr.tcl while ( !home_done) endwhile delay 250 ;load zero into pic counter register SHARK.writebit o_clear_counter, 1 delay 100 SHARK.writebit o clear counter,0 ;call error error_code = 5 call error.tcl \ i restart timer timer findtop_time set counter enable SHARK.writebit o start counter,! start motor to find top of syringe SHARK.writebit 224,1 delay 500 SHARK.writebit 401,1 endif endwhile ;read the number of counts to reach the syringe SHARK.readctr i_motor pulses,motor_pulses show "motor pulses = " + numtostr$ (motor_pulses) disable counter SHARK.writebit o start counter,0 Paqe 116

Claims: CLAIMS: 1. A system for the solid phase synthesis of multiple species of organic compounds each formed by repeated synthetic cycles of synthetic steps, said system comprising: a computer for processing a program of instructions correlated to predetermined synthetic cycles for the synthesis of each of said multiple species; an automated robot responsive to said computer, said automated robot operative to cause said synthesis steps to be performed in accordance with the synthetic cycles of each of said multiple species / and a timing protocol, implemented by said program of instruction and executed by said computer, for directing synthetic steps of at least two different species to be performed concurrently. 2. The system of claim 1 wherein each of said species has an associated sequence specific timing protocol, the compilation of all sequence specific timing protocols of species currently under synthesis being a cumulative remaining timing protocol, said system further including means for determining whether there is a timing conflict between the sequence specific timing protocol of a new desired species and the cumulative remaining timing protocol. 3. The system of claim 1 wherein said synthetic steps include the steps of washing, adding deprotection reagents, deprotection, adding coupling reagents and coupling. 4. The system of claim 1 wherein said synthetic steps include active and passive synthetic steps, said SϋBSHTUTE SHEET (RULE 26) 44 timing protocol directing said active steps within a first synthesis of a first species to be performed concurrently with passive steps within a second synthesis of a second species. 5. The system of claim 1 wherein said organic compounds includes peptides. 6. The system of claim 1 further comprising: a first set of a plurality of syringes, each syringe containing resin for repeatably coupling compounds to a solid support so as to synthesize a first species/ and a second set of a plurality of syringes, each syringe containing a desired compound that is to be coupled to the solid support during one of said synthetic cycles. 7. The system of claim 6 where said compound that is to be coupled is an amino acid for the synthesis of a peptide. 8. The system of claim 7 wherein said solid phase synthesis is a Merrifield solid phase peptide synthesis. 9. The system of claim 1 wherein said automated robot includes a gripper arm responsive to said computer, said gripper arm selectively positioning and manipulating syringes from said first and second sets of a plurality of syringes to thereby aspirate or dispense solvents and regents required within said synthetic cycles. SUBSmUIE SHEET (RDLE26) • _T 10. The system of claim 1 further comprising a database containing parameter variables required for the synthesis of said multiple species of organic compounds, said database including the characteristic sequence of the repeated synthetic cycles for each of said multiple species. 11. A system for the solid phase synthesis of multiple peptides each formed by repeated synthetic cycles of synthetic steps, said system comprising: a first set of syringes each holding a solid support; a second set of syringes each holding a desired amino acid, said first set of syringes serving as the reaction vessels for coupling desired amino acids from said second set of syringes to the solid supports; a computer for processing a program of instructions correlated to predetermined synthetic cycles for the synthesis of multiple peptides; and an automated robot responsive to said computer, said automated robot operatively coupled to said first and second sets of syringes for aspirating and dispensing reagents so as to cause said repeated synthesis cycles to be performed in accordance with a desired peptide synthesis to thereby repeatably couple a desired amino acid to a solid support, said repeated synthesis cycles including the synthetic steps of washing, adding deprotection reagents, deprotection, adding coupling reagents and coupling, said repeated synthesis cycles performed in accordance with a timing protocol wherein said washing, adding deprotection reagents or adding coupling reagents is performed concurrently with said deprotection or coupling for different peptide syntheses. SUBSTTTUiT SHEET (RULE 26) 12. The system of claim 11 wherein said first set of syringes is made of polypropylene. 13. The system of claim 11 wherein each of said first set of syringes includes a solid phase retaining device 14. The system of claim 13 wherein said solid phase retaining device is a frit. 15. The system of claim 11 wherein said solid support comprises a resin selected from the group of polystyrene and polyethylene glycol. 16. The system of claim 11 where said automated robot includes an arm operatively connected to said robot so as to manipulate each of said first and second sets of syringes. 17. The system of claim 16 wherein said first and second sets of syringes each includes a plunger operatively coupled thereto, said plunger movable by said arm of said automated robot to thereby aspirate or dispense reagents. 18. The system of claim 17 wherein the content amount of reagents in each of said syringes is determined by the plunger position of the corresponding syringe. 19. The system of claim 11 further including an optical sensor responsive to the movement of said first and second sets of syringes, said optical sensor confirming the positioning of said first and second sets of syringes. SUBSΠTOTE SHEET ROLE 26 20. The system of claim 11 wherein said synthesis of peptides employs Fmoc/tBu chemistry. 21. The system of claim 11 further comprising piston pumps and delivery cups, said piston pumps delivering solvents and reagents to said delivery cups from which said first and second sets of syringes dispense or aspirate said solvents or reagents. 22. The system of claim 11 further including a database containing parameter variables required for the synthesis of the multiple peptides. 23. A process for the solid phase automated synthesis of multiple species of organic compounds formed by repeated synthetic cycles of synthetic steps, said process comprising the steps of: a) initiating a synthetic step in a synthetic cycle of a species; b) determining if the time for said synthetic step of step a) is sufficient for initiating a synthetic step in the synthetic cycle of a different species, and if so, c) initiating a synthetic step in the synthetic cycle of said different species and d) repeating steps a) , b) and c) until said multiple species are synthesized. 24. The process of claim 23 wherein said synthetic steps include washing, deprotection and coupling for the synthesis of multiple peptides. 25. The process of claim 24 wherein said deprotection and coupling are performed in a plurality of syringes which serve as reaction vessels. 26. A process for the automated solid phase synthesis of multiple peptides formed by repeated cycles of washing, adding deprotection reagents, deprotection, adding coupling reagents and coupling so as to repeatably couple amino acids to a solid support, said process comprising the steps of: a) filling a first set of syringes, each with a resin solid support; b) filling a second set of syringes, each with a desired amino acid; d) washing one of said first set of syringes with a first solution; e) adding deprotection solution to the syringe of step d) to initiate deprotection; f) while deprotection of step e) is proceeding repeating steps d) and e) if the time for performing those steps is less than the time required for deprotection, otherwise proceeding with step g) ; g) adding coupling solution to the syringe of step d) to initiate coupling to thereby couple a desired amino acid to the solid support; and h) while coupling of step g) is proceeding repeating steps f) and g) if the time for performing those steps is less than the time for coupling, otherwise proceeding with steps d) and e) until the time for coupling expires. 27. The process of claim 26 wherein steps a) through h) are repeated until a peptide is synthesized. 28. The process of claim 26 further comprising o — 'fj. w wac*.s-->hni_n.ιgy e cackc--.hii o uf- s oa <_i_d■-.*< f --i_r_sotι_ s seett o KJf syringes of st penp rdl) ) p nrrii norr ttoo aardMdii nncgr rcmouiip-illi ϊn negt i-Vg 29. The process of claim 26 wherein the system is automated through the use of a robot, said robot adding coupling and deprotection solution by manipulating the syringes so as to aspirate and dispense reagents. 30. The process of claim 26 wherein the first solution is dimethylformamide. 31. The process of claim 26 wherein the deprotection solution is piperidine/DMF. 32. The process of claim 26 wherein the coupling solution is a solution of DIC/HOBt. 33. The process of claim 26 further comprising the step of interactively prompting a user for parameter variables thereby forming a database required for the synthesis of the multiple peptides, said database including the characteristic amino acid sequence of each of the multiple peptides. 34. The process of claim 26 further comprising the step of adding or deleting peptide sequences to a list of peptides to be synthesized. 35. A process for the solid phase automated synthesis of multiple species of organic compounds formed by repeated synthetic cycles of synthetic steps, said process comprising the steps of: a) determining a sequence specific timing protocol associated with a desired species to be synthesized, said sequence specific timing protocol including when each synthetic step for the desired species occurs temporally; b) determining the cumulative remaining timing protocol of species currently under synthesis, said cumulative remaining timing protocol including when each synthetic step for the species currently under synthesis occurs temporally; and c) determining whether a timing conflict exists between said sequence specific timing protocol and said cumulative remaining timing protocol, a timing conflict occurring when one synthetic step for the desired species to be synthesized cannot be performed concurrently with the synthetic steps of species currently under synthesis. 36. The process of claim 35 further comprising the step of time shifting the synthesis initiation of the desired species to be synthesized so as to resolve the time conflict. 37. The process of claim 35 wherein a time conflict occurs when an active synthetic step of the desired species to be synthesized is temporally coincident with any active synthetic steps for the species currently under synthesis. 38. The process of claim 35 wherein said organic compounds includes peptides. 39. The process of claim 35 further comprising the step of entering parameter variables required for the synthesis of the organic compounds.

Inventors: KRCHNAK VIKTOR, LEBL MICHAL, SELIGMANN BRUCE, KRCHNAK, VIKTOR, LEBL, MICHAL, SELIGMANN, BRUCE
Applicants: SELECTIDE CORP, SELECTIDE CORPORATION
Application year: 1996
Main classification: B01J8
IPC codes: B01J19, B25J9, C07K1, C40B40, C40B60