HOME Prise de donnees MML Controle commande Simulations Notes Hardware Ligne X Laser Interaction Diagnostiques Synchronisation
Hardware
  Notes sur les differents appareils (Klystron, Etuves, Sondes Etuve, Temperature, Modulateur,...), Page 1 of 2  Not logged in ThomX    logo
ID Date Authordown Status Type Category Important Subject Icon
  2   Thu Jun 6 11:53:24 2019 nfalcoz QuestionDocs , entered from 134.158.195.143 
Coucou Test
Attachment 1: index.jpeg
index.jpeg
  3   Thu Jun 6 11:54:08 2019 nfalcoz QuestionDocs , entered from 134.158.195.143 
Coucou Test
Attachment 1: index.jpeg
index.jpeg
  4   Thu Jun 6 12:00:33 2019 nfalcoz QuestionDocs , entered from 134.158.195.143 
Coucou Test2
Attachment 1: index.jpeg
index.jpeg
  6   Wed Jun 12 11:04:46 2019 nfalcoz InfoDocs , entered from 134.158.195.143 
Essai 1 sans piece jointe
Attachment 1: index.jpeg
index.jpeg
  7   Wed Jun 12 11:09:26 2019 nfalcoz ProblemSondes Etuve , entered from 134.158.195.143 
Essai 2 sans pièe jointe
  8   Wed Jun 12 11:24:05 2019 nfalcoz ProblemSondes Etuve , entered from 134.158.195.143 
/self.saisieTexte.toPlainText()
  9   Wed Jun 12 11:45:26 2019 nfalcoz UrgentTemperature , entered from 134.158.195.143 
Essai 3 sans pièce jointe (-_/!?éèêü)
  11   Wed Jun 12 14:23:38 2019 nfalcoz ProblemTemperature , entered from 134.158.195.143 
éééééèèè
  12   Fri Jun 14 13:55:33 2019 nfalcoz FixSondes Etuve , entered from 134.158.195.143 
Test 3 screens
Attachment 1: screen.png
screen.png
Attachment 2: Laser.png
Laser.png
Attachment 3: LaserAvance.png
LaserAvance.png
  13   Thu Jun 27 14:26:55 2019 nfalcoz FixKlystron , entered from 134.158.195.143 
Test IHMLogBook
Attachment 1: screen.png
screen.png
Attachment 2: Laser.png
Laser.png
  14   Thu Jul 11 11:14:46 2019 nfalcoz OtherDocs , entered from 134.158.195.143 
Test
Attachment 1: screenshot.py
#!/usr/bin/env python
# Python screenshot tool (fullscreen/area selection)
# Tested on:
# Lubuntu 13.04 x86_64
# Gentoo 4.1.7-hardened-r1 x86_64

import sys
from PyQt4 import QtCore, QtGui
from commands import getoutput
from StringIO import StringIO
from Xlib import X, display, Xutil


# Documentation for python-xlib here:
# http://python-xlib.sourceforge.net/doc/html/index.html

