├── data ├── images │ └── big-data-pattern.png ├── domain-specific-meta-modeling-languages.md └── big-data-task.md ├── .gitignore ├── agile └── feature-cucumber.md ├── dsl └── texture-dsl.md ├── geo └── geo-dsl.md ├── README.md ├── LICENSE ├── db └── plsql-model.md ├── refactor └── cross-language.md └── arch ├── interacting-domain-specific-languages.md └── observatory-modeling.md /data/images/big-data-pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phodal/dsls/master/data/images/big-data-pattern.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, build with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | .idea 14 | -------------------------------------------------------------------------------- /agile/feature-cucumber.md: -------------------------------------------------------------------------------- 1 | # Cucumber 2 | 3 | 4 | ```cucumber 5 | Scenario Outline: eating 6 | Given there are cucumbers 7 | When I eat cucumbers 8 | Then I should have cucumbers 9 | 10 | Examples: 11 | | start | eat | left | 12 | | 12 | 5 | 7 | 13 | | 20 | 5 | 15 | 14 | ``` -------------------------------------------------------------------------------- /dsl/texture-dsl.md: -------------------------------------------------------------------------------- 1 | # Textual Domain Specific Languages 2 | 3 | MontiCore: A Framework for the Development of Textual Domain Specific Languages 4 | 5 | https://www.se-rwth.de/staff/rumpe/publications20042008/MontiCore-A-Framework-for-the-Development-of-Textual-Domain-Specific-Languages.pdf 6 | 7 | ``` 8 | grammar Automaton { 9 | 10 | Automaton = 11 | "automaton" name:IDENT 12 | "{" (State | Transition)* "}"; 13 | 14 | State = 15 | "state" name:IDENT 16 | (("<<" initial:["initial"] ">>" ) | 17 | ("<<" final:["final"] ">>" ))* ";"; 18 | 19 | Transition = 20 | from:IDENT "-" activate:IDENT ">" 21 | to:IDENT ";"; 22 | 23 | associations { 24 | Transition.toState * <-> 1 State.ingoing; 25 | Transition.fromState * <-> 1 State.outgoing; 26 | } 27 | 28 | concept simplereference { 29 | toState: Transition.to -> State.name; 30 | fromState: Transition.from -> State.name; 31 | } 32 | ``` 33 | -------------------------------------------------------------------------------- /geo/geo-dsl.md: -------------------------------------------------------------------------------- 1 | 2 | Source: http://repositorio.pucrs.br/dspace/bitstream/10923/13813/2/A_High_Level_DSL_for_Geospatial_Visualizations_with_Multi_core_Parallelism_Support.pdf 3 | 4 | ``` 5 | visualization: markedmap; 6 | settings { 7 | latitude:field s12; 8 | longitude:field 11; 9 | marker−text:”Camera:”field 6 image(field 15); 10 | page−title:”Photosb y Camera Brand”; 11 | size:full; 12 | } 13 | data { 14 | file: ”yfcc100m_dataset_all”; 15 | structure { 16 | delimiter: tab; 17 | end−register: newline; 18 | date−format: ”YYYY−MM−DD”; 19 | } 20 | filter: field 4 is between date ”2014−01−01” and date”2014−02−01”; 21 | classification { 22 | class(”Canon”): field 6 contains”Canon”; 23 | class(”Sony”): field 6 contains”Sony”; 24 | class(”Nikon”): field 6 contains”Nikon”; 25 | class(”Panasonic”): field 6 contains ”Panasonic”; 26 | class(”Apple”): field 6 contains”Apple”; 27 | class(”FUJI”): field 6 contains”FUJI”; 28 | } 29 | } 30 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Domain Specific Language 2 | 3 | GOALS: 4 | 5 | 1. collection some userful external DSL design 6 | 2. make dsl easy 7 | 8 | Define DSL: 9 | 10 | 1. 计算机程序设计语言(compute programming language) 11 | 2. 语言性(language nature) 12 | 3. 受限的表达性(limited expresssiveness) 13 | 4. 针对领域(domain focus) 14 | 15 | DSL Types: 16 | 17 | - 外部 DSL,是一种『不同于应用系统主要使用语言』的语言。如正则表达式、SQL、Awek,XML 配置文件。 18 | - 内部 DSL,是一种通用语言物特定用法。即形成特定风格的代码,如 Lisp 程序,Ruby on Rails。 19 | - 语言工作台,专用的 IDE,用于定义和构建 DSL。 20 | 21 | DSL 是一种处理抽象的方式,它需要语义模型作为输入。 22 | 23 | ## When & How 24 | 25 | [When and How to Develop Domain-Specific Languages](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.654&rep=rep1&type=pdf) 26 | 27 | License 28 | --- 29 | 30 | [![Phodal's Idea](http://brand.phodal.com/shields/idea-small.svg)](http://ideas.phodal.com/) 31 | 32 | @ 2019 A [Phodal Huang](https://www.phodal.com)'s [Idea](http://github.com/phodal/ideas). This code is distributed under the MIT license. See `LICENSE` in this directory. 33 | 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Phodal Huang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /db/plsql-model.md: -------------------------------------------------------------------------------- 1 | # PL/SQL Model Extract 2 | 3 | ``` 4 | rule createPLSQLDefinition 5 | from create_package cp 6 | to PLSQLDefinition 7 | queries 8 | seqt : /cp//#seq_of_statements; 9 | mappings 10 | triggers = seqt; 11 | end_rule 12 | 13 | rule createTriggerBlock 14 | from seq_of_statements seqt 15 | to TriggerBlock 16 | queries 17 | stats : /seqt/#statement; 18 | mappings 19 | statements = stats; 20 | end_rule 21 | 22 | rule createReturnStatement 23 | from statement/return_statement st 24 | to ReturnStatement 25 | mappings 26 | end_rule 27 | 28 | rule createFunctionCallStatement 29 | from statement/function_call st 30 | to FunctionCallStatement 31 | queries 32 | fc : /statement/#function_call; 33 | iden : /fc/user_defined_function//#identifier; 34 | params : /fc///#call_parameter; 35 | mappings 36 | name = iden.ID; 37 | parameters = params; 38 | end_rule 39 | 40 | rule createFunctionCallParamForFunctionCall 41 | from call_parameter cp 42 | to FunctionCallParameter 43 | queries 44 | iden : /cp/parameter_name/#identifier; 45 | mappings 46 | name = iden.ID; 47 | end_rule 48 | ``` 49 | -------------------------------------------------------------------------------- /data/domain-specific-meta-modeling-languages.md: -------------------------------------------------------------------------------- 1 | 2 | [Domain-Specific Meta-Modelling Languages](http://miso.es/pubs/DSMM.pdf) 3 | 4 | DSL Examples: 5 | 6 | 7 | ```dsl 8 | Syntax DSPM_MM for ProcessModel [”.pm_mm”] { 9 | model template Process Syntax@1 for ProcessModel 10 | ”process” ˆId ”{” 11 | (_:TaskTemplate |_:PerformerTemplate |_:SeqTemplate)∗ 12 | ”}”; 13 | 14 | node template TaskTemplate@1 for Task 15 | (”final”)? ”task” ˆId #name 16 | with ”final” set final = true ; 17 | 18 | node template PerformerTemplate@1 for Performer 19 | ”performer” #name 20 | with name is id ; 21 | 22 | node template SeqTemplate@1 for Seq 23 | ”seq” ˆId ”:” #src ”−>” #tar 24 | with src redefinedBy from 25 | tar redefinedBy to; 26 | } 27 | ``` 28 | 29 | ```Process 30 | process SoftwareProcess { 31 | task Analysis ”requirements and analysis” 32 | task Design ”high and low level design” 33 | task Coding ”coding and unit testing” 34 | 35 | performer Analyst 36 | performer Designer 37 | performer Programmer 38 | 39 | seq a2d: Analysis −> Design 40 | seq d2c: Design −> Coding 41 | } 42 | ``` 43 | 44 | ```rule 45 | @metamodel(name=ProcessModel,domain=source) 46 | @metamodel(name=PMS,domain=target) 47 | @model(potency=0) 48 | rule Task2Ticket transform task : Source!Task to ticket : Target!Ticket 49 | { 50 | ticket.name := task.ˆname; 51 | ticket.description := task.name; 52 | ticket.priority := task.duration−1; 53 | 54 | for (ref in task.references(”perfBy”)) 55 | ticket.assignedTo ::= task.value(ref); 56 | } 57 | 58 | @lazy 59 | rule Performer2User transform per : Source!Performer to usr : Target!User 60 | { 61 | usr.name := per.name; 62 | } 63 | ``` 64 | 65 | ```operation 66 | operation Analysis createOutps() { 67 | var req := new RequirementsDoc(); 68 | self.output := req; 69 | } 70 | 71 | operation Design createOutps() { 72 | var dd := new DesignDoc(); 73 | self.output := dd; 74 | } 75 | ``` 76 | 77 | -------------------------------------------------------------------------------- /refactor/cross-language.md: -------------------------------------------------------------------------------- 1 | # Cross-Language Code Analysis and Refactoring 2 | 3 | https://www.pst.ifi.lmu.de/Personen/team/mayer/papers/2012_09_23_SCAM2012_CrossLanguage.pdf 4 | 5 | 6 | ``` 7 | transformation RubyOnRails ( ruby: Ruby, rdb: RDB ) { 8 | top relation ClassToTable { 9 | classname: String; 10 | error domain ruby c:Class { superClass = sc:Class { name=’ActiveRecord’ }, name= classname} 11 | error domain domain rdb t:Table { name=pluralize(classname) } 12 | } 13 | top relation BelongsToToTable { 14 | entityname: String; 15 | error domain ruby m:MethodInvocation { name=’belongs to’, parent=c:Class {}, 16 | parameter= p:Parameter { value= entityname }} 17 | error domain rdb col:Column { name= entityname + ’ id’, table= t:Table{}} 18 | when { ClassToTable(c, t) } 19 | } 20 | top relation HasOneManyToTable { 21 | entityname, classname: String; 22 | error domain ruby m:MethodInvocation { parent= c:Class { name=underline2camel(classname)}, 23 | ((name = ’has one’, parameter= p:Parameter { value= singularize(entityname) }) | 24 | (name = ’has many’, parameter= p:Parameter { value= entityname }) } 25 | error domain rdb col:Column { name= classname + ’ id’, table= t2:Table{ name= entityname }} 26 | when { ClassToTable(c, t) } 27 | } 28 | } 29 | 30 | transformation Android2XML ( djava: DJava, xml: XML ) { 31 | top relation ActivityToLayout { 32 | layoutName : String; 33 | error domain djava a:Activity { referencedLayout=layoutName } 34 | warn domain xml f:XMLFile { parent = d:Directory { name=’layout’, parent= dd:Directory { name= ’res’ }}, 35 | name = layoutName + ’.xml’ } 36 | } 37 | 38 | top relation IDReferenceDeclaration { 39 | reference: String; 40 | error domain djava lr:LayoutReference { activity= a, referencedID=reference } 41 | nocheck domain xml attr:Attribute { name=’android:id’, value= ’@+id/’ + reference }, 42 | parent= e:Element { file= f }} 43 | when { ActivityToLayout(a, f) } 44 | } 45 | } 46 | ``` 47 | -------------------------------------------------------------------------------- /data/big-data-task.md: -------------------------------------------------------------------------------- 1 | # Big Data 2 | 3 | 4 | 5 | https://www.researchgate.net/profile/Sergey_Kovalchuk2/publication/291343973_Dynamic_Domain-Specific_Language_for_BigData_Tasks'_Description/links/56a0fcbd08ae24f62701e2d8.pdf 6 | 7 | Patterns: 8 | 9 | ![Big Data Patterns](images/big-data-pattern.png) 10 | 11 | The dynamic DSL being developed within the knowledge-based approach incorporates 12 | the following artifacts: 13 | 14 | - **Domain-specific semantics**. A set of domain-specific objects which are used to 15 | describe the structure of investigated system is defined. This part of knowledge 16 | enables interconnection with WF and simulation procedures on the levels L4-5. 17 | - **Data formats**. To support the integration and high-level definition of the task, the 18 | semantically marked data of format description and atomic analysis procedures 19 | should be described. 20 | - **Data aggregation patterns**. To interpret imperative description of procedures 21 | within the high-level task with MapReduce code generation, the data aggregation 22 | and statistical analysis procedures should be available. 23 | - **Cloud infrastructure knowledge**. should be provided to support a) further 24 | processing of the results by the other parts of composite application; b) call the 25 | local software described in the same way as regular cloud computing services. 26 | 27 | 即: 28 | 29 | 1. 领域特定的语义 30 | 2. 数据格式 31 | 3. 数据聚合模式 32 | 4. 云基础设施知识 33 | 34 | ``` 35 | require BSHFile, projects, inControlPoints, points, searchedhirlam; 36 | 37 | script CycloneSearch runs BDDSL ( 38 | dir = "/data/path", tag = "ERA" 39 | ) 40 | 41 | {: 42 | select Cyclone where ( 43 | trajectory_path = "(65.67, 8.19), (65.97, 23.45), (60.97, 31.45)" 44 | accuracy = "(5, 5)" 45 | ) 46 | out Cyclone.Parameters() as outs 47 | :}; 48 | 49 | step CycloneStatistialAnalysis runs scilab ( 50 | input_folder = CycloneSearch.Result.outs["data/out"], 51 | script_name = "SCI_stat.sce" 52 | ); 53 | 54 | script FloodSimulation runs BDDSL ( 55 | dir = "/data/path", tag = "HIRLAM", 56 | config = CycloneStatistialAnalysis.Result.outs["output.dat"], 57 | points = points, projects = projects, BSHFile = BSHFile, 58 | searchedpattern = searchedhirlam, inControlPoints = inControlPoints 59 | ) 60 | 61 | {: 62 | select Forecast where ( 63 | preasure_field = searchedpattern 64 | ) 65 | simulate package cyclonegenerator with parameters ( 66 | inConfigFile = configFile 67 | forecastField = Forecast.field 68 | ) 69 | simulate VSO FloodSim from cyclonegenerator.Result [points, projects, 70 | BSHFile, inControlPoints] to FloodSimulation 71 | out FloodSim.Result as out 72 | :}; 73 | 74 | step FloodStatistialAnalysis runs scilab 75 | ( 76 | input_folder = FloodSimulaiton.Result.outs["/out/"], 77 | script_name = "FLOOD_stat.sce" 78 | ); 79 | ``` -------------------------------------------------------------------------------- /arch/interacting-domain-specific-languages.md: -------------------------------------------------------------------------------- 1 | # Developing Interacting Domain Specific Languages 2 | 3 | refs: [https://www.open.ou.nl/bhr/mak07thesis.pdf](https://www.open.ou.nl/bhr/mak07thesis.pdf) 4 | 5 | with Model Driven Architecture 6 | 7 | - Platform Independent Model The actual high-level description of an application (UML). 8 | - Platform Definition Model A model of a specific architecture (e.g. CORBA, .Net or a web-environment). 9 | - Platform Specific Model Executable description of an architecture instance. 10 | 11 | ## Domain Model Blog 12 | 13 | ``` 14 | domainmodel blog 15 | concept User { 16 | name :: String (unique, name) 17 | email :: Email 18 | blogEntries <> [BlogEntry] 19 | } 20 | concept BlogEntry { 21 | title :: String (name, required) 22 | abstract :: Text 23 | contents :: Text (required) 24 | date :: Date (name) 25 | tags -> [Tag] 26 | replies <> [Reply] 27 | category :: {"Technical" : TECH, "Other" : NONTECH} 28 | } 29 | concept Tag { 30 | tagName :: String 31 | } 32 | ``` 33 | 34 | ## WebLayer DSL 35 | 36 | ``` 37 | weblayer blog 38 | using domainmodel blog 39 | 40 | page ViewBlog(BlogEntry be, User u){ 41 | var Reply r 42 | 43 | header(be.title + " (written on " + be.date + ")") 44 | 45 | text(be.contents) 46 | 47 | table Tag t in be.tags { "Assigned tags" -> t.tagName } 48 | 49 | "Reply to this post:" 50 | form( input(r) 51 | action("Add reply", r.user = u; be.replies.add(r); be.save()) 52 | ) 53 | text("Replies for post " + be.title + " :") 54 | 55 | for Reply r in be.replies { show(r) } 56 | 57 | navigate("Home", Blog(u)) 58 | } 59 | ``` 60 | 61 | ## Interaction between DSLs 62 | 63 | ``` 64 | DomainModel( 65 | "blog" 66 | , [ ("Text", "String", [( "validate", "org.blog.domainmodel.validation.Text.validate" )]) 67 | , ("Email", "String", [( "validate", "org.blog.domainmodel.validation.Email.validate" )]) 68 | ] 69 | , [ Concept( 70 | "User" 71 | , "org.blog.domainmodel.User" 72 | , [ ConceptMember( Native(), "name", NativeType("String"), "java.lang.String", ["unique"] ) 73 | , ConceptMember( Native(), "email", ExtendedType("Email"), "java.lang.String", [] ) 74 | , ConceptMember( Composite(), "blogEntries", ListType(ConceptType("BlogEntry")) 75 | , "List", [] ) 76 | ] 77 | ) 78 | , Concept( 79 | "BlogEntry" 80 | , "org.blog.domainmodel.BlogEntry" 81 | , [ ConceptMember( Native(), "title", NativeType("String"), "java.lang.String", ["required"] ) 82 | <...> 83 | , ConceptMember( Native(), "category", EnumType(["TECH", "NONTECH"]), "org.blog.domainmodel.BlogEntry.Enum_category", [] ) 84 | ] 85 | ) 86 | , Concept( 87 | "Tag" 88 | , "org.blog.domainmodel.Tag" 89 | , [ConceptMember( Native(), "tagName", NativeType("String"), "java.lang.String", [] ) 90 | ] 91 | ) 92 | , Concept( 93 | "Reply" 94 | , "org.blog.domainmodel.Reply" 95 | [ <...> ] 96 | ) 97 | ] 98 | ) 99 | ``` 100 | 101 | ## BusinessRules DSL 102 | 103 | ``` 104 | page EditCustomer(Customer c, Account a) { 105 | form( 106 | show(a) 107 | input(c) 108 | action("Add account", 109 | a.customer = c 110 | ; verifyAccount(a) 111 | ; c.number = createAccountNr(a) 112 | ; a.save() 113 | ) 114 | ) 115 | } 116 | ``` 117 | 118 | ``` 119 | BusinessRules( 120 | "banking" 121 | , [ Rule( "verifyAccount", [Concept("Account")], Void() 122 | , [ HaltOnFailure() ] 123 | , [ ("method", "com.corporate.verify") 124 | , ("webservice", "http://corporate.com/accounts/verificationWS") 125 | ] 126 | ) 127 | , Rule( "createAccountNr", [Concept("Account")], Concept("AccountNumber") 128 | , [] 129 | , [ ("method", "com.corporate.createNewAccount") ] 130 | ) 131 | ] ) 132 | ``` 133 | -------------------------------------------------------------------------------- /arch/observatory-modeling.md: -------------------------------------------------------------------------------- 1 | ## observatory software modeling 2 | 3 | ### End-to-end observatory software modeling using domain specific languages 4 | 5 | Refs: [https://www.gmto.org/SPIE_2014/2014-SPIE-9152-58.pdf](https://www.gmto.org/SPIE_2014/2014-SPIE-9152-58.pdf) 6 | 7 | ### Component modeling 8 | 9 | ``` 10 | MKlass "Monitor", 11 | extends: ["Port"] 12 | abstract: false 13 | desc: "Monitors are the basic element for component telemetry. 14 | Monitors don't produce any direct action on the associated component" 15 | features: 16 | units: {kind: "reference", lower: 1, upper: 1, type: "UnitType", 17 | desc: "Units of the monitor"} 18 | type: {kind: "attribute", lower: 1, upper: 1, type: "BaseDataType", 19 | desc: "Type of the Monitor"} 20 | min: {kind: "attribute", lower:-1, upper: 1, type: "ValueType", 21 | desc: "Minimum value used for monitoring purposes"} 22 | max: {kind: "attribute", lower:-1, upper: 1, type: "ValueType", 23 | desc: "Maximum value used for monitoring purposes"} 24 | rate: {kind: "attribute", lower: 1, upper: 1, type: "Integer", 25 | desc: "Sampling rate, if zero, only on change"} 26 | storage: {kind: "attribute", lower: 1, upper: 1, type: "Integer", 27 | desc: "Decimation factor, if zero, no storage, if > 1 all samples are stored"} 28 | ``` 29 | 30 | ### Device control modeling 31 | 32 | ``` 33 | Controller "BasePositionController" 34 | extends: ["BaseController"] 35 | data_outputs: 36 | position_actual_value: 37 | desc: "This output shall provide the actual value of the position 38 | measurement device. The value shall be given in user-defined 39 | position units." 40 | type: "float32" 41 | pattern: "pull" 42 | max_rate: 20 43 | default: 0 44 | 45 | position_internal_demand: 46 | desc: "This output shall indicate the internal position demand 47 | calculated by the internal trajectory generator that the drive 48 | should move to in position profile mode using the 49 | current settings of motion control properties such as velocity, 50 | acceleration, deceleration, motion profile type etc. 51 | The value of this input shall be interpreted as absolute 52 | or relative depending on the state of the property abs/rel'. 53 | It shall be given in user-defined position units." 54 | type: "float32" 55 | pattern: "pull" 56 | max_rate: 20 57 | default: 0 58 | ``` 59 | 60 | ### Data processing modeling 61 | 62 | ``` 63 | KeywordDictionary "FITSDictionary", 64 | desc: "Keywords for a basic FITS standard header. In many cases, 65 | the keywords and descriptions are taken verbatim from 66 | 'Definition of the Flexible Image Transport System (FITS), 67 | Version 3.0'." 68 | extends: [] 69 | max_length: 8 70 | keywords: 71 | datamax: 72 | tags: ["fits_standard", "gen_primary", "data_value"] 73 | keyword: "DATAMAX" 74 | synopsis: "Maximum data value" 75 | index: "F" 76 | default: "" 77 | type: "Float" 78 | hdu: "any" 79 | desc: "The value field shall always contain a floating point 80 | number, regardless of the value of BITPIX. This number 81 | shall give the maximum valid physical value represented 82 | by the array, exclusive of any special values." 83 | ``` 84 | 85 | ### Observatory Operations modeling 86 | 87 | 88 | ``` 89 | GMTIFS_Observation "30DORField", 90 | notes: "" 91 | instrument: "gmtifs" 92 | obs_cond: 93 | image_quality: "20%/Best" 94 | cloud_cover: "20%/Best" 95 | wind_velocity: "20%/Best" 96 | sky_brightness: "" 97 | inst_conf: 98 | inst_rot_mode: "tracking" 99 | inst_PA: 135 100 | dichroic: "grating" #same as grating 101 | image_filter_wheel: "J" 102 | image_utility_wheel: "clear" 103 | imager_det_focus: "filter" #same as filter 104 | ifs_mask_wheel: "f-converter" #same as f-converter 105 | ifs_f_converter_wheel: "50" 106 | ifs_filter_wheel: "grating" #same as grating 107 | ifs_grating_wheel: "hK" 108 | ifs_detector_focus: "grating" #same as grating 109 | sets: 110 | 30_DOR: 111 | desc: "30_DOR Observation Set" 112 | blocks: 113 | pre_std_obsq: 114 | desc: "Pre Standard Star Observation Sequence" 115 | ao_conf: 116 | mode: "LTAO+OIWFS" 117 | rate: "1000" 118 | targets: 119 | base: {ra: "05:38:44.86", dec: "-69:05:44.2"} 120 | science: {ra: "05:38:44.86", dec: "-69:05:44.2"} 121 | agwfs3: {ra: "05:38:43.40", dec: "-68:59:66.8"} 122 | pcwfs : {ra: "05:39:25.75", dec: "-69:11:36.0"} 123 | oiwfs: {ra: "05:38:48.48", dec: "-69:05:32.6"} 124 | acquisition: 125 | exp_time: 5.0 126 | coadds: 1 127 | mode: "bright_object_spectroscopy" 128 | pause: true # Center target in IFS field 129 | exposure: 130 | det_conf: 131 | exp_time: 20.0 132 | coadds: 10 133 | mode: "bright_object_spectroscopy" 134 | offsets: [ 135 | { p: 0.0, q: 1.1, repeat: 1 } 136 | { p: 0.0, q: -1.1, repeat: 1 } 137 | { p: 10.0, q: 0.0, repeat: 1 } 138 | { p: -10.0, q: 0.0, repeat: 1 } 139 | { p: 0.0, q: 1.1, repeat: 1 } 140 | { p: 0.0, q: -1.1, repeat: 1 } 141 | ] 142 | ``` 143 | 144 | ### Work system modeling 145 | 146 | --------------------------------------------------------------------------------