Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cherab/tcv/div_spectrometer/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

from .spectrometer import *
from .fibres import *
121 changes: 121 additions & 0 deletions cherab/tcv/div_spectrometer/diaggeom.coords_div_spec
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
DIV (All possible lines of sight) #36793 2s
RIN (Line of sight)
1. From R= 1.400m, z=-1.234m, phi=90.469
To R= 1.108m, z= 0.560m, phi=91.749
2. From R= 1.400m, z=-1.234m, phi=90.469
To R= 1.182m, z= 0.839m, phi=91.809
3. From R= 1.400m, z=-1.234m, phi=90.469
To R= 1.292m, z= 1.035m, phi=91.655
4. From R= 1.400m, z=-1.234m, phi=90.469
To R= 1.423m, z= 1.142m, phi=91.487
5. From R= 1.400m, z=-1.234m, phi=90.469
To R= 1.566m, z= 1.167m, phi=91.242
7. From R= 1.400m, z=-1.234m, phi=90.469
To R= 1.822m, z= 1.000m, phi=90.975
8. From R= 1.400m, z=-1.234m, phi=90.469
To R= 1.918m, z= 0.847m, phi=90.829
RIV (Line of sight)
1. From R= 1.379m, z=-1.177m, phi=67.628
To R= 1.240m, z=-1.111m, phi=427.494
2. From R= 1.379m, z=-1.177m, phi=67.628
To R= 1.244m, z=-1.099m, phi=427.471
3. From R= 1.379m, z=-1.177m, phi=67.628
To R= 1.248m, z=-1.087m, phi=427.483
4. From R= 1.379m, z=-1.177m, phi=67.628
To R= 1.253m, z=-1.073m, phi=427.456
5. From R= 1.379m, z=-1.177m, phi=67.628
To R= 1.258m, z=-1.058m, phi=427.460
6. From R= 1.379m, z=-1.177m, phi=67.628
To R= 1.263m, z=-1.044m, phi=427.404
7. From R= 1.419m, z=-1.135m, phi=68.144
To R= 1.263m, z=-1.045m, phi=67.514
8. From R= 1.419m, z=-1.135m, phi=68.144
To R= 1.268m, z=-1.031m, phi=67.522
9. From R= 1.419m, z=-1.135m, phi=68.144
To R= 1.274m, z=-1.015m, phi=67.510
10. From R= 1.419m, z=-1.135m, phi=68.144
To R= 1.279m, z=-0.999m, phi=67.501
11. From R= 1.419m, z=-1.135m, phi=68.144
To R= 1.285m, z=-0.981m, phi=427.491
12. From R= 1.419m, z=-1.135m, phi=68.144
To R= 1.287m, z=-0.957m, phi=427.495
ROV (Line of sight)
1. From R= 1.438m, z=-1.194m, phi=112.541
To R= 1.581m, z=-1.202m, phi=112.592
2. From R= 1.438m, z=-1.194m, phi=112.541
To R= 1.584m, z=-1.191m, phi=112.556
3. From R= 1.438m, z=-1.194m, phi=112.541
To R= 1.587m, z=-1.178m, phi=112.544
4. From R= 1.438m, z=-1.194m, phi=112.541
To R= 1.591m, z=-1.165m, phi=112.532
5. From R= 1.438m, z=-1.194m, phi=112.541
To R= 1.595m, z=-1.150m, phi=112.517
6. From R= 1.438m, z=-1.194m, phi=112.541
To R= 1.598m, z=-1.136m, phi=112.508
7. From R= 1.438m, z=-1.194m, phi=112.541
To R= 1.603m, z=-1.118m, phi=112.507
8. From R= 1.409m, z=-1.147m, phi=112.665
To R= 1.602m, z=-1.123m, phi=112.543
9. From R= 1.409m, z=-1.147m, phi=112.665
To R= 1.607m, z=-1.105m, phi=112.551
10. From R= 1.409m, z=-1.147m, phi=112.665
To R= 1.612m, z=-1.086m, phi=112.546
11. From R= 1.409m, z=-1.147m, phi=112.665
To R= 1.617m, z=-1.065m, phi=112.529
12. From R= 1.409m, z=-1.147m, phi=112.665
To R= 1.624m, z=-1.041m, phi=112.538
13. From R= 1.409m, z=-1.147m, phi=112.665
To R= 1.631m, z=-1.013m, phi=112.537
14. From R= 1.409m, z=-1.147m, phi=112.665
To R= 1.641m, z=-0.980m, phi=112.554
RXV (Line of sight)
1. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.272m, z=-1.020m, phi=112.467
2. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.283m, z=-0.987m, phi=112.453
3. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.287m, z=-0.954m, phi=112.481
4. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.284m, z=-0.920m, phi=112.480
5. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.275m, z=-0.882m, phi=112.442
6. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.256m, z=-0.839m, phi=112.439
7. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.226m, z=-0.788m, phi=112.453
8. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.186m, z=-0.725m, phi=112.412
9. From R= 1.752m, z=-1.001m, phi=112.445
To R= 1.140m, z=-0.653m, phi=112.409
ZIV (Line of sight)
2. From R= 1.438m, z=-1.217m, phi=90.267
To R= 1.583m, z= 1.160m, phi=103.932
3. From R= 1.438m, z=-1.217m, phi=90.267
To R= 1.126m, z= 0.635m, phi=98.482
4. From R= 1.438m, z=-1.217m, phi=90.267
To R= 1.063m, z= 0.309m, phi=94.989
5. From R= 1.438m, z=-1.217m, phi=90.267
To R= 1.044m, z= 0.046m, phi=93.534
6. From R= 1.438m, z=-1.217m, phi=90.267
To R= 1.052m, z=-0.202m, phi=92.674
7. From R= 1.438m, z=-1.217m, phi=90.267
To R= 1.081m, z=-0.422m, phi=92.002
8. From R= 1.438m, z=-1.217m, phi=90.267
To R= 1.287m, z=-0.928m, phi=90.777
ZON (Line of sight)
1. From R= 1.352m, z=-1.168m, phi=90.577
To R= 1.793m, z=-0.779m, phi=90.108
2. From R= 1.352m, z=-1.168m, phi=90.577
To R= 2.004m, z=-0.519m, phi=89.890
3. From R= 1.352m, z=-1.168m, phi=90.577
To R= 2.096m, z=-0.340m, phi=89.776
4. From R= 1.352m, z=-1.168m, phi=90.577
To R= 2.169m, z=-0.144m, phi=89.677
5. From R= 1.352m, z=-1.168m, phi=90.577
To R= 2.201m, z= 0.034m, phi=89.562
7. From R= 1.352m, z=-1.168m, phi=90.577
To R= 2.172m, z= 0.341m, phi=89.435
8. From R= 1.352m, z=-1.168m, phi=90.577
To R= 2.126m, z= 0.466m, phi=89.344
9. From R= 1.352m, z=-1.168m, phi=90.577
To R= 2.069m, z= 0.599m, phi=89.334
91 changes: 91 additions & 0 deletions cherab/tcv/div_spectrometer/fibres.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import matplotlib.pyplot as plt
import math
import numpy as np
from cherab.mastu.machine import *