class XSelect:
    def __init__(self, display):
        # X display
        self.d = display

        # Screen
        self.screen = self.d.screen()

        # Draw on the root window (desktop surface)
        self.window = self.screen.root

        # If only I could get this working...
        #cursor = xobject.cursor.Cursor(self.d, Xcursorfont.crosshair)
        #cursor = self.d.create_resource_object('cursor', Xcursorfont.X_cursor)
        cursor = X.NONE

        self.window.grab_pointer(1, X.PointerMotionMask|X.ButtonReleaseMask|X.ButtonPressMask,
                X.GrabModeAsync, X.GrabModeAsync, X.NONE, cursor, X.CurrentTime)

        self.window.grab_keyboard(1, X.GrabModeAsync, X.GrabModeAsync, X.CurrentTime)

        colormap = self.screen.default_colormap
        color = colormap.alloc_color(0, 0, 0)
        # Xor it because we'll draw with X.GXxor function
        xor_color = color.pixel ^ 0xffffff

        self.gc = self.window.create_gc(
            line_width = 1,
            line_style = X.LineSolid,
            fill_style = X.FillOpaqueStippled,
            fill_rule  = X.WindingRule,
            cap_style  = X.CapButt,
            join_style = X.JoinMiter,
            foreground = xor_color,
            background = self.screen.black_pixel,
            function = X.GXxor,
            graphics_exposures = False,
            subwindow_mode = X.IncludeInferiors,
        )

        done    = False
        started = False
        start   = dict(x=0, y=0)
        end     = dict(x=0, y=0)
        last    = None
        drawlimit = 10
        i = 0

        while done == False:
            e = self.d.next_event()

            # Window has been destroyed, quit
            if e.type == X.DestroyNotify:
                sys.exit(0)

            # Mouse button press
            elif e.type == X.ButtonPress:
                # Left mouse button?
                if e.detail == 1:
                    start = dict(x=e.root_x, y=e.root_y)
                    started = True

                # Right mouse button?
                elif e.detail == 3:
                    sys.exit(0)

            # Mouse button release
            elif e.type == X.ButtonRelease:
                end = dict(x=e.root_x, y=e.root_y)
                if last:
                    self.draw_rectangle(start, last)
                done = True
                pass

            # Mouse movement
            elif e.type == X.MotionNotify and started:
                i = i + 1
                if i % drawlimit != 0:
                    continue

                if last:
                    self.draw_rectangle(start, last)
                    last = None

                last = dict(x=e.root_x, y=e.root_y)
                self.draw_rectangle(start, last)
                pass

            # Keyboard key
            elif e.type == X.KeyPress:
                sys.exit(0)

        self.d.flush()

        coords = self.get_coords(start, end)
        if coords['width'] <= 1 or coords['height'] <= 1:
            sys.exit(0)
        else:
            print "%d %d %d %d" % (coords['start']['x'], coords['start']['y'], coords['width'], coords['height'])

    def get_coords(self, start, end):
        safe_start = dict(x=0, y=0)
        safe_end   = dict(x=0, y=0)

        if start['x'] > end['x']:
            safe_start['x'] = end['x']
            safe_end['x']   = start['x']
        else:
            safe_start['x'] = start['x']
            safe_end['x']   = end['x']

        if start['y'] > end['y']:
            safe_start['y'] = end['y']
            safe_end['y']   = start['y']
        else:
            safe_start['y'] = start['y']
            safe_end['y']   = end['y']

        return {
            'start': {
                'x': safe_start['x'],
                'y': safe_start['y'],
            },
            'end': {
                'x': safe_end['x'],
                'y': safe_end['y'],
            },
            'width' : safe_end['x'] - safe_start['x'],
            'height': safe_end['y'] - safe_start['y'],
        }

    def draw_rectangle(self, start, end):
        coords = self.get_coords(start, end)
        self.window.rectangle(self.gc,
            coords['start']['x'],
            coords['start']['y'],
            coords['end']['x'] - coords['start']['x'],
            coords['end']['y'] - coords['start']['y']
        )


