Browse Source

initial reading of material files, filter materials to tabulated

Konstantin Ladutenko 3 years ago
parent
commit
52550759b0

+ 16 - 0
guiapp/public/getTabulatedFilenames.py

@@ -0,0 +1,16 @@
+import glob, os
+
+files = []
+for filename in glob.iglob('./refractiveindex.info-database/database/data/**', recursive=True):
+    if os.path.isfile(filename): # filter dirs
+        with open(filename) as f:
+            contents = f.read()
+            # if contents.count('- type:')>1:
+            #     files.append(filename.replace('./refractiveindex.info-database/database/data/',''))
+            if 'tabulated n' in contents:
+                files.append(filename.replace('./refractiveindex.info-database/database/data/',''))
+
+print(files)
+print(len(files))
+with open('tabulated.txt', 'w') as f:
+    f.write(str(files))

File diff suppressed because it is too large
+ 0 - 0
guiapp/public/tabulated.txt


+ 34 - 23
guiapp/src/components/GetParticleParameters.vue

@@ -71,34 +71,39 @@
 
         <div class="col-auto">
           <q-select
-              v-model="layer.materialName"
-              :options="activatedMaterialsNames"
+              v-model="layer.material"
+              :options="activatedMaterials"
               :style="'width: '+basicWidthStyle"
               class="q-px-xs"
               dense
               options-dense
               outlined
-              options-value="value"
-              options-label="label"
+              options-value="name"
+              options-label="name"
+              :display-value="layer.material.name"
           >
             <template #option="scope">
-              <span v-if="scope.opt =='link'">
-                <q-item v-bind="scope.itemProps"
-                        clickable
+              <span v-if="scope.opt.name =='link'">
+                <q-item clickable dense
                         to="/materials"
                 >
                   <q-item-section side>
-                    <q-icon name="settings"/>
+                    <q-icon size="xs" name="settings"/>
                   </q-item-section>
                   <q-item-section>
                     <q-item-label >Manage materials...</q-item-label>
                   </q-item-section>
                 </q-item>
+                <q-separator inset />
               </span>
               <span v-else>
-                <q-item v-bind="scope.itemProps" >
+                <q-item
+                    v-bind="scope.itemProps"
+                    :disable="(!scope.opt.kSpline || !scope.opt.kSpline)
+                     && !(scope.opt.name=='nk-constant' || scope.opt.name=='PEC')"
+                >
                   <q-item-section>
-                    <q-item-label>{{ scope.opt }}</q-item-label>
+                    <q-item-label>{{ scope.opt.name }}</q-item-label>
                     <!--                  <q-item-label caption>{{ scope.opt.description }}</q-item-label>-->
                   </q-item-section>
                 </q-item>
@@ -108,7 +113,7 @@
         </div>
 
       </div>
-      <div v-if="layer.materialName=='nk-constant'"
+      <div v-if="layer.material.name=='nk-constant'"
                class="row justify-xs-center justify-sm-start items-baseline">
 
         <div class="col-auto"> <input-with-units
@@ -169,11 +174,17 @@ export default defineComponent({
     })
 
     const activatedMaterials = computed(() => $store.state.guiRuntime.activatedMaterials)
-    const activatedMaterialsNames = computed(() => {
-      let list = activatedMaterials.value.map(x=>x.name)
-      list.push('link')
-      return list
-    })
+    // const activatedMaterialsOptions = computed(() => {
+    //   let list = activatedMaterials.value.map(x=>{
+    //     return {
+    //       name: x.name, value: x.name, label: x.name,
+    //       spectrumRangeStart:x.spectrumRangeStart, spectrumRangeEnd:x.spectrumRangeEnd,
+    //       nSpline: x.nSpline, kSpline: x.kSpline
+    //     }
+    //   })
+    //   console.log(list)
+    //   return list
+    // })
 
     let layers = reactive( cloneDeep($store.state.simulationSetup.gui.layers) )
 