radians = 3.14159265 / 180.0

start = [1.50569999217987, -0.399749994277954]

angles = [ -0.391012817621231,
-0.377983331680298,
-0.365014135837555,
-0.352100670337677,
-0.339238584041595,
-0.326423466205597,
-0.313651055097580,
-0.300917148590088,
-0.288217544555664,
-0.275548070669174,
-0.262904673814774,
-0.250283271074295,
-0.237679839134216,
-0.225090354681015,
-0.212510809302330,
-0.199937224388123,
-0.187365636229515,
-0.174792051315308,
-0.162212505936623,
-0.149623006582260,
-0.137019574642181,
-0.124398179352283,
-0.111754782497883,
-0.0990853235125542,
-0.0863857045769692,
-0.0736517906188965,
-0.0608793906867504,
-0.0480642840266228,
-0.0352021791040897,
-0.0222887266427279,
-0.00931951310485601,
0.00364970066584647]

def endpoint(start, angle, length):

endx = start[0] - length * np.cos(angle)
endy = start[1] + length * np.sin(angle)

return [endx, endy]

fibre_r_z=[endpoint(start, a, 2.) for a in angles[::-1]] # reversed anglers order so that chord 0 is by the X-point

class fibres:
"""
Geometry data for fibre bundles
"""

def __init__(self):
self.loaded = -1
self.set_bundle(group=1)