class Screenshot(QtGui.QWidget):
    def __init__(self):
        super(Screenshot, self).__init__()

        self.screenshotLabel = QtGui.QLabel()
        self.screenshotLabel.setSizePolicy(QtGui.QSizePolicy.Expanding,
                QtGui.QSizePolicy.Expanding)
        self.screenshotLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.screenshotLabel.setMinimumSize(240, 160)

        self.createOptionsGroupBox()
        self.createButtonsLayout()

        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(self.screenshotLabel)
        mainLayout.addWidget(self.optionsGroupBox)
        mainLayout.addLayout(self.buttonsLayout)
        self.setLayout(mainLayout)

        self.area = None
        self.shootScreen()
        self.delaySpinBox.setValue(1)

        self.setWindowTitle("Screenshot")
        self.resize(300, 200)

    def resizeEvent(self, event):
        scaledSize = self.originalPixmap.size()
        scaledSize.scale(self.screenshotLabel.size(), QtCore.Qt.KeepAspectRatio)
        if not self.screenshotLabel.pixmap() or scaledSize != self.screenshotLabel.pixmap().size():
            self.updateScreenshotLabel()

    def selectArea(self):
        self.hide()

        #print sys.argv[0]
        resArea = getoutput('python ./screenshot.py -A') #TODO horrible 1/2 !
        if resArea and resArea != '0 0 0 0':
            print resArea.split()
            self.area = xo, yo, x, y = resArea.split()
            self.areaLabel.setText("Area: x%s y%s to x%s y%s" % (xo, yo, x, y))
            self.shootScreen()
            # print 'OK', self.area #DEBUG
        elif self.area is not None:
            self.area = None
            self.areaLabel.setText("Area: fullscreen")
            self.shootScreen()

        self.show()

    def newScreenshot(self):
        if self.hideThisWindowCheckBox.isChecked():
            self.hide()
        self.newScreenshotButton.setDisabled(True)

        QtCore.QTimer.singleShot(self.delaySpinBox.value() * 1000, self.shootScreen)

    def saveScreenshot(self):
        format = 'png'
        initialPath = QtCore.QDir.currentPath() + "/untitled." + format

        fileName = QtGui.QFileDialog.getSaveFileName(self, "Save As",
                initialPath,
                "%s Files (*.%s);;All Files (*)" % (format.upper(), format))
        if fileName:
            self.originalPixmap.save(fileName, format)

    def shootScreen(self):
        if self.delaySpinBox.value() != 0:
            QtGui.qApp.beep()

        # Garbage collect any existing image first.
        self.originalPixmap = None
        self.originalPixmap = QtGui.QPixmap.grabWindow(QtGui.QApplication.desktop().winId())
        if self.area is not None:
            qi = self.originalPixmap.toImage()
            size = qi.size()
            qi = qi.copy(int(self.area[0]), int(self.area[1]), int(self.area[2]), int(self.area[3]))
            self.originalPixmap = None
            self.originalPixmap = QtGui.QPixmap.fromImage(qi)

        self.updateScreenshotLabel()

        self.newScreenshotButton.setDisabled(False)
        if self.hideThisWindowCheckBox.isChecked():
            self.show()

    def updateCheckBox(self):
        if self.delaySpinBox.value() == 0:
            self.hideThisWindowCheckBox.setDisabled(True)
        else:
            self.hideThisWindowCheckBox.setDisabled(False)

    def createOptionsGroupBox(self):
        self.optionsGroupBox = QtGui.QGroupBox("Options")

        self.delaySpinBox = QtGui.QSpinBox()
        self.delaySpinBox.setSuffix(" s")
        self.delaySpinBox.setMaximum(60)
        self.delaySpinBox.valueChanged.connect(self.updateCheckBox)

        self.delaySpinBoxLabel = QtGui.QLabel("Screenshot Delay:")

        self.hideThisWindowCheckBox = QtGui.QCheckBox("Hide This Window")
        self.hideThisWindowCheckBox.setChecked(True)
        
        self.areaLabel = QtGui.QLabel("Area: fullscreen")

        optionsGroupBoxLayout = QtGui.QGridLayout()
        optionsGroupBoxLayout.addWidget(self.delaySpinBoxLabel, 0, 0)
        optionsGroupBoxLayout.addWidget(self.delaySpinBox, 0, 1)
        optionsGroupBoxLayout.addWidget(self.hideThisWindowCheckBox, 1, 0)
        optionsGroupBoxLayout.addWidget(self.areaLabel, 1, 1)
        self.optionsGroupBox.setLayout(optionsGroupBoxLayout)

    def createButtonsLayout(self):
        self.selectAreaButton = self.createButton("Select Area",
                self.selectArea)

        self.newScreenshotButton = self.createButton("New Screenshot",
                self.newScreenshot)

        self.saveScreenshotButton = self.createButton("Save Screenshot",
                self.saveScreenshot)

        self.quitScreenshotButton = self.createButton("Quit", self.close)

        self.buttonsLayout = QtGui.QHBoxLayout()
        self.buttonsLayout.addStretch()
        self.buttonsLayout.addWidget(self.selectAreaButton)
        self.buttonsLayout.addWidget(self.newScreenshotButton)
        self.buttonsLayout.addWidget(self.saveScreenshotButton)
        self.buttonsLayout.addWidget(self.quitScreenshotButton)

    def createButton(self, text, member):
        button = QtGui.QPushButton(text)
        button.clicked.connect(member)
        return button

    def updateScreenshotLabel(self):
        self.screenshotLabel.setPixmap(self.originalPixmap.scaled(
                self.screenshotLabel.size(), QtCore.Qt.KeepAspectRatio,
                QtCore.Qt.SmoothTransformation))