@@ -194,9 +205,9 @@ export default defineComponent({
             if (isAlmostSame(storeLayers[i].layerWidth, layers[i].layerWidth)) {
               layers[i].layerWidth = storeLayers[i].layerWidth
             }
-            if (layers[i].materialName == 'link') {
-              layers[i].materialName = storeLayers[i].materialName
-            }
+            // if (layers[i].material.name == 'link') {
+            //   layers[i].material.name = storeLayers[i].material.name
+            // }
           }
           $store.commit('simulationSetup/setLayers', layers)
         },
@@ -224,11 +235,11 @@ export default defineComponent({
         layers.push(
             {
               layerWidth: coreR*0.1,
-              materialName: 'nk-constant',
+              material: {name:'nk-constant', fileFullPath:undefined,
+                spectrumRangeStart:undefined, spectrumRangeEnd: undefined,
+                nSpline: undefined, kSpline: undefined},
               n: 4.0,
               k: 0.01,
-              nSpline: undefined,
-              kSpline: undefined,
             }
         );
       }
@@ -252,7 +263,7 @@ export default defineComponent({
       particleType,
       numberOfLayers, layers, getLayerTitle, getTooltipText,
       units, toUnits, fromUnits, isShowingHelpForInputWithUnits,
-      activatedMaterialsNames
+      activatedMaterials
       }
   },
 })

+ 11 - 18
guiapp/src/components/MaterialsActivated.vue

@@ -21,16 +21,15 @@
       </template>
 
       <template #body="props">
-        <q-tr :props="props">
-
-
+        <q-tr
+            v-if="props.row.name!='link' && props.row.name!='nk-constant' && props.row.name!='PEC'"
+            :props="props"
+        >
           <q-td auto-width>
-            <span v-if="props.row.name!='nk-constant' && props.row.name!='PEC'">
             <q-tooltip anchor="top start" self="bottom start" >
               Delete from simulation</q-tooltip>
             <q-btn size="sm" padding="5px" color="primary" round dense icon="delete"
                    @click="deleteFromSimulation(props.row.name)"/>
-            </span>
           </q-td>
 
 
@@ -39,10 +38,7 @@
           </q-td>
 
           <q-td auto-width>
-            <span v-if="props.row.name!='nk-constant' && props.row.name!='PEC'">
             <q-tooltip
-                v-if="props.row.spectrumRangeStart>=fromWavelengthStore ||
-                 props.row.spectrumRangeEnd<=toWavelengthStore"
                 anchor="top middle" self="bottom middle"
                 class="bg-red">
               Mismatch with spectrum simulation
@@ -50,22 +46,19 @@
             <span :class="props.row.spectrumRangeStart>=fromWavelengthStore?'text-red':'text-black'">
               {{ props.row.spectrumRangeStart }}
             </span>
-            <span v-if="props.row.spectrumRangeStart">&ndash;</span>
+            &ndash;
             <span :class="props.row.spectrumRangeEnd<=toWavelengthStore?'text-red':'text-black'">
               {{ props.row.spectrumRangeEnd }}
             </span>
-            <span v-if="props.row.spectrumRangeStart">&NonBreakingSpace;nm</span>
-              </span>
+            &NonBreakingSpace;nm
           </q-td>
 
           <q-td class="">
-            <span v-if="props.row.name!='nk-constant' && props.row.name!='PEC'">
-              <span v-if="props.row.nSpline && props.row.kSpline">
-                <q-icon size='sm' color="green" name="done" />
-              </span>
-              <span v-else>
-                <q-icon size='xs' color="red" name="do_not_disturb" />
-              </span>
+            <span v-if="props.row.nSpline && props.row.kSpline">
+              <q-icon size='sm' color="green" name="done" />
+            </span>
+            <span v-else>
+              <q-icon size='xs' color="red" name="do_not_disturb" />
             </span>
           </q-td>
 

+ 8 - 2
guiapp/src/components/MaterialsSelector.vue