def set_bundle(self, group=None, fibre=12):
if group == 1:
self.group = 1
self.load_ROV(fibre)
self.numfibres = 32
self.loaded = 1

def set_fibre(self, number=1):
self.set_bundle(group = self.group, fibre=number)

def load_ROV(self,fibre):
self.origin = self.machine_coordinates(*start, 180)
if fibre in range(len(fibre_r_z)):
self.term = self.machine_coordinates(*fibre_r_z[fibre], 180)

self.distance = self.fibre_distance_world(-1)

def machine_coordinates(self,R,Z,phi):
return ( R * math.cos(phi * radians), R * math.sin(phi * radians), Z )

def xhat(self):
return (self.term[0]-self.origin[0]) / self.distance

def yhat(self):
return (self.term[1]-self.origin[1]) / self.distance

def zhat(self):
return (self.term[2]-self.origin[2]) / self.distance

def fibre_distance_world(self,world):
return np.sqrt( (self.origin[0]-self.term[0])**2 + (self.origin[1]-self.term[1])**2 + (self.origin[2]-self.term[2])**2)
68 changes: 68 additions & 0 deletions cherab/tcv/div_spectrometer/spectrometer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import os
import numpy as np
import matplotlib.pyplot as plt
import math

class spectrometer:
"""
Spectrometer and detector settings
"""
def __init__(self):
self.detector="Unknown"
self.pixels=512
self.spectrograph="Unknown"
self.grating=300
self.wcentre=60.
self.set_spec()
def check_inputs(self):
if self.grating not in (300, 600, 1200):
print("Warning: Only gratings 300/600/1200 available - setting 300")
self.grating = 300
def set_spec(self):
self.check_inputs()
self.wrange()
self.wupper = self.wcentre + self.range/2.0
self.wlower = self.wcentre - self.range/2.0
self.wresol = (self.wupper - self.wlower)/self.pixels
self.wlngth = np.linspace(self.wlower,self.wupper,self.pixels)

def wrange(self):
self.range=0.0
if self.grating == 300:
self.range = 88.0
if self.grating == 600:
self.range = 44.0
if self.grating == 1200:
self.range = 16.0
def set_grating(self,grating):
self.grating=grating
self.set_spec()
def set_wcentre(self,centre):
self.wcentre=centre
self.set_spec()
def set_range(self,setting=1):
if setting == 1:
# Primary setting outputs:
# Continuum ratio ~ Te
# Stark broadening ~ ne
# D[gamma,delta,epsilon] ratio
# Impurity/molecular (CD) emission
self.set_grating(300)
self.set_wcentre(60.0) # 395.0)
if setting == 2:
# Secondary setting outputs:
# Doppler broadening (He II/C III/C IV)
# CX measurement (C IV)
self.set_grating(1200)
self.set_wcentre(465.0)
if setting == 3:
# Secondary setting outputs:
# He I (668/706/728 nm) line ratios
self.set_grating(300)
self.set_wcentre(694.0)
if setting == 4:
# Secondary setting outputs:
# Stark broadening ~ ne
# D[gamma,delta,epsilon] ratio
self.set_grating(1200)
self.set_wcentre(403.5)
Loading