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 2 of 2  Not logged in ThomX    logo
ID Date Author Status Type Categorydown Important Subject Icon
  10   Wed Jun 12 14:15:20 2019 Entered by Falcoz Nicolas from 134.158.195.143 on Wed Jun 12 14:15:07 2019 ProblemEtuves Test accent éè 

Test accent éè

  1   Thu Jun 6 10:58:43 2019 Miwiwi QuestionDocs , entered from 134.158.195.143 
coucou loulou
Attachment 1: index.jpeg
index.jpeg
  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
  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
  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

  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

 

  26   Mon Mar 28 15:51:33 2022 Entered by Kevin Dupraz from 134.158.195.144 on Mon Mar 28 15:51:15 2022Reference SolutionInfo | note | LinacCC | Opt | Electronique Configuration Iris motorisé Laser PhotoCathode 

Les paramètres de l'iris sont les suivants :

Données d'entrée :

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

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

Données contrôleur (sensor type 428) :

    * max (7mm) = -85360 (-32145 m°)

    * min (0.5mm) = 120 (33342 m°)

===> Donc l'échelle est inversée et la conversion (en natif l'unité est le n°) est : n°/mm (ouverture) :  (120+85360)*1E6 / 6.5 = 13 150 769 231

et le décalage (offset) est de : -85360*1E6 - 0.5* 13 150 769 231 = -91 935 384 615

Paramètres Contrôleur MCS2 :

     * logical scale offset : -91 935 384 615

     * logical scale inversion : inverted

Propriétés DS moteur :

     * AxisNumber : 0

     * SensorType : 428

Attributs DS moteur :

      *  MoveMode : 0

      * StepAmplitude : 65535

      * StepFrequency : 1000

      * Conversion : 13 150 769 231 pas/mm

      * UnitLimit (Min et Max) : 0

      * SensorMode : 1

Dans le DS contrôleur :

       * ConnectType: net
 

Attachment 1: Capture_d’écran_2026-02-05_110042.png
Capture_d’écran_2026-02-05_110042.png
  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.

 

  25   Mon Feb 7 15:45:51 2022 Entered by Philippe G. (CC) from 78.203.22.151 on Sat Feb 5 18:56:52 2022Reference SolutionInfoCC ordi portable sous windows, entered from 134.158.196.106 
Lors de la réunion vendredi, il a été demandé quels étaient les ordinateurs portables sous windows pour utilisation par le DG/SY. Pour rappel, la liste des matériels déclarés sur le réseau informatique ThomX figure ici : https://atrium.in2p3.fr/c8fc130b-c7e5-4200-ba00-95e5f6921828 Marie et Christelle ont demandé vendredi à avoir la liste des ordi portables déclarés sur le réseau ThomX sous windows. - portable-rf (RI-C2/RF/PC.01), sous Windows, sous la responsabilité du groupe RF - op1 (CR/OP/PC.01), sous GNU/Linux - thomx-dg1 (pas de code nomenclature), sous GNU/Linux, la responsabilité du groupe DG - test-cc (pas de code nomenclature), sous GNU/Linux, sous la responsabilité du groupe CC
  22   Tue Nov 16 10:00:54 2021 Entered by Kevin Dupraz from 134.158.89.107 on Tue Nov 16 10:00:37 2021New SolutionInfo | LinacAimants | Electronique Paramètrage Solénoïdes 

mise à jours 20/01/2022 : conversion des mouvement moteur en mouvement réel, en fonction du fichier des paramètres constructeur à verifier en réelle pour la conversion pas moteur / angle

Les moteurs des solénoïdes du canon ont été réglés hier (15/11/2021) dans l'IcePAP baie17:

 - board11: LI/AE/COL.01-MOT.01, axe X bobine focalisation 1/4 + codeur (translation X)

     * AXMO/Nanotec ST5909L2008-B câblage parallèle (enc: WEDL5541-A06)
     * 2000 coups encodeur par tour, 1mm/tour
     * 100 poles pairs, 2.4 Ohm, (6V), 2A, (microstep : 2000 pas/tour)
     * encodeur : QUAD, 2000 pas/tour
     * conversion :  0.5 um/pas

 - board12: LI/AE/COL.01-MOT.02, axe Z bobine focalisation 2/4 + codeur (translation Z)

     * AXMO/Nanotec ST6018D4508-B câblage parallèle (enc: WEDL5541-A06)
     * 2000 coups encodeur par tour, 250um/tour
     * 50 poles pairs, 0.75 Ohm, (4V), 4.5A, (microstep : 2000 pas/tour)
     * encodeur : QUAD, 2000 pas/tour
     * conversion :  0.125 um/pas

 - board13: LI/AE/COL.02-MOT.01, bobine focalisation 3/4 + codeur (rotation X, rayon de 276mm)

     * Ametek/Haydon E35H4N-05-A31 (enc: US Digital E5-200-315-IE-D-D-D-B)
     * 800 coups encodeur par tour, 600um/tour
     * 50 poles pairs, 8.8 Ohm, (6.27V), 0.57A, (microstep : 800 pas/tour)
     * encodeur : QUAD, 800 pas/tour
     * conversion :  2.72 urad/pas (368 pas/mrad)

 - board14: LI/AE/COL.02-MOT.02, bobine focalisation 4/4 + codeur (rotation Z, rayon de 336mm)

     * Ametek/Haydon E35H4N-05-A31 (enc: US Digital E5-200-315-IE-D-D-D-B)
     * 800 coups encodeur par tour, 600um/tour
     * 50 poles pairs, 8.8 Ohm, (6.27V), 0.57A, (microstep : 800 pas/tour)
     * encodeur : QUAD, 800 pas/tour
     * conversion :  2.23 urad/pas (448 pas/mrad)

le fichier de répartition des icePAP sous atrium a été mis à jour en conséquence. Il faut mettre les fichiers constructeur dans l'espace atrium créé.

ci joint le plan avec les distance permettant de remonter à la relation angle(mrad) et distance parcourue par le moteur.

selon X : rayon de 276mm, soit 1 degré correspond à 4.81mm, ou 1mrad correspond à 0.276 mm

selon Z : rayon de 336mm, soit 1degré correspond à 5.86 mm, ou 1mrad correspond à 0.336 mm

TODO : les directions des moteurs selon leur signe

Bonne journée,

Attachment 1: Axmo_solenoide_translations.pdf
Attachment 2: Conversion_mm_avec_angle_de_rotation_solenoide.pdf
  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
  Draft   Tue Jun 11 12:25:21 2019 Entered by Falcoz Nicolas from 134.158.195.143 on Tue Jun 11 11:55:34 2019      
  Draft   Tue Oct 26 18:31:38 2021 Entered by Viktor Soskov from 134.158.195.153 on Tue Oct 26 18:30:49 2021FixedLinac  Laser_Cathode_PulseWidth_Compressor 
Attachment 1: SR_20200824_1-9460.pdf
  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
ELOG V3.1.4-395e101