@@ -159,10 +159,16 @@ export default defineComponent({
     }
 
     async function GetPagesFromLib() { /* eslint-disable */
+      //TODO enable eslint, which is disabled now due to unknown result type of load() from js-yaml
+
       let rows = []
       // lib has an irregular structure
       const response = await fetch('refractiveindex.info-database/database/library.yml')
       const data = await response.text()
+
+      const response2 = await fetch('tabulated.txt')
+      const tabulated = await response2.text()
+
       const lib = await load(data) as any
       let i = 1
       for (const shelf of lib) {
@@ -190,6 +196,7 @@ export default defineComponent({
 
                 pageName = pageOrDivider.name
                 pageData = pageOrDivider.data
+                if (tabulated.indexOf(pageData) == -1) continue
                 if (bookDivider.includes('Model') || bookDivider.includes('model')
                     || pageName.includes('Model') || pageName.includes('model')) continue
                 const pageNameSplit = GetRange(pageName)
@@ -239,8 +246,7 @@ export default defineComponent({
       fromWavelengthStore, toWavelengthStore,
       composeLabelFromPageData,
       addToSimulation(val:number) {
-        console.log(rows[val-1].pageData)
-        $store.commit('guiRuntime/activateMaterial', rows[val-1].pageData)
+        $store.dispatch('guiRuntime/activateMaterial', rows[val-1].pageData)
       },
       async downloadPageData(filepath:string) {
         const response = await fetch('refractiveindex.info-database/database/data/'+filepath)

+ 2 - 2
guiapp/src/components/RunSimulationSpectrum.vue

@@ -117,8 +117,8 @@ export default defineComponent({
 
             nmie.ClearTarget()
             for (const layer of layers) {
-              if (layer.nSpline) layer.n = layer.nSpline.at(WL)
-              if (layer.kSpline) layer.k = layer.kSpline.at(WL)
+              if (layer.material.nSpline) layer.n = layer.material.nSpline.at(WL)
+              if (layer.material.kSpline) layer.k = layer.material.kSpline.at(WL)
               nmie.AddTargetLayerReIm(layer.layerWidth * host, layer.n / host, layer.k / host)
             }
 

+ 53 - 8
guiapp/src/store/gui-runtime/actions.ts

@@ -1,11 +1,56 @@
-import { ActionTree } from 'vuex';
-import { StateInterface } from '../index';
-import { guiRuntimeStateInterface } from './state';
+import { ActionTree } from 'vuex'
+import { StateInterface } from '../index'
+import { guiRuntimeStateInterface } from './state'
+import { composeLabelFromPageData } from 'components/utils'
+import { load } from 'js-yaml'
 
-const actions: ActionTree<guiRuntimeStateInterface, StateInterface> = {
-  someAction (/* context */) {
-    // your code
+async function loadMaterialData(filename:string){ /* eslint-disable */
+  // TODO enable eslint, which is disabled now due to unknown result type of load() from js-yaml
+  // TODO implement formulas
+  // TODO implement multiple '- type:' in one file (e.g. it can be 'tabulated n' and 'tabulated k'
+
+  let Ag_data
+
+  try {
+    const response = await fetch('refractiveindex.info-database/database/data/'+filename)
+    const Ag_data = await response.text()
+
+    const doc = await load(Ag_data) as any
+    console.log(doc)
+    if (doc.DATA[0].type == 'tabulated nk' || doc.DATA[0].type == 'tabulated n') {
+      const csv = doc.DATA[0].data
+      const rows:string[] = csv.split("\n")
+      let data =  rows.map(row =>row.split(" "))
+      console.log(data)
+      data.pop()
+      let data_num = data.map(elem => elem.map(elem2 => parseFloat(elem2)))
+
+      function transpose(array:number[][]) {
+        return array[0].map((col, i) => array.map(row => row[i]));
+      }
+
+      let data_columns = transpose(data_num)
+      // Convert from default refractiveindex.info mkm to nm
+
+      for (let i=0; i<data_columns[0].length; i++)
+        data_columns[0][i] *= 1000
+      console.log(data_columns)
+      return data_columns
+    }
+  } catch (e) {
+    console.log(e)
   }
-};
+}
+
+
+const actions: ActionTree<guiRuntimeStateInterface, StateInterface> = {
+  activateMaterial({commit,state}/* context */, filepath:string) {
+    // console.log(composeLabelFromPageData(filepath))
+    let data_columns = loadMaterialData(filepath)
+    console.log(data_columns)
+    return {state, filepath}
+  },
+
+}
 
-export default actions;
+export default actions

+ 3 - 5
guiapp/src/store/gui-runtime/mutations.ts

@@ -1,6 +1,5 @@
-import { MutationTree } from 'vuex';
-import { guiRuntimeStateInterface as grsi} from './state';
-import { composeLabelFromPageData } from 'components/utils'
+import { MutationTree } from 'vuex'
+import { guiRuntimeStateInterface as grsi} from './state'
 
 const mutation: MutationTree<grsi> = {
   setIsShowingHelpForInputWithUnits (state: grsi, val: boolean) {state.isShowingHelpForInputWithUnits = val},
@@ -8,8 +7,7 @@ const mutation: MutationTree<grsi> = {
   setSourceUnits       (state: grsi, val: string ) {state.sourceUnits       = val},
   setIsSourceSameUnits (state: grsi, val: boolean) {state.isSourceSameUnits = val},
 
-  activateMaterial(state: grsi, filepath: string) {
-    console.log(composeLabelFromPageData(filepath))
+  addMaterial(state: grsi, filepath: string) {
     return {state, filepath}
   },
 

+ 3 - 9
guiapp/src/store/gui-runtime/state.ts

@@ -1,15 +1,7 @@
-import Spline from 'cubic-spline-ts'
+import { material } from 'src/store/simulation-setup/state'
 
 // All numbers with units (e.g. size, radius, wavelength, e.g.) are given in nanometers.
 
-interface material {
-  name: string
-  fileFullPath:string,
-  spectrumRangeStart:number,
-  spectrumRangeEnd:number
-  nSpline: Spline|undefined
-  kSpline: Spline|undefined
-}
 
 export interface guiRuntimeStateInterface {
   isShowingHelpForInputWithUnits: boolean
@@ -27,6 +19,8 @@ function state(): guiRuntimeStateInterface {
     isSourceSameUnits: true,
     activatedMaterials: [
         // 'PEC',
+      {name:'link', fileFullPath:'', spectrumRangeStart:0, spectrumRangeEnd:1e300,
+        nSpline: undefined, kSpline: undefined},
       {name:'nk-constant', fileFullPath:'', spectrumRangeStart:0, spectrumRangeEnd:1e300,
         nSpline: undefined, kSpline: undefined},
       {name:'Ag_McPeak', fileFullPath:'main/Ag/McPeak.yml', spectrumRangeStart:300, spectrumRangeEnd:1700,

+ 13 - 5
guiapp/src/store/simulation-setup/state.ts

@@ -3,13 +3,20 @@ import Spline from 'cubic-spline-ts'
 
 // All numbers with units (e.g. size, radius, wavelength, e.g.) are given in nanometers.
 
+export interface material {
+  name: string
+  fileFullPath:string|undefined
+  spectrumRangeStart:number|undefined
+  spectrumRangeEnd:number|undefined
+  nSpline: Spline|undefined
+  kSpline: Spline|undefined
+}
+
 export interface layer {
   layerWidth: number
-  materialName: string
+  material: material
   n: number
   k: number
-  nSpline: Spline|undefined
-  kSpline: Spline|undefined
 }
 
 export interface simulationSetup {
@@ -34,8 +41,9 @@ function setupFactory(hostIndex = 1,
                       fromWL = 400, toWL=1000, pointsWL=201, currentWL = 400,
                       layers = [
                         {layerWidth:100, n:4, k:0.01,
-                          materialName:'nk-constant',
-                          nSpline:undefined, kSpline:undefined
+                          material: {name:'nk-constant', fileFullPath:undefined,
+                            spectrumRangeStart:undefined, spectrumRangeEnd: undefined,
+                            nSpline: undefined, kSpline: undefined},
                         },
                       ],
                       numberOfModesToPlot = 4,

Some files were not shown because too many files changed in this diff