... 19 more lines ...
Attachment 2: RFCanon.png
RFCanon.png
Attachment 3: RFSection.png
RFSection.png
  35   Mon Sep 15 11:54:53 2025 NDFixedAnneauAimants Test cyclage QP5 

11:50 Test de cyclage QP5:OK

12:04 Test de cyclage de tous les aimants: OK

Pas de probleme observe avec le cyclage de QP5 (ni avce les autres aimants).

Verifier l'existence de RI-C2/PS/STR.06

12:26 Extinction des aimants

 

Attachment 1: Screenshot_from_2025-09-15_12-03-10.png
Screenshot_from_2025-09-15_12-03-10.png
Attachment 2: Screenshot_from_2025-09-15_12-13-06.png
Screenshot_from_2025-09-15_12-13-06.png
Attachment 3: Screenshot_from_2025-09-15_12-25-28.png
Screenshot_from_2025-09-15_12-25-28.png
  1   Thu Jun 6 10:58:43 2019 Miwiwi QuestionDocs , entered from 134.158.195.143 
coucou loulou
Attachment 1: index.jpeg
index.jpeg
  31   Fri Sep 13 17:11:13 2024 KD InfoDiag | RF D1 | Electronique réflechis canon 

remplacement attenuation sur le signal réflechi canon par un 6.1dB

3dB --> 6.1dB

  36   Thu Oct 9 08:53:26 2025 KDFixedInfo | note | LinacOpt changement iris motorisée 

08/10/2025 : mise en place de l'iris motorisée temporaire (Thorlabs Eliptec ELL15Z) . Pour y accéder et la controler :

- se connecter sur vvan2.thomx.fr (compte: xline-user1 ; pass: Th0mX-user1)

- lancer l'application sur le bureau "Thorlabs.Elliptec.ELLO"

- choisir dans port: "COM4",  le search Range "0" à "0" (sinon cela prend plus de temps pour la connection) ==> cliquer sur "Connect"

- Dans l'interface sur le panneau "Control", il y a la position actuelle et le contrôle des mouvements. (actuellement l'iris est réglé sur 1.3mm).

/!\ ne pas toucher aux autres paramètres

Janvier 2026: remise en place de l'IRIS SmarAct.

 

Attachment 1: Eliptec_1.png
Eliptec_1.png
Attachment 2: Eliptec_2.png
Eliptec_2.png
Attachment 3: programme.png
programme.png
  37   Tue Apr 7 09:21:16 2026 KDFixedInfo | note | LinacOpt RE: changement iris motorisée 

- se connecter sur vvan2.thomx.fr (compte: xline-user1 ; pass: Th0mX-user1)

- Utiliser le soft MCS2 (sur le bureau) : conversion mm --> m° : ouverture_mm * 13 150.769 231

    * Iris fermée à 0.5mm de diamètre

    * Iris entièrement ouverte à 7mm de diamètre

==> mettre sur STOP le moteur pour arrêter la rétroaction

 

KD wrote:

08/10/2025 : mise en place de l'iris motorisée temporaire (Thorlabs Eliptec ELL15Z) . Pour y accéder et la controler :

- se connecter sur vvan2.thomx.fr (compte: xline-user1 ; pass: Th0mX-user1)

- lancer l'application sur le bureau "Thorlabs.Elliptec.ELLO"

- choisir dans port: "COM4",  le search Range "0" à "0" (sinon cela prend plus de temps pour la connection) ==> cliquer sur "Connect"

- Dans l'interface sur le panneau "Control", il y a la position actuelle et le contrôle des mouvements. (actuellement l'iris est réglé sur 1.3mm).

/!\ ne pas toucher aux autres paramètres

Janvier 2026: remise en place de l'IRIS SmarAct.

 

 

Attachment 1: screenshot_MCS2
  27   Thu Mar 31 16:26:06 2022 Hayg Reference SolutionInfoCC | Electronique Redpitaya --> signal sur page web 

Pour afficher le signal de la redpitaya sur le web :

1/ on arrête le Ds

2/ mettre l'adresse ip sur le navigater

redpitaya.thomx.fr has address 192.168.209.91
redpitaya1-b13.thomx.fr has address 192.168.229.148
redpitaya1-b14.thomx.fr has address 192.168.229.123
redpitaya1-b17.thomx.fr has address 192.168.229.68
redpitaya1-b5.thomx.fr has address 192.168.229.10
redpitaya2-b13.thomx.fr has address 192.168.229.136
redpitaya2-b14.thomx.fr has address 192.168.229.135
redpitaya2-b17.thomx.fr has address 192.168.229.69
redpitaya2-b5.thomx.fr has address 192.168.229.11
redpitaya3-b17.thomx.fr has address 192.168.229.70
redpitaya3-b5.thomx.fr has address 192.168.229.12
redpitaya4-b17.thomx.fr has address 192.168.229.71
redpitaya4-b5.thomx.fr has address 192.168.229.13
redpitaya5-b5.thomx.fr has address 192.168.229.14

3/ redémarrer le Ds via Astor

 

 

Autrement, même en jouant sur les paramètres du signal sur l'interface, le signal n'apparait pas.

 

  30   Wed Aug 21 09:20:22 2024 Entered by Vincent Chaumat from 134.158.76.115 on Tue Aug 20 11:13:35 2024FixedInfo | noteDiag | RF D1 Etalonnage des détecteurs de puissance Hytem 20-02-05 

Ci dessous les tendences pour les étalonnages des 3 détecteurs Hytem 20-02-05

ils ont été mesuré entre  0.3mW et 50mW

à savoir les détecteurs ont une résolution en puissance meilleure que 10% entre 3mW et 50mW

20/08/2024 équation de la forme  P(mW) = A*|mV|3 + B*|mV|2+C*|mV|
La puissance est exprimée en mW pour une tension absolue mesurée en mV sur 50 ohms      
     
Référence détecteur Equations tendance A B C
Hytem 20-02-05 - 1 y = 4,95E-04x2 - 7,57E-02x  0,00E+00 4,95E-04 -7,57E-02
Hytem 20-02-05 - 2 y = 4,58E-04x2 - 7,20E-02x 0,00E+00 4,58E-04 -7,20E-02
Hytem 20-02-05 - 3 y = 4,61E-04x2 - 7,03E-02x 0,00E+00 4,61E-04 -7,03E-02

https://atrium.in2p3.fr/56387201-0546-4278-a7aa-9f8f1dd3a933

 

  Draft   Wed Oct 27 09:41:39 2021 Entered by Viktor Soskov from 134.158.195.153 on Wed Oct 27 09:41:22 2021FixedLinac  UV Energy_PD vs Atten 
Attachment 1: UVenergy_PG_Atten1.pdf
  34   Wed Jun 25 15:18:09 2025 Entered by Viktor Soskov from 134.158.195.153 on Wed Jun 25 15:17:47 2025FixedLinacLaser Etat laser 

L'energie_Max UV actuelle sur la cathode est 26mkJ (Att.: 420, iris: 1.3mm)

Viktor.

ELOG V3.1.4-395e101